diff --git a/source/blender/draw/engines/overlay/overlay_next_shader.cc b/source/blender/draw/engines/overlay/overlay_next_shader.cc index e01f72d3aab..d194c269bf4 100644 --- a/source/blender/draw/engines/overlay/overlay_next_shader.cc +++ b/source/blender/draw/engines/overlay/overlay_next_shader.cc @@ -16,13 +16,10 @@ ShaderModule::ShaderPtr ShaderModule::shader( const char *create_info_name, const FunctionRef patch) { - const gpu::shader::ShaderCreateInfo *info_ptr = - reinterpret_cast( - GPU_shader_create_info_get(create_info_name)); - BLI_assert(info_ptr != nullptr); - /* Perform a copy for patching. */ - gpu::shader::ShaderCreateInfo info = *info_ptr; + gpu::shader::ShaderCreateInfo info(create_info_name); + GPU_shader_create_info_get_unfinalized_copy(create_info_name, + reinterpret_cast(info)); patch(info); @@ -45,8 +42,11 @@ ShaderModule::ShaderPtr ShaderModule::selectable_shader(const char *create_info_ // this->shader_ = GPU_shader_create_from_info_name(create_info_name.c_str()); /* WORKAROUND: ... but for now, we have to patch the create info used by the old engine. */ - gpu::shader::ShaderCreateInfo info = *reinterpret_cast( - GPU_shader_create_info_get(create_info_name)); + + /* Perform a copy for patching. */ + gpu::shader::ShaderCreateInfo info(create_info_name); + GPU_shader_create_info_get_unfinalized_copy(create_info_name, + reinterpret_cast(info)); info.define("OVERLAY_NEXT"); @@ -74,8 +74,10 @@ ShaderModule::ShaderPtr ShaderModule::selectable_shader( const char *create_info_name, const FunctionRef patch) { - gpu::shader::ShaderCreateInfo info = *reinterpret_cast( - GPU_shader_create_info_get(create_info_name)); + /* Perform a copy for patching. */ + gpu::shader::ShaderCreateInfo info(create_info_name); + GPU_shader_create_info_get_unfinalized_copy(create_info_name, + reinterpret_cast(info)); patch(info); diff --git a/source/blender/gpu/GPU_shader.hh b/source/blender/gpu/GPU_shader.hh index a2ed01c3d0e..6aa3d99de2e 100644 --- a/source/blender/gpu/GPU_shader.hh +++ b/source/blender/gpu/GPU_shader.hh @@ -56,6 +56,9 @@ GPUShader *GPU_shader_create_from_info_name(const char *info_name); */ const GPUShaderCreateInfo *GPU_shader_create_info_get(const char *info_name); +void GPU_shader_create_info_get_unfinalized_copy(const char *info_name, + GPUShaderCreateInfo &r_info); + /** * Error checking for user created shaders. * \return true is create info is valid. diff --git a/source/blender/gpu/intern/gpu_shader.cc b/source/blender/gpu/intern/gpu_shader.cc index 616ea6ac67c..119f4d3b492 100644 --- a/source/blender/gpu/intern/gpu_shader.cc +++ b/source/blender/gpu/intern/gpu_shader.cc @@ -261,6 +261,12 @@ const GPUShaderCreateInfo *GPU_shader_create_info_get(const char *info_name) return gpu_shader_create_info_get(info_name); } +void GPU_shader_create_info_get_unfinalized_copy(const char *info_name, + GPUShaderCreateInfo &r_info) +{ + gpu_shader_create_info_get_unfinalized_copy(info_name, r_info); +} + bool GPU_shader_create_info_check_error(const GPUShaderCreateInfo *_info, char r_error[128]) { using namespace blender::gpu::shader; diff --git a/source/blender/gpu/intern/gpu_shader_create_info.cc b/source/blender/gpu/intern/gpu_shader_create_info.cc index fee3ed2732a..c8bca1f316b 100644 --- a/source/blender/gpu/intern/gpu_shader_create_info.cc +++ b/source/blender/gpu/intern/gpu_shader_create_info.cc @@ -31,9 +31,11 @@ namespace blender::gpu::shader { using CreateInfoDictionnary = Map; +using CreateInfoValueDictionnary = Map; using InterfaceDictionnary = Map; static CreateInfoDictionnary *g_create_infos = nullptr; +static CreateInfoValueDictionnary *g_create_infos_unfinalized = nullptr; static InterfaceDictionnary *g_interfaces = nullptr; /* -------------------------------------------------------------------- */ @@ -449,6 +451,7 @@ using namespace blender::gpu::shader; void gpu_shader_create_info_init() { g_create_infos = new CreateInfoDictionnary(); + g_create_infos_unfinalized = new CreateInfoValueDictionnary(); g_interfaces = new InterfaceDictionnary(); #define GPU_SHADER_INTERFACE_INFO(_interface, _inst_name) \ @@ -577,7 +580,8 @@ void gpu_shader_create_info_init() #endif } - for (ShaderCreateInfo *info : g_create_infos->values()) { + for (auto [key, info] : g_create_infos->items()) { + g_create_infos_unfinalized->add_new(key, *info); info->finalize(true); } @@ -595,6 +599,8 @@ void gpu_shader_create_info_exit() } delete g_create_infos; + delete g_create_infos_unfinalized; + for (auto *value : g_interfaces->values()) { delete value; } @@ -697,3 +703,16 @@ const GPUShaderCreateInfo *gpu_shader_create_info_get(const char *info_name) ShaderCreateInfo *info = g_create_infos->lookup(info_name); return reinterpret_cast(info); } + +void gpu_shader_create_info_get_unfinalized_copy(const char *info_name, + GPUShaderCreateInfo &r_info) +{ + if (g_create_infos_unfinalized->contains(info_name) == false) { + std::string msg = std::string("Error: Cannot find shader create info named \"") + info_name + + "\"\n"; + BLI_assert_msg(0, msg.c_str()); + } + else { + reinterpret_cast(r_info) = g_create_infos_unfinalized->lookup(info_name); + } +} diff --git a/source/blender/gpu/intern/gpu_shader_create_info_private.hh b/source/blender/gpu/intern/gpu_shader_create_info_private.hh index b022d9b774e..5ff09ca6b1b 100644 --- a/source/blender/gpu/intern/gpu_shader_create_info_private.hh +++ b/source/blender/gpu/intern/gpu_shader_create_info_private.hh @@ -22,3 +22,6 @@ bool gpu_shader_create_info_compile(const char *name_starts_with_filter); /** Runtime create infos are not registered in the dictionary and cannot be searched. */ const GPUShaderCreateInfo *gpu_shader_create_info_get(const char *info_name); + +void gpu_shader_create_info_get_unfinalized_copy(const char *info_name, + GPUShaderCreateInfo &r_info);