diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2022-02-04 22:06:36 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2022-02-04 22:21:41 +0300 |
commit | 671fb286abd2206b1e93507625412d8081f69fde (patch) | |
tree | 320967dabb9d08fa38e720f0e9ff5e3853d74d63 /source/blender/gpu/intern/gpu_shader.cc | |
parent | ae50527c23720b5128aefdabf7accc69e93bb3cc (diff) |
GPUShader: Cleanup dependency system to not remove string allocation
Source files are now only referenced and listed for the driver to ingest.
Shader sources now includes generated data if any.
Also cleans up gpu_shader_dependency_get_builtins casts.
Diffstat (limited to 'source/blender/gpu/intern/gpu_shader.cc')
-rw-r--r-- | source/blender/gpu/intern/gpu_shader.cc | 78 |
1 files changed, 24 insertions, 54 deletions
diff --git a/source/blender/gpu/intern/gpu_shader.cc b/source/blender/gpu/intern/gpu_shader.cc index 2e924925ab8..93ec317be42 100644 --- a/source/blender/gpu/intern/gpu_shader.cc +++ b/source/blender/gpu/intern/gpu_shader.cc @@ -301,20 +301,22 @@ GPUShader *GPU_shader_create_from_info(const GPUShaderCreateInfo *_info) std::string defines = shader->defines_declare(info); std::string resources = shader->resources_declare(info); - char *shader_shared_utils = nullptr; defines += "#define USE_GPU_SHADER_CREATE_INFO\n"; - Vector<char *> typedefs; - for (auto filename : info.typedef_sources_) { - typedefs.append(gpu_shader_dependency_get_source(filename.c_str())); + Vector<const char *> typedefs; + if (!info.typedef_sources_.is_empty() || !info.typedef_source_generated.empty()) { + typedefs.append(gpu_shader_dependency_get_source("gpu_shader_shared_utils.h").c_str()); + } + if (!info.typedef_source_generated.empty()) { + typedefs.append(info.typedef_source_generated.c_str()); } - if (!typedefs.is_empty()) { - shader_shared_utils = gpu_shader_dependency_get_source("gpu_shader_shared_utils.h"); + for (auto filename : info.typedef_sources_) { + typedefs.append(gpu_shader_dependency_get_source(filename).c_str()); } if (!info.vertex_source_.is_empty()) { - char *code = gpu_shader_dependency_get_resolved_source(info.vertex_source_.c_str()); + auto code = gpu_shader_dependency_get_resolved_source(info.vertex_source_); std::string interface = shader->vertex_interface_declare(info); Vector<const char *> sources; @@ -324,23 +326,18 @@ GPUShader *GPU_shader_create_from_info(const GPUShaderCreateInfo *_info) sources.append("#define USE_GEOMETRY_SHADER\n"); } sources.append(defines.c_str()); - if (!typedefs.is_empty()) { - sources.append(shader_shared_utils); - } - for (auto *types : typedefs) { - sources.append(types); - } + sources.extend(typedefs); sources.append(resources.c_str()); sources.append(interface.c_str()); - sources.append(code); + sources.extend(code); + sources.extend(info.dependencies_generated); + sources.append(info.vertex_source_generated.c_str()); shader->vertex_shader_from_glsl(sources); - - free(code); } if (!info.fragment_source_.is_empty()) { - char *code = gpu_shader_dependency_get_resolved_source(info.fragment_source_.c_str()); + auto code = gpu_shader_dependency_get_resolved_source(info.fragment_source_); std::string interface = shader->fragment_interface_declare(info); Vector<const char *> sources; @@ -350,23 +347,18 @@ GPUShader *GPU_shader_create_from_info(const GPUShaderCreateInfo *_info) sources.append("#define USE_GEOMETRY_SHADER\n"); } sources.append(defines.c_str()); - if (!typedefs.is_empty()) { - sources.append(shader_shared_utils); - } - for (auto *types : typedefs) { - sources.append(types); - } + sources.extend(typedefs); sources.append(resources.c_str()); sources.append(interface.c_str()); - sources.append(code); + sources.extend(code); + sources.extend(info.dependencies_generated); + sources.append(info.fragment_source_generated.c_str()); shader->fragment_shader_from_glsl(sources); - - free(code); } if (!info.geometry_source_.is_empty()) { - char *code = gpu_shader_dependency_get_resolved_source(info.geometry_source_.c_str()); + auto code = gpu_shader_dependency_get_resolved_source(info.geometry_source_); std::string layout = shader->geometry_layout_declare(info); std::string interface = shader->geometry_interface_declare(info); @@ -374,51 +366,29 @@ GPUShader *GPU_shader_create_from_info(const GPUShaderCreateInfo *_info) standard_defines(sources); sources.append("#define GPU_GEOMETRY_SHADER\n"); sources.append(defines.c_str()); - if (!typedefs.is_empty()) { - sources.append(shader_shared_utils); - } - for (auto *types : typedefs) { - sources.append(types); - } + sources.extend(typedefs); sources.append(resources.c_str()); sources.append(layout.c_str()); sources.append(interface.c_str()); - sources.append(code); + sources.extend(code); shader->geometry_shader_from_glsl(sources); - - free(code); } if (!info.compute_source_.is_empty()) { - char *code = gpu_shader_dependency_get_resolved_source(info.compute_source_.c_str()); + auto code = gpu_shader_dependency_get_resolved_source(info.compute_source_); std::string layout = shader->compute_layout_declare(info); Vector<const char *> sources; standard_defines(sources); sources.append("#define GPU_COMPUTE_SHADER\n"); sources.append(defines.c_str()); - if (!typedefs.is_empty()) { - sources.append(shader_shared_utils); - } - for (auto *types : typedefs) { - sources.append(types); - } + sources.extend(typedefs); sources.append(resources.c_str()); sources.append(layout.c_str()); - sources.append(code); + sources.extend(code); shader->compute_shader_from_glsl(sources); - - free(code); - } - - for (auto *types : typedefs) { - free(types); - } - - if (shader_shared_utils) { - free(shader_shared_utils); } if (!shader->finalize(&info)) { |