94 if (pass->hash ==
hash) {
113 for (; pass && (pass->
hash ==
hash); pass = pass->
next) {
151 BLI_dynstr_appendf(ds,
"vec2((%s.r + %s.g + %s.b) / 3.0, %s.a)", name, name, name, name);
207 for (i = 0; i <
type; i++) {
227 return "unfinvviewmat";
230 return "unfinvobmat";
233 return "unflocaltoviewmat";
236 return "unfinvlocaltoviewmat";
239 return "varposition";
248 return "unfobjectcolor";
251 return "unfobautobumpscale";
254 return "unfcameratexfactors";
257 return "unfparticlescalarprops";
260 return "unfparticleco";
263 return "unfparticlevel";
266 return "unfparticleangvel";
269 return "unfobjectinfo";
272 return "unfbarycentrictex";
275 return "unfbarycentricdist";
310 if (
tex->colorband) {
313 else if (
tex->tiled_mapping_name[0]) {
334 if (!(builtins & input->builtin)) {
335 builtins |= input->builtin;
388 BLI_dynstr_append(ds,
" UniformAttributes uniform_attrs[DRW_RESOURCE_CHUNK_LEN];\n");
390 BLI_dynstr_append(ds,
"#define GET_UNIFORM_ATTR(name) (uniform_attrs[resource_id].name)\n");
434 ds, input->link->output->type, input->type,
"tmp", input->link->output->id);
521 const char *interface_str)
547 BLI_dynstr_append(ds,
" vec2 barytexco = barycentric_resolve(barycentricTexCo);\n");
570 " #define invlocaltoviewmat (ModelMatrixInverse * ViewMatrixInverse)\n");
576 BLI_dynstr_append(ds,
" vec3 facingnormal = transform_direction(ViewMatrix, n);\n");
578 BLI_dynstr_append(ds,
" vec3 facingnormal = gl_FrontFacing ? viewNormal: -viewNormal;\n");
637 printf(
"%s\n", code);
660 BLI_assert(
false &&
"GPUVertAttr Prefix type not found : This should not happen!");
695 const char *interface_str,
696 const char *vert_code,
714 else if (attr->name[0] ==
'\0') {
732 BLI_dynstr_append(ds,
"void pass_attr(vec3 position, mat3 normalmat, mat4 modelmatinv);\n");
738 BLI_dynstr_append(ds,
"void pass_attr(vec3 position, mat3 normalmat, mat4 modelmatinv) {\n");
752 BLI_dynstr_appendf(ds,
" var%d = tangent_get(att%d, normalmat);\n", attr->id, attr->id);
754 else if (attr->type ==
CD_ORCO) {
756 ds,
" var%d = orco_get(position, modelmatinv, OrcoTexCoFactors, orco);\n", attr->id);
760 BLI_dynstr_appendf(ds,
" var%d = GET_ATTR(%s, att%d);\n", attr->id, type_str, attr->id);
772 printf(
"%s\n", code);
780 const char *interface_str,
781 const char *geom_code,
809 BLI_dynstr_append(ds,
"dataAttrOut.barycentricTexCo = calc_barycentric_co(vert);\\\n");
814 BLI_dynstr_appendf(ds,
"dataAttrOut.var%d = dataAttrIn[vert].var%d;\\\n", attr->id, attr->id);
841 const char *vert_code,
842 const char *geom_code,
843 const char *frag_lib,
855 builtins |= input->builtin;
896 pass_hash, vertexcode, geometrycode, fragmentcode, defines,
hash);
926 if (pass_hash !=
NULL) {
929 pass_hash->
next = pass;
947 int num_samplers = 0;
949 while ((code = strstr(code,
"uniform "))) {
953 while (*code ==
' ') {
965 while (!
ELEM(*code,
' ',
'\0')) {
969 while (*code ==
' ') {
974 char sampler_name[64];
1006 int total_samplers_len = vert_samplers_len + frag_samplers_len;
1016 total_samplers_len += geom_samplers_len;
1027 bool success =
true;
1037 fprintf(stderr,
"GPUShader: error: too many samplers in shader.\n");
1070 static int lasttime = 0;
1071 const int shadercollectrate = 60;
1074 if (ctime < shadercollectrate + lasttime) {
1084 if (pass->refcount == 0) {
1090 prev_pass = &pass->
next;
General operations, lookup, etc. for materials.
void BKE_material_defaults_free_gpu(void)
A dynamically sized string ADT.
DynStr * BLI_dynstr_new(void) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT
void BLI_dynstr_free(DynStr *ds) ATTR_NONNULL()
void BLI_dynstr_appendf(DynStr *__restrict ds, const char *__restrict format,...) ATTR_PRINTF_FORMAT(2
char * BLI_dynstr_get_cstring(DynStr *ds) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
void BLI_dynstr_append(DynStr *__restrict ds, const char *cstr) ATTR_NONNULL()
GSet * BLI_gset_int_new(const char *info) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT
bool BLI_gset_haskey(GSet *gs, const void *key) ATTR_WARN_UNUSED_RESULT
void BLI_gset_free(GSet *gs, GSetKeyFreeFP keyfreefp)
bool BLI_gset_add(GSet *gs, void *key)
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)
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)
bool BLI_str_startswith(const char *__restrict str, const char *__restrict start) ATTR_NONNULL()
char * BLI_strdup(const char *str) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL() ATTR_MALLOC
char * BLI_strdupcat(const char *__restrict str1, const char *__restrict str2) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL() ATTR_MALLOC
size_t BLI_snprintf(char *__restrict dst, size_t maxncpy, const char *__restrict format,...) ATTR_NONNULL(1
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)
#define POINTER_FROM_INT(i)
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
@ GPU_PARTICLE_ANG_VELOCITY
@ GPU_INVERSE_OBJECT_MATRIX
@ GPU_INVERSE_VIEW_MATRIX
@ GPU_PARTICLE_SCALAR_PROPS
@ GPU_CAMERA_TEXCO_FACTORS
@ GPU_INVERSE_LOC_TO_VIEW_MATRIX
void GPU_material_uniform_buffer_create(GPUMaterial *material, ListBase *inputs)
GPUShader * GPU_shader_create(const char *vertcode, const char *fragcode, const char *geomcode, const char *libcode, const char *defines, const char *shname)
int GPU_shader_get_uniform(GPUShader *shader, const char *name)
struct GPUShader GPUShader
void GPU_shader_free_builtin_shaders(void)
void GPU_shader_free(GPUShader *shader)
Read Guarded memory(de)allocation.
Platform independent time functions.
char datatoc_gpu_shader_common_obinfos_lib_glsl[]
char datatoc_gpu_shader_codegen_lib_glsl[]
static GPUPass * gpu_pass_cache_lookup(uint32_t hash)
static void codegen_call_functions(DynStr *ds, GPUNodeGraph *graph)
static SpinLock pass_cache_spin
static void codegen_final_output(DynStr *ds, GPUOutput *finaloutput)
static void gpu_pass_free(GPUPass *pass)
static char * code_generate_interface(GPUNodeGraph *graph, int builtins)
static bool gpu_pass_is_valid(GPUPass *pass)
static const char * attr_prefix_get(CustomDataType type)
static GPUPass * pass_cache
void GPU_pass_cache_free(void)
static void codegen_declare_tmps(DynStr *ds, GPUNodeGraph *graph)
void GPU_pass_release(GPUPass *pass)
static int codegen_process_uniforms_functions(GPUMaterial *material, DynStr *ds, GPUNodeGraph *graph)
static void codegen_convert_datatype(DynStr *ds, int from, int to, const char *tmp, int id)
void gpu_codegen_init(void)
static void codegen_set_unique_ids(GPUNodeGraph *graph)
static void codegen_print_datatype(DynStr *ds, const eGPUType type, float *data)
GPUPass * GPU_generate_pass(GPUMaterial *material, GPUNodeGraph *graph, const char *vert_code, const char *geom_code, const char *frag_lib, const char *defines)
static char * code_generate_vertex(GPUNodeGraph *graph, const char *interface_str, const char *vert_code, int builtins)
static const char * gpu_builtin_name(eGPUBuiltin builtin)
bool GPU_pass_compile(GPUPass *pass, const char *shname)
static bool gpu_pass_shader_validate(GPUPass *pass, GPUShader *shader)
static char * code_generate_geometry(GPUNodeGraph *graph, const char *interface_str, const char *geom_code, int builtins)
void GPU_pass_cache_garbage_collect(void)
static uint32_t gpu_pass_hash(const char *frag_gen, const char *defs, ListBase *attributes)
void GPU_pass_cache_init(void)
static GPUPass * gpu_pass_cache_resolve_collision(GPUPass *pass, const char *vert, const char *geom, const char *frag, const char *defs, uint32_t hash)
static int count_active_texture_sampler(GPUShader *shader, char *source)
static char * code_generate_fragment(GPUMaterial *material, GPUNodeGraph *graph, const char *interface_str)
GPUShader * GPU_pass_shader_get(GPUPass *pass)
void gpu_codegen_exit(void)
GSet * gpu_material_used_libraries(GPUMaterial *material)
const char * gpu_data_type_to_string(const eGPUType type)
char * gpu_str_skip_token(char *str, char *token, int max)
char * gpu_material_library_generate_code(GSet *used_libraries, const char *frag_lib)
void gpu_node_graph_finalize_uniform_attrs(GPUNodeGraph *graph)
void gpu_node_graph_prune_unused(GPUNodeGraph *graph)
@ GPU_SOURCE_VOLUME_GRID_TRANSFORM
@ GPU_SOURCE_TEX_TILED_MAPPING
@ GPU_SOURCE_UNIFORM_ATTR
void KERNEL_FUNCTION_FULL_NAME() shader(KernelGlobals *kg, uint4 *input, float4 *output, int type, int filter, int i, int offset, int sample)
void(* MEM_freeN)(void *vmemh)
void *(* MEM_callocN)(size_t len, const char *str)
struct GPUShader * shader
double PIL_check_seconds_timer(void)