diff options
Diffstat (limited to 'source/blender/draw/intern/draw_manager_shader.c')
-rw-r--r-- | source/blender/draw/intern/draw_manager_shader.c | 81 |
1 files changed, 67 insertions, 14 deletions
diff --git a/source/blender/draw/intern/draw_manager_shader.c b/source/blender/draw/intern/draw_manager_shader.c index 6304b707cb9..fec234c5015 100644 --- a/source/blender/draw/intern/draw_manager_shader.c +++ b/source/blender/draw/intern/draw_manager_shader.c @@ -91,10 +91,13 @@ static void drw_deferred_shader_queue_free(ListBase *queue) } } -static void drw_deferred_shader_compilation_exec(void *custom_data, - short *stop, - short *do_update, - float *progress) +static void drw_deferred_shader_compilation_exec( + void *custom_data, + /* Cannot be const, this function implements wm_jobs_start_callback. + * NOLINTNEXTLINE: readability-non-const-parameter. */ + short *stop, + short *do_update, + float *progress) { DRWShaderCompiler *comp = (DRWShaderCompiler *)custom_data; void *gl_context = comp->gl_context; @@ -325,6 +328,26 @@ GPUShader *DRW_shader_create_with_lib( return sh; } +GPUShader *DRW_shader_create_with_shaderlib(const char *vert, + const char *geom, + const char *frag, + const DRWShaderLibrary *lib, + const char *defines) +{ + GPUShader *sh; + char *vert_with_lib = DRW_shader_library_create_shader_string(lib, vert); + char *frag_with_lib = DRW_shader_library_create_shader_string(lib, frag); + char *geom_with_lib = (geom) ? DRW_shader_library_create_shader_string(lib, geom) : NULL; + + sh = GPU_shader_create(vert_with_lib, frag_with_lib, geom_with_lib, NULL, defines, __func__); + + MEM_SAFE_FREE(vert_with_lib); + MEM_SAFE_FREE(frag_with_lib); + MEM_SAFE_FREE(geom_with_lib); + + return sh; +} + GPUShader *DRW_shader_create_with_transform_feedback(const char *vert, const char *geom, const char *defines, @@ -349,6 +372,22 @@ GPUShader *DRW_shader_create_fullscreen(const char *frag, const char *defines) datatoc_common_fullscreen_vert_glsl, frag, NULL, NULL, defines, __func__); } +GPUShader *DRW_shader_create_fullscreen_with_shaderlib(const char *frag, + const DRWShaderLibrary *lib, + const char *defines) +{ + + GPUShader *sh; + char *vert = datatoc_common_fullscreen_vert_glsl; + char *frag_with_lib = DRW_shader_library_create_shader_string(lib, frag); + + sh = GPU_shader_create(vert, frag_with_lib, NULL, NULL, defines, __func__); + + MEM_SAFE_FREE(frag_with_lib); + + return sh; +} + GPUMaterial *DRW_shader_find_from_world(World *wo, const void *engine_type, const int options, @@ -391,7 +430,8 @@ GPUMaterial *DRW_shader_create_from_world(struct Scene *scene, const char *geom, const char *frag_lib, const char *defines, - bool deferred) + bool deferred, + GPUMaterialEvalCallbackFn callback) { GPUMaterial *mat = NULL; if (DRW_state_is_image_render() || !deferred) { @@ -411,7 +451,8 @@ GPUMaterial *DRW_shader_create_from_world(struct Scene *scene, geom, frag_lib, defines, - wo->id.name); + wo->id.name, + callback); } if (GPU_material_status(mat) == GPU_MAT_QUEUED) { @@ -431,7 +472,8 @@ GPUMaterial *DRW_shader_create_from_material(struct Scene *scene, const char *geom, const char *frag_lib, const char *defines, - bool deferred) + bool deferred, + GPUMaterialEvalCallbackFn callback) { GPUMaterial *mat = NULL; if (DRW_state_is_image_render() || !deferred) { @@ -451,7 +493,8 @@ GPUMaterial *DRW_shader_create_from_material(struct Scene *scene, geom, frag_lib, defines, - ma->id.name); + ma->id.name, + callback); } if (GPU_material_status(mat) == GPU_MAT_QUEUED) { @@ -502,7 +545,7 @@ void DRW_shader_library_free(DRWShaderLibrary *lib) MEM_SAFE_FREE(lib); } -static int drw_shader_library_search(DRWShaderLibrary *lib, const char *name) +static int drw_shader_library_search(const DRWShaderLibrary *lib, const char *name) { for (int i = 0; i < MAX_LIB; i++) { if (lib->libs[i]) { @@ -518,18 +561,28 @@ static int drw_shader_library_search(DRWShaderLibrary *lib, const char *name) } /* Return bitmap of dependencies. */ -static uint32_t drw_shader_dependencies_get(DRWShaderLibrary *lib, char *lib_code) +static uint32_t drw_shader_dependencies_get(const DRWShaderLibrary *lib, const char *lib_code) { /* Search dependencies. */ uint32_t deps = 0; - char *haystack = lib_code; + const char *haystack = lib_code; while ((haystack = strstr(haystack, "BLENDER_REQUIRE("))) { haystack += 16; int dep = drw_shader_library_search(lib, haystack); if (dep == -1) { + char dbg_name[32]; + int i = 0; + while ((haystack[0] != ')') && (i < 31)) { + dbg_name[i] = haystack[0]; + haystack++; + i++; + } + dbg_name[i + 1] = '\0'; + printf( - "Error: Dependency not found.\n" - "This might be due to bad lib ordering.\n"); + "Error: Dependency not found: %s\n" + "This might be due to bad lib ordering.\n", + dbg_name); BLI_assert(0); } else { @@ -562,7 +615,7 @@ void DRW_shader_library_add_file(DRWShaderLibrary *lib, char *lib_code, const ch /* Return an allocN'ed string containing the shader code with its dependencies prepended. * Caller must free the string with MEM_freeN after use. */ -char *DRW_shader_library_create_shader_string(DRWShaderLibrary *lib, char *shader_code) +char *DRW_shader_library_create_shader_string(const DRWShaderLibrary *lib, const char *shader_code) { uint32_t deps = drw_shader_dependencies_get(lib, shader_code); |