59 char var_names[16][8];
65 auto index = sampler_names.
size();
66 sampler_names.
append(std::make_unique<NameEntry>());
67 char *name_buffer = sampler_names[index]->
data();
68 memcpy(name_buffer, name, 32);
81 delete interface_generated;
117 if (pass->hash ==
hash) {
129 if (
node !=
nullptr) {
147 for (; pass && (pass->
hash ==
hash); pass = pass->
next) {
172 switch (
input->source) {
175 return stream <<
"tmp" <<
input->id;
177 return stream <<
"cons" <<
input->id;
179 return stream <<
"node_tree.u" <<
input->id;
181 return stream <<
"var_attrs.v" <<
input->attr->id;
183 return stream <<
"unf_attrs[resource_id].attr" <<
input->uniform_attr->id;
185 return stream <<
"strct" <<
input->id;
187 return stream <<
input->texture->sampler_name;
189 return stream <<
input->texture->tiled_mapping_name;
198 return stream <<
"tmp" <<
output->id;
208 stream <<
input->type <<
"(";
209 for (
int i = 0; i <
input->type; i++) {
210 char formated_float[32];
214 stream << formated_float;
215 if (i < input->
type - 1) {
239 ListBase ubo_inputs_ = {
nullptr,
nullptr};
267 void generate_graphs();
268 void generate_uniform_buffer();
269 void generate_attribs();
270 void generate_resources();
271 void generate_library();
279 void set_unique_ids();
281 void node_serialize(std::stringstream &eval_ss,
const GPUNode *
node);
284 static char *extract_c_str(std::stringstream &stream)
286 auto string = stream.str();
294 output.attr_load =
nullptr;
305 std::stringstream load_ss;
321 load_ss <<
"var_attrs." << var_name;
322 switch (attr->type) {
327 load_ss <<
" = attr_load_orco(" << attr_name <<
");\n";
331 load_ss <<
" = attr_load_" << input_type <<
"(" << attr_name <<
");\n";
335 load_ss <<
" = attr_load_tangent(" << attr_name <<
");\n";
339 load_ss <<
" = attr_load_" << input_type <<
"(" << attr_name <<
");\n";
347 output.attr_load = extract_c_str(load_ss);
357 info.
define(
"PRINCIPLED_CLEARCOAT");
360 info.
define(
"PRINCIPLED_METALLIC");
363 info.
define(
"PRINCIPLED_DIELECTRIC");
366 info.
define(
"PRINCIPLED_GLASS");
369 info.
define(
"PRINCIPLED_ANY");
372 std::stringstream ss;
376 if (
tex->colorband) {
380 else if (
tex->tiled_mapping_name[0] !=
'\0') {
395 ss <<
"struct NodeTree {\n";
398 ss <<
input->type <<
" u" <<
input->id <<
";\n";
406 ss <<
"struct UniformAttrs {\n";
408 ss <<
"vec4 attr" << attr->id <<
";\n";
432 void GPUCodegen::node_serialize(std::stringstream &eval_ss,
const GPUNode *
node)
436 switch (
input->source) {
441 eval_ss <<
input->type <<
" " <<
input <<
" = CLOSURE_DEFAULT;\n";
456 eval_ss <<
node->name <<
"(";
459 switch (
input->source) {
465 input->link->output->type;
468 eval_ss << to <<
"_from_" <<
from <<
"(";
475 eval_ss <<
input->link->output;
501 if (output_link ==
nullptr) {
505 std::stringstream eval_ss;
509 if ((
node->tag & tree_tag) == 0) {
512 node_serialize(eval_ss,
node);
514 eval_ss <<
"return " << output_link->
output <<
";\n";
516 char *eval_c_str = extract_c_str(eval_ss);
539 void GPUCodegen::set_unique_ids()
562 std::stringstream eval_ss;
563 eval_ss <<
"\n/* Generated Functions */\n\n";
566 eval_ss <<
"float " << func_link->name <<
"() {\n" << fn <<
"}\n\n";
569 output.material_functions = extract_c_str(eval_ss);
667 int num_samplers = 0;
670 if (res.
bind_type == ShaderCreateInfo::Resource::BindType::SAMPLER) {
682 if (shader ==
nullptr) {
721 if (shader !=
nullptr) {
722 fprintf(stderr,
"GPUShader: error: too many samplers in shader.\n");
758 static int lasttime = 0;
759 const int shadercollectrate = 60;
762 if (ctime < shadercollectrate + lasttime) {
772 if (pass->refcount == 0) {
778 prev_pass = &pass->
next;
General operations, lookup, etc. for materials.
void BKE_material_defaults_free_gpu(void)
#define BLI_assert_msg(a, msg)
bool BLI_gset_pop(GSet *gs, GSetIterState *state, void **r_key) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
void BLI_hash_mm2a_init(BLI_HashMurmur2A *mm2, uint32_t seed)
void BLI_hash_mm2a_add(BLI_HashMurmur2A *mm2, const unsigned char *data, size_t len)
void BLI_hash_mm2a_add_int(BLI_HashMurmur2A *mm2, int data)
uint32_t BLI_hash_mm2a_end(BLI_HashMurmur2A *mm2)
Single link-list utility macros. (header only api).
#define BLI_LINKS_PREPEND(list, link)
BLI_INLINE bool BLI_listbase_is_empty(const struct ListBase *lb)
#define LISTBASE_FOREACH(type, var, list)
struct LinkData * BLI_genericNodeN(void *data)
void void BLI_freelistN(struct ListBase *listbase) ATTR_NONNULL(1)
void BLI_addtail(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
#define STRNCPY(dst, src)
#define SNPRINTF(dst, format,...)
char * BLI_strdup(const char *str) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL() ATTR_MALLOC
pthread_spinlock_t SpinLock
void BLI_spin_init(SpinLock *spin)
void BLI_spin_unlock(SpinLock *spin)
void BLI_spin_lock(SpinLock *spin)
void BLI_spin_end(SpinLock *spin)
int GPU_max_textures_vert(void)
int GPU_max_textures_frag(void)
int GPU_max_textures_geom(void)
int GPU_max_textures(void)
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum type
uint64_t GPU_material_uuid_get(GPUMaterial *mat)
void(* GPUCodegenCallbackFn)(void *thunk, GPUMaterial *mat, GPUCodegenOutput *codegen)
bool GPU_material_flag_get(const GPUMaterial *mat, eGPUMaterialFlag flag)
@ GPU_MATFLAG_PRINCIPLED_GLASS
@ GPU_MATFLAG_OBJECT_INFO
@ GPU_MATFLAG_PRINCIPLED_DIELECTRIC
@ GPU_MATFLAG_PRINCIPLED_CLEARCOAT
@ GPU_MATFLAG_PRINCIPLED_ANY
@ GPU_MATFLAG_PRINCIPLED_METALLIC
eGPUMaterialFlag GPU_material_flag(const GPUMaterial *mat)
void GPU_material_uniform_buffer_create(GPUMaterial *material, ListBase *inputs)
int GPU_shader_get_uniform(GPUShader *shader, const char *name)
struct GPUShader GPUShader
void GPU_shader_free_builtin_shaders(void)
struct GPUShaderCreateInfo GPUShaderCreateInfo
void GPU_shader_free(GPUShader *shader)
GPUShader * GPU_shader_create_from_info(const GPUShaderCreateInfo *_info)
Read Guarded memory(de)allocation.
Platform independent time functions.
GPUCodegenCreateInfo * create_info
uint32_t hash_get() const
void generate_resources()
GPUCodegen(GPUMaterial *mat_, GPUNodeGraph *graph_)
void generate_uniform_buffer()
constexpr bool is_empty() const
constexpr const char * c_str() const
void append(const T &value)
void extend_non_duplicates(Span< T > array)
GPUPass * GPU_generate_pass(GPUMaterial *material, GPUNodeGraph *graph, GPUCodegenCallbackFn finalize_source_cb, void *thunk)
static GPUPass * gpu_pass_cache_lookup(uint32_t hash)
static SpinLock pass_cache_spin
static int count_active_texture_sampler(GPUPass *pass, GPUShader *shader)
static void gpu_pass_free(GPUPass *pass)
static bool gpu_pass_is_valid(GPUPass *pass)
static GPUPass * gpu_pass_cache_resolve_collision(GPUPass *pass, GPUShaderCreateInfo *info, uint32_t hash)
static GPUPass * pass_cache
void GPU_pass_cache_free(void)
void GPU_pass_release(GPUPass *pass)
void gpu_codegen_init(void)
bool GPU_pass_compile(GPUPass *pass, const char *shname)
static void gpu_pass_cache_insert_after(GPUPass *node, GPUPass *pass)
static bool gpu_pass_shader_validate(GPUPass *pass, GPUShader *shader)
void GPU_pass_cache_garbage_collect(void)
void GPU_pass_cache_init(void)
GPUShader * GPU_pass_shader_get(GPUPass *pass)
void gpu_codegen_exit(void)
void gpu_node_graph_finalize_uniform_attrs(GPUNodeGraph *graph)
void gpu_node_graph_prune_unused(GPUNodeGraph *graph)
@ GPU_NODE_TAG_DISPLACEMENT
@ GPU_SOURCE_FUNCTION_CALL
@ GPU_SOURCE_TEX_TILED_MAPPING
@ GPU_SOURCE_UNIFORM_ATTR
ccl_global KernelShaderEvalInput ccl_global float * output
ccl_global KernelShaderEvalInput * input
void(* MEM_freeN)(void *vmemh)
void *(* MEM_callocN)(size_t len, const char *str)
static Type to_type(const eGPUType type)
static std::ostream & operator<<(std::ostream &stream, const Type type)
Vector< const char * > gpu_shader_dependency_get_resolved_source(const StringRefNull shader_source_name)
char attr_names[16][GPU_MAX_SAFE_ATTR_NAME+1]
std::array< char, 32 > NameEntry
blender::Vector< std::unique_ptr< NameEntry >, 16 > sampler_names
const char * append_sampler_name(const char name[32])
StageInterfaceInfo * interface_generated
GPUCodegenCreateInfo(const char *name)
GPUShaderCreateInfo * create_info
struct GPUOutput * output
GPUCodegenCreateInfo * create_info
Describe inputs & outputs, stage interfaces, resources and sources of a shader. If all data is correc...
Self & uniform_buf(int slot, StringRefNull type_name, StringRefNull name, Frequency freq=Frequency::PASS)
Self & sampler(int slot, ImageType type, StringRefNull name, Frequency freq=Frequency::PASS, eGPUSamplerState sampler=(eGPUSamplerState) -1)
Self & additional_info(StringRefNull info_name0, StringRefNull info_name1="", StringRefNull info_name2="", StringRefNull info_name3="", StringRefNull info_name4="", StringRefNull info_name5="", StringRefNull info_name6="")
StringRefNull geometry_source_
Vector< Resource > pass_resources_
Self & vertex_in(int slot, Type type, StringRefNull name)
std::string typedef_source_generated
Self & vertex_out(StageInterfaceInfo &interface)
Vector< const char *, 0 > dependencies_generated
Self & define(StringRefNull name, StringRefNull value="")
Self & smooth(Type type, StringRefNull _name)
double PIL_check_seconds_timer(void)