50#define MAX_COLOR_BAND 128
51#define MAX_GPU_SKIES 8
111 if (
pass !=
nullptr) {
114 if (
ubo !=
nullptr) {
138 bool deferred_compilation,
146 if (mat->
uuid == shader_uuid && mat->
engine == engine) {
147 if (!deferred_compilation) {
156 GPUMaterial *mat = MEM_new<GPUMaterial>(__func__, engine);
158 mat->
uuid = shader_uuid;
181 if (
GPUPass *default_pass = pass_replacement_cb ? pass_replacement_cb(thunk, mat) :
nullptr) {
182 mat->
pass = default_pass;
194 mat, &mat->
graph, mat->
name.c_str(), engine, deferred_compilation, callback, thunk,
false);
201 mat, &mat->
graph, mat->
name.c_str(), engine,
true, callback, thunk,
true);
225 GPUMaterial *material = MEM_new<GPUMaterial>(__func__, engine);
228 construct_function_cb(thunk, material);
239 generate_code_function_cb,
251 generate_code_function_cb,
263 MEM_delete(material);
290 return material->
name.c_str();
392 return material->
ubo;
408 return attrs->
count > 0 ? attrs :
nullptr;
419 return &material->
graph;
425 GPUMaterial *mat,
int width,
int height,
const float *pixels,
float *row)
442 printf(
"Too many sky textures in shader!\n");
469 *r_row =
float(layer);
472 printf(
"Too many color band in shader! Remove some Curve, Black Body or Color Ramp Node.\n");
476 memcpy(dst, pixels,
sizeof(
float) * (
CM_TABLE + 1) * 4);
495 blender::gpu::TextureFormat::SFLOAT_16_16_16_16,
497 (
float *)builder->
pixels);
514 blender::gpu::TextureFormat::SFLOAT_32_32_32_32,
566 compositor_link->
outlink = link;
575 switch (return_type) {
577 GPU_link(material,
"set_value", *link, link);
580 GPU_link(material,
"set_rgb", *link, link);
583 GPU_link(material,
"set_rgba", *link, link);
595 return func_link->
name;
void BKE_id_free(Main *bmain, void *idv)
General operations, lookup, etc. for materials.
void BKE_material_defaults_free_gpu()
#define BLI_assert_unreachable()
#define LISTBASE_FOREACH(type, var, list)
BLI_INLINE bool BLI_listbase_is_empty(const ListBase *lb)
void void BLI_freelistN(ListBase *listbase) ATTR_NONNULL(1)
void BLI_addtail(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
#define SNPRINTF(dst, format,...)
Platform independent time functions.
#define UNUSED_VARS_NDEBUG(...)
void(*)(void *thunk, GPUMaterial *material) ConstructGPUMaterialFn
eGPUMaterialOptimizationStatus
@ GPU_MAT_OPTIMIZATION_QUEUED
@ GPU_MAT_OPTIMIZATION_SUCCESS
@ GPU_MAT_OPTIMIZATION_SKIP
GPUPass *(*)(void *thunk, GPUMaterial *mat) GPUMaterialPassReplacementCallbackFn
void(*)(void *thunk, GPUMaterial *mat, struct GPUCodegenOutput *codegen) GPUCodegenCallbackFn
bool GPU_link(GPUMaterial *mat, const char *name,...)
blender::gpu::Shader * GPU_pass_shader_get(GPUPass *pass)
void GPU_pass_ensure_its_ready(GPUPass *pass)
GPUPassStatus GPU_pass_status(GPUPass *pass)
void GPU_pass_release(GPUPass *pass)
void GPU_pass_acquire(GPUPass *pass)
GPUPass * GPU_generate_pass(GPUMaterial *material, GPUNodeGraph *graph, const char *debug_name, eGPUMaterialEngine engine, bool deferred_compilation, GPUCodegenCallbackFn finalize_source_cb, void *thunk, bool optimize_graph)
uint64_t GPU_pass_compilation_timestamp(GPUPass *pass)
bool GPU_pass_should_optimize(GPUPass *pass)
blender::gpu::Texture * GPU_texture_create_2d_array(const char *name, int width, int height, int layer_len, int mip_len, blender::gpu::TextureFormat format, eGPUTextureUsage usage, const float *data)
blender::gpu::Texture * GPU_texture_create_1d_array(const char *name, int width, int layer_len, int mip_len, blender::gpu::TextureFormat format, eGPUTextureUsage usage, const float *data)
@ GPU_TEXTURE_USAGE_SHADER_READ
void GPU_texture_free(blender::gpu::Texture *texture)
Read Guarded memory(de)allocation.
Provides wrapper around system-specific atomic primitives, and some extensions (faked-atomic operatio...
unsigned long long int uint64_t
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
GPUMaterialFromNodeTreeResult GPU_material_from_nodetree(Material *ma, bNodeTree *ntree, ListBase *gpumaterials, const char *name, eGPUMaterialEngine engine, uint64_t shader_uuid, bool deferred_compilation, GPUCodegenCallbackFn callback, void *thunk, GPUMaterialPassReplacementCallbackFn pass_replacement_cb)
uint64_t GPU_material_uuid_get(GPUMaterial *mat)
static void gpu_material_ramp_texture_build(GPUMaterial *mat)
ListBase GPU_material_attributes(const GPUMaterial *material)
void GPU_material_output_surface(GPUMaterial *material, GPUNodeLink *link)
blender::gpu::Shader * GPU_material_get_shader(GPUMaterial *material)
GPUPass * GPU_material_get_pass(GPUMaterial *material)
bool GPU_material_has_surface_output(GPUMaterial *mat)
void GPU_material_free_single(GPUMaterial *material)
blender::gpu::Texture ** 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)
void GPU_material_add_output_link_aov(GPUMaterial *material, GPUNodeLink *link, int hash)
bool GPU_material_flag_get(const GPUMaterial *mat, eGPUMaterialFlag flag)
ListBase GPU_material_textures(GPUMaterial *material)
void GPU_material_add_output_link_composite(GPUMaterial *material, GPUNodeLink *link)
GPUMaterialStatus GPU_material_status(GPUMaterial *mat)
GPUMaterial * GPU_material_from_callbacks(eGPUMaterialEngine engine, ConstructGPUMaterialFn construct_function_cb, GPUCodegenCallbackFn generate_code_function_cb, void *thunk)
blender::gpu::Texture ** gpu_material_sky_texture_layer_set(GPUMaterial *mat, int width, int height, const float *pixels, float *row)
void GPU_material_flag_set(GPUMaterial *mat, eGPUMaterialFlag flag)
blender::gpu::UniformBuf * GPU_material_uniform_buffer_get(GPUMaterial *material)
Material * GPU_material_get_material(GPUMaterial *material)
void GPU_material_output_volume(GPUMaterial *material, GPUNodeLink *link)
eGPUMaterialFlag GPU_material_flag(const GPUMaterial *mat)
uint64_t GPU_material_compilation_timestamp(GPUMaterial *mat)
static void gpu_material_sky_texture_build(GPUMaterial *mat)
const char * GPU_material_get_name(GPUMaterial *material)
char * GPU_material_split_sub_function(GPUMaterial *material, GPUType return_type, GPUNodeLink **link)
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)
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_callocN(size_t len, const char *str)
void MEM_freeN(void *vmemh)
static void error(const char *str)
bNodeTree * node_tree_add_tree(Main *bmain, StringRef name, StringRef idname)
bool inline_shader_node_tree(const bNodeTree &src_tree, bNodeTree &dst_tree, InlineShaderNodeTreeParams ¶ms)
static blender::bke::bNodeSocketTemplate inputs[]
float pixels[MAX_COLOR_BAND][CM_TABLE+1][4]
GPUSkyBuilder * sky_builder
int generated_function_len
GPUColorBandBuilder * coba_builder
bool has_displacement_output
GPUMaterial(eGPUMaterialEngine engine)
blender::gpu::Texture * coba_tex
Material * source_material
blender::gpu::Texture * sky_tex
blender::gpu::UniformBuf * ubo
eGPUMaterialEngine engine
ListBase outlink_compositor
GPUNodeLink * outlink_displacement
GPUNodeLink * outlink_thickness
GPUNodeLink * outlink_volume
GPUNodeLink * outlink_surface
GPUUniformAttrList uniform_attrs
ListBase material_functions
float pixels[MAX_GPU_SKIES][GPU_SKY_WIDTH *GPU_SKY_HEIGHT][4]
bool allow_preserving_repeat_zones
Vector< ErrorMessage > r_error_messages
void * ntreeGPUMaterialNodes