46#define MAX_COLOR_BAND 128
47#define MAX_GPU_SKIES 8
59#define ASYNC_OPTIMIZED_PASS_CREATION 0
88#if ASYNC_OPTIMIZED_PASS_CREATION == 1
89 struct DeferredOptimizePass {
92 } DeferredOptimizePass;
93 struct DeferredOptimizePass optimize_pass_info;
156 GPUMaterial *mat,
int width,
int height,
const float *pixels,
float *row)
174 printf(
"Too many sky textures in shader!\n");
202 *r_row =
float(layer);
205 printf(
"Too many color band in shader! Remove some Curve, Black Body or Color Ramp Node.\n");
209 memcpy(dst, pixels,
sizeof(
float) * (
CM_TABLE + 1) * 4);
230 (
float *)builder->
pixels);
264 if (material->optimized_pass !=
nullptr) {
267 if (material->pass !=
nullptr) {
270 if (material->ubo !=
nullptr) {
273 if (material->coba_builder !=
nullptr) {
276 if (material->coba_tex !=
nullptr) {
279 if (material->sky_tex !=
nullptr) {
282 if (material->sss_profile !=
nullptr) {
285 if (material->sss_tex_profile !=
nullptr) {
303 return material->scene;
311 material->optimized_pass) ?
312 material->optimized_pass :
322 material->optimized_pass) ?
325 return (shader) ? shader : ((material->pass) ?
GPU_pass_shader_get(material->pass) :
nullptr);
335 return material->name;
345 return material->ubo;
355 return material->graph.attributes;
360 return material->graph.textures;
366 return attrs->
count > 0 ? attrs :
nullptr;
371 const ListBase *attrs = &material->graph.layer_attrs;
379# define SSS_SAMPLES 65
380# define SSS_EXPONENT 2.0f
395 if (material->sss_enabled) {
399 material->sss_enabled =
true;
402 if (material->sss_profile ==
nullptr) {
414 if (!material->graph.outlink_surface) {
415 material->graph.outlink_surface = link;
416 material->has_surface_output =
true;
422 if (!material->graph.outlink_volume) {
423 material->graph.outlink_volume = link;
424 material->has_volume_output =
true;
430 if (!material->graph.outlink_displacement) {
431 material->graph.outlink_displacement = link;
432 material->has_displacement_output =
true;
438 if (!material->graph.outlink_thickness) {
439 material->graph.outlink_thickness = link;
449 BLI_addtail(&material->graph.outlink_aovs, aov_link);
456 compositor_link->
outlink = link;
457 BLI_addtail(&material->graph.outlink_compositor, compositor_link);
465 switch (return_type) {
467 GPU_link(material,
"set_value", *link, link);
470 GPU_link(material,
"set_rgb", *link, link);
473 GPU_link(material,
"set_rgba", *link, link);
483 SNPRINTF(func_link->
name,
"ntree_fn%d", material->generated_function_len++);
484 BLI_addtail(&material->graph.material_functions, func_link);
486 return func_link->
name;
491 return &material->graph;
527 const double optimization_time_threshold_s = 1.2;
533 if (material != default_material) {
534 material->default_mat = default_material;
579 mat->
flag &= ~GPU_MATFLAG_UPDATED;
595 bool is_volume_shader,
604 if (mat->
uuid == shader_uuid && mat->
engine == engine) {
613 mat->
uuid = shader_uuid;
634 if (
GPUPass *default_pass = pass_replacement_cb ? pass_replacement_cb(thunk, mat) :
nullptr) {
635 mat->
pass = default_pass;
649 if (mat->
pass ==
nullptr) {
673#if ASYNC_OPTIMIZED_PASS_CREATION == 1
675 mat->optimize_pass_info.callback =
callback;
676 mat->optimize_pass_info.thunk = thunk;
686 if (optimized_sh !=
nullptr) {
796 const char *name = mat->
name;
798 const char *name = __func__;
829#if ASYNC_OPTIMIZED_PASS_CREATION == 1
839 mat->optimize_pass_info.callback,
840 mat->optimize_pass_info.thunk,
923 material->refcount = 1;
925 material->optimized_pass =
nullptr;
926 material->default_mat =
nullptr;
927 material->engine = engine;
930 construct_function_cb(thunk, material);
937 material, &material->graph, material->engine, generate_code_function_cb, thunk,
false);
938 material->optimized_pass =
nullptr;
941 if (material->pass ==
nullptr) {
949 if (shader !=
nullptr) {
General operations, lookup, etc. for materials.
void BKE_material_defaults_free_gpu(void)
#define BLI_STATIC_ASSERT_ALIGN(st, align)
unsigned int BLI_ghashutil_ptrhash(const void *key)
GSet * BLI_gset_new(GSetHashFP hashfp, GSetCmpFP cmpfp, const char *info) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT
bool BLI_ghashutil_ptrcmp(const void *a, const void *b)
BLI_INLINE bool BLI_listbase_is_empty(const struct ListBase *lb)
#define LISTBASE_FOREACH(type, var, list)
void void BLI_freelistN(struct ListBase *listbase) ATTR_NONNULL(1)
void BLI_addtail(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
MINLINE void copy_v3_v3(float r[3], const float a[3])
#define STRNCPY(dst, src)
#define SNPRINTF(dst, format,...)
Platform independent time functions.
double BLI_time_now_seconds(void)
#define UNUSED_VARS_NDEBUG(...)
void(*)(void *thunk, GPUMaterial *material) ConstructGPUMaterialFn
@ GPU_MATFLAG_LOOKDEV_HACK
void(*)(void *thunk, GPUMaterial *mat, GPUCodegenOutput *codegen) GPUCodegenCallbackFn
eGPUMaterialOptimizationStatus
@ GPU_MAT_OPTIMIZATION_READY
@ GPU_MAT_OPTIMIZATION_SUCCESS
@ GPU_MAT_OPTIMIZATION_SKIP
GPUPass *(*)(void *thunk, GPUMaterial *mat) GPUMaterialPassReplacementCallbackFn
bool GPU_link(GPUMaterial *mat, const char *name,...)
void GPU_shader_set_parent(GPUShader *shader, GPUShader *parent)
void GPU_shader_warm_cache(GPUShader *shader, int limit)
void GPU_texture_free(GPUTexture *texture)
@ GPU_TEXTURE_USAGE_SHADER_READ
GPUTexture * GPU_texture_create_2d_array(const char *name, int width, int height, int layer_len, int mip_len, eGPUTextureFormat format, eGPUTextureUsage usage, const float *data)
GPUTexture * GPU_texture_create_1d_array(const char *name, int width, int layer_len, int mip_len, eGPUTextureFormat format, eGPUTextureUsage usage, const float *data)
Read Guarded memory(de)allocation.
Provides wrapper around system-specific atomic primitives, and some extensions (faked-atomic operatio...
ATOMIC_INLINE uint32_t atomic_add_and_fetch_uint32(uint32_t *p, uint32_t x)
ATOMIC_INLINE uint32_t atomic_sub_and_fetch_uint32(uint32_t *p, uint32_t x)
struct GPUShader GPUShader
additional_info("compositor_sum_float_shared") .push_constant(Type additional_info("compositor_sum_float_shared") .push_constant(Type GPU_RGBA32F
DEGForeachIDComponentCallback callback
draw_view in_light_buf[] float
GPUPass * GPU_generate_pass(GPUMaterial *material, GPUNodeGraph *graph, eGPUMaterialEngine engine, GPUCodegenCallbackFn finalize_source_cb, void *thunk, bool optimize_graph)
void GPU_pass_release(GPUPass *pass)
void GPU_pass_acquire(GPUPass *pass)
void GPU_pass_begin_async_compilation(GPUPass *pass, const char *shname)
bool GPU_pass_compile(GPUPass *pass, const char *shname)
bool GPU_pass_async_compilation_try_finalize(GPUPass *pass)
bool GPU_pass_should_optimize(GPUPass *pass)
GPUShader * GPU_pass_shader_get(GPUPass *pass)
char * GPU_material_split_sub_function(GPUMaterial *material, eGPUType return_type, GPUNodeLink **link)
uint64_t GPU_material_uuid_get(GPUMaterial *mat)
static void gpu_material_ramp_texture_build(GPUMaterial *mat)
bool GPU_material_async_try_finalize(GPUMaterial *mat)
void GPU_material_acquire(GPUMaterial *mat)
void GPU_material_compile(GPUMaterial *mat)
ListBase GPU_material_attributes(const GPUMaterial *material)
void GPU_material_output_surface(GPUMaterial *material, GPUNodeLink *link)
GPUPass * GPU_material_get_pass(GPUMaterial *material)
void GPU_material_async_compile(GPUMaterial *mat)
bool GPU_material_has_surface_output(GPUMaterial *mat)
void GPU_material_status_set(GPUMaterial *mat, eGPUMaterialStatus status)
void GPU_material_free_single(GPUMaterial *material)
GPUTexture ** gpu_material_ramp_texture_row_set(GPUMaterial *mat, int size, const float *pixels, float *r_row)
void GPU_materials_free(Main *bmain)
void GPU_material_free(ListBase *gpumaterial)
void GPU_material_output_displacement(GPUMaterial *material, GPUNodeLink *link)
const ListBase * GPU_material_layer_attributes(const GPUMaterial *material)
void GPU_material_output_thickness(GPUMaterial *material, GPUNodeLink *link)
GPUShader * GPU_material_get_shader(GPUMaterial *material)
void GPU_material_optimize(GPUMaterial *mat)
void GPU_material_add_output_link_aov(GPUMaterial *material, GPUNodeLink *link, int hash)
bool GPU_material_optimization_ready(GPUMaterial *mat)
bool GPU_material_flag_get(const GPUMaterial *mat, eGPUMaterialFlag flag)
Scene * GPU_material_scene(GPUMaterial *material)
bool GPU_material_recalc_flag_get(GPUMaterial *mat)
GPUShader * GPU_material_get_shader_base(GPUMaterial *material)
ListBase GPU_material_textures(GPUMaterial *material)
void GPU_material_add_output_link_composite(GPUMaterial *material, GPUNodeLink *link)
bool GPU_material_sss_profile_create(GPUMaterial *material, float radii[3])
static void gpu_material_finalize(GPUMaterial *mat, bool success)
GPUMaterial * GPU_material_from_callbacks(eGPUMaterialEngine engine, ConstructGPUMaterialFn construct_function_cb, GPUCodegenCallbackFn generate_code_function_cb, void *thunk)
GPUTexture ** gpu_material_sky_texture_layer_set(GPUMaterial *mat, int width, int height, const float *pixels, float *row)
void GPU_material_release(GPUMaterial *mat)
GPUMaterial * GPU_material_from_nodetree(Scene *scene, Material *ma, bNodeTree *ntree, ListBase *gpumaterials, const char *name, eGPUMaterialEngine engine, uint64_t shader_uuid, bool is_volume_shader, bool is_lookdev, GPUCodegenCallbackFn callback, void *thunk, GPUMaterialPassReplacementCallbackFn pass_replacement_cb)
eGPUMaterialStatus GPU_material_status(GPUMaterial *mat)
void GPU_material_flag_set(GPUMaterial *mat, eGPUMaterialFlag flag)
Material * GPU_material_get_material(GPUMaterial *material)
void GPU_material_output_volume(GPUMaterial *material, GPUNodeLink *link)
eGPUMaterialFlag GPU_material_flag(const GPUMaterial *mat)
static void gpu_material_sky_texture_build(GPUMaterial *mat)
void GPU_material_optimization_status_set(GPUMaterial *mat, eGPUMaterialOptimizationStatus status)
const char * GPU_material_get_name(GPUMaterial *material)
void GPU_material_set_default(GPUMaterial *material, GPUMaterial *default_material)
const GPUUniformAttrList * GPU_material_uniform_attributes(const GPUMaterial *material)
bool GPU_material_has_displacement_output(GPUMaterial *mat)
GPUNodeGraph * gpu_material_node_graph(GPUMaterial *material)
void GPU_material_uniform_buffer_create(GPUMaterial *material, ListBase *inputs)
GPUUniformBuf * GPU_material_uniform_buffer_get(GPUMaterial *material)
bool GPU_material_has_volume_output(GPUMaterial *mat)
eGPUMaterialOptimizationStatus GPU_material_optimization_status(GPUMaterial *mat)
void gpu_node_graph_free(GPUNodeGraph *graph)
void gpu_node_graph_free_nodes(GPUNodeGraph *graph)
void *(* MEM_mallocN)(size_t len, const char *str)
void MEM_freeN(void *vmemh)
void *(* MEM_callocN)(size_t len, const char *str)
void node_tree_free_local_tree(bNodeTree *ntree)
bNodeTree * node_tree_localize(bNodeTree *ntree, ID *new_owner_id)
unsigned __int64 uint64_t
float pixels[MAX_COLOR_BAND][CM_TABLE+1][4]
GPUSkyBuilder * sky_builder
int generated_function_len
GPUColorBandBuilder * coba_builder
GPUTexture * sss_tex_profile
bool has_displacement_output
GPUUniformBuf * sss_profile
bool do_batch_compilation
eGPUMaterialOptimizationStatus optimization_status
GPUMaterial * default_mat
eGPUMaterialEngine engine
eGPUMaterialStatus status
float pixels[MAX_GPU_SKIES][GPU_SKY_WIDTH *GPU_SKY_HEIGHT][4]
float kernel[SSS_SAMPLES][4]
void * DRW_deferred_shader_remove
void * ntreeGPUMaterialNodes