Blender V4.3
GPU_material.hh
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2005 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
9#pragma once
10
11#include <string>
12
13#include "DNA_customdata_types.h" /* for eCustomDataType */
14#include "DNA_image_types.h"
15#include "DNA_listBase.h"
16
17#include "BLI_sys_types.h" /* for bool */
18
19#include "GPU_shader.hh" /* for GPUShaderCreateInfo */
20#include "GPU_texture.hh" /* for GPUSamplerState */
21
22struct GHash;
23struct GPUMaterial;
24struct GPUNodeLink;
25struct GPUNodeStack;
26struct GPUPass;
27struct GPUTexture;
28struct GPUUniformBuf;
29struct Image;
30struct ImageUser;
31struct ListBase;
32struct Main;
33struct Material;
34struct Scene;
35struct bNode;
36struct bNodeTree;
37
38/* Functions to create GPU Materials nodes. */
39
41 /* Keep in sync with GPU_DATATYPE_STR */
42 /* The value indicates the number of elements in each type */
51
52 /* Values not in GPU_DATATYPE_STR */
54 GPU_TEX2D = 1002,
56 GPU_TEX3D = 1004,
57
58 /* GLSL Struct types */
60
61 /* Opengl Attributes */
62 GPU_ATTR = 3001,
63};
64
74 GPU_MATFLAG_AO = (1 << 8),
75 /* Signals the presence of multiple reflection closures. */
76 GPU_MATFLAG_COAT = (1 << 9),
78
81
83 GPU_MATFLAG_AOV = (1 << 19),
84
86
87 /* Tells the render engine the material was just compiled or updated. */
89
90 /* HACK(fclem) Tells the environment texture node to not bail out if empty. */
92};
93
95
105
112
113/* GPU_MAT_OPTIMIZATION_SKIP for cases where we do not
114 * plan to perform optimization on a given material. */
121
126
128 std::string attr_load;
129 /* Node-tree functions calls. */
130 std::string displacement;
131 std::string surface;
132 std::string volume;
133 std::string thickness;
134 std::string composite;
136
137 GPUShaderCreateInfo *create_info;
138};
139
140using GPUCodegenCallbackFn = void (*)(void *thunk, GPUMaterial *mat, GPUCodegenOutput *codegen);
146
147GPUNodeLink *GPU_constant(const float *num);
148GPUNodeLink *GPU_uniform(const float *num);
149GPUNodeLink *GPU_attribute(GPUMaterial *mat, eCustomDataType type, const char *name);
160 eCustomDataType type,
161 const char *name,
162 eGPUDefaultValue default_value);
164 const char *name,
165 bool use_dupli,
166 uint32_t *r_hash);
167GPUNodeLink *GPU_layer_attribute(GPUMaterial *mat, const char *name);
169 Image *ima,
170 ImageUser *iuser,
171 GPUSamplerState sampler_state);
173 Image *ima,
174 ImageUser *iuser,
175 GPUSamplerState sampler_state,
176 GPUNodeLink **r_image_tiled_link,
177 GPUNodeLink **r_image_tiled_mapping_link);
179 int width,
180 int height,
181 const float *pixels,
182 float *layer,
183 GPUSamplerState sampler_state);
184GPUNodeLink *GPU_color_band(GPUMaterial *mat, int size, float *pixels, float *r_row);
185
191GPUNodeLink *GPU_differentiate_float_function(const char *function_name);
192
193bool GPU_link(GPUMaterial *mat, const char *name, ...);
195 const bNode *node,
196 const char *name,
197 GPUNodeStack *in,
198 GPUNodeStack *out,
199 ...);
200
205
207
209
219 eGPUType return_type,
220 GPUNodeLink **link);
221
222bool GPU_material_sss_profile_create(GPUMaterial *material, float radii[3]);
232
234 Scene *scene,
235 Material *ma,
236 bNodeTree *ntree,
237 ListBase *gpumaterials,
238 const char *name,
239 eGPUMaterialEngine engine,
240 uint64_t shader_uuid,
241 bool is_volume_shader,
242 bool is_lookdev,
244 void *thunk,
245 GPUMaterialPassReplacementCallbackFn pass_replacement_cb = nullptr);
246
249void GPU_material_free(ListBase *gpumaterial);
250
254
257
258void GPU_materials_free(Main *bmain);
259
266const char *GPU_material_get_name(GPUMaterial *material);
267
275
285
292
309void GPU_material_set_default(GPUMaterial *material, GPUMaterial *default_material);
310
311GPUUniformBuf *GPU_material_uniform_buffer_get(GPUMaterial *material);
318
322
328
332
333/* Requested Material Attributes and Textures */
334
337 int type; /* eCustomDataType */
338 char name[68]; /* MAX_CUSTOMDATA_LAYER_NAME */
339 char input_name[12 + 1]; /* GPU_MAX_SAFE_ATTR_NAME + 1 */
341 eGPUDefaultValue default_value; /* Only for volumes attributes. */
342 int id;
343 int users;
354};
355
361 GPUTexture **colorband;
362 GPUTexture **sky;
363 char sampler_name[32]; /* Name of sampler in GLSL. */
364 char tiled_mapping_name[32]; /* Name of tile mapping sampler in GLSL. */
365 int users;
367};
368
371
374
375 /* Meaningful part of the attribute set key. */
376 char name[68]; /* MAX_CUSTOMDATA_LAYER_NAME */
380
381 /* Helper fields used by code generation. */
382 short id;
383 int users;
384};
385
387 ListBase list; /* GPUUniformAttr */
388
389 /* List length and hash code precomputed for fast lookup and comparison. */
390 unsigned int count, hash_code;
391};
392
394
395GHash *GPU_uniform_attr_list_hash_new(const char *info);
398
401
402 /* Meaningful part of the attribute set key. */
403 char name[68]; /* MAX_CUSTOMDATA_LAYER_NAME */
406
407 /* Helper fields used by code generation. */
408 int users;
409};
410
412
413/* A callback passed to GPU_material_from_callbacks to construct the material graph by adding and
414 * linking the necessary GPU material nodes. */
415using ConstructGPUMaterialFn = void (*)(void *thunk, GPUMaterial *material);
416
417/* Construct a GPU material from a set of callbacks. See the callback types for more information.
418 * The given thunk will be passed as the first parameter of each callback. */
420 ConstructGPUMaterialFn construct_function_cb,
421 GPUCodegenCallbackFn generate_code_function_cb,
422 void *thunk);
#define ENUM_OPERATORS(_type, _max)
These structs are the foundation for all linked lists in the library system.
void(*)(void *thunk, GPUMaterial *material) ConstructGPUMaterialFn
bool GPU_stack_link(GPUMaterial *mat, const bNode *node, const char *name, GPUNodeStack *in, GPUNodeStack *out,...)
char * GPU_material_split_sub_function(GPUMaterial *material, eGPUType return_type, GPUNodeLink **link)
eGPUDefaultValue
@ GPU_DEFAULT_1
@ GPU_DEFAULT_0
uint64_t GPU_material_uuid_get(GPUMaterial *mat)
GPUNodeLink * GPU_constant(const float *num)
bool GPU_material_async_try_finalize(GPUMaterial *mat)
void GPU_material_acquire(GPUMaterial *mat)
void GPU_material_compile(GPUMaterial *mat)
void GPU_pass_cache_garbage_collect()
ListBase GPU_material_attributes(const GPUMaterial *material)
void GPU_material_output_surface(GPUMaterial *material, GPUNodeLink *link)
GPUNodeLink * GPU_attribute_hair_length(GPUMaterial *mat)
GPUPass * GPU_material_get_pass(GPUMaterial *material)
void GPU_material_async_compile(GPUMaterial *mat)
bool GPU_material_has_surface_output(GPUMaterial *mat)
GPUNodeLink * GPU_layer_attribute(GPUMaterial *mat, const char *name)
GPUNodeLink * GPU_attribute_default_color(GPUMaterial *mat)
void GPU_material_status_set(GPUMaterial *mat, eGPUMaterialStatus status)
void GPU_material_free_single(GPUMaterial *material)
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)
eGPUMaterialEngine
@ GPU_MAT_EEVEE_LEGACY
@ GPU_MAT_COMPOSITOR
@ GPU_MAT_EEVEE
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)
GPUNodeLink * GPU_color_band(GPUMaterial *mat, int size, float *pixels, float *r_row)
GPUShader * GPU_material_get_shader_base(GPUMaterial *material)
ListBase GPU_material_textures(GPUMaterial *material)
void GPU_pass_cache_init()
void GPU_material_add_output_link_composite(GPUMaterial *material, GPUNodeLink *link)
bool GPU_material_sss_profile_create(GPUMaterial *material, float radii[3])
GPUMaterial * GPU_material_from_callbacks(eGPUMaterialEngine engine, ConstructGPUMaterialFn construct_function_cb, GPUCodegenCallbackFn generate_code_function_cb, void *thunk)
void GPU_material_release(GPUMaterial *mat)
eGPUMaterialStatus GPU_material_status(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=nullptr)
eGPUMaterialFlag
@ GPU_MATFLAG_UPDATED
@ GPU_MATFLAG_VOLUME_SCATTER
@ GPU_MATFLAG_AOV
@ GPU_MATFLAG_SHADER_TO_RGBA
@ GPU_MATFLAG_VOLUME_ABSORPTION
@ GPU_MATFLAG_EMISSION
@ GPU_MATFLAG_OBJECT_INFO
@ GPU_MATFLAG_GLOSSY
@ GPU_MATFLAG_COAT
@ GPU_MATFLAG_AO
@ GPU_MATFLAG_REFRACT
@ GPU_MATFLAG_BARYCENTRIC
@ GPU_MATFLAG_LOOKDEV_HACK
@ GPU_MATFLAG_TRANSLUCENT
@ GPU_MATFLAG_HOLDOUT
@ GPU_MATFLAG_DIFFUSE
@ GPU_MATFLAG_TRANSPARENT
@ GPU_MATFLAG_SUBSURFACE
void GPU_material_flag_set(GPUMaterial *mat, eGPUMaterialFlag flag)
eGPUMaterialStatus
@ GPU_MAT_QUEUED
@ GPU_MAT_FAILED
@ GPU_MAT_SUCCESS
@ GPU_MAT_CREATED
void(*)(void *thunk, GPUMaterial *mat, GPUCodegenOutput *codegen) GPUCodegenCallbackFn
Material * GPU_material_get_material(GPUMaterial *material)
GPUNodeLink * GPU_image(GPUMaterial *mat, Image *ima, ImageUser *iuser, GPUSamplerState sampler_state)
void GPU_uniform_attr_list_copy(GPUUniformAttrList *dest, const GPUUniformAttrList *src)
GHash * GPU_uniform_attr_list_hash_new(const char *info)
void GPU_uniform_attr_list_free(GPUUniformAttrList *set)
void GPU_material_output_volume(GPUMaterial *material, GPUNodeLink *link)
eGPUMaterialFlag GPU_material_flag(const GPUMaterial *mat)
GPUNodeLink * GPU_uniform_attribute(GPUMaterial *mat, const char *name, bool use_dupli, uint32_t *r_hash)
GPUNodeLink * GPU_image_sky(GPUMaterial *mat, int width, int height, const float *pixels, float *layer, GPUSamplerState sampler_state)
eGPUMaterialOptimizationStatus
@ GPU_MAT_OPTIMIZATION_READY
@ GPU_MAT_OPTIMIZATION_QUEUED
@ GPU_MAT_OPTIMIZATION_SUCCESS
@ GPU_MAT_OPTIMIZATION_SKIP
GPUPass *(*)(void *thunk, GPUMaterial *mat) GPUMaterialPassReplacementCallbackFn
void GPU_material_optimization_status_set(GPUMaterial *mat, eGPUMaterialOptimizationStatus status)
const char * GPU_material_get_name(GPUMaterial *material)
void GPU_image_tiled(GPUMaterial *mat, Image *ima, ImageUser *iuser, GPUSamplerState sampler_state, GPUNodeLink **r_image_tiled_link, GPUNodeLink **r_image_tiled_mapping_link)
GPUNodeLink * GPU_attribute_with_default(GPUMaterial *mat, eCustomDataType type, const char *name, eGPUDefaultValue default_value)
GPUNodeLink * GPU_attribute(GPUMaterial *mat, eCustomDataType type, const char *name)
void GPU_material_set_default(GPUMaterial *material, GPUMaterial *default_material)
eGPUType
@ GPU_ATTR
@ GPU_VEC2
@ GPU_MAT4
@ GPU_TEX1D_ARRAY
@ GPU_MAX_CONSTANT_DATA
@ GPU_TEX2D_ARRAY
@ GPU_TEX2D
@ GPU_VEC4
@ GPU_NONE
@ GPU_CLOSURE
@ GPU_VEC3
@ GPU_MAT3
@ GPU_TEX3D
@ GPU_FLOAT
const GPUUniformAttrList * GPU_material_uniform_attributes(const GPUMaterial *material)
bool GPU_material_has_displacement_output(GPUMaterial *mat)
void GPU_pass_cache_free()
GPUNodeLink * GPU_differentiate_float_function(const char *function_name)
void GPU_material_uniform_buffer_create(GPUMaterial *material, ListBase *inputs)
bool GPU_link(GPUMaterial *mat, const char *name,...)
GPUUniformBuf * GPU_material_uniform_buffer_get(GPUMaterial *material)
bool GPU_material_has_volume_output(GPUMaterial *mat)
eGPUMaterialOptimizationStatus GPU_material_optimization_status(GPUMaterial *mat)
GPUNodeLink * GPU_uniform(const float *num)
struct GPUShader GPUShader
Material material
DEGForeachIDComponentCallback callback
#define hash
Definition noise.c:154
unsigned int uint32_t
Definition stdint.h:80
unsigned __int64 uint64_t
Definition stdint.h:90
std::string surface
std::string thickness
std::string displacement
std::string volume
std::string attr_load
std::string material_functions
std::string composite
GPUShaderCreateInfo * create_info
GPULayerAttr * next
uint32_t hash_code
GPULayerAttr * prev
GPUMaterialAttribute * prev
eGPUDefaultValue default_value
GPUMaterialAttribute * next
GPUMaterialTexture * prev
GPUSamplerState sampler_state
GPUTexture ** sky
char tiled_mapping_name[32]
GPUTexture ** colorband
GPUMaterialTexture * next
eGPUType type
GPUNodeLink * link
unsigned int hash_code
GPUUniformAttr * prev
GPUUniformAttr * next
uint8_t flag
Definition wm_window.cc:138