|
@@ -36,6 +36,7 @@
|
|
|
#include "core/io/marshalls.h"
|
|
|
#include "core/os/os.h"
|
|
|
#include "core/templates/hashfuncs.h"
|
|
|
+#include "core/version.h"
|
|
|
#include "drivers/vulkan/vulkan_context.h"
|
|
|
|
|
|
#include "thirdparty/misc/smolv.h"
|
|
@@ -4656,7 +4657,7 @@ bool RenderingDeviceVulkan::_uniform_add_binding(Vector<Vector<VkDescriptorSetLa
|
|
|
#define SHADER_BINARY_VERSION 3
|
|
|
|
|
|
String RenderingDeviceVulkan::shader_get_binary_cache_key() const {
|
|
|
- return "Vulkan-SV" + itos(SHADER_BINARY_VERSION);
|
|
|
+ return "Vulkan-SV" + itos(SHADER_BINARY_VERSION) + "-" + String(VERSION_NUMBER) + "-" + String(VERSION_HASH);
|
|
|
}
|
|
|
|
|
|
struct RenderingDeviceVulkanShaderBinaryDataBinding {
|
|
@@ -4830,7 +4831,7 @@ Vector<uint8_t> RenderingDeviceVulkan::shader_compile_binary_from_spirv(const Ve
|
|
|
}
|
|
|
|
|
|
if (may_be_writable) {
|
|
|
- info.writable = !(bool)(binding.type_description->decoration_flags & SPV_REFLECT_DECORATION_NON_WRITABLE);
|
|
|
+ info.writable = !(binding.type_description->decoration_flags & SPV_REFLECT_DECORATION_NON_WRITABLE) && !(binding.block.decoration_flags & SPV_REFLECT_DECORATION_NON_WRITABLE);
|
|
|
} else {
|
|
|
info.writable = false;
|
|
|
}
|
|
@@ -4857,6 +4858,10 @@ Vector<uint8_t> RenderingDeviceVulkan::shader_compile_binary_from_spirv(const Ve
|
|
|
ERR_FAIL_COND_V_MSG(uniform_info[set][k].length != info.length, Vector<uint8_t>(),
|
|
|
"On shader stage '" + String(shader_stage_names[stage]) + "', uniform '" + binding.name + "' trying to re-use location for set=" + itos(set) + ", binding=" + itos(info.binding) + " with different uniform size.");
|
|
|
|
|
|
+ //also, verify that it has the same writability
|
|
|
+ ERR_FAIL_COND_V_MSG(uniform_info[set][k].writable != info.writable, Vector<uint8_t>(),
|
|
|
+ "On shader stage '" + String(shader_stage_names[stage]) + "', uniform '" + binding.name + "' trying to re-use location for set=" + itos(set) + ", binding=" + itos(info.binding) + " with different writability.");
|
|
|
+
|
|
|
//just append stage mask and return
|
|
|
uniform_info.write[set].write[k].stages |= 1 << stage;
|
|
|
exists = true;
|
|
@@ -5156,7 +5161,7 @@ RID RenderingDeviceVulkan::shader_create_from_bytecode(const Vector<uint8_t> &p_
|
|
|
ERR_FAIL_COND_V(binptr[0] != 'G' || binptr[1] != 'V' || binptr[2] != 'B' || binptr[3] != 'D', RID());
|
|
|
|
|
|
uint32_t bin_version = decode_uint32(binptr + 4);
|
|
|
- ERR_FAIL_COND_V(bin_version > SHADER_BINARY_VERSION, RID());
|
|
|
+ ERR_FAIL_COND_V(bin_version != SHADER_BINARY_VERSION, RID());
|
|
|
|
|
|
uint32_t bin_data_size = decode_uint32(binptr + 8);
|
|
|
|