diff options
author | Yuri Roubinsky <chaosus89@gmail.com> | 2021-11-25 23:34:58 +0300 |
---|---|---|
committer | Yuri Roubinsky <chaosus89@gmail.com> | 2021-11-25 23:38:08 +0300 |
commit | 43d999e346f5a4b5ea813b63d157725d3f84335e (patch) | |
tree | 473b74d3f11aee4da93d8d3f36b6bacd5803151d /servers/rendering/renderer_rd/renderer_storage_rd.cpp | |
parent | 1e99eea0640b32b6349c31b1984134c2e031b92d (diff) | |
download | redot-engine-43d999e346f5a4b5ea813b63d157725d3f84335e.tar.gz |
Fix uniform array alignment to fix a bug
Diffstat (limited to 'servers/rendering/renderer_rd/renderer_storage_rd.cpp')
-rw-r--r-- | servers/rendering/renderer_rd/renderer_storage_rd.cpp | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/servers/rendering/renderer_rd/renderer_storage_rd.cpp b/servers/rendering/renderer_rd/renderer_storage_rd.cpp index 04acc871b4..fd26efa1fb 100644 --- a/servers/rendering/renderer_rd/renderer_storage_rd.cpp +++ b/servers/rendering/renderer_rd/renderer_storage_rd.cpp @@ -2652,7 +2652,17 @@ void RendererStorageRD::MaterialData::update_uniform_buffer(const Map<StringName //regular uniform uint32_t offset = p_uniform_offsets[E.value.order]; #ifdef DEBUG_ENABLED - uint32_t size = ShaderLanguage::get_type_size(E.value.type); + uint32_t size = 0U; + // The following code enforces a 16-byte alignment of uniform arrays. + if (E.value.array_size > 0) { + size = ShaderLanguage::get_type_size(E.value.type) * E.value.array_size; + int m = (16 * E.value.array_size); + if ((size % m) != 0U) { + size += m - (size % m); + } + } else { + size = ShaderLanguage::get_type_size(E.value.type); + } ERR_CONTINUE(offset + size > p_buffer_size); #endif uint8_t *data = &p_buffer[offset]; |