Skip to content

Commit e137c88

Browse files
committed
Disable smolv and change the shader hash when SPIR-V debug info is enabled.
1 parent 4ebf67c commit e137c88

File tree

5 files changed

+73
-52
lines changed

5 files changed

+73
-52
lines changed

drivers/vulkan/rendering_device_driver_vulkan.cpp

Lines changed: 15 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,7 @@
3434
#include "core/io/marshalls.h"
3535
#include "vulkan_hooks.h"
3636

37-
#if RENDERING_SHADER_CONTAINER_VULKAN_SMOLV
3837
#include "thirdparty/misc/smolv.h"
39-
#endif
4038

4139
#if defined(ANDROID_ENABLED)
4240
#include "platform/android/java_godot_wrapper.h"
@@ -1586,6 +1584,8 @@ Error RenderingDeviceDriverVulkan::initialize(uint32_t p_device_index, uint32_t
15861584
}
15871585
#endif
15881586

1587+
shader_container_format.set_debug_info_enabled(Engine::get_singleton()->is_generate_spirv_debug_info_enabled());
1588+
15891589
return OK;
15901590
}
15911591

@@ -3664,7 +3664,6 @@ RDD::ShaderID RenderingDeviceDriverVulkan::shader_create_from_container(const Re
36643664
VkShaderModule vk_module;
36653665
for (int i = 0; i < shader_refl.stages_vector.size(); i++) {
36663666
const RenderingShaderContainer::Shader &shader = p_shader_container->shaders[i];
3667-
#if RENDERING_SHADER_CONTAINER_VULKAN_COMPRESSION
36683667
bool requires_decompression = (shader.code_decompressed_size > 0);
36693668
if (requires_decompression) {
36703669
decompressed_code.resize(shader.code_decompressed_size);
@@ -3674,27 +3673,24 @@ RDD::ShaderID RenderingDeviceDriverVulkan::shader_create_from_container(const Re
36743673
break;
36753674
}
36763675
}
3677-
#else
3678-
bool requires_decompression = false;
3679-
#endif
36803676

36813677
const uint8_t *smolv_input = requires_decompression ? decompressed_code.ptr() : shader.code_compressed_bytes.ptr();
36823678
uint32_t smolv_input_size = requires_decompression ? decompressed_code.size() : shader.code_compressed_bytes.size();
3683-
#if RENDERING_SHADER_CONTAINER_VULKAN_SMOLV
3684-
decoded_spirv.resize(smolv::GetDecodedBufferSize(smolv_input, smolv_input_size));
3685-
if (decoded_spirv.is_empty()) {
3686-
error_text = vformat("Malformed smolv input on shader stage %s.", String(SHADER_STAGE_NAMES[shader_refl.stages_vector[i]]));
3687-
break;
3688-
}
3679+
if (shader.code_compression_flags & RenderingShaderContainerVulkan::COMPRESSION_FLAG_SMOLV) {
3680+
decoded_spirv.resize(smolv::GetDecodedBufferSize(smolv_input, smolv_input_size));
3681+
if (decoded_spirv.is_empty()) {
3682+
error_text = vformat("Malformed smolv input on shader stage %s.", String(SHADER_STAGE_NAMES[shader_refl.stages_vector[i]]));
3683+
break;
3684+
}
36893685

3690-
if (!smolv::Decode(smolv_input, smolv_input_size, decoded_spirv.ptrw(), decoded_spirv.size())) {
3691-
error_text = vformat("Malformed smolv input on shader stage %s.", String(SHADER_STAGE_NAMES[shader_refl.stages_vector[i]]));
3692-
break;
3686+
if (!smolv::Decode(smolv_input, smolv_input_size, decoded_spirv.ptrw(), decoded_spirv.size())) {
3687+
error_text = vformat("Malformed smolv input on shader stage %s.", String(SHADER_STAGE_NAMES[shader_refl.stages_vector[i]]));
3688+
break;
3689+
}
3690+
} else {
3691+
decoded_spirv.resize(smolv_input_size);
3692+
memcpy(decoded_spirv.ptrw(), smolv_input, decoded_spirv.size());
36933693
}
3694-
#else
3695-
decoded_spirv.resize(smolv_input_size);
3696-
memcpy(decoded_spirv.ptrw(), smolv_input, decoded_spirv.size());
3697-
#endif
36983694

36993695
VkShaderModuleCreateInfo shader_module_create_info = {};
37003696
shader_module_create_info.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;

drivers/vulkan/rendering_shader_container_vulkan.cpp

Lines changed: 38 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,7 @@
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

8993
Ref<RenderingShaderContainer> RenderingShaderContainerFormatVulkan::create_container() const {
90-
return memnew(RenderingShaderContainerVulkan);
94+
return memnew(RenderingShaderContainerVulkan(debug_info_enabled));
9195
}
9296

9397
RenderingDeviceCommons::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+
101109
RenderingShaderContainerFormatVulkan::RenderingShaderContainerFormatVulkan() {}
102110

103111
RenderingShaderContainerFormatVulkan::~RenderingShaderContainerFormatVulkan() {}

drivers/vulkan/rendering_shader_container_vulkan.h

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,26 +32,36 @@
3232

3333
#include "servers/rendering/rendering_shader_container.h"
3434

35-
#define RENDERING_SHADER_CONTAINER_VULKAN_COMPRESSION 1
36-
#define RENDERING_SHADER_CONTAINER_VULKAN_SMOLV 1
37-
3835
class RenderingShaderContainerVulkan : public RenderingShaderContainer {
3936
GDSOFTCLASS(RenderingShaderContainerVulkan, RenderingShaderContainer);
4037

4138
public:
4239
static const uint32_t FORMAT_VERSION;
4340

41+
enum CompressionFlagsVulkan {
42+
COMPRESSION_FLAG_SMOLV = 0x10000,
43+
};
44+
45+
bool debug_info_enabled = false;
46+
4447
protected:
4548
virtual uint32_t _format() const override;
4649
virtual uint32_t _format_version() const override;
4750
virtual bool _set_code_from_spirv(const Vector<RenderingDeviceCommons::ShaderStageSPIRVData> &p_spirv) override;
51+
52+
public:
53+
RenderingShaderContainerVulkan(bool p_debug_info_enabled);
4854
};
4955

5056
class RenderingShaderContainerFormatVulkan : public RenderingShaderContainerFormat {
57+
private:
58+
bool debug_info_enabled = false;
59+
5160
public:
5261
virtual Ref<RenderingShaderContainer> create_container() const override;
5362
virtual ShaderLanguageVersion get_shader_language_version() const override;
5463
virtual ShaderSpirvVersion get_shader_spirv_version() const override;
64+
void set_debug_info_enabled(bool p_debug_info_enabled);
5565
RenderingShaderContainerFormatVulkan();
5666
virtual ~RenderingShaderContainerFormatVulkan();
5767
};

editor/export/shader_baker_export_plugin.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,11 @@ bool ShaderBakerExportPlugin::_begin_customize_resources(const Ref<EditorExportP
103103
return false;
104104
}
105105

106+
if (Engine::get_singleton()->is_generate_spirv_debug_info_enabled()) {
107+
WARN_PRINT("Shader baker can't generate a compatible shader when run with --generate-spirv-debug-info. Restart the editor without this argument if you want to bake shaders.");
108+
return false;
109+
}
110+
106111
shader_cache_platform_name = p_platform->get_os_name();
107112
shader_cache_renderer_name = RendererSceneRenderRD::get_singleton()->get_name();
108113
tasks_processed = 0;

servers/rendering/renderer_rd/shader_rd.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,8 @@ void ShaderRD::setup(const char *p_vertex_code, const char *p_fragment_code, con
158158
tohash.append(p_fragment_code ? p_fragment_code : "");
159159
tohash.append("[Compute]");
160160
tohash.append(p_compute_code ? p_compute_code : "");
161+
tohash.append("[DebugInfo]");
162+
tohash.append(Engine::get_singleton()->is_generate_spirv_debug_info_enabled() ? "1" : "0");
161163

162164
base_sha256 = tohash.as_string().sha256_text();
163165
}

0 commit comments

Comments
 (0)