3232
3333#include " glslang_resource_limits.h"
3434
35+ #include " core/config/engine.h"
3536#include " servers/rendering/rendering_device.h"
3637
3738#include < glslang/Include/Types.h>
@@ -56,7 +57,6 @@ static Vector<uint8_t> _compile_shader_glsl(RenderingDevice::ShaderStage p_stage
5657
5758 glslang::EShTargetClientVersion ClientVersion = glslang::EShTargetVulkan_1_2;
5859 glslang::EShTargetLanguageVersion TargetVersion = glslang::EShTargetSpv_1_5;
59- glslang::TShader::ForbidIncluder includer;
6060
6161 if (capabilities->device_family == RenderingDevice::DeviceFamily::DEVICE_VULKAN ) {
6262 if (capabilities->version_major == 1 && capabilities->version_minor == 0 ) {
@@ -127,23 +127,10 @@ static Vector<uint8_t> _compile_shader_glsl(RenderingDevice::ShaderStage p_stage
127127 }
128128
129129 EShMessages messages = (EShMessages)(EShMsgSpvRules | EShMsgVulkanRules);
130- const int DefaultVersion = 100 ;
131- std::string pre_processed_code;
132-
133- // preprocess
134- if (!shader.preprocess (&DefaultTBuiltInResource, DefaultVersion, ENoProfile, false , false , messages, &pre_processed_code, includer)) {
135- if (r_error) {
136- (*r_error) = " Failed pre-process:\n " ;
137- (*r_error) += shader.getInfoLog ();
138- (*r_error) += " \n " ;
139- (*r_error) += shader.getInfoDebugLog ();
140- }
141-
142- return ret;
130+ if (Engine::get_singleton ()->is_generate_spirv_debug_info_enabled ()) {
131+ messages = (EShMessages)(messages | EShMsgDebugInfo);
143132 }
144- // set back..
145- cs_strings = pre_processed_code.c_str ();
146- shader.setStrings (&cs_strings, 1 );
133+ const int DefaultVersion = 100 ;
147134
148135 // parse
149136 if (!shader.parse (&DefaultTBuiltInResource, DefaultVersion, false , messages)) {
@@ -174,6 +161,13 @@ static Vector<uint8_t> _compile_shader_glsl(RenderingDevice::ShaderStage p_stage
174161 std::vector<uint32_t > SpirV;
175162 spv::SpvBuildLogger logger;
176163 glslang::SpvOptions spvOptions;
164+
165+ if (Engine::get_singleton ()->is_generate_spirv_debug_info_enabled ()) {
166+ spvOptions.generateDebugInfo = true ;
167+ spvOptions.emitNonSemanticShaderDebugInfo = true ;
168+ spvOptions.emitNonSemanticShaderDebugSource = true ;
169+ }
170+
177171 glslang::GlslangToSpv (*program.getIntermediate (stages[p_stage]), SpirV, &logger, &spvOptions);
178172
179173 ret.resize (SpirV.size () * sizeof (uint32_t ));
@@ -188,7 +182,7 @@ static Vector<uint8_t> _compile_shader_glsl(RenderingDevice::ShaderStage p_stage
188182static String _get_cache_key_function_glsl (const RenderingDevice *p_render_device) {
189183 const RD ::Capabilities *capabilities = p_render_device->get_device_capabilities ();
190184 String version;
191- version = " SpirVGen=" + itos (glslang::GetSpirvGeneratorVersion ()) + " , major=" + itos (capabilities->version_major ) + " , minor=" + itos (capabilities->version_minor ) + " , subgroup_size=" + itos (p_render_device->limit_get (RD ::LIMIT_SUBGROUP_SIZE )) + " , subgroup_ops=" + itos (p_render_device->limit_get (RD ::LIMIT_SUBGROUP_OPERATIONS )) + " , subgroup_in_shaders=" + itos (p_render_device->limit_get (RD ::LIMIT_SUBGROUP_IN_SHADERS ));
185+ version = " SpirVGen=" + itos (glslang::GetSpirvGeneratorVersion ()) + " , major=" + itos (capabilities->version_major ) + " , minor=" + itos (capabilities->version_minor ) + " , subgroup_size=" + itos (p_render_device->limit_get (RD ::LIMIT_SUBGROUP_SIZE )) + " , subgroup_ops=" + itos (p_render_device->limit_get (RD ::LIMIT_SUBGROUP_OPERATIONS )) + " , subgroup_in_shaders=" + itos (p_render_device->limit_get (RD ::LIMIT_SUBGROUP_IN_SHADERS )) + " , debug= " + itos ( Engine::get_singleton ()-> is_generate_spirv_debug_info_enabled ()) ;
192186 return version;
193187}
194188
0 commit comments