Blender V4.5
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 "DNA_customdata_types.h" /* for eCustomDataType */
14#include "DNA_image_types.h"
15#include "DNA_listBase.h"
16
17#include "GPU_shader.hh" /* for GPUShaderCreateInfo */
18#include "GPU_texture.hh" /* for GPUSamplerState */
19
20struct GHash;
21struct GPUMaterial;
22struct GPUNodeLink;
23struct GPUNodeStack;
24struct GPUPass;
25struct GPUTexture;
26struct GPUUniformBuf;
27struct Image;
28struct ImageUser;
29struct ListBase;
30struct Main;
31struct Material;
32struct Scene;
33struct bNode;
34struct bNodeTree;
35
39
45
51
52/* GPU_MAT_OPTIMIZATION_SKIP for cases where we do not
53 * plan to perform optimization on a given material. */
59
69 GPU_MATFLAG_AO = (1 << 8),
70 /* Signals the presence of multiple reflection closures. */
71 GPU_MATFLAG_COAT = (1 << 9),
73
76
78 GPU_MATFLAG_AOV = (1 << 19),
79
81
82 /* Tells the render engine the material was just compiled or updated. */
84};
86
87using GPUCodegenCallbackFn = void (*)(void *thunk,
88 GPUMaterial *mat,
89 struct GPUCodegenOutput *codegen);
95
98 Material *ma,
99 bNodeTree *ntree,
100 ListBase *gpumaterials,
101 const char *name,
102 eGPUMaterialEngine engine,
103 uint64_t shader_uuid,
104 bool deferred_compilation,
105 GPUCodegenCallbackFn callback,
106 void *thunk,
107 GPUMaterialPassReplacementCallbackFn pass_replacement_cb = nullptr);
108
109/* A callback passed to GPU_material_from_callbacks to construct the material graph by adding and
110 * linking the necessary GPU material nodes. */
111using ConstructGPUMaterialFn = void (*)(void *thunk, GPUMaterial *material);
112
113/* Construct a GPU material from a set of callbacks. See the callback types for more information.
114 * The given thunk will be passed as the first parameter of each callback. */
116 ConstructGPUMaterialFn construct_function_cb,
117 GPUCodegenCallbackFn generate_code_function_cb,
118 void *thunk);
119
121void GPU_material_free(ListBase *gpumaterial);
122
123void GPU_materials_free(Main *bmain);
124
127GPUShader *GPU_material_get_shader(GPUMaterial *material);
128
129const char *GPU_material_get_name(GPUMaterial *material);
130
139
144
146
147GPUUniformBuf *GPU_material_uniform_buffer_get(GPUMaterial *material);
154
158
160
162
165
166 /* Meaningful part of the attribute set key. */
167 char name[256]; /* Multiple MAX_CUSTOMDATA_LAYER_NAME */
169 uint32_t hash_code;
170
171 /* Helper fields used by code generation. */
172 int users;
173};
174
176
177/* Requested Material Attributes and Textures */
178
180 /* Keep in sync with GPU_DATATYPE_STR */
181 /* The value indicates the number of elements in each type */
190
191 /* Values not in GPU_DATATYPE_STR */
193 GPU_TEX2D = 1002,
195 GPU_TEX3D = 1004,
196
197 /* GLSL Struct types */
199
200 /* Opengl Attributes */
201 GPU_ATTR = 3001,
202};
203
208
211 int type; /* eCustomDataType */
212 char name[/*MAX_CUSTOMDATA_LAYER_NAME*/ 68];
213 char input_name[/*GPU_MAX_SAFE_ATTR_NAME + 1*/ 12 + 1];
215 eGPUDefaultValue default_value; /* Only for volumes attributes. */
216 int id;
217 int users;
228};
229
235 GPUTexture **colorband;
236 GPUTexture **sky;
237 char sampler_name[32]; /* Name of sampler in GLSL. */
238 char tiled_mapping_name[32]; /* Name of tile mapping sampler in GLSL. */
239 int users;
241};
242
245
248
249 /* Meaningful part of the attribute set key. */
250 char name[/*MAX_CUSTOMDATA_LAYER_NAME*/ 68];
252 uint32_t hash_code;
254
255 /* Helper fields used by code generation. */
256 short id;
257 int users;
258};
259
261 ListBase list; /* GPUUniformAttr */
262
263 /* List length and hash code precomputed for fast lookup and comparison. */
264 unsigned int count, hash_code;
265};
266
268
269/* Functions to create GPU Materials nodes. */
270/* TODO: Move to its own header. */
271
281
283 std::string attr_load;
284 /* Node-tree functions calls. */
285 std::string displacement;
286 std::string surface;
287 std::string volume;
288 std::string thickness;
289 std::string composite;
291
292 GPUShaderCreateInfo *create_info;
293};
294
295GPUNodeLink *GPU_constant(const float *num);
296GPUNodeLink *GPU_uniform(const float *num);
297GPUNodeLink *GPU_attribute(GPUMaterial *mat, eCustomDataType type, const char *name);
308 eCustomDataType type,
309 const char *name,
310 eGPUDefaultValue default_value);
312 const char *name,
313 bool use_dupli,
314 uint32_t *r_hash);
315GPUNodeLink *GPU_layer_attribute(GPUMaterial *mat, const char *name);
317 Image *ima,
318 ImageUser *iuser,
319 GPUSamplerState sampler_state);
321 Image *ima,
322 ImageUser *iuser,
323 GPUSamplerState sampler_state,
324 GPUNodeLink **r_image_tiled_link,
325 GPUNodeLink **r_image_tiled_mapping_link);
327 int width,
328 int height,
329 const float *pixels,
330 float *layer,
331 GPUSamplerState sampler_state);
332GPUNodeLink *GPU_color_band(GPUMaterial *mat, int size, float *pixels, float *r_row);
333
339GPUNodeLink *GPU_differentiate_float_function(const char *function_name, const float filter_width);
340
341bool GPU_link(GPUMaterial *mat, const char *name, ...);
343 const bNode *node,
344 const char *name,
347 ...);
348
353
355
357
367 eGPUType return_type,
368 GPUNodeLink **link);
369
372
373GHash *GPU_uniform_attr_list_hash_new(const char *info);
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.
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)
void(*)(void *thunk, GPUMaterial *mat, struct GPUCodegenOutput *codegen) GPUCodegenCallbackFn
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)
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)
GPUShader * GPU_material_get_shader(GPUMaterial *material)
void GPU_material_add_output_link_aov(GPUMaterial *material, GPUNodeLink *link, int hash)
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)
void GPU_material_add_output_link_composite(GPUMaterial *material, GPUNodeLink *link)
GPUMaterial * GPU_material_from_callbacks(eGPUMaterialEngine engine, ConstructGPUMaterialFn construct_function_cb, GPUCodegenCallbackFn generate_code_function_cb, void *thunk)
eGPUMaterialStatus GPU_material_status(GPUMaterial *mat)
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_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
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)
GPUMaterial * 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)
eGPUMaterialOptimizationStatus
@ GPU_MAT_OPTIMIZATION_QUEUED
@ GPU_MAT_OPTIMIZATION_SUCCESS
@ GPU_MAT_OPTIMIZATION_SKIP
GPUPass *(*)(void *thunk, GPUMaterial *mat) GPUMaterialPassReplacementCallbackFn
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)
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)
GPUNodeLink * GPU_differentiate_float_function(const char *function_name, const float filter_width)
bool GPU_material_has_displacement_output(GPUMaterial *mat)
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)
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
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
char name[256]
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
GPUNodeLink * link
unsigned int hash_code
GPUUniformAttr * prev
GPUUniformAttr * next
uint8_t flag
Definition wm_window.cc:139