Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorClément Foucault <foucault.clem@gmail.com>2022-02-04 22:06:36 +0300
committerClément Foucault <foucault.clem@gmail.com>2022-02-04 22:21:41 +0300
commit671fb286abd2206b1e93507625412d8081f69fde (patch)
tree320967dabb9d08fa38e720f0e9ff5e3853d74d63 /source/blender/gpu/intern/gpu_shader.cc
parentae50527c23720b5128aefdabf7accc69e93bb3cc (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.cc78
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)) {