writer/hlsl: Emit UBO as an array of vector
Instead of a ConstantBuffer.
HLSL requires that each structure field in a UBO is 16 byte aligned.
WGSL has much looser constraints with its UBO field alignment rules.
Instead generate an array of uint4 vectors, and index into this, much
like we index into [RW]ByteAddressBuffers for SSBOs.
Extend the DecomposeStorageAccess transform to support uniforms too.
This has been renamed to DecomposeMemoryAccess.
Change-Id: I3868ff80af1ab3b3dddfbf5b969724cb87ef0744
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/55246
Kokoro: Kokoro <noreply+kokoro@google.com>
Reviewed-by: David Neto <dneto@google.com>
diff --git a/test/array/assign_to_workgroup_var.wgsl.expected.hlsl b/test/array/assign_to_workgroup_var.wgsl.expected.hlsl
index 64bb639..49062f7 100644
--- a/test/array/assign_to_workgroup_var.wgsl.expected.hlsl
+++ b/test/array/assign_to_workgroup_var.wgsl.expected.hlsl
@@ -4,30 +4,34 @@
}
struct tint_padded_array_element {
- /* 0x0000 */ int el;
- /* 0x0004 */ int tint_pad_0[3];
+ int el;
};
-
-tint_padded_array_element make_tint_padded_array_element(int param_0) {
- tint_padded_array_element output;
- output.el = param_0;
- return output;
-}
struct tint_array_wrapper {
- /* 0x0000 */ tint_padded_array_element arr[4];
+ tint_padded_array_element arr[4];
};
struct S {
- /* 0x0000 */ tint_array_wrapper arr;
+ tint_array_wrapper arr;
};
-tint_array_wrapper tint_symbol_2(RWByteAddressBuffer buffer, uint offset) {
- const tint_array_wrapper tint_symbol_3 = {{make_tint_padded_array_element(asint(buffer.Load((offset + 0u)))), make_tint_padded_array_element(asint(buffer.Load((offset + 16u)))), make_tint_padded_array_element(asint(buffer.Load((offset + 32u)))), make_tint_padded_array_element(asint(buffer.Load((offset + 48u))))}};
- return tint_symbol_3;
+tint_array_wrapper tint_symbol_2(uint4 buffer[4], uint offset) {
+ const int scalar_offset = ((offset + 0u)) / 4;
+ const int scalar_offset_1 = ((offset + 16u)) / 4;
+ const int scalar_offset_2 = ((offset + 32u)) / 4;
+ const int scalar_offset_3 = ((offset + 48u)) / 4;
+ const tint_array_wrapper tint_symbol_5 = {{{asint(buffer[scalar_offset / 4][scalar_offset % 4])}, {asint(buffer[scalar_offset_1 / 4][scalar_offset_1 % 4])}, {asint(buffer[scalar_offset_2 / 4][scalar_offset_2 % 4])}, {asint(buffer[scalar_offset_3 / 4][scalar_offset_3 % 4])}}};
+ return tint_symbol_5;
+}
+
+tint_array_wrapper tint_symbol_4(RWByteAddressBuffer buffer, uint offset) {
+ const tint_array_wrapper tint_symbol_6 = {{{asint(buffer.Load((offset + 0u)))}, {asint(buffer.Load((offset + 16u)))}, {asint(buffer.Load((offset + 32u)))}, {asint(buffer.Load((offset + 48u)))}}};
+ return tint_symbol_6;
}
static tint_array_wrapper src_private;
groupshared tint_array_wrapper src_workgroup;
-ConstantBuffer<S> src_uniform : register(b0, space0);
+cbuffer cbuffer_src_uniform : register(b0, space0) {
+ uint4 src_uniform[4];
+};
RWByteAddressBuffer src_storage : register(u1, space0);
groupshared tint_array_wrapper tint_symbol;
@@ -44,29 +48,29 @@
groupshared tint_array_wrapper_1 dst_nested;
tint_array_wrapper ret_arr() {
- const tint_array_wrapper tint_symbol_4 = {{make_tint_padded_array_element(0), make_tint_padded_array_element(0), make_tint_padded_array_element(0), make_tint_padded_array_element(0)}};
- return tint_symbol_4;
+ const tint_array_wrapper tint_symbol_7 = {{{0}, {0}, {0}, {0}}};
+ return tint_symbol_7;
}
S ret_struct_arr() {
- const S tint_symbol_5 = {{{make_tint_padded_array_element(0), make_tint_padded_array_element(0), make_tint_padded_array_element(0), make_tint_padded_array_element(0)}}};
- return tint_symbol_5;
+ const S tint_symbol_8 = {{{{0}, {0}, {0}, {0}}}};
+ return tint_symbol_8;
}
void foo(tint_array_wrapper src_param) {
- tint_array_wrapper src_function = {{make_tint_padded_array_element(0), make_tint_padded_array_element(0), make_tint_padded_array_element(0), make_tint_padded_array_element(0)}};
- const tint_array_wrapper tint_symbol_6 = {{make_tint_padded_array_element(1), make_tint_padded_array_element(2), make_tint_padded_array_element(3), make_tint_padded_array_element(3)}};
- tint_symbol = tint_symbol_6;
+ tint_array_wrapper src_function = {{{0}, {0}, {0}, {0}}};
+ const tint_array_wrapper tint_symbol_9 = {{{1}, {2}, {3}, {3}}};
+ tint_symbol = tint_symbol_9;
tint_symbol = src_param;
tint_symbol = ret_arr();
- const tint_array_wrapper src_let = {{make_tint_padded_array_element(0), make_tint_padded_array_element(0), make_tint_padded_array_element(0), make_tint_padded_array_element(0)}};
+ const tint_array_wrapper src_let = {{{0}, {0}, {0}, {0}}};
tint_symbol = src_let;
tint_symbol = src_function;
tint_symbol = src_private;
tint_symbol = src_workgroup;
tint_symbol = ret_struct_arr().arr;
- tint_symbol = src_uniform.arr;
- tint_symbol = tint_symbol_2(src_storage, 0u);
+ tint_symbol = tint_symbol_2(src_uniform, 0u);
+ tint_symbol = tint_symbol_4(src_storage, 0u);
tint_array_wrapper_1 src_nested = {{{{{{0, 0}}, {{0, 0}}, {{0, 0}}}}, {{{{0, 0}}, {{0, 0}}, {{0, 0}}}}, {{{{0, 0}}, {{0, 0}}, {{0, 0}}}}, {{{{0, 0}}, {{0, 0}}, {{0, 0}}}}}};
dst_nested = src_nested;
}