Blender V5.0
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
8
9#pragma once
10
11#include <string>
12
13#include "BLI_math_base.h"
14#include "BLI_set.hh"
15
16#include "DNA_customdata_types.h" /* for eCustomDataType */
17#include "DNA_image_types.h"
18#include "DNA_listBase.h"
19
20#include "GPU_shader.hh" /* for GPUShaderCreateInfo */
21#include "GPU_texture.hh" /* for GPUSamplerState */
22
23struct GHash;
24struct GPUMaterial;
25struct GPUNodeLink;
26struct GPUNodeStack;
27struct GPUPass;
28namespace blender::gpu {
29class Texture;
30class UniformBuf;
31} // namespace blender::gpu
32struct Image;
33struct ImageUser;
34struct ListBase;
35struct Main;
36struct Material;
37struct Scene;
38struct bNode;
39struct bNodeTree;
40
44
50
56
57/* GPU_MAT_OPTIMIZATION_SKIP for cases where we do not
58 * plan to perform optimization on a given material. */
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 /* Signals that these specific closures might *not* be colorless.
87 * If this flag is not set, all closures are ensured to not be tinted. */
90
91 /* Tells the render engine the material was just compiled or updated. */
93};
95
96using GPUCodegenCallbackFn = void (*)(void *thunk,
97 GPUMaterial *mat,
98 struct GPUCodegenOutput *codegen);
104
114
117 Material *ma,
118 bNodeTree *ntree,
119 ListBase *gpumaterials,
120 const char *name,
121 eGPUMaterialEngine engine,
122 uint64_t shader_uuid,
123 bool deferred_compilation,
124 GPUCodegenCallbackFn callback,
125 void *thunk,
126 GPUMaterialPassReplacementCallbackFn pass_replacement_cb = nullptr);
127
128/* A callback passed to GPU_material_from_callbacks to construct the material graph by adding and
129 * linking the necessary GPU material nodes. */
130using ConstructGPUMaterialFn = void (*)(void *thunk, GPUMaterial *material);
131
132/* Construct a GPU material from a set of callbacks. See the callback types for more information.
133 * The given thunk will be passed as the first parameter of each callback. */
135 ConstructGPUMaterialFn construct_function_cb,
136 GPUCodegenCallbackFn generate_code_function_cb,
137 void *thunk);
138
140void GPU_material_free(ListBase *gpumaterial);
141
142void GPU_materials_free(Main *bmain);
143
147
148const char *GPU_material_get_name(GPUMaterial *material);
149
158
163
165
173
177
179
181
184
185 /* Meaningful part of the attribute set key. */
186 char name[256]; /* Multiple MAX_CUSTOMDATA_LAYER_NAME */
188 uint32_t hash_code;
189
190 /* Helper fields used by code generation. */
191 int users;
192};
193
195
196/* Requested Material Attributes and Textures */
197
199 /* Keep in sync with GPU_DATATYPE_STR */
200 /* The value indicates the number of elements in each type */
209
210 /* Values not in GPU_DATATYPE_STR */
212 GPU_TEX2D = 1002,
214 GPU_TEX3D = 1004,
215
216 /* GLSL Struct types */
218
219 /* Opengl Attributes */
220 GPU_ATTR = 3001,
221};
222
227
230 int type; /* eCustomDataType */
231 char name[/*MAX_CUSTOMDATA_LAYER_NAME*/ 68];
232 char input_name[/*GPU_MAX_SAFE_ATTR_NAME + 1*/ 12 + 1];
234 GPUDefaultValue default_value; /* Only for volumes attributes. */
235 int id;
236 int users;
251};
252
265
268
271
272 /* Meaningful part of the attribute set key. */
273 char name[/*MAX_CUSTOMDATA_LAYER_NAME*/ 68];
275 uint32_t hash_code;
277
278 /* Helper fields used by code generation. */
279 short id;
280 int users;
281};
282
284 ListBase list; /* GPUUniformAttr */
285
286 /* List length and hash code precomputed for fast lookup and comparison. */
287 unsigned int count, hash_code;
288};
289
291
292/* Functions to create GPU Materials nodes. */
293/* TODO: Move to its own header. */
294
297 float vec[4];
302 bool end;
303
304 /* Return true if the socket might contain a polychromatic value.
305 * This is a conservative heuristic that allows for optimization. */
306 bool might_be_tinted() const
307 {
308 return this->link || (this->vec[0] != this->vec[1]) || (this->vec[1] != this->vec[2]);
309 }
310
311 bool socket_not_zero() const
312 {
313 return this->link || (clamp_f(this->vec[0], 0.0f, 1.0f) > 1e-5f);
314 }
315
316 bool socket_not_one() const
317 {
318 return this->link || (clamp_f(this->vec[0], 0.0f, 1.0f) < 1.0f - 1e-5f);
319 }
320
321 bool socket_is_one() const
322 {
323 return !this->link && (clamp_f(this->vec[0], 0.0f, 1.0f) > 0.9999f);
324 }
325};
326
328 std::string serialized;
330
331 bool empty() const
332 {
333 return serialized.empty();
334 }
335
336 std::string serialized_or_default(std::string value) const
337 {
338 return serialized.empty() ? value : serialized;
339 }
340};
341
354
355GPUNodeLink *GPU_constant(const float *num);
356GPUNodeLink *GPU_uniform(const float *num);
369 eCustomDataType type,
370 const char *name,
371 GPUDefaultValue default_value);
373 const char *name,
374 bool use_dupli,
375 uint32_t *r_hash);
378 Image *ima,
379 ImageUser *iuser,
380 GPUSamplerState sampler_state);
382 Image *ima,
383 ImageUser *iuser,
384 GPUSamplerState sampler_state,
385 GPUNodeLink **r_image_tiled_link,
386 GPUNodeLink **r_image_tiled_mapping_link);
388 int width,
389 int height,
390 const float *pixels,
391 float *layer,
392 GPUSamplerState sampler_state);
393GPUNodeLink *GPU_color_band(GPUMaterial *mat, int size, float *pixels, float *r_row);
394
400GPUNodeLink *GPU_differentiate_float_function(const char *function_name, const float filter_width);
401
402bool GPU_link(GPUMaterial *mat, const char *name, ...);
404 const bNode *node,
405 const char *name,
408 ...);
409
410bool GPU_stack_link_zone(GPUMaterial *material,
411 const bNode *bnode,
412 const char *name,
415 int zone_index,
416 bool is_zone_end,
417 int in_argument_count,
418 int out_argument_count);
419
424
426
428
438 GPUType return_type,
439 GPUNodeLink **link);
440
443
444GHash *GPU_uniform_attr_list_hash_new(const char *info);
MINLINE float clamp_f(float value, float min, float max)
ATTR_WARN_UNUSED_RESULT const size_t num
#define ENUM_OPERATORS(_type, _max)
These structs are the foundation for all linked lists in the library system.
GPUDefaultValue
@ GPU_DEFAULT_1
@ GPU_DEFAULT_0
void(*)(void *thunk, GPUMaterial *material) ConstructGPUMaterialFn
bool GPU_stack_link(GPUMaterial *mat, const bNode *node, const char *name, GPUNodeStack *in, GPUNodeStack *out,...)
uint64_t GPU_material_uuid_get(GPUMaterial *mat)
GPUNodeLink * GPU_constant(const float *num)
ListBase GPU_material_attributes(const GPUMaterial *material)
void GPU_material_output_surface(GPUMaterial *material, GPUNodeLink *link)
GPUNodeLink * GPU_attribute_hair_length(GPUMaterial *mat)
blender::gpu::Shader * GPU_material_get_shader(GPUMaterial *material)
GPUPass * GPU_material_get_pass(GPUMaterial *material)
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_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_ENGINE_MAX
@ GPU_MAT_COMPOSITOR
@ GPU_MAT_EEVEE
void GPU_material_output_thickness(GPUMaterial *material, GPUNodeLink *link)
GPUMaterialStatus
@ GPU_MAT_QUEUED
@ GPU_MAT_FAILED
@ GPU_MAT_SUCCESS
void GPU_material_add_output_link_aov(GPUMaterial *material, GPUNodeLink *link, int hash)
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=nullptr)
bool GPU_material_flag_get(const GPUMaterial *mat, eGPUMaterialFlag flag)
GPUNodeLink * GPU_color_band(GPUMaterial *mat, int size, float *pixels, float *r_row)
ListBase GPU_material_textures(GPUMaterial *material)
GPUType
@ 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
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)
eGPUMaterialFlag
@ GPU_MATFLAG_UPDATED
@ GPU_MATFLAG_REFRACTION_MAYBE_COLORED
@ 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_REFLECTION_MAYBE_COLORED
@ GPU_MATFLAG_GLOSSY
@ GPU_MATFLAG_COAT
@ GPU_MATFLAG_AO
@ GPU_MATFLAG_REFRACT
@ GPU_MATFLAG_BARYCENTRIC
@ GPU_MATFLAG_TRANSLUCENT
@ GPU_MATFLAG_HOLDOUT
@ GPU_MATFLAG_DIFFUSE
@ GPU_MATFLAG_TRANSPARENT
@ GPU_MATFLAG_SUBSURFACE
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)
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)
uint64_t GPU_material_compilation_timestamp(GPUMaterial *mat)
GPUNodeLink * GPU_image_sky(GPUMaterial *mat, int width, int height, const float *pixels, float *layer, GPUSamplerState sampler_state)
eGPUMaterialOptimizationStatus
@ GPU_MAT_OPTIMIZATION_QUEUED
@ GPU_MAT_OPTIMIZATION_SUCCESS
@ GPU_MAT_OPTIMIZATION_SKIP
GPUPass *(*)(void *thunk, GPUMaterial *mat) GPUMaterialPassReplacementCallbackFn
bool GPU_stack_link_zone(GPUMaterial *material, const bNode *bnode, const char *name, GPUNodeStack *in, GPUNodeStack *out, int zone_index, bool is_zone_end, int in_argument_count, int out_argument_count)
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)
char * GPU_material_split_sub_function(GPUMaterial *material, GPUType return_type, GPUNodeLink **link)
GPUNodeLink * GPU_attribute(GPUMaterial *mat, eCustomDataType type, const char *name)
const GPUUniformAttrList * GPU_material_uniform_attributes(const GPUMaterial *material)
GPUNodeLink * GPU_differentiate_float_function(const char *function_name, const float filter_width)
GPUNodeLink * GPU_attribute_hair_intercept(GPUMaterial *mat)
bool GPU_material_has_displacement_output(GPUMaterial *mat)
GPUNodeLink * GPU_attribute_with_default(GPUMaterial *mat, eCustomDataType type, const char *name, GPUDefaultValue default_value)
void(*)(void *thunk, GPUMaterial *mat, struct GPUCodegenOutput *codegen) GPUCodegenCallbackFn
void GPU_material_uniform_buffer_create(GPUMaterial *material, ListBase *inputs)
bool GPU_link(GPUMaterial *mat, const char *name,...)
bool GPU_material_has_volume_output(GPUMaterial *mat)
eGPUMaterialOptimizationStatus GPU_material_optimization_status(GPUMaterial *mat)
GPUNodeLink * GPU_uniform(const float *num)
unsigned long long int uint64_t
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
Definition btDbvt.cpp:52
#define in
#define out
static blender::bke::bNodeSocketTemplate inputs[]
#define hash
Definition noise_c.cc:154
const char * name
blender::Vector< GPUGraphOutput > material_functions
GPUGraphOutput displacement
GPUGraphOutput volume
GPUGraphOutput composite
GPUGraphOutput thickness
std::string attr_load
GPUShaderCreateInfo * create_info
GPUGraphOutput surface
std::string serialized
std::string serialized_or_default(std::string value) const
blender::Vector< blender::StringRefNull > dependencies
bool empty() const
char name[256]
GPULayerAttr * next
uint32_t hash_code
GPULayerAttr * prev
GPUMaterialAttribute * prev
GPUMaterialAttribute * next
GPUDefaultValue default_value
blender::Vector< Error > errors
blender::gpu::Texture ** sky
GPUMaterialTexture * prev
GPUSamplerState sampler_state
char tiled_mapping_name[32]
GPUMaterialTexture * next
blender::gpu::Texture ** colorband
bool socket_not_one() const
bool might_be_tinted() const
bool socket_is_one() const
bool socket_not_zero() const
GPUNodeLink * link
unsigned int hash_code
GPUUniformAttr * prev
GPUUniformAttr * next
uint8_t flag
Definition wm_window.cc:145