3030
3131#include " rendering_shader_container_vulkan.h"
3232
33- #if RENDERING_SHADER_CONTAINER_VULKAN_SMOLV
3433#include " thirdparty/misc/smolv.h"
35- #endif
3634
3735// RenderingShaderContainerVulkan
3836
@@ -50,44 +48,50 @@ bool RenderingShaderContainerVulkan::_set_code_from_spirv(const Vector<Rendering
5048 PackedByteArray code_bytes;
5149 shaders.resize (p_spirv.size ());
5250 for (int64_t i = 0 ; i < p_spirv.size (); i++) {
53- #if RENDERING_SHADER_CONTAINER_VULKAN_SMOLV
54- // Encode into smolv.
55- smolv::ByteArray smolv_bytes;
56- bool smolv_encoded = smolv::Encode (p_spirv[i].spirv .ptr (), p_spirv[i].spirv .size (), smolv_bytes, smolv::kEncodeFlagStripDebugInfo );
57- ERR_FAIL_COND_V_MSG (!smolv_encoded, false , " Failed to compress SPIR-V into smolv." );
58-
59- code_bytes.resize (smolv_bytes.size ());
60- memcpy (code_bytes.ptrw (), smolv_bytes.data (), code_bytes.size ());
61- #else
62- code_bytes.resize (p_spirv[i].spirv .size ());
63- memcpy (code_bytes.ptrw (), p_spirv[i].spirv .ptr (), code_bytes.size ());
64- #endif
65-
6651 RenderingShaderContainer::Shader &shader = shaders.ptrw ()[i];
67- #if RENDERING_SHADER_CONTAINER_VULKAN_COMPRESSION
68- uint32_t compressed_size = 0 ;
69- shader.code_decompressed_size = code_bytes.size ();
70- shader.code_compressed_bytes .resize (code_bytes.size ());
71-
72- bool compressed = compress_code (code_bytes.ptr (), code_bytes.size (), shader.code_compressed_bytes .ptrw (), &compressed_size, &shader.code_compression_flags );
73- ERR_FAIL_COND_V_MSG (!compressed, false , vformat (" Failed to compress native code to native for SPIR-V #%d." , i));
74-
75- shader.code_compressed_bytes .resize (compressed_size);
76- #else
77- shader.code_decompressed_size = 0 ;
78- shader.code_compression_flags = 0 ;
79- shader.code_compressed_bytes = code_bytes;
80- #endif
52+
53+ if (debug_info_enabled) {
54+ // Store SPIR-V as is when debug info is required.
55+ shader.code_compressed_bytes = p_spirv[i].spirv ;
56+ shader.code_compression_flags = 0 ;
57+ shader.code_decompressed_size = 0 ;
58+ } else {
59+ // Encode into smolv.
60+ smolv::ByteArray smolv_bytes;
61+ bool smolv_encoded = smolv::Encode (p_spirv[i].spirv .ptr (), p_spirv[i].spirv .size (), smolv_bytes, smolv::kEncodeFlagStripDebugInfo );
62+ ERR_FAIL_COND_V_MSG (!smolv_encoded, false , " Failed to compress SPIR-V into smolv." );
63+
64+ code_bytes.resize (smolv_bytes.size ());
65+ memcpy (code_bytes.ptrw (), smolv_bytes.data (), code_bytes.size ());
66+
67+ // Compress.
68+ uint32_t compressed_size = 0 ;
69+ shader.code_decompressed_size = code_bytes.size ();
70+ shader.code_compressed_bytes .resize (code_bytes.size ());
71+
72+ bool compressed = compress_code (code_bytes.ptr (), code_bytes.size (), shader.code_compressed_bytes .ptrw (), &compressed_size, &shader.code_compression_flags );
73+ ERR_FAIL_COND_V_MSG (!compressed, false , vformat (" Failed to compress native code to native for SPIR-V #%d." , i));
74+
75+ shader.code_compressed_bytes .resize (compressed_size);
76+
77+ // Indicate it uses smolv for compression.
78+ shader.code_compression_flags |= COMPRESSION_FLAG_SMOLV;
79+ }
80+
8181 shader.shader_stage = p_spirv[i].shader_stage ;
8282 }
8383
8484 return true ;
8585}
8686
87+ RenderingShaderContainerVulkan::RenderingShaderContainerVulkan (bool p_debug_info_enabled) {
88+ debug_info_enabled = p_debug_info_enabled;
89+ }
90+
8791// RenderingShaderContainerFormatVulkan
8892
8993Ref<RenderingShaderContainer> RenderingShaderContainerFormatVulkan::create_container () const {
90- return memnew (RenderingShaderContainerVulkan);
94+ return memnew (RenderingShaderContainerVulkan (debug_info_enabled) );
9195}
9296
9397RenderingDeviceCommons::ShaderLanguageVersion RenderingShaderContainerFormatVulkan::get_shader_language_version () const {
@@ -98,6 +102,10 @@ RenderingDeviceCommons::ShaderSpirvVersion RenderingShaderContainerFormatVulkan:
98102 return SHADER_SPIRV_VERSION_1_3;
99103}
100104
105+ void RenderingShaderContainerFormatVulkan::set_debug_info_enabled (bool p_debug_info_enabled) {
106+ debug_info_enabled = p_debug_info_enabled;
107+ }
108+
101109RenderingShaderContainerFormatVulkan::RenderingShaderContainerFormatVulkan () {}
102110
103111RenderingShaderContainerFormatVulkan::~RenderingShaderContainerFormatVulkan () {}
0 commit comments