瀏覽代碼

Merge pull request #55311 from Chaosus/fix_uniform_array

Fix uniform array alignment to fix a bug
Rémi Verschelde 3 年之前
父節點
當前提交
4813abc6e7

+ 11 - 1
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];

+ 3 - 1
servers/rendering/renderer_rd/shader_compiler_rd.cpp

@@ -661,6 +661,7 @@ String ShaderCompilerRD::_dump_node_code(const SL::Node *p_node, int p_level, Ge
 						uniform_sizes.write[uniform.order] = _get_datatype_size(ShaderLanguage::TYPE_UINT);
 						uniform_alignments.write[uniform.order] = _get_datatype_alignment(ShaderLanguage::TYPE_UINT);
 					} else {
+						// The following code enforces a 16-byte alignment of uniform arrays.
 						if (uniform.array_size > 0) {
 							int size = _get_datatype_size(uniform.type) * uniform.array_size;
 							int m = (16 * uniform.array_size);
@@ -668,10 +669,11 @@ String ShaderCompilerRD::_dump_node_code(const SL::Node *p_node, int p_level, Ge
 								size += m - (size % m);
 							}
 							uniform_sizes.write[uniform.order] = size;
+							uniform_alignments.write[uniform.order] = 16;
 						} else {
 							uniform_sizes.write[uniform.order] = _get_datatype_size(uniform.type);
+							uniform_alignments.write[uniform.order] = _get_datatype_alignment(uniform.type);
 						}
-						uniform_alignments.write[uniform.order] = _get_datatype_alignment(uniform.type);
 					}
 				}