|
@@ -3441,7 +3441,7 @@ Vector<uint8_t> RenderingDeviceDriverVulkan::shader_compile_binary_from_spirv(Ve
|
|
|
|
|
|
binary_data.shader_name_len = shader_name_utf.length();
|
|
|
|
|
|
- uint32_t total_size = sizeof(uint32_t) * 3; // Header + version + main datasize;.
|
|
|
+ uint32_t total_size = sizeof(uint32_t) * 4; // Header + version + pad + main datasize;.
|
|
|
total_size += sizeof(ShaderBinary::Data);
|
|
|
|
|
|
total_size += STEPIFY(binary_data.shader_name_len, 4);
|
|
@@ -3470,6 +3470,8 @@ Vector<uint8_t> RenderingDeviceDriverVulkan::shader_compile_binary_from_spirv(Ve
|
|
|
offset += sizeof(uint32_t);
|
|
|
encode_uint32(sizeof(ShaderBinary::Data), binptr + offset);
|
|
|
offset += sizeof(uint32_t);
|
|
|
+ encode_uint32(0, binptr + offset); // Pad to align ShaderBinary::Data to 8 bytes.
|
|
|
+ offset += sizeof(uint32_t);
|
|
|
memcpy(binptr + offset, &binary_data, sizeof(ShaderBinary::Data));
|
|
|
offset += sizeof(ShaderBinary::Data);
|
|
|
|
|
@@ -3528,7 +3530,7 @@ RDD::ShaderID RenderingDeviceDriverVulkan::shader_create_from_bytecode(const Vec
|
|
|
uint32_t read_offset = 0;
|
|
|
|
|
|
// Consistency check.
|
|
|
- ERR_FAIL_COND_V(binsize < sizeof(uint32_t) * 3 + sizeof(ShaderBinary::Data), ShaderID());
|
|
|
+ ERR_FAIL_COND_V(binsize < sizeof(uint32_t) * 4 + sizeof(ShaderBinary::Data), ShaderID());
|
|
|
ERR_FAIL_COND_V(binptr[0] != 'G' || binptr[1] != 'S' || binptr[2] != 'B' || binptr[3] != 'D', ShaderID());
|
|
|
|
|
|
uint32_t bin_version = decode_uint32(binptr + 4);
|
|
@@ -3536,7 +3538,8 @@ RDD::ShaderID RenderingDeviceDriverVulkan::shader_create_from_bytecode(const Vec
|
|
|
|
|
|
uint32_t bin_data_size = decode_uint32(binptr + 8);
|
|
|
|
|
|
- const ShaderBinary::Data &binary_data = *(reinterpret_cast<const ShaderBinary::Data *>(binptr + 12));
|
|
|
+ // 16, not 12, to skip alignment padding.
|
|
|
+ const ShaderBinary::Data &binary_data = *(reinterpret_cast<const ShaderBinary::Data *>(binptr + 16));
|
|
|
|
|
|
r_shader_desc.push_constant_size = binary_data.push_constant_size;
|
|
|
shader_info.vk_push_constant_stages = binary_data.vk_push_constant_stages_mask;
|
|
@@ -3549,7 +3552,7 @@ RDD::ShaderID RenderingDeviceDriverVulkan::shader_create_from_bytecode(const Vec
|
|
|
r_shader_desc.compute_local_size[1] = binary_data.compute_local_size[1];
|
|
|
r_shader_desc.compute_local_size[2] = binary_data.compute_local_size[2];
|
|
|
|
|
|
- read_offset += sizeof(uint32_t) * 3 + bin_data_size;
|
|
|
+ read_offset += sizeof(uint32_t) * 4 + bin_data_size;
|
|
|
|
|
|
if (binary_data.shader_name_len) {
|
|
|
r_name.parse_utf8((const char *)(binptr + read_offset), binary_data.shader_name_len);
|