diff --git a/src/tint/writer/glsl/generator_impl.cc b/src/tint/writer/glsl/generator_impl.cc index 0771da9587..5031329dcb 100644 --- a/src/tint/writer/glsl/generator_impl.cc +++ b/src/tint/writer/glsl/generator_impl.cc @@ -221,10 +221,8 @@ SanitizedResult Sanitize(const Program* in, manager.Add(); manager.Add(); manager.Add(); - manager.Add(); // Must come after PromoteSideEffectsToDecl manager.Add(); manager.Add(); - manager.Add(); manager.Add(); @@ -245,6 +243,13 @@ SanitizedResult Sanitize(const Program* in, manager.Add(); manager.Add(); manager.Add(); + + // Std140 must come after PromoteSideEffectsToDecl and AddBlockAttribute + // Std140 must come before SimplifyPointers. + manager.Add(); + + manager.Add(); + data.Add( transform::CanonicalizeEntryPointIO::ShaderStyle::kGlsl); diff --git a/src/tint/writer/spirv/generator_impl.cc b/src/tint/writer/spirv/generator_impl.cc index f303324948..2a2c25c8c1 100644 --- a/src/tint/writer/spirv/generator_impl.cc +++ b/src/tint/writer/spirv/generator_impl.cc @@ -77,19 +77,25 @@ SanitizedResult Sanitize(const Program* in, const Options& options) { manager.Add(); manager.Add(); manager.Add(); - manager.Add(); // Must come after PromoteSideEffectsToDecl manager.Add(); manager.Add(); // Required for arrayLength() manager.Add(); manager.Add(); manager.Add(); - manager.Add(); // Must come after - manager.Add(); // ZeroInitWorkgroupMemory + manager.Add(); // ZeroInitWorkgroupMemory manager.Add(); manager.Add(); manager.Add(); + + // Std140 must come after PromoteSideEffectsToDecl, AddBlockAttribute + manager.Add(); + + // VarForDynamicIndex must come after Std140 manager.Add(); + // ForLoopToLoop must come after Std140, ZeroInitWorkgroupMemory + manager.Add(); + data.Add( transform::CanonicalizeEntryPointIO::Config( transform::CanonicalizeEntryPointIO::ShaderStyle::kSpirv, 0xFFFFFFFF, diff --git a/test/tint/buffer/uniform/dynamic_index/read.wgsl.expected.glsl b/test/tint/buffer/uniform/dynamic_index/read.wgsl.expected.glsl index 067b82de10..b992d245f1 100644 --- a/test/tint/buffer/uniform/dynamic_index/read.wgsl.expected.glsl +++ b/test/tint/buffer/uniform/dynamic_index/read.wgsl.expected.glsl @@ -11,6 +11,8 @@ struct Inner { ivec2 h; mat2x3 i; mat3x2 j; + uint pad; + uint pad_1; ivec4 k[4]; }; @@ -32,10 +34,6 @@ struct Inner_std140 { ivec4 k[4]; }; -struct S { - Inner arr[8]; -}; - layout(binding = 0, std140) uniform S_std140_ubo { Inner_std140 arr[8]; } s; diff --git a/test/tint/buffer/uniform/dynamic_index/read.wgsl.expected.spvasm b/test/tint/buffer/uniform/dynamic_index/read.wgsl.expected.spvasm index 42889abb48..d2f0b8e109 100644 --- a/test/tint/buffer/uniform/dynamic_index/read.wgsl.expected.spvasm +++ b/test/tint/buffer/uniform/dynamic_index/read.wgsl.expected.spvasm @@ -1,7 +1,7 @@ ; SPIR-V ; Version: 1.3 ; Generator: Google Tint Compiler; 0 -; Bound: 86 +; Bound: 92 ; Schema: 0 OpCapability Shader OpMemoryModel Logical GLSL450 @@ -76,12 +76,13 @@ %mat3v2float = OpTypeMatrix %v2float 3 %21 = OpTypeFunction %mat3v2float %uint %uint_0 = OpConstant %uint 0 +%_ptr_Uniform_Inner_std140 = OpTypePointer Uniform %Inner_std140 %uint_9 = OpConstant %uint 9 %_ptr_Uniform_v2float = OpTypePointer Uniform %v2float %uint_10 = OpConstant %uint 10 %uint_11 = OpConstant %uint 11 %void = OpTypeVoid - %38 = OpTypeFunction %void %uint + %44 = OpTypeFunction %void %uint %_ptr_Uniform_v3int = OpTypePointer Uniform %v3int %uint_1 = OpConstant %uint 1 %_ptr_Uniform_int = OpTypePointer Uniform %int @@ -98,48 +99,49 @@ %_ptr_Uniform_mat2v3float = OpTypePointer Uniform %mat2v3float %uint_12 = OpConstant %uint 12 %_ptr_Uniform__arr_v4int_uint_4 = OpTypePointer Uniform %_arr_v4int_uint_4 - %81 = OpTypeFunction %void + %87 = OpTypeFunction %void %load_s_arr_p0_j = OpFunction %mat3v2float None %21 %p0 = OpFunctionParameter %uint %25 = OpLabel - %29 = OpAccessChain %_ptr_Uniform_v2float %s %uint_0 %p0 %uint_9 - %30 = OpLoad %v2float %29 - %32 = OpAccessChain %_ptr_Uniform_v2float %s %uint_0 %p0 %uint_10 - %33 = OpLoad %v2float %32 - %35 = OpAccessChain %_ptr_Uniform_v2float %s %uint_0 %p0 %uint_11 - %36 = OpLoad %v2float %35 - %37 = OpCompositeConstruct %mat3v2float %30 %33 %36 - OpReturnValue %37 + %29 = OpAccessChain %_ptr_Uniform_Inner_std140 %s %uint_0 %p0 + %33 = OpAccessChain %_ptr_Uniform_v2float %29 %uint_9 + %34 = OpLoad %v2float %33 + %37 = OpAccessChain %_ptr_Uniform_v2float %29 %uint_10 + %38 = OpLoad %v2float %37 + %41 = OpAccessChain %_ptr_Uniform_v2float %29 %uint_11 + %42 = OpLoad %v2float %41 + %43 = OpCompositeConstruct %mat3v2float %34 %38 %42 + OpReturnValue %43 OpFunctionEnd - %main_inner = OpFunction %void None %38 + %main_inner = OpFunction %void None %44 %idx = OpFunctionParameter %uint - %42 = OpLabel - %44 = OpAccessChain %_ptr_Uniform_v3int %s %uint_0 %idx %uint_0 - %45 = OpLoad %v3int %44 - %48 = OpAccessChain %_ptr_Uniform_int %s %uint_0 %idx %uint_1 - %49 = OpLoad %int %48 - %52 = OpAccessChain %_ptr_Uniform_v3uint %s %uint_0 %idx %uint_2 - %53 = OpLoad %v3uint %52 - %56 = OpAccessChain %_ptr_Uniform_uint %s %uint_0 %idx %uint_3 - %57 = OpLoad %uint %56 - %59 = OpAccessChain %_ptr_Uniform_v3float %s %uint_0 %idx %uint_4 - %60 = OpLoad %v3float %59 - %63 = OpAccessChain %_ptr_Uniform_float %s %uint_0 %idx %uint_5 - %64 = OpLoad %float %63 - %67 = OpAccessChain %_ptr_Uniform_v2int %s %uint_0 %idx %uint_6 - %68 = OpLoad %v2int %67 - %70 = OpAccessChain %_ptr_Uniform_v2int %s %uint_0 %idx %uint_7 - %71 = OpLoad %v2int %70 - %73 = OpAccessChain %_ptr_Uniform_mat2v3float %s %uint_0 %idx %uint_8 - %74 = OpLoad %mat2v3float %73 - %75 = OpFunctionCall %mat3v2float %load_s_arr_p0_j %idx - %79 = OpAccessChain %_ptr_Uniform__arr_v4int_uint_4 %s %uint_0 %idx %uint_12 - %80 = OpLoad %_arr_v4int_uint_4 %79 + %48 = OpLabel + %50 = OpAccessChain %_ptr_Uniform_v3int %s %uint_0 %idx %uint_0 + %51 = OpLoad %v3int %50 + %54 = OpAccessChain %_ptr_Uniform_int %s %uint_0 %idx %uint_1 + %55 = OpLoad %int %54 + %58 = OpAccessChain %_ptr_Uniform_v3uint %s %uint_0 %idx %uint_2 + %59 = OpLoad %v3uint %58 + %62 = OpAccessChain %_ptr_Uniform_uint %s %uint_0 %idx %uint_3 + %63 = OpLoad %uint %62 + %65 = OpAccessChain %_ptr_Uniform_v3float %s %uint_0 %idx %uint_4 + %66 = OpLoad %v3float %65 + %69 = OpAccessChain %_ptr_Uniform_float %s %uint_0 %idx %uint_5 + %70 = OpLoad %float %69 + %73 = OpAccessChain %_ptr_Uniform_v2int %s %uint_0 %idx %uint_6 + %74 = OpLoad %v2int %73 + %76 = OpAccessChain %_ptr_Uniform_v2int %s %uint_0 %idx %uint_7 + %77 = OpLoad %v2int %76 + %79 = OpAccessChain %_ptr_Uniform_mat2v3float %s %uint_0 %idx %uint_8 + %80 = OpLoad %mat2v3float %79 + %81 = OpFunctionCall %mat3v2float %load_s_arr_p0_j %idx + %85 = OpAccessChain %_ptr_Uniform__arr_v4int_uint_4 %s %uint_0 %idx %uint_12 + %86 = OpLoad %_arr_v4int_uint_4 %85 OpReturn OpFunctionEnd - %main = OpFunction %void None %81 - %83 = OpLabel - %85 = OpLoad %uint %idx_1 - %84 = OpFunctionCall %void %main_inner %85 + %main = OpFunction %void None %87 + %89 = OpLabel + %91 = OpLoad %uint %idx_1 + %90 = OpFunctionCall %void %main_inner %91 OpReturn OpFunctionEnd diff --git a/test/tint/buffer/uniform/static_index/read.wgsl.expected.glsl b/test/tint/buffer/uniform/static_index/read.wgsl.expected.glsl index 1b07ab0d8b..233bbf45c6 100644 --- a/test/tint/buffer/uniform/static_index/read.wgsl.expected.glsl +++ b/test/tint/buffer/uniform/static_index/read.wgsl.expected.glsl @@ -7,21 +7,6 @@ struct Inner { uint pad_2; }; -struct S { - ivec3 a; - int b; - uvec3 c; - uint d; - vec3 e; - float f; - ivec2 g; - ivec2 h; - mat2x3 i; - mat3x2 j; - Inner k; - Inner l[4]; -}; - layout(binding = 0, std140) uniform S_std140_ubo { ivec3 a; int b; diff --git a/test/tint/buffer/uniform/static_index/read.wgsl.expected.spvasm b/test/tint/buffer/uniform/static_index/read.wgsl.expected.spvasm index 7134d5b9fb..b93631f3d1 100644 --- a/test/tint/buffer/uniform/static_index/read.wgsl.expected.spvasm +++ b/test/tint/buffer/uniform/static_index/read.wgsl.expected.spvasm @@ -1,7 +1,7 @@ ; SPIR-V ; Version: 1.3 ; Generator: Google Tint Compiler; 0 -; Bound: 78 +; Bound: 82 ; Schema: 0 OpCapability Shader OpMemoryModel Logical GLSL450 @@ -71,7 +71,7 @@ %uint_10 = OpConstant %uint 10 %uint_11 = OpConstant %uint 11 %void = OpTypeVoid - %31 = OpTypeFunction %void + %35 = OpTypeFunction %void %uint_0 = OpConstant %uint 0 %_ptr_Uniform_v3int = OpTypePointer Uniform %v3int %uint_1 = OpConstant %uint 1 @@ -94,39 +94,39 @@ %_ptr_Uniform__arr_Inner_uint_4 = OpTypePointer Uniform %_arr_Inner_uint_4 %load_s_j = OpFunction %mat3v2float None %16 %19 = OpLabel - %22 = OpAccessChain %_ptr_Uniform_v2float %s %uint_9 - %23 = OpLoad %v2float %22 - %25 = OpAccessChain %_ptr_Uniform_v2float %s %uint_10 - %26 = OpLoad %v2float %25 - %28 = OpAccessChain %_ptr_Uniform_v2float %s %uint_11 + %24 = OpAccessChain %_ptr_Uniform_v2float %s %uint_9 + %25 = OpLoad %v2float %24 + %28 = OpAccessChain %_ptr_Uniform_v2float %s %uint_10 %29 = OpLoad %v2float %28 - %30 = OpCompositeConstruct %mat3v2float %23 %26 %29 - OpReturnValue %30 + %32 = OpAccessChain %_ptr_Uniform_v2float %s %uint_11 + %33 = OpLoad %v2float %32 + %34 = OpCompositeConstruct %mat3v2float %25 %29 %33 + OpReturnValue %34 OpFunctionEnd - %main = OpFunction %void None %31 - %34 = OpLabel - %37 = OpAccessChain %_ptr_Uniform_v3int %s %uint_0 - %38 = OpLoad %v3int %37 - %41 = OpAccessChain %_ptr_Uniform_int %s %uint_1 - %42 = OpLoad %int %41 - %45 = OpAccessChain %_ptr_Uniform_v3uint %s %uint_2 - %46 = OpLoad %v3uint %45 - %49 = OpAccessChain %_ptr_Uniform_uint %s %uint_3 - %50 = OpLoad %uint %49 - %52 = OpAccessChain %_ptr_Uniform_v3float %s %uint_4 - %53 = OpLoad %v3float %52 - %56 = OpAccessChain %_ptr_Uniform_float %s %uint_5 - %57 = OpLoad %float %56 - %60 = OpAccessChain %_ptr_Uniform_v2int %s %uint_6 - %61 = OpLoad %v2int %60 - %63 = OpAccessChain %_ptr_Uniform_v2int %s %uint_7 - %64 = OpLoad %v2int %63 - %67 = OpAccessChain %_ptr_Uniform_mat2v3float %s %uint_8 - %68 = OpLoad %mat2v3float %67 - %69 = OpFunctionCall %mat3v2float %load_s_j - %72 = OpAccessChain %_ptr_Uniform_Inner %s %uint_12 - %73 = OpLoad %Inner %72 - %76 = OpAccessChain %_ptr_Uniform__arr_Inner_uint_4 %s %uint_13 - %77 = OpLoad %_arr_Inner_uint_4 %76 + %main = OpFunction %void None %35 + %38 = OpLabel + %41 = OpAccessChain %_ptr_Uniform_v3int %s %uint_0 + %42 = OpLoad %v3int %41 + %45 = OpAccessChain %_ptr_Uniform_int %s %uint_1 + %46 = OpLoad %int %45 + %49 = OpAccessChain %_ptr_Uniform_v3uint %s %uint_2 + %50 = OpLoad %v3uint %49 + %53 = OpAccessChain %_ptr_Uniform_uint %s %uint_3 + %54 = OpLoad %uint %53 + %56 = OpAccessChain %_ptr_Uniform_v3float %s %uint_4 + %57 = OpLoad %v3float %56 + %60 = OpAccessChain %_ptr_Uniform_float %s %uint_5 + %61 = OpLoad %float %60 + %64 = OpAccessChain %_ptr_Uniform_v2int %s %uint_6 + %65 = OpLoad %v2int %64 + %67 = OpAccessChain %_ptr_Uniform_v2int %s %uint_7 + %68 = OpLoad %v2int %67 + %71 = OpAccessChain %_ptr_Uniform_mat2v3float %s %uint_8 + %72 = OpLoad %mat2v3float %71 + %73 = OpFunctionCall %mat3v2float %load_s_j + %76 = OpAccessChain %_ptr_Uniform_Inner %s %uint_12 + %77 = OpLoad %Inner %76 + %80 = OpAccessChain %_ptr_Uniform__arr_Inner_uint_4 %s %uint_13 + %81 = OpLoad %_arr_Inner_uint_4 %80 OpReturn OpFunctionEnd diff --git a/test/tint/buffer/uniform/std140/array/mat2x2/dynamic_index_via_ptr.wgsl b/test/tint/buffer/uniform/std140/array/mat2x2/dynamic_index_via_ptr.wgsl new file mode 100644 index 0000000000..241aa52fe9 --- /dev/null +++ b/test/tint/buffer/uniform/std140/array/mat2x2/dynamic_index_via_ptr.wgsl @@ -0,0 +1,15 @@ +@group(0) @binding(0) var a : array, 4>; + +var counter = 0; +fn i() -> i32 { counter++; return counter; } + +@compute @workgroup_size(1) +fn f() { + let p_a = &a; + let p_a_i = &((*p_a)[i()]); + let p_a_i_i = &((*p_a_i)[i()]); + + let l_a : array, 4> = *p_a; + let l_a_i : mat2x2 = *p_a_i; + let l_a_i_i : vec2 = *p_a_i_i; +} diff --git a/test/tint/buffer/uniform/std140/array/mat2x2/dynamic_index_via_ptr.wgsl.expected.dxc.hlsl b/test/tint/buffer/uniform/std140/array/mat2x2/dynamic_index_via_ptr.wgsl.expected.dxc.hlsl new file mode 100644 index 0000000000..c66c0624f3 --- /dev/null +++ b/test/tint/buffer/uniform/std140/array/mat2x2/dynamic_index_via_ptr.wgsl.expected.dxc.hlsl @@ -0,0 +1,40 @@ +cbuffer cbuffer_a : register(b0, space0) { + uint4 a[4]; +}; +static int counter = 0; + +int i() { + counter = (counter + 1); + return counter; +} + +float2x2 tint_symbol_1(uint4 buffer[4], uint offset) { + const uint scalar_offset = ((offset + 0u)) / 4; + uint4 ubo_load = buffer[scalar_offset / 4]; + const uint scalar_offset_1 = ((offset + 8u)) / 4; + uint4 ubo_load_1 = buffer[scalar_offset_1 / 4]; + return float2x2(asfloat(((scalar_offset & 2) ? ubo_load.zw : ubo_load.xy)), asfloat(((scalar_offset_1 & 2) ? ubo_load_1.zw : ubo_load_1.xy))); +} + +typedef float2x2 tint_symbol_ret[4]; +tint_symbol_ret tint_symbol(uint4 buffer[4], uint offset) { + float2x2 arr[4] = (float2x2[4])0; + { + [loop] for(uint i_1 = 0u; (i_1 < 4u); i_1 = (i_1 + 1u)) { + arr[i_1] = tint_symbol_1(buffer, (offset + (i_1 * 16u))); + } + } + return arr; +} + +[numthreads(1, 1, 1)] +void f() { + const int p_a_i_save = i(); + const int p_a_i_i_save = i(); + const float2x2 l_a[4] = tint_symbol(a, 0u); + const float2x2 l_a_i = tint_symbol_1(a, (16u * uint(p_a_i_save))); + const uint scalar_offset_2 = (((16u * uint(p_a_i_save)) + (8u * uint(p_a_i_i_save)))) / 4; + uint4 ubo_load_2 = a[scalar_offset_2 / 4]; + const float2 l_a_i_i = asfloat(((scalar_offset_2 & 2) ? ubo_load_2.zw : ubo_load_2.xy)); + return; +} diff --git a/test/tint/buffer/uniform/std140/array/mat2x2/dynamic_index_via_ptr.wgsl.expected.fxc.hlsl b/test/tint/buffer/uniform/std140/array/mat2x2/dynamic_index_via_ptr.wgsl.expected.fxc.hlsl new file mode 100644 index 0000000000..c66c0624f3 --- /dev/null +++ b/test/tint/buffer/uniform/std140/array/mat2x2/dynamic_index_via_ptr.wgsl.expected.fxc.hlsl @@ -0,0 +1,40 @@ +cbuffer cbuffer_a : register(b0, space0) { + uint4 a[4]; +}; +static int counter = 0; + +int i() { + counter = (counter + 1); + return counter; +} + +float2x2 tint_symbol_1(uint4 buffer[4], uint offset) { + const uint scalar_offset = ((offset + 0u)) / 4; + uint4 ubo_load = buffer[scalar_offset / 4]; + const uint scalar_offset_1 = ((offset + 8u)) / 4; + uint4 ubo_load_1 = buffer[scalar_offset_1 / 4]; + return float2x2(asfloat(((scalar_offset & 2) ? ubo_load.zw : ubo_load.xy)), asfloat(((scalar_offset_1 & 2) ? ubo_load_1.zw : ubo_load_1.xy))); +} + +typedef float2x2 tint_symbol_ret[4]; +tint_symbol_ret tint_symbol(uint4 buffer[4], uint offset) { + float2x2 arr[4] = (float2x2[4])0; + { + [loop] for(uint i_1 = 0u; (i_1 < 4u); i_1 = (i_1 + 1u)) { + arr[i_1] = tint_symbol_1(buffer, (offset + (i_1 * 16u))); + } + } + return arr; +} + +[numthreads(1, 1, 1)] +void f() { + const int p_a_i_save = i(); + const int p_a_i_i_save = i(); + const float2x2 l_a[4] = tint_symbol(a, 0u); + const float2x2 l_a_i = tint_symbol_1(a, (16u * uint(p_a_i_save))); + const uint scalar_offset_2 = (((16u * uint(p_a_i_save)) + (8u * uint(p_a_i_i_save)))) / 4; + uint4 ubo_load_2 = a[scalar_offset_2 / 4]; + const float2 l_a_i_i = asfloat(((scalar_offset_2 & 2) ? ubo_load_2.zw : ubo_load_2.xy)); + return; +} diff --git a/test/tint/buffer/uniform/std140/array/mat2x2/dynamic_index_via_ptr.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/array/mat2x2/dynamic_index_via_ptr.wgsl.expected.glsl new file mode 100644 index 0000000000..3b568528d8 --- /dev/null +++ b/test/tint/buffer/uniform/std140/array/mat2x2/dynamic_index_via_ptr.wgsl.expected.glsl @@ -0,0 +1,27 @@ +#version 310 es + +layout(binding = 0, std140) uniform a_block_ubo { + mat2 inner[4]; +} a; + +int counter = 0; +int i() { + counter = (counter + 1); + return counter; +} + +void f() { + int tint_symbol = i(); + int p_a_i_save = tint_symbol; + int tint_symbol_1 = i(); + int p_a_i_i_save = tint_symbol_1; + mat2 l_a[4] = a.inner; + mat2 l_a_i = a.inner[p_a_i_save]; + vec2 l_a_i_i = a.inner[p_a_i_save][p_a_i_i_save]; +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + f(); + return; +} diff --git a/test/tint/buffer/uniform/std140/array/mat2x2/dynamic_index_via_ptr.wgsl.expected.msl b/test/tint/buffer/uniform/std140/array/mat2x2/dynamic_index_via_ptr.wgsl.expected.msl new file mode 100644 index 0000000000..fe8fe733f3 --- /dev/null +++ b/test/tint/buffer/uniform/std140/array/mat2x2/dynamic_index_via_ptr.wgsl.expected.msl @@ -0,0 +1,33 @@ +#include + +using namespace metal; + +template +struct tint_array { + const constant T& operator[](size_t i) const constant { return elements[i]; } + device T& operator[](size_t i) device { return elements[i]; } + const device T& operator[](size_t i) const device { return elements[i]; } + thread T& operator[](size_t i) thread { return elements[i]; } + const thread T& operator[](size_t i) const thread { return elements[i]; } + threadgroup T& operator[](size_t i) threadgroup { return elements[i]; } + const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; } + T elements[N]; +}; + +int i() { + thread int tint_symbol_2 = 0; + tint_symbol_2 = as_type((as_type(tint_symbol_2) + as_type(1))); + return tint_symbol_2; +} + +kernel void f(const constant tint_array* tint_symbol_3 [[buffer(0)]]) { + int const tint_symbol = i(); + int const p_a_i_save = tint_symbol; + int const tint_symbol_1 = i(); + int const p_a_i_i_save = tint_symbol_1; + tint_array const l_a = *(tint_symbol_3); + float2x2 const l_a_i = (*(tint_symbol_3))[p_a_i_save]; + float2 const l_a_i_i = (*(tint_symbol_3))[p_a_i_save][p_a_i_i_save]; + return; +} + diff --git a/test/tint/buffer/uniform/std140/array/mat2x2/dynamic_index_via_ptr.wgsl.expected.spvasm b/test/tint/buffer/uniform/std140/array/mat2x2/dynamic_index_via_ptr.wgsl.expected.spvasm new file mode 100644 index 0000000000..b9a3ee9897 --- /dev/null +++ b/test/tint/buffer/uniform/std140/array/mat2x2/dynamic_index_via_ptr.wgsl.expected.spvasm @@ -0,0 +1,64 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 37 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %f "f" + OpExecutionMode %f LocalSize 1 1 1 + OpName %a_block "a_block" + OpMemberName %a_block 0 "inner" + OpName %a "a" + OpName %counter "counter" + OpName %i "i" + OpName %f "f" + OpDecorate %a_block Block + OpMemberDecorate %a_block 0 Offset 0 + OpMemberDecorate %a_block 0 ColMajor + OpMemberDecorate %a_block 0 MatrixStride 8 + OpDecorate %_arr_mat2v2float_uint_4 ArrayStride 16 + OpDecorate %a NonWritable + OpDecorate %a DescriptorSet 0 + OpDecorate %a Binding 0 + %float = OpTypeFloat 32 + %v2float = OpTypeVector %float 2 +%mat2v2float = OpTypeMatrix %v2float 2 + %uint = OpTypeInt 32 0 + %uint_4 = OpConstant %uint 4 +%_arr_mat2v2float_uint_4 = OpTypeArray %mat2v2float %uint_4 + %a_block = OpTypeStruct %_arr_mat2v2float_uint_4 +%_ptr_Uniform_a_block = OpTypePointer Uniform %a_block + %a = OpVariable %_ptr_Uniform_a_block Uniform + %int = OpTypeInt 32 1 + %11 = OpConstantNull %int +%_ptr_Private_int = OpTypePointer Private %int + %counter = OpVariable %_ptr_Private_int Private %11 + %14 = OpTypeFunction %int + %int_1 = OpConstant %int 1 + %void = OpTypeVoid + %21 = OpTypeFunction %void + %uint_0 = OpConstant %uint 0 +%_ptr_Uniform__arr_mat2v2float_uint_4 = OpTypePointer Uniform %_arr_mat2v2float_uint_4 +%_ptr_Uniform_mat2v2float = OpTypePointer Uniform %mat2v2float +%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float + %i = OpFunction %int None %14 + %16 = OpLabel + %17 = OpLoad %int %counter + %19 = OpIAdd %int %17 %int_1 + OpStore %counter %19 + %20 = OpLoad %int %counter + OpReturnValue %20 + OpFunctionEnd + %f = OpFunction %void None %21 + %24 = OpLabel + %25 = OpFunctionCall %int %i + %26 = OpFunctionCall %int %i + %29 = OpAccessChain %_ptr_Uniform__arr_mat2v2float_uint_4 %a %uint_0 + %30 = OpLoad %_arr_mat2v2float_uint_4 %29 + %32 = OpAccessChain %_ptr_Uniform_mat2v2float %a %uint_0 %25 + %33 = OpLoad %mat2v2float %32 + %35 = OpAccessChain %_ptr_Uniform_v2float %a %uint_0 %25 %26 + %36 = OpLoad %v2float %35 + OpReturn + OpFunctionEnd diff --git a/test/tint/buffer/uniform/std140/array/mat2x2/dynamic_index_via_ptr.wgsl.expected.wgsl b/test/tint/buffer/uniform/std140/array/mat2x2/dynamic_index_via_ptr.wgsl.expected.wgsl new file mode 100644 index 0000000000..fdad9a27e6 --- /dev/null +++ b/test/tint/buffer/uniform/std140/array/mat2x2/dynamic_index_via_ptr.wgsl.expected.wgsl @@ -0,0 +1,18 @@ +@group(0) @binding(0) var a : array, 4>; + +var counter = 0; + +fn i() -> i32 { + counter++; + return counter; +} + +@compute @workgroup_size(1) +fn f() { + let p_a = &(a); + let p_a_i = &((*(p_a))[i()]); + let p_a_i_i = &((*(p_a_i))[i()]); + let l_a : array, 4> = *(p_a); + let l_a_i : mat2x2 = *(p_a_i); + let l_a_i_i : vec2 = *(p_a_i_i); +} diff --git a/test/tint/buffer/uniform/std140/array/mat2x2/static_index_via_ptr.wgsl b/test/tint/buffer/uniform/std140/array/mat2x2/static_index_via_ptr.wgsl new file mode 100644 index 0000000000..24649bf2c2 --- /dev/null +++ b/test/tint/buffer/uniform/std140/array/mat2x2/static_index_via_ptr.wgsl @@ -0,0 +1,12 @@ +@group(0) @binding(0) var a : array, 4>; + +@compute @workgroup_size(1) +fn f() { + let p_a = &a; + let p_a_2 = &((*p_a)[2]); + let p_a_2_1 = &((*p_a_2)[1]); + + let l_a : array, 4> = *p_a; + let l_a_i : mat2x2 = *p_a_2; + let l_a_i_i : vec2 = *p_a_2_1; +} diff --git a/test/tint/buffer/uniform/std140/array/mat2x2/static_index_via_ptr.wgsl.expected.dxc.hlsl b/test/tint/buffer/uniform/std140/array/mat2x2/static_index_via_ptr.wgsl.expected.dxc.hlsl new file mode 100644 index 0000000000..95d27c0e95 --- /dev/null +++ b/test/tint/buffer/uniform/std140/array/mat2x2/static_index_via_ptr.wgsl.expected.dxc.hlsl @@ -0,0 +1,30 @@ +cbuffer cbuffer_a : register(b0, space0) { + uint4 a[4]; +}; + +float2x2 tint_symbol_1(uint4 buffer[4], uint offset) { + const uint scalar_offset = ((offset + 0u)) / 4; + uint4 ubo_load = buffer[scalar_offset / 4]; + const uint scalar_offset_1 = ((offset + 8u)) / 4; + uint4 ubo_load_1 = buffer[scalar_offset_1 / 4]; + return float2x2(asfloat(((scalar_offset & 2) ? ubo_load.zw : ubo_load.xy)), asfloat(((scalar_offset_1 & 2) ? ubo_load_1.zw : ubo_load_1.xy))); +} + +typedef float2x2 tint_symbol_ret[4]; +tint_symbol_ret tint_symbol(uint4 buffer[4], uint offset) { + float2x2 arr[4] = (float2x2[4])0; + { + [loop] for(uint i = 0u; (i < 4u); i = (i + 1u)) { + arr[i] = tint_symbol_1(buffer, (offset + (i * 16u))); + } + } + return arr; +} + +[numthreads(1, 1, 1)] +void f() { + const float2x2 l_a[4] = tint_symbol(a, 0u); + const float2x2 l_a_i = tint_symbol_1(a, 32u); + const float2 l_a_i_i = asfloat(a[2].zw); + return; +} diff --git a/test/tint/buffer/uniform/std140/array/mat2x2/static_index_via_ptr.wgsl.expected.fxc.hlsl b/test/tint/buffer/uniform/std140/array/mat2x2/static_index_via_ptr.wgsl.expected.fxc.hlsl new file mode 100644 index 0000000000..95d27c0e95 --- /dev/null +++ b/test/tint/buffer/uniform/std140/array/mat2x2/static_index_via_ptr.wgsl.expected.fxc.hlsl @@ -0,0 +1,30 @@ +cbuffer cbuffer_a : register(b0, space0) { + uint4 a[4]; +}; + +float2x2 tint_symbol_1(uint4 buffer[4], uint offset) { + const uint scalar_offset = ((offset + 0u)) / 4; + uint4 ubo_load = buffer[scalar_offset / 4]; + const uint scalar_offset_1 = ((offset + 8u)) / 4; + uint4 ubo_load_1 = buffer[scalar_offset_1 / 4]; + return float2x2(asfloat(((scalar_offset & 2) ? ubo_load.zw : ubo_load.xy)), asfloat(((scalar_offset_1 & 2) ? ubo_load_1.zw : ubo_load_1.xy))); +} + +typedef float2x2 tint_symbol_ret[4]; +tint_symbol_ret tint_symbol(uint4 buffer[4], uint offset) { + float2x2 arr[4] = (float2x2[4])0; + { + [loop] for(uint i = 0u; (i < 4u); i = (i + 1u)) { + arr[i] = tint_symbol_1(buffer, (offset + (i * 16u))); + } + } + return arr; +} + +[numthreads(1, 1, 1)] +void f() { + const float2x2 l_a[4] = tint_symbol(a, 0u); + const float2x2 l_a_i = tint_symbol_1(a, 32u); + const float2 l_a_i_i = asfloat(a[2].zw); + return; +} diff --git a/test/tint/buffer/uniform/std140/array/mat2x2/static_index_via_ptr.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/array/mat2x2/static_index_via_ptr.wgsl.expected.glsl new file mode 100644 index 0000000000..a3d6e08a3f --- /dev/null +++ b/test/tint/buffer/uniform/std140/array/mat2x2/static_index_via_ptr.wgsl.expected.glsl @@ -0,0 +1,17 @@ +#version 310 es + +layout(binding = 0, std140) uniform a_block_ubo { + mat2 inner[4]; +} a; + +void f() { + mat2 l_a[4] = a.inner; + mat2 l_a_i = a.inner[2]; + vec2 l_a_i_i = a.inner[2][1]; +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + f(); + return; +} diff --git a/test/tint/buffer/uniform/std140/array/mat2x2/static_index_via_ptr.wgsl.expected.msl b/test/tint/buffer/uniform/std140/array/mat2x2/static_index_via_ptr.wgsl.expected.msl new file mode 100644 index 0000000000..190b395fd3 --- /dev/null +++ b/test/tint/buffer/uniform/std140/array/mat2x2/static_index_via_ptr.wgsl.expected.msl @@ -0,0 +1,23 @@ +#include + +using namespace metal; + +template +struct tint_array { + const constant T& operator[](size_t i) const constant { return elements[i]; } + device T& operator[](size_t i) device { return elements[i]; } + const device T& operator[](size_t i) const device { return elements[i]; } + thread T& operator[](size_t i) thread { return elements[i]; } + const thread T& operator[](size_t i) const thread { return elements[i]; } + threadgroup T& operator[](size_t i) threadgroup { return elements[i]; } + const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; } + T elements[N]; +}; + +kernel void f(const constant tint_array* tint_symbol [[buffer(0)]]) { + tint_array const l_a = *(tint_symbol); + float2x2 const l_a_i = (*(tint_symbol))[2]; + float2 const l_a_i_i = (*(tint_symbol))[2][1]; + return; +} + diff --git a/test/tint/buffer/uniform/std140/array/mat2x2/static_index_via_ptr.wgsl.expected.spvasm b/test/tint/buffer/uniform/std140/array/mat2x2/static_index_via_ptr.wgsl.expected.spvasm new file mode 100644 index 0000000000..0e6ccba35f --- /dev/null +++ b/test/tint/buffer/uniform/std140/array/mat2x2/static_index_via_ptr.wgsl.expected.spvasm @@ -0,0 +1,49 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 27 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %f "f" + OpExecutionMode %f LocalSize 1 1 1 + OpName %a_block "a_block" + OpMemberName %a_block 0 "inner" + OpName %a "a" + OpName %f "f" + OpDecorate %a_block Block + OpMemberDecorate %a_block 0 Offset 0 + OpMemberDecorate %a_block 0 ColMajor + OpMemberDecorate %a_block 0 MatrixStride 8 + OpDecorate %_arr_mat2v2float_uint_4 ArrayStride 16 + OpDecorate %a NonWritable + OpDecorate %a DescriptorSet 0 + OpDecorate %a Binding 0 + %float = OpTypeFloat 32 + %v2float = OpTypeVector %float 2 +%mat2v2float = OpTypeMatrix %v2float 2 + %uint = OpTypeInt 32 0 + %uint_4 = OpConstant %uint 4 +%_arr_mat2v2float_uint_4 = OpTypeArray %mat2v2float %uint_4 + %a_block = OpTypeStruct %_arr_mat2v2float_uint_4 +%_ptr_Uniform_a_block = OpTypePointer Uniform %a_block + %a = OpVariable %_ptr_Uniform_a_block Uniform + %void = OpTypeVoid + %10 = OpTypeFunction %void + %uint_0 = OpConstant %uint 0 +%_ptr_Uniform__arr_mat2v2float_uint_4 = OpTypePointer Uniform %_arr_mat2v2float_uint_4 + %int = OpTypeInt 32 1 + %int_2 = OpConstant %int 2 +%_ptr_Uniform_mat2v2float = OpTypePointer Uniform %mat2v2float + %int_1 = OpConstant %int 1 +%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float + %f = OpFunction %void None %10 + %13 = OpLabel + %16 = OpAccessChain %_ptr_Uniform__arr_mat2v2float_uint_4 %a %uint_0 + %17 = OpLoad %_arr_mat2v2float_uint_4 %16 + %21 = OpAccessChain %_ptr_Uniform_mat2v2float %a %uint_0 %int_2 + %22 = OpLoad %mat2v2float %21 + %25 = OpAccessChain %_ptr_Uniform_v2float %a %uint_0 %int_2 %int_1 + %26 = OpLoad %v2float %25 + OpReturn + OpFunctionEnd diff --git a/test/tint/buffer/uniform/std140/array/mat2x2/static_index_via_ptr.wgsl.expected.wgsl b/test/tint/buffer/uniform/std140/array/mat2x2/static_index_via_ptr.wgsl.expected.wgsl new file mode 100644 index 0000000000..9c17d71aaf --- /dev/null +++ b/test/tint/buffer/uniform/std140/array/mat2x2/static_index_via_ptr.wgsl.expected.wgsl @@ -0,0 +1,11 @@ +@group(0) @binding(0) var a : array, 4>; + +@compute @workgroup_size(1) +fn f() { + let p_a = &(a); + let p_a_2 = &((*(p_a))[2]); + let p_a_2_1 = &((*(p_a_2))[1]); + let l_a : array, 4> = *(p_a); + let l_a_i : mat2x2 = *(p_a_2); + let l_a_i_i : vec2 = *(p_a_2_1); +} diff --git a/test/tint/buffer/uniform/std140/array/mat2x2/to_builtin.wgsl b/test/tint/buffer/uniform/std140/array/mat2x2/to_builtin.wgsl new file mode 100644 index 0000000000..db6adf2146 --- /dev/null +++ b/test/tint/buffer/uniform/std140/array/mat2x2/to_builtin.wgsl @@ -0,0 +1,8 @@ +@group(0) @binding(0) var u : array, 4>; + +@compute @workgroup_size(1) +fn f() { + let t = transpose(u[2]); + let l = length(u[0][1].yx); + let a = abs(u[0][1].yx.x); +} diff --git a/test/tint/buffer/uniform/std140/array/mat2x2/to_builtin.wgsl.expected.dxc.hlsl b/test/tint/buffer/uniform/std140/array/mat2x2/to_builtin.wgsl.expected.dxc.hlsl new file mode 100644 index 0000000000..e8f4937748 --- /dev/null +++ b/test/tint/buffer/uniform/std140/array/mat2x2/to_builtin.wgsl.expected.dxc.hlsl @@ -0,0 +1,19 @@ +cbuffer cbuffer_u : register(b0, space0) { + uint4 u[4]; +}; + +float2x2 tint_symbol(uint4 buffer[4], uint offset) { + const uint scalar_offset = ((offset + 0u)) / 4; + uint4 ubo_load = buffer[scalar_offset / 4]; + const uint scalar_offset_1 = ((offset + 8u)) / 4; + uint4 ubo_load_1 = buffer[scalar_offset_1 / 4]; + return float2x2(asfloat(((scalar_offset & 2) ? ubo_load.zw : ubo_load.xy)), asfloat(((scalar_offset_1 & 2) ? ubo_load_1.zw : ubo_load_1.xy))); +} + +[numthreads(1, 1, 1)] +void f() { + const float2x2 t = transpose(tint_symbol(u, 32u)); + const float l = length(asfloat(u[0].zw).yx); + const float a = abs(asfloat(u[0].zw).yx.x); + return; +} diff --git a/test/tint/buffer/uniform/std140/array/mat2x2/to_builtin.wgsl.expected.fxc.hlsl b/test/tint/buffer/uniform/std140/array/mat2x2/to_builtin.wgsl.expected.fxc.hlsl new file mode 100644 index 0000000000..e8f4937748 --- /dev/null +++ b/test/tint/buffer/uniform/std140/array/mat2x2/to_builtin.wgsl.expected.fxc.hlsl @@ -0,0 +1,19 @@ +cbuffer cbuffer_u : register(b0, space0) { + uint4 u[4]; +}; + +float2x2 tint_symbol(uint4 buffer[4], uint offset) { + const uint scalar_offset = ((offset + 0u)) / 4; + uint4 ubo_load = buffer[scalar_offset / 4]; + const uint scalar_offset_1 = ((offset + 8u)) / 4; + uint4 ubo_load_1 = buffer[scalar_offset_1 / 4]; + return float2x2(asfloat(((scalar_offset & 2) ? ubo_load.zw : ubo_load.xy)), asfloat(((scalar_offset_1 & 2) ? ubo_load_1.zw : ubo_load_1.xy))); +} + +[numthreads(1, 1, 1)] +void f() { + const float2x2 t = transpose(tint_symbol(u, 32u)); + const float l = length(asfloat(u[0].zw).yx); + const float a = abs(asfloat(u[0].zw).yx.x); + return; +} diff --git a/test/tint/buffer/uniform/std140/array/mat2x2/to_builtin.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/array/mat2x2/to_builtin.wgsl.expected.glsl new file mode 100644 index 0000000000..ffcbc7c88a --- /dev/null +++ b/test/tint/buffer/uniform/std140/array/mat2x2/to_builtin.wgsl.expected.glsl @@ -0,0 +1,17 @@ +#version 310 es + +layout(binding = 0, std140) uniform u_block_ubo { + mat2 inner[4]; +} u; + +void f() { + mat2 t = transpose(u.inner[2]); + float l = length(u.inner[0][1].yx); + float a = abs(u.inner[0][1].yx.x); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + f(); + return; +} diff --git a/test/tint/buffer/uniform/std140/array/mat2x2/to_builtin.wgsl.expected.msl b/test/tint/buffer/uniform/std140/array/mat2x2/to_builtin.wgsl.expected.msl new file mode 100644 index 0000000000..5d16588204 --- /dev/null +++ b/test/tint/buffer/uniform/std140/array/mat2x2/to_builtin.wgsl.expected.msl @@ -0,0 +1,23 @@ +#include + +using namespace metal; + +template +struct tint_array { + const constant T& operator[](size_t i) const constant { return elements[i]; } + device T& operator[](size_t i) device { return elements[i]; } + const device T& operator[](size_t i) const device { return elements[i]; } + thread T& operator[](size_t i) thread { return elements[i]; } + const thread T& operator[](size_t i) const thread { return elements[i]; } + threadgroup T& operator[](size_t i) threadgroup { return elements[i]; } + const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; } + T elements[N]; +}; + +kernel void f(const constant tint_array* tint_symbol [[buffer(0)]]) { + float2x2 const t = transpose((*(tint_symbol))[2]); + float const l = length(float2((*(tint_symbol))[0][1]).yx); + float const a = fabs(float2((*(tint_symbol))[0][1]).yx[0]); + return; +} + diff --git a/test/tint/buffer/uniform/std140/array/mat2x2/to_builtin.wgsl.expected.spvasm b/test/tint/buffer/uniform/std140/array/mat2x2/to_builtin.wgsl.expected.spvasm new file mode 100644 index 0000000000..399fe032f5 --- /dev/null +++ b/test/tint/buffer/uniform/std140/array/mat2x2/to_builtin.wgsl.expected.spvasm @@ -0,0 +1,56 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 34 +; Schema: 0 + OpCapability Shader + %22 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %f "f" + OpExecutionMode %f LocalSize 1 1 1 + OpName %u_block "u_block" + OpMemberName %u_block 0 "inner" + OpName %u "u" + OpName %f "f" + OpDecorate %u_block Block + OpMemberDecorate %u_block 0 Offset 0 + OpMemberDecorate %u_block 0 ColMajor + OpMemberDecorate %u_block 0 MatrixStride 8 + OpDecorate %_arr_mat2v2float_uint_4 ArrayStride 16 + OpDecorate %u NonWritable + OpDecorate %u DescriptorSet 0 + OpDecorate %u Binding 0 + %float = OpTypeFloat 32 + %v2float = OpTypeVector %float 2 +%mat2v2float = OpTypeMatrix %v2float 2 + %uint = OpTypeInt 32 0 + %uint_4 = OpConstant %uint 4 +%_arr_mat2v2float_uint_4 = OpTypeArray %mat2v2float %uint_4 + %u_block = OpTypeStruct %_arr_mat2v2float_uint_4 +%_ptr_Uniform_u_block = OpTypePointer Uniform %u_block + %u = OpVariable %_ptr_Uniform_u_block Uniform + %void = OpTypeVoid + %10 = OpTypeFunction %void + %uint_0 = OpConstant %uint 0 + %int = OpTypeInt 32 1 + %int_2 = OpConstant %int 2 +%_ptr_Uniform_mat2v2float = OpTypePointer Uniform %mat2v2float + %23 = OpConstantNull %int + %int_1 = OpConstant %int 1 +%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float + %f = OpFunction %void None %10 + %13 = OpLabel + %19 = OpAccessChain %_ptr_Uniform_mat2v2float %u %uint_0 %int_2 + %20 = OpLoad %mat2v2float %19 + %14 = OpTranspose %mat2v2float %20 + %26 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 %23 %int_1 + %27 = OpLoad %v2float %26 + %28 = OpVectorShuffle %v2float %27 %27 1 0 + %21 = OpExtInst %float %22 Length %28 + %30 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 %23 %int_1 + %31 = OpLoad %v2float %30 + %32 = OpVectorShuffle %v2float %31 %31 1 0 + %33 = OpCompositeExtract %float %32 0 + %29 = OpExtInst %float %22 FAbs %33 + OpReturn + OpFunctionEnd diff --git a/test/tint/buffer/uniform/std140/array/mat2x2/to_builtin.wgsl.expected.wgsl b/test/tint/buffer/uniform/std140/array/mat2x2/to_builtin.wgsl.expected.wgsl new file mode 100644 index 0000000000..853b423646 --- /dev/null +++ b/test/tint/buffer/uniform/std140/array/mat2x2/to_builtin.wgsl.expected.wgsl @@ -0,0 +1,8 @@ +@group(0) @binding(0) var u : array, 4>; + +@compute @workgroup_size(1) +fn f() { + let t = transpose(u[2]); + let l = length(u[0][1].yx); + let a = abs(u[0][1].yx.x); +} diff --git a/test/tint/buffer/uniform/std140/array/mat2x2/to_fn.wgsl b/test/tint/buffer/uniform/std140/array/mat2x2/to_fn.wgsl new file mode 100644 index 0000000000..3bb9cb8005 --- /dev/null +++ b/test/tint/buffer/uniform/std140/array/mat2x2/to_fn.wgsl @@ -0,0 +1,14 @@ +@group(0) @binding(0) var u : array, 4>; + +fn a(a : array, 4>) {} +fn b(m : mat2x2) {} +fn c(v : vec2) {} +fn d(f : f32) {} + +@compute @workgroup_size(1) +fn f() { + a(u); + b(u[1]); + c(u[1][0].yx); + d(u[1][0].yx.x); +} diff --git a/test/tint/buffer/uniform/std140/array/mat2x2/to_fn.wgsl.expected.dxc.hlsl b/test/tint/buffer/uniform/std140/array/mat2x2/to_fn.wgsl.expected.dxc.hlsl new file mode 100644 index 0000000000..224ee60220 --- /dev/null +++ b/test/tint/buffer/uniform/std140/array/mat2x2/to_fn.wgsl.expected.dxc.hlsl @@ -0,0 +1,43 @@ +cbuffer cbuffer_u : register(b0, space0) { + uint4 u[4]; +}; + +void a(float2x2 a_1[4]) { +} + +void b(float2x2 m) { +} + +void c(float2 v) { +} + +void d(float f_1) { +} + +float2x2 tint_symbol_1(uint4 buffer[4], uint offset) { + const uint scalar_offset = ((offset + 0u)) / 4; + uint4 ubo_load = buffer[scalar_offset / 4]; + const uint scalar_offset_1 = ((offset + 8u)) / 4; + uint4 ubo_load_1 = buffer[scalar_offset_1 / 4]; + return float2x2(asfloat(((scalar_offset & 2) ? ubo_load.zw : ubo_load.xy)), asfloat(((scalar_offset_1 & 2) ? ubo_load_1.zw : ubo_load_1.xy))); +} + +typedef float2x2 tint_symbol_ret[4]; +tint_symbol_ret tint_symbol(uint4 buffer[4], uint offset) { + float2x2 arr[4] = (float2x2[4])0; + { + [loop] for(uint i = 0u; (i < 4u); i = (i + 1u)) { + arr[i] = tint_symbol_1(buffer, (offset + (i * 16u))); + } + } + return arr; +} + +[numthreads(1, 1, 1)] +void f() { + a(tint_symbol(u, 0u)); + b(tint_symbol_1(u, 16u)); + c(asfloat(u[1].xy).yx); + d(asfloat(u[1].xy).yx.x); + return; +} diff --git a/test/tint/buffer/uniform/std140/array/mat2x2/to_fn.wgsl.expected.fxc.hlsl b/test/tint/buffer/uniform/std140/array/mat2x2/to_fn.wgsl.expected.fxc.hlsl new file mode 100644 index 0000000000..224ee60220 --- /dev/null +++ b/test/tint/buffer/uniform/std140/array/mat2x2/to_fn.wgsl.expected.fxc.hlsl @@ -0,0 +1,43 @@ +cbuffer cbuffer_u : register(b0, space0) { + uint4 u[4]; +}; + +void a(float2x2 a_1[4]) { +} + +void b(float2x2 m) { +} + +void c(float2 v) { +} + +void d(float f_1) { +} + +float2x2 tint_symbol_1(uint4 buffer[4], uint offset) { + const uint scalar_offset = ((offset + 0u)) / 4; + uint4 ubo_load = buffer[scalar_offset / 4]; + const uint scalar_offset_1 = ((offset + 8u)) / 4; + uint4 ubo_load_1 = buffer[scalar_offset_1 / 4]; + return float2x2(asfloat(((scalar_offset & 2) ? ubo_load.zw : ubo_load.xy)), asfloat(((scalar_offset_1 & 2) ? ubo_load_1.zw : ubo_load_1.xy))); +} + +typedef float2x2 tint_symbol_ret[4]; +tint_symbol_ret tint_symbol(uint4 buffer[4], uint offset) { + float2x2 arr[4] = (float2x2[4])0; + { + [loop] for(uint i = 0u; (i < 4u); i = (i + 1u)) { + arr[i] = tint_symbol_1(buffer, (offset + (i * 16u))); + } + } + return arr; +} + +[numthreads(1, 1, 1)] +void f() { + a(tint_symbol(u, 0u)); + b(tint_symbol_1(u, 16u)); + c(asfloat(u[1].xy).yx); + d(asfloat(u[1].xy).yx.x); + return; +} diff --git a/test/tint/buffer/uniform/std140/array/mat2x2/to_fn.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/array/mat2x2/to_fn.wgsl.expected.glsl new file mode 100644 index 0000000000..bc291fd2ec --- /dev/null +++ b/test/tint/buffer/uniform/std140/array/mat2x2/to_fn.wgsl.expected.glsl @@ -0,0 +1,30 @@ +#version 310 es + +layout(binding = 0, std140) uniform u_block_ubo { + mat2 inner[4]; +} u; + +void a(mat2 a_1[4]) { +} + +void b(mat2 m) { +} + +void c(vec2 v) { +} + +void d(float f_1) { +} + +void f() { + a(u.inner); + b(u.inner[1]); + c(u.inner[1][0].yx); + d(u.inner[1][0].yx.x); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + f(); + return; +} diff --git a/test/tint/buffer/uniform/std140/array/mat2x2/to_fn.wgsl.expected.msl b/test/tint/buffer/uniform/std140/array/mat2x2/to_fn.wgsl.expected.msl new file mode 100644 index 0000000000..abc8d5dc3c --- /dev/null +++ b/test/tint/buffer/uniform/std140/array/mat2x2/to_fn.wgsl.expected.msl @@ -0,0 +1,36 @@ +#include + +using namespace metal; + +template +struct tint_array { + const constant T& operator[](size_t i) const constant { return elements[i]; } + device T& operator[](size_t i) device { return elements[i]; } + const device T& operator[](size_t i) const device { return elements[i]; } + thread T& operator[](size_t i) thread { return elements[i]; } + const thread T& operator[](size_t i) const thread { return elements[i]; } + threadgroup T& operator[](size_t i) threadgroup { return elements[i]; } + const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; } + T elements[N]; +}; + +void a(tint_array a_1) { +} + +void b(float2x2 m) { +} + +void c(float2 v) { +} + +void d(float f_1) { +} + +kernel void f(const constant tint_array* tint_symbol [[buffer(0)]]) { + a(*(tint_symbol)); + b((*(tint_symbol))[1]); + c(float2((*(tint_symbol))[1][0]).yx); + d(float2((*(tint_symbol))[1][0]).yx[0]); + return; +} + diff --git a/test/tint/buffer/uniform/std140/array/mat2x2/to_fn.wgsl.expected.spvasm b/test/tint/buffer/uniform/std140/array/mat2x2/to_fn.wgsl.expected.spvasm new file mode 100644 index 0000000000..8f407ac12e --- /dev/null +++ b/test/tint/buffer/uniform/std140/array/mat2x2/to_fn.wgsl.expected.spvasm @@ -0,0 +1,90 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 52 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %f "f" + OpExecutionMode %f LocalSize 1 1 1 + OpName %u_block "u_block" + OpMemberName %u_block 0 "inner" + OpName %u "u" + OpName %a "a" + OpName %a_1 "a_1" + OpName %b "b" + OpName %m "m" + OpName %c "c" + OpName %v "v" + OpName %d "d" + OpName %f_1 "f_1" + OpName %f "f" + OpDecorate %u_block Block + OpMemberDecorate %u_block 0 Offset 0 + OpMemberDecorate %u_block 0 ColMajor + OpMemberDecorate %u_block 0 MatrixStride 8 + OpDecorate %_arr_mat2v2float_uint_4 ArrayStride 16 + OpDecorate %u NonWritable + OpDecorate %u DescriptorSet 0 + OpDecorate %u Binding 0 + %float = OpTypeFloat 32 + %v2float = OpTypeVector %float 2 +%mat2v2float = OpTypeMatrix %v2float 2 + %uint = OpTypeInt 32 0 + %uint_4 = OpConstant %uint 4 +%_arr_mat2v2float_uint_4 = OpTypeArray %mat2v2float %uint_4 + %u_block = OpTypeStruct %_arr_mat2v2float_uint_4 +%_ptr_Uniform_u_block = OpTypePointer Uniform %u_block + %u = OpVariable %_ptr_Uniform_u_block Uniform + %void = OpTypeVoid + %10 = OpTypeFunction %void %_arr_mat2v2float_uint_4 + %15 = OpTypeFunction %void %mat2v2float + %19 = OpTypeFunction %void %v2float + %23 = OpTypeFunction %void %float + %27 = OpTypeFunction %void + %uint_0 = OpConstant %uint 0 +%_ptr_Uniform__arr_mat2v2float_uint_4 = OpTypePointer Uniform %_arr_mat2v2float_uint_4 + %int = OpTypeInt 32 1 + %int_1 = OpConstant %int 1 +%_ptr_Uniform_mat2v2float = OpTypePointer Uniform %mat2v2float + %42 = OpConstantNull %int +%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float + %a = OpFunction %void None %10 + %a_1 = OpFunctionParameter %_arr_mat2v2float_uint_4 + %14 = OpLabel + OpReturn + OpFunctionEnd + %b = OpFunction %void None %15 + %m = OpFunctionParameter %mat2v2float + %18 = OpLabel + OpReturn + OpFunctionEnd + %c = OpFunction %void None %19 + %v = OpFunctionParameter %v2float + %22 = OpLabel + OpReturn + OpFunctionEnd + %d = OpFunction %void None %23 + %f_1 = OpFunctionParameter %float + %26 = OpLabel + OpReturn + OpFunctionEnd + %f = OpFunction %void None %27 + %29 = OpLabel + %33 = OpAccessChain %_ptr_Uniform__arr_mat2v2float_uint_4 %u %uint_0 + %34 = OpLoad %_arr_mat2v2float_uint_4 %33 + %30 = OpFunctionCall %void %a %34 + %39 = OpAccessChain %_ptr_Uniform_mat2v2float %u %uint_0 %int_1 + %40 = OpLoad %mat2v2float %39 + %35 = OpFunctionCall %void %b %40 + %44 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 %int_1 %42 + %45 = OpLoad %v2float %44 + %46 = OpVectorShuffle %v2float %45 %45 1 0 + %41 = OpFunctionCall %void %c %46 + %48 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 %int_1 %42 + %49 = OpLoad %v2float %48 + %50 = OpVectorShuffle %v2float %49 %49 1 0 + %51 = OpCompositeExtract %float %50 0 + %47 = OpFunctionCall %void %d %51 + OpReturn + OpFunctionEnd diff --git a/test/tint/buffer/uniform/std140/array/mat2x2/to_fn.wgsl.expected.wgsl b/test/tint/buffer/uniform/std140/array/mat2x2/to_fn.wgsl.expected.wgsl new file mode 100644 index 0000000000..fd3bf0ce35 --- /dev/null +++ b/test/tint/buffer/uniform/std140/array/mat2x2/to_fn.wgsl.expected.wgsl @@ -0,0 +1,21 @@ +@group(0) @binding(0) var u : array, 4>; + +fn a(a : array, 4>) { +} + +fn b(m : mat2x2) { +} + +fn c(v : vec2) { +} + +fn d(f : f32) { +} + +@compute @workgroup_size(1) +fn f() { + a(u); + b(u[1]); + c(u[1][0].yx); + d(u[1][0].yx.x); +} diff --git a/test/tint/buffer/uniform/std140/array/mat2x2/to_private.wgsl b/test/tint/buffer/uniform/std140/array/mat2x2/to_private.wgsl new file mode 100644 index 0000000000..8a421d8da2 --- /dev/null +++ b/test/tint/buffer/uniform/std140/array/mat2x2/to_private.wgsl @@ -0,0 +1,16 @@ +struct S { + before : i32, + m : mat2x2, + after : i32, +} + +@group(0) @binding(0) var u : array, 4>; +var p : array, 4>; + +@compute @workgroup_size(1) +fn f() { + p = u; + p[1] = u[2]; + p[1][0] = u[0][1].yx; + p[1][0].x = u[0][1].x; +} diff --git a/test/tint/buffer/uniform/std140/array/mat2x2/to_private.wgsl.expected.dxc.hlsl b/test/tint/buffer/uniform/std140/array/mat2x2/to_private.wgsl.expected.dxc.hlsl new file mode 100644 index 0000000000..1af99237dc --- /dev/null +++ b/test/tint/buffer/uniform/std140/array/mat2x2/to_private.wgsl.expected.dxc.hlsl @@ -0,0 +1,32 @@ +cbuffer cbuffer_u : register(b0, space0) { + uint4 u[4]; +}; +static float2x2 p[4] = (float2x2[4])0; + +float2x2 tint_symbol_1(uint4 buffer[4], uint offset) { + const uint scalar_offset = ((offset + 0u)) / 4; + uint4 ubo_load = buffer[scalar_offset / 4]; + const uint scalar_offset_1 = ((offset + 8u)) / 4; + uint4 ubo_load_1 = buffer[scalar_offset_1 / 4]; + return float2x2(asfloat(((scalar_offset & 2) ? ubo_load.zw : ubo_load.xy)), asfloat(((scalar_offset_1 & 2) ? ubo_load_1.zw : ubo_load_1.xy))); +} + +typedef float2x2 tint_symbol_ret[4]; +tint_symbol_ret tint_symbol(uint4 buffer[4], uint offset) { + float2x2 arr[4] = (float2x2[4])0; + { + [loop] for(uint i = 0u; (i < 4u); i = (i + 1u)) { + arr[i] = tint_symbol_1(buffer, (offset + (i * 16u))); + } + } + return arr; +} + +[numthreads(1, 1, 1)] +void f() { + p = tint_symbol(u, 0u); + p[1] = tint_symbol_1(u, 32u); + p[1][0] = asfloat(u[0].zw).yx; + p[1][0].x = asfloat(u[0].z); + return; +} diff --git a/test/tint/buffer/uniform/std140/array/mat2x2/to_private.wgsl.expected.fxc.hlsl b/test/tint/buffer/uniform/std140/array/mat2x2/to_private.wgsl.expected.fxc.hlsl new file mode 100644 index 0000000000..1af99237dc --- /dev/null +++ b/test/tint/buffer/uniform/std140/array/mat2x2/to_private.wgsl.expected.fxc.hlsl @@ -0,0 +1,32 @@ +cbuffer cbuffer_u : register(b0, space0) { + uint4 u[4]; +}; +static float2x2 p[4] = (float2x2[4])0; + +float2x2 tint_symbol_1(uint4 buffer[4], uint offset) { + const uint scalar_offset = ((offset + 0u)) / 4; + uint4 ubo_load = buffer[scalar_offset / 4]; + const uint scalar_offset_1 = ((offset + 8u)) / 4; + uint4 ubo_load_1 = buffer[scalar_offset_1 / 4]; + return float2x2(asfloat(((scalar_offset & 2) ? ubo_load.zw : ubo_load.xy)), asfloat(((scalar_offset_1 & 2) ? ubo_load_1.zw : ubo_load_1.xy))); +} + +typedef float2x2 tint_symbol_ret[4]; +tint_symbol_ret tint_symbol(uint4 buffer[4], uint offset) { + float2x2 arr[4] = (float2x2[4])0; + { + [loop] for(uint i = 0u; (i < 4u); i = (i + 1u)) { + arr[i] = tint_symbol_1(buffer, (offset + (i * 16u))); + } + } + return arr; +} + +[numthreads(1, 1, 1)] +void f() { + p = tint_symbol(u, 0u); + p[1] = tint_symbol_1(u, 32u); + p[1][0] = asfloat(u[0].zw).yx; + p[1][0].x = asfloat(u[0].z); + return; +} diff --git a/test/tint/buffer/uniform/std140/array/mat2x2/to_private.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/array/mat2x2/to_private.wgsl.expected.glsl new file mode 100644 index 0000000000..59ec729b82 --- /dev/null +++ b/test/tint/buffer/uniform/std140/array/mat2x2/to_private.wgsl.expected.glsl @@ -0,0 +1,25 @@ +#version 310 es + +struct S { + int before; + mat2 m; + int after; +}; + +layout(binding = 0, std140) uniform u_block_ubo { + mat2 inner[4]; +} u; + +mat2 p[4] = mat2[4](mat2(0.0f, 0.0f, 0.0f, 0.0f), mat2(0.0f, 0.0f, 0.0f, 0.0f), mat2(0.0f, 0.0f, 0.0f, 0.0f), mat2(0.0f, 0.0f, 0.0f, 0.0f)); +void f() { + p = u.inner; + p[1] = u.inner[2]; + p[1][0] = u.inner[0][1].yx; + p[1][0].x = u.inner[0][1].x; +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + f(); + return; +} diff --git a/test/tint/buffer/uniform/std140/array/mat2x2/to_private.wgsl.expected.msl b/test/tint/buffer/uniform/std140/array/mat2x2/to_private.wgsl.expected.msl new file mode 100644 index 0000000000..ec3ed6d739 --- /dev/null +++ b/test/tint/buffer/uniform/std140/array/mat2x2/to_private.wgsl.expected.msl @@ -0,0 +1,31 @@ +#include + +using namespace metal; + +template +struct tint_array { + const constant T& operator[](size_t i) const constant { return elements[i]; } + device T& operator[](size_t i) device { return elements[i]; } + const device T& operator[](size_t i) const device { return elements[i]; } + thread T& operator[](size_t i) thread { return elements[i]; } + const thread T& operator[](size_t i) const thread { return elements[i]; } + threadgroup T& operator[](size_t i) threadgroup { return elements[i]; } + const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; } + T elements[N]; +}; + +struct S { + int before; + float2x2 m; + int after; +}; + +kernel void f(const constant tint_array* tint_symbol_1 [[buffer(0)]]) { + thread tint_array tint_symbol = {}; + tint_symbol = *(tint_symbol_1); + tint_symbol[1] = (*(tint_symbol_1))[2]; + tint_symbol[1][0] = float2((*(tint_symbol_1))[0][1]).yx; + tint_symbol[1][0][0] = (*(tint_symbol_1))[0][1][0]; + return; +} + diff --git a/test/tint/buffer/uniform/std140/array/mat2x2/to_private.wgsl.expected.spvasm b/test/tint/buffer/uniform/std140/array/mat2x2/to_private.wgsl.expected.spvasm new file mode 100644 index 0000000000..922f2c7fef --- /dev/null +++ b/test/tint/buffer/uniform/std140/array/mat2x2/to_private.wgsl.expected.spvasm @@ -0,0 +1,68 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 41 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %f "f" + OpExecutionMode %f LocalSize 1 1 1 + OpName %u_block "u_block" + OpMemberName %u_block 0 "inner" + OpName %u "u" + OpName %p "p" + OpName %f "f" + OpDecorate %u_block Block + OpMemberDecorate %u_block 0 Offset 0 + OpMemberDecorate %u_block 0 ColMajor + OpMemberDecorate %u_block 0 MatrixStride 8 + OpDecorate %_arr_mat2v2float_uint_4 ArrayStride 16 + OpDecorate %u NonWritable + OpDecorate %u DescriptorSet 0 + OpDecorate %u Binding 0 + %float = OpTypeFloat 32 + %v2float = OpTypeVector %float 2 +%mat2v2float = OpTypeMatrix %v2float 2 + %uint = OpTypeInt 32 0 + %uint_4 = OpConstant %uint 4 +%_arr_mat2v2float_uint_4 = OpTypeArray %mat2v2float %uint_4 + %u_block = OpTypeStruct %_arr_mat2v2float_uint_4 +%_ptr_Uniform_u_block = OpTypePointer Uniform %u_block + %u = OpVariable %_ptr_Uniform_u_block Uniform +%_ptr_Private__arr_mat2v2float_uint_4 = OpTypePointer Private %_arr_mat2v2float_uint_4 + %12 = OpConstantNull %_arr_mat2v2float_uint_4 + %p = OpVariable %_ptr_Private__arr_mat2v2float_uint_4 Private %12 + %void = OpTypeVoid + %13 = OpTypeFunction %void + %uint_0 = OpConstant %uint 0 +%_ptr_Uniform__arr_mat2v2float_uint_4 = OpTypePointer Uniform %_arr_mat2v2float_uint_4 + %int = OpTypeInt 32 1 + %int_1 = OpConstant %int 1 +%_ptr_Private_mat2v2float = OpTypePointer Private %mat2v2float + %int_2 = OpConstant %int 2 +%_ptr_Uniform_mat2v2float = OpTypePointer Uniform %mat2v2float + %29 = OpConstantNull %int +%_ptr_Private_v2float = OpTypePointer Private %v2float +%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float +%_ptr_Private_float = OpTypePointer Private %float +%_ptr_Uniform_float = OpTypePointer Uniform %float + %f = OpFunction %void None %13 + %16 = OpLabel + %19 = OpAccessChain %_ptr_Uniform__arr_mat2v2float_uint_4 %u %uint_0 + %20 = OpLoad %_arr_mat2v2float_uint_4 %19 + OpStore %p %20 + %24 = OpAccessChain %_ptr_Private_mat2v2float %p %int_1 + %27 = OpAccessChain %_ptr_Uniform_mat2v2float %u %uint_0 %int_2 + %28 = OpLoad %mat2v2float %27 + OpStore %24 %28 + %31 = OpAccessChain %_ptr_Private_v2float %p %int_1 %29 + %33 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 %29 %int_1 + %34 = OpLoad %v2float %33 + %35 = OpVectorShuffle %v2float %34 %34 1 0 + OpStore %31 %35 + %37 = OpAccessChain %_ptr_Private_float %p %int_1 %29 %uint_0 + %39 = OpAccessChain %_ptr_Uniform_float %u %uint_0 %29 %int_1 %uint_0 + %40 = OpLoad %float %39 + OpStore %37 %40 + OpReturn + OpFunctionEnd diff --git a/test/tint/buffer/uniform/std140/array/mat2x2/to_private.wgsl.expected.wgsl b/test/tint/buffer/uniform/std140/array/mat2x2/to_private.wgsl.expected.wgsl new file mode 100644 index 0000000000..732f5d6b1a --- /dev/null +++ b/test/tint/buffer/uniform/std140/array/mat2x2/to_private.wgsl.expected.wgsl @@ -0,0 +1,17 @@ +struct S { + before : i32, + m : mat2x2, + after : i32, +} + +@group(0) @binding(0) var u : array, 4>; + +var p : array, 4>; + +@compute @workgroup_size(1) +fn f() { + p = u; + p[1] = u[2]; + p[1][0] = u[0][1].yx; + p[1][0].x = u[0][1].x; +} diff --git a/test/tint/buffer/uniform/std140/array/mat2x2/to_storage.wgsl b/test/tint/buffer/uniform/std140/array/mat2x2/to_storage.wgsl new file mode 100644 index 0000000000..3a40144979 --- /dev/null +++ b/test/tint/buffer/uniform/std140/array/mat2x2/to_storage.wgsl @@ -0,0 +1,16 @@ +struct S { + before : i32, + m : mat2x2, + after : i32, +} + +@group(0) @binding(0) var u : array, 4>; +@group(0) @binding(1) var s : array, 4>; + +@compute @workgroup_size(1) +fn f() { + s = u; + s[1] = u[2]; + s[1][0] = u[0][1].yx; + s[1][0].x = u[0][1].x; +} diff --git a/test/tint/buffer/uniform/std140/array/mat2x2/to_storage.wgsl.expected.dxc.hlsl b/test/tint/buffer/uniform/std140/array/mat2x2/to_storage.wgsl.expected.dxc.hlsl new file mode 100644 index 0000000000..3714023524 --- /dev/null +++ b/test/tint/buffer/uniform/std140/array/mat2x2/to_storage.wgsl.expected.dxc.hlsl @@ -0,0 +1,46 @@ +cbuffer cbuffer_u : register(b0, space0) { + uint4 u[4]; +}; +RWByteAddressBuffer s : register(u1, space0); + +void tint_symbol_1(RWByteAddressBuffer buffer, uint offset, float2x2 value) { + buffer.Store2((offset + 0u), asuint(value[0u])); + buffer.Store2((offset + 8u), asuint(value[1u])); +} + +void tint_symbol(RWByteAddressBuffer buffer, uint offset, float2x2 value[4]) { + float2x2 array[4] = value; + { + [loop] for(uint i = 0u; (i < 4u); i = (i + 1u)) { + tint_symbol_1(buffer, (offset + (i * 16u)), array[i]); + } + } +} + +float2x2 tint_symbol_4(uint4 buffer[4], uint offset) { + const uint scalar_offset = ((offset + 0u)) / 4; + uint4 ubo_load = buffer[scalar_offset / 4]; + const uint scalar_offset_1 = ((offset + 8u)) / 4; + uint4 ubo_load_1 = buffer[scalar_offset_1 / 4]; + return float2x2(asfloat(((scalar_offset & 2) ? ubo_load.zw : ubo_load.xy)), asfloat(((scalar_offset_1 & 2) ? ubo_load_1.zw : ubo_load_1.xy))); +} + +typedef float2x2 tint_symbol_3_ret[4]; +tint_symbol_3_ret tint_symbol_3(uint4 buffer[4], uint offset) { + float2x2 arr[4] = (float2x2[4])0; + { + [loop] for(uint i_1 = 0u; (i_1 < 4u); i_1 = (i_1 + 1u)) { + arr[i_1] = tint_symbol_4(buffer, (offset + (i_1 * 16u))); + } + } + return arr; +} + +[numthreads(1, 1, 1)] +void f() { + tint_symbol(s, 0u, tint_symbol_3(u, 0u)); + tint_symbol_1(s, 16u, tint_symbol_4(u, 32u)); + s.Store2(16u, asuint(asfloat(u[0].zw).yx)); + s.Store(16u, asuint(asfloat(u[0].z))); + return; +} diff --git a/test/tint/buffer/uniform/std140/array/mat2x2/to_storage.wgsl.expected.fxc.hlsl b/test/tint/buffer/uniform/std140/array/mat2x2/to_storage.wgsl.expected.fxc.hlsl new file mode 100644 index 0000000000..3714023524 --- /dev/null +++ b/test/tint/buffer/uniform/std140/array/mat2x2/to_storage.wgsl.expected.fxc.hlsl @@ -0,0 +1,46 @@ +cbuffer cbuffer_u : register(b0, space0) { + uint4 u[4]; +}; +RWByteAddressBuffer s : register(u1, space0); + +void tint_symbol_1(RWByteAddressBuffer buffer, uint offset, float2x2 value) { + buffer.Store2((offset + 0u), asuint(value[0u])); + buffer.Store2((offset + 8u), asuint(value[1u])); +} + +void tint_symbol(RWByteAddressBuffer buffer, uint offset, float2x2 value[4]) { + float2x2 array[4] = value; + { + [loop] for(uint i = 0u; (i < 4u); i = (i + 1u)) { + tint_symbol_1(buffer, (offset + (i * 16u)), array[i]); + } + } +} + +float2x2 tint_symbol_4(uint4 buffer[4], uint offset) { + const uint scalar_offset = ((offset + 0u)) / 4; + uint4 ubo_load = buffer[scalar_offset / 4]; + const uint scalar_offset_1 = ((offset + 8u)) / 4; + uint4 ubo_load_1 = buffer[scalar_offset_1 / 4]; + return float2x2(asfloat(((scalar_offset & 2) ? ubo_load.zw : ubo_load.xy)), asfloat(((scalar_offset_1 & 2) ? ubo_load_1.zw : ubo_load_1.xy))); +} + +typedef float2x2 tint_symbol_3_ret[4]; +tint_symbol_3_ret tint_symbol_3(uint4 buffer[4], uint offset) { + float2x2 arr[4] = (float2x2[4])0; + { + [loop] for(uint i_1 = 0u; (i_1 < 4u); i_1 = (i_1 + 1u)) { + arr[i_1] = tint_symbol_4(buffer, (offset + (i_1 * 16u))); + } + } + return arr; +} + +[numthreads(1, 1, 1)] +void f() { + tint_symbol(s, 0u, tint_symbol_3(u, 0u)); + tint_symbol_1(s, 16u, tint_symbol_4(u, 32u)); + s.Store2(16u, asuint(asfloat(u[0].zw).yx)); + s.Store(16u, asuint(asfloat(u[0].z))); + return; +} diff --git a/test/tint/buffer/uniform/std140/array/mat2x2/to_storage.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/array/mat2x2/to_storage.wgsl.expected.glsl new file mode 100644 index 0000000000..2a920f8c1f --- /dev/null +++ b/test/tint/buffer/uniform/std140/array/mat2x2/to_storage.wgsl.expected.glsl @@ -0,0 +1,28 @@ +#version 310 es + +struct S { + int before; + mat2 m; + int after; +}; + +layout(binding = 0, std140) uniform u_block_ubo { + mat2 inner[4]; +} u; + +layout(binding = 1, std430) buffer u_block_ssbo { + mat2 inner[4]; +} s; + +void f() { + s.inner = u.inner; + s.inner[1] = u.inner[2]; + s.inner[1][0] = u.inner[0][1].yx; + s.inner[1][0].x = u.inner[0][1].x; +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + f(); + return; +} diff --git a/test/tint/buffer/uniform/std140/array/mat2x2/to_storage.wgsl.expected.msl b/test/tint/buffer/uniform/std140/array/mat2x2/to_storage.wgsl.expected.msl new file mode 100644 index 0000000000..892ef66d76 --- /dev/null +++ b/test/tint/buffer/uniform/std140/array/mat2x2/to_storage.wgsl.expected.msl @@ -0,0 +1,30 @@ +#include + +using namespace metal; + +template +struct tint_array { + const constant T& operator[](size_t i) const constant { return elements[i]; } + device T& operator[](size_t i) device { return elements[i]; } + const device T& operator[](size_t i) const device { return elements[i]; } + thread T& operator[](size_t i) thread { return elements[i]; } + const thread T& operator[](size_t i) const thread { return elements[i]; } + threadgroup T& operator[](size_t i) threadgroup { return elements[i]; } + const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; } + T elements[N]; +}; + +struct S { + int before; + float2x2 m; + int after; +}; + +kernel void f(device tint_array* tint_symbol [[buffer(1)]], const constant tint_array* tint_symbol_1 [[buffer(0)]]) { + *(tint_symbol) = *(tint_symbol_1); + (*(tint_symbol))[1] = (*(tint_symbol_1))[2]; + (*(tint_symbol))[1][0] = float2((*(tint_symbol_1))[0][1]).yx; + (*(tint_symbol))[1][0][0] = (*(tint_symbol_1))[0][1][0]; + return; +} + diff --git a/test/tint/buffer/uniform/std140/array/mat2x2/to_storage.wgsl.expected.spvasm b/test/tint/buffer/uniform/std140/array/mat2x2/to_storage.wgsl.expected.spvasm new file mode 100644 index 0000000000..19eba56c8f --- /dev/null +++ b/test/tint/buffer/uniform/std140/array/mat2x2/to_storage.wgsl.expected.spvasm @@ -0,0 +1,71 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 42 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %f "f" + OpExecutionMode %f LocalSize 1 1 1 + OpName %u_block "u_block" + OpMemberName %u_block 0 "inner" + OpName %u "u" + OpName %s "s" + OpName %f "f" + OpDecorate %u_block Block + OpMemberDecorate %u_block 0 Offset 0 + OpMemberDecorate %u_block 0 ColMajor + OpMemberDecorate %u_block 0 MatrixStride 8 + OpDecorate %_arr_mat2v2float_uint_4 ArrayStride 16 + OpDecorate %u NonWritable + OpDecorate %u DescriptorSet 0 + OpDecorate %u Binding 0 + OpDecorate %s DescriptorSet 0 + OpDecorate %s Binding 1 + %float = OpTypeFloat 32 + %v2float = OpTypeVector %float 2 +%mat2v2float = OpTypeMatrix %v2float 2 + %uint = OpTypeInt 32 0 + %uint_4 = OpConstant %uint 4 +%_arr_mat2v2float_uint_4 = OpTypeArray %mat2v2float %uint_4 + %u_block = OpTypeStruct %_arr_mat2v2float_uint_4 +%_ptr_Uniform_u_block = OpTypePointer Uniform %u_block + %u = OpVariable %_ptr_Uniform_u_block Uniform +%_ptr_StorageBuffer_u_block = OpTypePointer StorageBuffer %u_block + %s = OpVariable %_ptr_StorageBuffer_u_block StorageBuffer + %void = OpTypeVoid + %12 = OpTypeFunction %void + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer__arr_mat2v2float_uint_4 = OpTypePointer StorageBuffer %_arr_mat2v2float_uint_4 +%_ptr_Uniform__arr_mat2v2float_uint_4 = OpTypePointer Uniform %_arr_mat2v2float_uint_4 + %int = OpTypeInt 32 1 + %int_1 = OpConstant %int 1 +%_ptr_StorageBuffer_mat2v2float = OpTypePointer StorageBuffer %mat2v2float + %int_2 = OpConstant %int 2 +%_ptr_Uniform_mat2v2float = OpTypePointer Uniform %mat2v2float + %30 = OpConstantNull %int +%_ptr_StorageBuffer_v2float = OpTypePointer StorageBuffer %v2float +%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float +%_ptr_StorageBuffer_float = OpTypePointer StorageBuffer %float +%_ptr_Uniform_float = OpTypePointer Uniform %float + %f = OpFunction %void None %12 + %15 = OpLabel + %18 = OpAccessChain %_ptr_StorageBuffer__arr_mat2v2float_uint_4 %s %uint_0 + %20 = OpAccessChain %_ptr_Uniform__arr_mat2v2float_uint_4 %u %uint_0 + %21 = OpLoad %_arr_mat2v2float_uint_4 %20 + OpStore %18 %21 + %25 = OpAccessChain %_ptr_StorageBuffer_mat2v2float %s %uint_0 %int_1 + %28 = OpAccessChain %_ptr_Uniform_mat2v2float %u %uint_0 %int_2 + %29 = OpLoad %mat2v2float %28 + OpStore %25 %29 + %32 = OpAccessChain %_ptr_StorageBuffer_v2float %s %uint_0 %int_1 %30 + %34 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 %30 %int_1 + %35 = OpLoad %v2float %34 + %36 = OpVectorShuffle %v2float %35 %35 1 0 + OpStore %32 %36 + %38 = OpAccessChain %_ptr_StorageBuffer_float %s %uint_0 %int_1 %30 %uint_0 + %40 = OpAccessChain %_ptr_Uniform_float %u %uint_0 %30 %int_1 %uint_0 + %41 = OpLoad %float %40 + OpStore %38 %41 + OpReturn + OpFunctionEnd diff --git a/test/tint/buffer/uniform/std140/array/mat2x2/to_storage.wgsl.expected.wgsl b/test/tint/buffer/uniform/std140/array/mat2x2/to_storage.wgsl.expected.wgsl new file mode 100644 index 0000000000..11735038f7 --- /dev/null +++ b/test/tint/buffer/uniform/std140/array/mat2x2/to_storage.wgsl.expected.wgsl @@ -0,0 +1,17 @@ +struct S { + before : i32, + m : mat2x2, + after : i32, +} + +@group(0) @binding(0) var u : array, 4>; + +@group(0) @binding(1) var s : array, 4>; + +@compute @workgroup_size(1) +fn f() { + s = u; + s[1] = u[2]; + s[1][0] = u[0][1].yx; + s[1][0].x = u[0][1].x; +} diff --git a/test/tint/buffer/uniform/std140/array/mat2x2/to_workgroup.wgsl b/test/tint/buffer/uniform/std140/array/mat2x2/to_workgroup.wgsl new file mode 100644 index 0000000000..08ce8f6253 --- /dev/null +++ b/test/tint/buffer/uniform/std140/array/mat2x2/to_workgroup.wgsl @@ -0,0 +1,16 @@ +struct S { + before : i32, + m : mat2x2, + after : i32, +} + +@group(0) @binding(0) var u : array, 4>; +var w : array, 4>; + +@compute @workgroup_size(1) +fn f() { + w = u; + w[1] = u[2]; + w[1][0] = u[0][1].yx; + w[1][0].x = u[0][1].x; +} diff --git a/test/tint/buffer/uniform/std140/array/mat2x2/to_workgroup.wgsl.expected.dxc.hlsl b/test/tint/buffer/uniform/std140/array/mat2x2/to_workgroup.wgsl.expected.dxc.hlsl new file mode 100644 index 0000000000..fa0cad44c0 --- /dev/null +++ b/test/tint/buffer/uniform/std140/array/mat2x2/to_workgroup.wgsl.expected.dxc.hlsl @@ -0,0 +1,47 @@ +cbuffer cbuffer_u : register(b0, space0) { + uint4 u[4]; +}; +groupshared float2x2 w[4]; + +struct tint_symbol_1 { + uint local_invocation_index : SV_GroupIndex; +}; + +float2x2 tint_symbol_3(uint4 buffer[4], uint offset) { + const uint scalar_offset = ((offset + 0u)) / 4; + uint4 ubo_load = buffer[scalar_offset / 4]; + const uint scalar_offset_1 = ((offset + 8u)) / 4; + uint4 ubo_load_1 = buffer[scalar_offset_1 / 4]; + return float2x2(asfloat(((scalar_offset & 2) ? ubo_load.zw : ubo_load.xy)), asfloat(((scalar_offset_1 & 2) ? ubo_load_1.zw : ubo_load_1.xy))); +} + +typedef float2x2 tint_symbol_2_ret[4]; +tint_symbol_2_ret tint_symbol_2(uint4 buffer[4], uint offset) { + float2x2 arr[4] = (float2x2[4])0; + { + [loop] for(uint i_1 = 0u; (i_1 < 4u); i_1 = (i_1 + 1u)) { + arr[i_1] = tint_symbol_3(buffer, (offset + (i_1 * 16u))); + } + } + return arr; +} + +void f_inner(uint local_invocation_index) { + { + [loop] for(uint idx = local_invocation_index; (idx < 4u); idx = (idx + 1u)) { + const uint i = idx; + w[i] = float2x2((0.0f).xx, (0.0f).xx); + } + } + GroupMemoryBarrierWithGroupSync(); + w = tint_symbol_2(u, 0u); + w[1] = tint_symbol_3(u, 32u); + w[1][0] = asfloat(u[0].zw).yx; + w[1][0].x = asfloat(u[0].z); +} + +[numthreads(1, 1, 1)] +void f(tint_symbol_1 tint_symbol) { + f_inner(tint_symbol.local_invocation_index); + return; +} diff --git a/test/tint/buffer/uniform/std140/array/mat2x2/to_workgroup.wgsl.expected.fxc.hlsl b/test/tint/buffer/uniform/std140/array/mat2x2/to_workgroup.wgsl.expected.fxc.hlsl new file mode 100644 index 0000000000..fa0cad44c0 --- /dev/null +++ b/test/tint/buffer/uniform/std140/array/mat2x2/to_workgroup.wgsl.expected.fxc.hlsl @@ -0,0 +1,47 @@ +cbuffer cbuffer_u : register(b0, space0) { + uint4 u[4]; +}; +groupshared float2x2 w[4]; + +struct tint_symbol_1 { + uint local_invocation_index : SV_GroupIndex; +}; + +float2x2 tint_symbol_3(uint4 buffer[4], uint offset) { + const uint scalar_offset = ((offset + 0u)) / 4; + uint4 ubo_load = buffer[scalar_offset / 4]; + const uint scalar_offset_1 = ((offset + 8u)) / 4; + uint4 ubo_load_1 = buffer[scalar_offset_1 / 4]; + return float2x2(asfloat(((scalar_offset & 2) ? ubo_load.zw : ubo_load.xy)), asfloat(((scalar_offset_1 & 2) ? ubo_load_1.zw : ubo_load_1.xy))); +} + +typedef float2x2 tint_symbol_2_ret[4]; +tint_symbol_2_ret tint_symbol_2(uint4 buffer[4], uint offset) { + float2x2 arr[4] = (float2x2[4])0; + { + [loop] for(uint i_1 = 0u; (i_1 < 4u); i_1 = (i_1 + 1u)) { + arr[i_1] = tint_symbol_3(buffer, (offset + (i_1 * 16u))); + } + } + return arr; +} + +void f_inner(uint local_invocation_index) { + { + [loop] for(uint idx = local_invocation_index; (idx < 4u); idx = (idx + 1u)) { + const uint i = idx; + w[i] = float2x2((0.0f).xx, (0.0f).xx); + } + } + GroupMemoryBarrierWithGroupSync(); + w = tint_symbol_2(u, 0u); + w[1] = tint_symbol_3(u, 32u); + w[1][0] = asfloat(u[0].zw).yx; + w[1][0].x = asfloat(u[0].z); +} + +[numthreads(1, 1, 1)] +void f(tint_symbol_1 tint_symbol) { + f_inner(tint_symbol.local_invocation_index); + return; +} diff --git a/test/tint/buffer/uniform/std140/array/mat2x2/to_workgroup.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/array/mat2x2/to_workgroup.wgsl.expected.glsl new file mode 100644 index 0000000000..8dcc07dcec --- /dev/null +++ b/test/tint/buffer/uniform/std140/array/mat2x2/to_workgroup.wgsl.expected.glsl @@ -0,0 +1,32 @@ +#version 310 es + +struct S { + int before; + mat2 m; + int after; +}; + +layout(binding = 0, std140) uniform u_block_ubo { + mat2 inner[4]; +} u; + +shared mat2 w[4]; +void f(uint local_invocation_index) { + { + for(uint idx = local_invocation_index; (idx < 4u); idx = (idx + 1u)) { + uint i = idx; + w[i] = mat2(vec2(0.0f), vec2(0.0f)); + } + } + barrier(); + w = u.inner; + w[1] = u.inner[2]; + w[1][0] = u.inner[0][1].yx; + w[1][0].x = u.inner[0][1].x; +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + f(gl_LocalInvocationIndex); + return; +} diff --git a/test/tint/buffer/uniform/std140/array/mat2x2/to_workgroup.wgsl.expected.msl b/test/tint/buffer/uniform/std140/array/mat2x2/to_workgroup.wgsl.expected.msl new file mode 100644 index 0000000000..4f8574d683 --- /dev/null +++ b/test/tint/buffer/uniform/std140/array/mat2x2/to_workgroup.wgsl.expected.msl @@ -0,0 +1,44 @@ +#include + +using namespace metal; + +template +struct tint_array { + const constant T& operator[](size_t i) const constant { return elements[i]; } + device T& operator[](size_t i) device { return elements[i]; } + const device T& operator[](size_t i) const device { return elements[i]; } + thread T& operator[](size_t i) thread { return elements[i]; } + const thread T& operator[](size_t i) const thread { return elements[i]; } + threadgroup T& operator[](size_t i) threadgroup { return elements[i]; } + const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; } + T elements[N]; +}; + +struct tint_symbol_5 { + tint_array w; +}; + +struct S { + int before; + float2x2 m; + int after; +}; + +void f_inner(uint local_invocation_index, threadgroup tint_array* const tint_symbol, const constant tint_array* const tint_symbol_1) { + for(uint idx = local_invocation_index; (idx < 4u); idx = (idx + 1u)) { + uint const i = idx; + (*(tint_symbol))[i] = float2x2(float2(0.0f), float2(0.0f)); + } + threadgroup_barrier(mem_flags::mem_threadgroup); + *(tint_symbol) = *(tint_symbol_1); + (*(tint_symbol))[1] = (*(tint_symbol_1))[2]; + (*(tint_symbol))[1][0] = float2((*(tint_symbol_1))[0][1]).yx; + (*(tint_symbol))[1][0][0] = (*(tint_symbol_1))[0][1][0]; +} + +kernel void f(const constant tint_array* tint_symbol_4 [[buffer(0)]], threadgroup tint_symbol_5* tint_symbol_3 [[threadgroup(0)]], uint local_invocation_index [[thread_index_in_threadgroup]]) { + threadgroup tint_array* const tint_symbol_2 = &((*(tint_symbol_3)).w); + f_inner(local_invocation_index, tint_symbol_2, tint_symbol_4); + return; +} + diff --git a/test/tint/buffer/uniform/std140/array/mat2x2/to_workgroup.wgsl.expected.spvasm b/test/tint/buffer/uniform/std140/array/mat2x2/to_workgroup.wgsl.expected.spvasm new file mode 100644 index 0000000000..495667cecb --- /dev/null +++ b/test/tint/buffer/uniform/std140/array/mat2x2/to_workgroup.wgsl.expected.spvasm @@ -0,0 +1,115 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 70 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %f "f" %local_invocation_index_1 + OpExecutionMode %f LocalSize 1 1 1 + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %u_block "u_block" + OpMemberName %u_block 0 "inner" + OpName %u "u" + OpName %w "w" + OpName %f_inner "f_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %idx "idx" + OpName %f "f" + OpDecorate %local_invocation_index_1 BuiltIn LocalInvocationIndex + OpDecorate %u_block Block + OpMemberDecorate %u_block 0 Offset 0 + OpMemberDecorate %u_block 0 ColMajor + OpMemberDecorate %u_block 0 MatrixStride 8 + OpDecorate %_arr_mat2v2float_uint_4 ArrayStride 16 + OpDecorate %u NonWritable + OpDecorate %u DescriptorSet 0 + OpDecorate %u Binding 0 + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1 = OpVariable %_ptr_Input_uint Input + %float = OpTypeFloat 32 + %v2float = OpTypeVector %float 2 +%mat2v2float = OpTypeMatrix %v2float 2 + %uint_4 = OpConstant %uint 4 +%_arr_mat2v2float_uint_4 = OpTypeArray %mat2v2float %uint_4 + %u_block = OpTypeStruct %_arr_mat2v2float_uint_4 +%_ptr_Uniform_u_block = OpTypePointer Uniform %u_block + %u = OpVariable %_ptr_Uniform_u_block Uniform +%_ptr_Workgroup__arr_mat2v2float_uint_4 = OpTypePointer Workgroup %_arr_mat2v2float_uint_4 + %w = OpVariable %_ptr_Workgroup__arr_mat2v2float_uint_4 Workgroup + %void = OpTypeVoid + %14 = OpTypeFunction %void %uint +%_ptr_Function_uint = OpTypePointer Function %uint + %21 = OpConstantNull %uint + %bool = OpTypeBool +%_ptr_Workgroup_mat2v2float = OpTypePointer Workgroup %mat2v2float + %35 = OpConstantNull %mat2v2float + %uint_1 = OpConstant %uint 1 + %uint_2 = OpConstant %uint 2 + %uint_264 = OpConstant %uint 264 + %uint_0 = OpConstant %uint 0 +%_ptr_Uniform__arr_mat2v2float_uint_4 = OpTypePointer Uniform %_arr_mat2v2float_uint_4 + %int = OpTypeInt 32 1 + %int_1 = OpConstant %int 1 + %int_2 = OpConstant %int 2 +%_ptr_Uniform_mat2v2float = OpTypePointer Uniform %mat2v2float + %53 = OpConstantNull %int +%_ptr_Workgroup_v2float = OpTypePointer Workgroup %v2float +%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float +%_ptr_Workgroup_float = OpTypePointer Workgroup %float +%_ptr_Uniform_float = OpTypePointer Uniform %float + %65 = OpTypeFunction %void + %f_inner = OpFunction %void None %14 +%local_invocation_index = OpFunctionParameter %uint + %18 = OpLabel + %idx = OpVariable %_ptr_Function_uint Function %21 + OpStore %idx %local_invocation_index + OpBranch %22 + %22 = OpLabel + OpLoopMerge %23 %24 None + OpBranch %25 + %25 = OpLabel + %27 = OpLoad %uint %idx + %28 = OpULessThan %bool %27 %uint_4 + %26 = OpLogicalNot %bool %28 + OpSelectionMerge %30 None + OpBranchConditional %26 %31 %30 + %31 = OpLabel + OpBranch %23 + %30 = OpLabel + %32 = OpLoad %uint %idx + %34 = OpAccessChain %_ptr_Workgroup_mat2v2float %w %32 + OpStore %34 %35 + OpBranch %24 + %24 = OpLabel + %36 = OpLoad %uint %idx + %38 = OpIAdd %uint %36 %uint_1 + OpStore %idx %38 + OpBranch %22 + %23 = OpLabel + OpControlBarrier %uint_2 %uint_2 %uint_264 + %44 = OpAccessChain %_ptr_Uniform__arr_mat2v2float_uint_4 %u %uint_0 + %45 = OpLoad %_arr_mat2v2float_uint_4 %44 + OpStore %w %45 + %48 = OpAccessChain %_ptr_Workgroup_mat2v2float %w %int_1 + %51 = OpAccessChain %_ptr_Uniform_mat2v2float %u %uint_0 %int_2 + %52 = OpLoad %mat2v2float %51 + OpStore %48 %52 + %55 = OpAccessChain %_ptr_Workgroup_v2float %w %int_1 %53 + %57 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 %53 %int_1 + %58 = OpLoad %v2float %57 + %59 = OpVectorShuffle %v2float %58 %58 1 0 + OpStore %55 %59 + %61 = OpAccessChain %_ptr_Workgroup_float %w %int_1 %53 %uint_0 + %63 = OpAccessChain %_ptr_Uniform_float %u %uint_0 %53 %int_1 %uint_0 + %64 = OpLoad %float %63 + OpStore %61 %64 + OpReturn + OpFunctionEnd + %f = OpFunction %void None %65 + %67 = OpLabel + %69 = OpLoad %uint %local_invocation_index_1 + %68 = OpFunctionCall %void %f_inner %69 + OpReturn + OpFunctionEnd diff --git a/test/tint/buffer/uniform/std140/array/mat2x2/to_workgroup.wgsl.expected.wgsl b/test/tint/buffer/uniform/std140/array/mat2x2/to_workgroup.wgsl.expected.wgsl new file mode 100644 index 0000000000..fdb82d0300 --- /dev/null +++ b/test/tint/buffer/uniform/std140/array/mat2x2/to_workgroup.wgsl.expected.wgsl @@ -0,0 +1,17 @@ +struct S { + before : i32, + m : mat2x2, + after : i32, +} + +@group(0) @binding(0) var u : array, 4>; + +var w : array, 4>; + +@compute @workgroup_size(1) +fn f() { + w = u; + w[1] = u[2]; + w[1][0] = u[0][1].yx; + w[1][0].x = u[0][1].x; +} diff --git a/test/tint/buffer/uniform/std140/array/mat4x2/dynamic_index_via_ptr.wgsl b/test/tint/buffer/uniform/std140/array/mat4x2/dynamic_index_via_ptr.wgsl new file mode 100644 index 0000000000..9e1a54dde7 --- /dev/null +++ b/test/tint/buffer/uniform/std140/array/mat4x2/dynamic_index_via_ptr.wgsl @@ -0,0 +1,15 @@ +@group(0) @binding(0) var a : array, 4>; + +var counter = 0; +fn i() -> i32 { counter++; return counter; } + +@compute @workgroup_size(1) +fn f() { + let p_a = &a; + let p_a_i = &((*p_a)[i()]); + let p_a_i_i = &((*p_a_i)[i()]); + + let l_a : array, 4> = *p_a; + let l_a_i : mat4x2 = *p_a_i; + let l_a_i_i : vec2 = *p_a_i_i; +} diff --git a/test/tint/buffer/uniform/std140/array/mat4x2/dynamic_index_via_ptr.wgsl.expected.dxc.hlsl b/test/tint/buffer/uniform/std140/array/mat4x2/dynamic_index_via_ptr.wgsl.expected.dxc.hlsl new file mode 100644 index 0000000000..6c19c10bf9 --- /dev/null +++ b/test/tint/buffer/uniform/std140/array/mat4x2/dynamic_index_via_ptr.wgsl.expected.dxc.hlsl @@ -0,0 +1,44 @@ +cbuffer cbuffer_a : register(b0, space0) { + uint4 a[8]; +}; +static int counter = 0; + +int i() { + counter = (counter + 1); + return counter; +} + +float4x2 tint_symbol_1(uint4 buffer[8], uint offset) { + const uint scalar_offset = ((offset + 0u)) / 4; + uint4 ubo_load = buffer[scalar_offset / 4]; + const uint scalar_offset_1 = ((offset + 8u)) / 4; + uint4 ubo_load_1 = buffer[scalar_offset_1 / 4]; + const uint scalar_offset_2 = ((offset + 16u)) / 4; + uint4 ubo_load_2 = buffer[scalar_offset_2 / 4]; + const uint scalar_offset_3 = ((offset + 24u)) / 4; + uint4 ubo_load_3 = buffer[scalar_offset_3 / 4]; + return float4x2(asfloat(((scalar_offset & 2) ? ubo_load.zw : ubo_load.xy)), asfloat(((scalar_offset_1 & 2) ? ubo_load_1.zw : ubo_load_1.xy)), asfloat(((scalar_offset_2 & 2) ? ubo_load_2.zw : ubo_load_2.xy)), asfloat(((scalar_offset_3 & 2) ? ubo_load_3.zw : ubo_load_3.xy))); +} + +typedef float4x2 tint_symbol_ret[4]; +tint_symbol_ret tint_symbol(uint4 buffer[8], uint offset) { + float4x2 arr[4] = (float4x2[4])0; + { + [loop] for(uint i_1 = 0u; (i_1 < 4u); i_1 = (i_1 + 1u)) { + arr[i_1] = tint_symbol_1(buffer, (offset + (i_1 * 32u))); + } + } + return arr; +} + +[numthreads(1, 1, 1)] +void f() { + const int p_a_i_save = i(); + const int p_a_i_i_save = i(); + const float4x2 l_a[4] = tint_symbol(a, 0u); + const float4x2 l_a_i = tint_symbol_1(a, (32u * uint(p_a_i_save))); + const uint scalar_offset_4 = (((32u * uint(p_a_i_save)) + (8u * uint(p_a_i_i_save)))) / 4; + uint4 ubo_load_4 = a[scalar_offset_4 / 4]; + const float2 l_a_i_i = asfloat(((scalar_offset_4 & 2) ? ubo_load_4.zw : ubo_load_4.xy)); + return; +} diff --git a/test/tint/buffer/uniform/std140/array/mat4x2/dynamic_index_via_ptr.wgsl.expected.fxc.hlsl b/test/tint/buffer/uniform/std140/array/mat4x2/dynamic_index_via_ptr.wgsl.expected.fxc.hlsl new file mode 100644 index 0000000000..6c19c10bf9 --- /dev/null +++ b/test/tint/buffer/uniform/std140/array/mat4x2/dynamic_index_via_ptr.wgsl.expected.fxc.hlsl @@ -0,0 +1,44 @@ +cbuffer cbuffer_a : register(b0, space0) { + uint4 a[8]; +}; +static int counter = 0; + +int i() { + counter = (counter + 1); + return counter; +} + +float4x2 tint_symbol_1(uint4 buffer[8], uint offset) { + const uint scalar_offset = ((offset + 0u)) / 4; + uint4 ubo_load = buffer[scalar_offset / 4]; + const uint scalar_offset_1 = ((offset + 8u)) / 4; + uint4 ubo_load_1 = buffer[scalar_offset_1 / 4]; + const uint scalar_offset_2 = ((offset + 16u)) / 4; + uint4 ubo_load_2 = buffer[scalar_offset_2 / 4]; + const uint scalar_offset_3 = ((offset + 24u)) / 4; + uint4 ubo_load_3 = buffer[scalar_offset_3 / 4]; + return float4x2(asfloat(((scalar_offset & 2) ? ubo_load.zw : ubo_load.xy)), asfloat(((scalar_offset_1 & 2) ? ubo_load_1.zw : ubo_load_1.xy)), asfloat(((scalar_offset_2 & 2) ? ubo_load_2.zw : ubo_load_2.xy)), asfloat(((scalar_offset_3 & 2) ? ubo_load_3.zw : ubo_load_3.xy))); +} + +typedef float4x2 tint_symbol_ret[4]; +tint_symbol_ret tint_symbol(uint4 buffer[8], uint offset) { + float4x2 arr[4] = (float4x2[4])0; + { + [loop] for(uint i_1 = 0u; (i_1 < 4u); i_1 = (i_1 + 1u)) { + arr[i_1] = tint_symbol_1(buffer, (offset + (i_1 * 32u))); + } + } + return arr; +} + +[numthreads(1, 1, 1)] +void f() { + const int p_a_i_save = i(); + const int p_a_i_i_save = i(); + const float4x2 l_a[4] = tint_symbol(a, 0u); + const float4x2 l_a_i = tint_symbol_1(a, (32u * uint(p_a_i_save))); + const uint scalar_offset_4 = (((32u * uint(p_a_i_save)) + (8u * uint(p_a_i_i_save)))) / 4; + uint4 ubo_load_4 = a[scalar_offset_4 / 4]; + const float2 l_a_i_i = asfloat(((scalar_offset_4 & 2) ? ubo_load_4.zw : ubo_load_4.xy)); + return; +} diff --git a/test/tint/buffer/uniform/std140/array/mat4x2/dynamic_index_via_ptr.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/array/mat4x2/dynamic_index_via_ptr.wgsl.expected.glsl new file mode 100644 index 0000000000..a71a1431e5 --- /dev/null +++ b/test/tint/buffer/uniform/std140/array/mat4x2/dynamic_index_via_ptr.wgsl.expected.glsl @@ -0,0 +1,27 @@ +#version 310 es + +layout(binding = 0, std140) uniform a_block_ubo { + mat4x2 inner[4]; +} a; + +int counter = 0; +int i() { + counter = (counter + 1); + return counter; +} + +void f() { + int tint_symbol = i(); + int p_a_i_save = tint_symbol; + int tint_symbol_1 = i(); + int p_a_i_i_save = tint_symbol_1; + mat4x2 l_a[4] = a.inner; + mat4x2 l_a_i = a.inner[p_a_i_save]; + vec2 l_a_i_i = a.inner[p_a_i_save][p_a_i_i_save]; +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + f(); + return; +} diff --git a/test/tint/buffer/uniform/std140/array/mat4x2/dynamic_index_via_ptr.wgsl.expected.msl b/test/tint/buffer/uniform/std140/array/mat4x2/dynamic_index_via_ptr.wgsl.expected.msl new file mode 100644 index 0000000000..cffca674d8 --- /dev/null +++ b/test/tint/buffer/uniform/std140/array/mat4x2/dynamic_index_via_ptr.wgsl.expected.msl @@ -0,0 +1,33 @@ +#include + +using namespace metal; + +template +struct tint_array { + const constant T& operator[](size_t i) const constant { return elements[i]; } + device T& operator[](size_t i) device { return elements[i]; } + const device T& operator[](size_t i) const device { return elements[i]; } + thread T& operator[](size_t i) thread { return elements[i]; } + const thread T& operator[](size_t i) const thread { return elements[i]; } + threadgroup T& operator[](size_t i) threadgroup { return elements[i]; } + const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; } + T elements[N]; +}; + +int i() { + thread int tint_symbol_2 = 0; + tint_symbol_2 = as_type((as_type(tint_symbol_2) + as_type(1))); + return tint_symbol_2; +} + +kernel void f(const constant tint_array* tint_symbol_3 [[buffer(0)]]) { + int const tint_symbol = i(); + int const p_a_i_save = tint_symbol; + int const tint_symbol_1 = i(); + int const p_a_i_i_save = tint_symbol_1; + tint_array const l_a = *(tint_symbol_3); + float4x2 const l_a_i = (*(tint_symbol_3))[p_a_i_save]; + float2 const l_a_i_i = (*(tint_symbol_3))[p_a_i_save][p_a_i_i_save]; + return; +} + diff --git a/test/tint/buffer/uniform/std140/array/mat4x2/dynamic_index_via_ptr.wgsl.expected.spvasm b/test/tint/buffer/uniform/std140/array/mat4x2/dynamic_index_via_ptr.wgsl.expected.spvasm new file mode 100644 index 0000000000..11457bda51 --- /dev/null +++ b/test/tint/buffer/uniform/std140/array/mat4x2/dynamic_index_via_ptr.wgsl.expected.spvasm @@ -0,0 +1,64 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 37 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %f "f" + OpExecutionMode %f LocalSize 1 1 1 + OpName %a_block "a_block" + OpMemberName %a_block 0 "inner" + OpName %a "a" + OpName %counter "counter" + OpName %i "i" + OpName %f "f" + OpDecorate %a_block Block + OpMemberDecorate %a_block 0 Offset 0 + OpMemberDecorate %a_block 0 ColMajor + OpMemberDecorate %a_block 0 MatrixStride 8 + OpDecorate %_arr_mat4v2float_uint_4 ArrayStride 32 + OpDecorate %a NonWritable + OpDecorate %a DescriptorSet 0 + OpDecorate %a Binding 0 + %float = OpTypeFloat 32 + %v2float = OpTypeVector %float 2 +%mat4v2float = OpTypeMatrix %v2float 4 + %uint = OpTypeInt 32 0 + %uint_4 = OpConstant %uint 4 +%_arr_mat4v2float_uint_4 = OpTypeArray %mat4v2float %uint_4 + %a_block = OpTypeStruct %_arr_mat4v2float_uint_4 +%_ptr_Uniform_a_block = OpTypePointer Uniform %a_block + %a = OpVariable %_ptr_Uniform_a_block Uniform + %int = OpTypeInt 32 1 + %11 = OpConstantNull %int +%_ptr_Private_int = OpTypePointer Private %int + %counter = OpVariable %_ptr_Private_int Private %11 + %14 = OpTypeFunction %int + %int_1 = OpConstant %int 1 + %void = OpTypeVoid + %21 = OpTypeFunction %void + %uint_0 = OpConstant %uint 0 +%_ptr_Uniform__arr_mat4v2float_uint_4 = OpTypePointer Uniform %_arr_mat4v2float_uint_4 +%_ptr_Uniform_mat4v2float = OpTypePointer Uniform %mat4v2float +%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float + %i = OpFunction %int None %14 + %16 = OpLabel + %17 = OpLoad %int %counter + %19 = OpIAdd %int %17 %int_1 + OpStore %counter %19 + %20 = OpLoad %int %counter + OpReturnValue %20 + OpFunctionEnd + %f = OpFunction %void None %21 + %24 = OpLabel + %25 = OpFunctionCall %int %i + %26 = OpFunctionCall %int %i + %29 = OpAccessChain %_ptr_Uniform__arr_mat4v2float_uint_4 %a %uint_0 + %30 = OpLoad %_arr_mat4v2float_uint_4 %29 + %32 = OpAccessChain %_ptr_Uniform_mat4v2float %a %uint_0 %25 + %33 = OpLoad %mat4v2float %32 + %35 = OpAccessChain %_ptr_Uniform_v2float %a %uint_0 %25 %26 + %36 = OpLoad %v2float %35 + OpReturn + OpFunctionEnd diff --git a/test/tint/buffer/uniform/std140/array/mat4x2/dynamic_index_via_ptr.wgsl.expected.wgsl b/test/tint/buffer/uniform/std140/array/mat4x2/dynamic_index_via_ptr.wgsl.expected.wgsl new file mode 100644 index 0000000000..ede7b608d6 --- /dev/null +++ b/test/tint/buffer/uniform/std140/array/mat4x2/dynamic_index_via_ptr.wgsl.expected.wgsl @@ -0,0 +1,18 @@ +@group(0) @binding(0) var a : array, 4>; + +var counter = 0; + +fn i() -> i32 { + counter++; + return counter; +} + +@compute @workgroup_size(1) +fn f() { + let p_a = &(a); + let p_a_i = &((*(p_a))[i()]); + let p_a_i_i = &((*(p_a_i))[i()]); + let l_a : array, 4> = *(p_a); + let l_a_i : mat4x2 = *(p_a_i); + let l_a_i_i : vec2 = *(p_a_i_i); +} diff --git a/test/tint/buffer/uniform/std140/array/mat4x2/static_index_via_ptr.wgsl b/test/tint/buffer/uniform/std140/array/mat4x2/static_index_via_ptr.wgsl new file mode 100644 index 0000000000..c51141a49c --- /dev/null +++ b/test/tint/buffer/uniform/std140/array/mat4x2/static_index_via_ptr.wgsl @@ -0,0 +1,12 @@ +@group(0) @binding(0) var a : array, 4>; + +@compute @workgroup_size(1) +fn f() { + let p_a = &a; + let p_a_2 = &((*p_a)[2]); + let p_a_2_1 = &((*p_a_2)[1]); + + let l_a : array, 4> = *p_a; + let l_a_i : mat4x2 = *p_a_2; + let l_a_i_i : vec2 = *p_a_2_1; +} diff --git a/test/tint/buffer/uniform/std140/array/mat4x2/static_index_via_ptr.wgsl.expected.dxc.hlsl b/test/tint/buffer/uniform/std140/array/mat4x2/static_index_via_ptr.wgsl.expected.dxc.hlsl new file mode 100644 index 0000000000..5d255ce2a0 --- /dev/null +++ b/test/tint/buffer/uniform/std140/array/mat4x2/static_index_via_ptr.wgsl.expected.dxc.hlsl @@ -0,0 +1,34 @@ +cbuffer cbuffer_a : register(b0, space0) { + uint4 a[8]; +}; + +float4x2 tint_symbol_1(uint4 buffer[8], uint offset) { + const uint scalar_offset = ((offset + 0u)) / 4; + uint4 ubo_load = buffer[scalar_offset / 4]; + const uint scalar_offset_1 = ((offset + 8u)) / 4; + uint4 ubo_load_1 = buffer[scalar_offset_1 / 4]; + const uint scalar_offset_2 = ((offset + 16u)) / 4; + uint4 ubo_load_2 = buffer[scalar_offset_2 / 4]; + const uint scalar_offset_3 = ((offset + 24u)) / 4; + uint4 ubo_load_3 = buffer[scalar_offset_3 / 4]; + return float4x2(asfloat(((scalar_offset & 2) ? ubo_load.zw : ubo_load.xy)), asfloat(((scalar_offset_1 & 2) ? ubo_load_1.zw : ubo_load_1.xy)), asfloat(((scalar_offset_2 & 2) ? ubo_load_2.zw : ubo_load_2.xy)), asfloat(((scalar_offset_3 & 2) ? ubo_load_3.zw : ubo_load_3.xy))); +} + +typedef float4x2 tint_symbol_ret[4]; +tint_symbol_ret tint_symbol(uint4 buffer[8], uint offset) { + float4x2 arr[4] = (float4x2[4])0; + { + [loop] for(uint i = 0u; (i < 4u); i = (i + 1u)) { + arr[i] = tint_symbol_1(buffer, (offset + (i * 32u))); + } + } + return arr; +} + +[numthreads(1, 1, 1)] +void f() { + const float4x2 l_a[4] = tint_symbol(a, 0u); + const float4x2 l_a_i = tint_symbol_1(a, 64u); + const float2 l_a_i_i = asfloat(a[4].zw); + return; +} diff --git a/test/tint/buffer/uniform/std140/array/mat4x2/static_index_via_ptr.wgsl.expected.fxc.hlsl b/test/tint/buffer/uniform/std140/array/mat4x2/static_index_via_ptr.wgsl.expected.fxc.hlsl new file mode 100644 index 0000000000..5d255ce2a0 --- /dev/null +++ b/test/tint/buffer/uniform/std140/array/mat4x2/static_index_via_ptr.wgsl.expected.fxc.hlsl @@ -0,0 +1,34 @@ +cbuffer cbuffer_a : register(b0, space0) { + uint4 a[8]; +}; + +float4x2 tint_symbol_1(uint4 buffer[8], uint offset) { + const uint scalar_offset = ((offset + 0u)) / 4; + uint4 ubo_load = buffer[scalar_offset / 4]; + const uint scalar_offset_1 = ((offset + 8u)) / 4; + uint4 ubo_load_1 = buffer[scalar_offset_1 / 4]; + const uint scalar_offset_2 = ((offset + 16u)) / 4; + uint4 ubo_load_2 = buffer[scalar_offset_2 / 4]; + const uint scalar_offset_3 = ((offset + 24u)) / 4; + uint4 ubo_load_3 = buffer[scalar_offset_3 / 4]; + return float4x2(asfloat(((scalar_offset & 2) ? ubo_load.zw : ubo_load.xy)), asfloat(((scalar_offset_1 & 2) ? ubo_load_1.zw : ubo_load_1.xy)), asfloat(((scalar_offset_2 & 2) ? ubo_load_2.zw : ubo_load_2.xy)), asfloat(((scalar_offset_3 & 2) ? ubo_load_3.zw : ubo_load_3.xy))); +} + +typedef float4x2 tint_symbol_ret[4]; +tint_symbol_ret tint_symbol(uint4 buffer[8], uint offset) { + float4x2 arr[4] = (float4x2[4])0; + { + [loop] for(uint i = 0u; (i < 4u); i = (i + 1u)) { + arr[i] = tint_symbol_1(buffer, (offset + (i * 32u))); + } + } + return arr; +} + +[numthreads(1, 1, 1)] +void f() { + const float4x2 l_a[4] = tint_symbol(a, 0u); + const float4x2 l_a_i = tint_symbol_1(a, 64u); + const float2 l_a_i_i = asfloat(a[4].zw); + return; +} diff --git a/test/tint/buffer/uniform/std140/array/mat4x2/static_index_via_ptr.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/array/mat4x2/static_index_via_ptr.wgsl.expected.glsl new file mode 100644 index 0000000000..ef740a1748 --- /dev/null +++ b/test/tint/buffer/uniform/std140/array/mat4x2/static_index_via_ptr.wgsl.expected.glsl @@ -0,0 +1,17 @@ +#version 310 es + +layout(binding = 0, std140) uniform a_block_ubo { + mat4x2 inner[4]; +} a; + +void f() { + mat4x2 l_a[4] = a.inner; + mat4x2 l_a_i = a.inner[2]; + vec2 l_a_i_i = a.inner[2][1]; +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + f(); + return; +} diff --git a/test/tint/buffer/uniform/std140/array/mat4x2/static_index_via_ptr.wgsl.expected.msl b/test/tint/buffer/uniform/std140/array/mat4x2/static_index_via_ptr.wgsl.expected.msl new file mode 100644 index 0000000000..6de7aca86e --- /dev/null +++ b/test/tint/buffer/uniform/std140/array/mat4x2/static_index_via_ptr.wgsl.expected.msl @@ -0,0 +1,23 @@ +#include + +using namespace metal; + +template +struct tint_array { + const constant T& operator[](size_t i) const constant { return elements[i]; } + device T& operator[](size_t i) device { return elements[i]; } + const device T& operator[](size_t i) const device { return elements[i]; } + thread T& operator[](size_t i) thread { return elements[i]; } + const thread T& operator[](size_t i) const thread { return elements[i]; } + threadgroup T& operator[](size_t i) threadgroup { return elements[i]; } + const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; } + T elements[N]; +}; + +kernel void f(const constant tint_array* tint_symbol [[buffer(0)]]) { + tint_array const l_a = *(tint_symbol); + float4x2 const l_a_i = (*(tint_symbol))[2]; + float2 const l_a_i_i = (*(tint_symbol))[2][1]; + return; +} + diff --git a/test/tint/buffer/uniform/std140/array/mat4x2/static_index_via_ptr.wgsl.expected.spvasm b/test/tint/buffer/uniform/std140/array/mat4x2/static_index_via_ptr.wgsl.expected.spvasm new file mode 100644 index 0000000000..d69110ba33 --- /dev/null +++ b/test/tint/buffer/uniform/std140/array/mat4x2/static_index_via_ptr.wgsl.expected.spvasm @@ -0,0 +1,49 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 27 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %f "f" + OpExecutionMode %f LocalSize 1 1 1 + OpName %a_block "a_block" + OpMemberName %a_block 0 "inner" + OpName %a "a" + OpName %f "f" + OpDecorate %a_block Block + OpMemberDecorate %a_block 0 Offset 0 + OpMemberDecorate %a_block 0 ColMajor + OpMemberDecorate %a_block 0 MatrixStride 8 + OpDecorate %_arr_mat4v2float_uint_4 ArrayStride 32 + OpDecorate %a NonWritable + OpDecorate %a DescriptorSet 0 + OpDecorate %a Binding 0 + %float = OpTypeFloat 32 + %v2float = OpTypeVector %float 2 +%mat4v2float = OpTypeMatrix %v2float 4 + %uint = OpTypeInt 32 0 + %uint_4 = OpConstant %uint 4 +%_arr_mat4v2float_uint_4 = OpTypeArray %mat4v2float %uint_4 + %a_block = OpTypeStruct %_arr_mat4v2float_uint_4 +%_ptr_Uniform_a_block = OpTypePointer Uniform %a_block + %a = OpVariable %_ptr_Uniform_a_block Uniform + %void = OpTypeVoid + %10 = OpTypeFunction %void + %uint_0 = OpConstant %uint 0 +%_ptr_Uniform__arr_mat4v2float_uint_4 = OpTypePointer Uniform %_arr_mat4v2float_uint_4 + %int = OpTypeInt 32 1 + %int_2 = OpConstant %int 2 +%_ptr_Uniform_mat4v2float = OpTypePointer Uniform %mat4v2float + %int_1 = OpConstant %int 1 +%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float + %f = OpFunction %void None %10 + %13 = OpLabel + %16 = OpAccessChain %_ptr_Uniform__arr_mat4v2float_uint_4 %a %uint_0 + %17 = OpLoad %_arr_mat4v2float_uint_4 %16 + %21 = OpAccessChain %_ptr_Uniform_mat4v2float %a %uint_0 %int_2 + %22 = OpLoad %mat4v2float %21 + %25 = OpAccessChain %_ptr_Uniform_v2float %a %uint_0 %int_2 %int_1 + %26 = OpLoad %v2float %25 + OpReturn + OpFunctionEnd diff --git a/test/tint/buffer/uniform/std140/array/mat4x2/static_index_via_ptr.wgsl.expected.wgsl b/test/tint/buffer/uniform/std140/array/mat4x2/static_index_via_ptr.wgsl.expected.wgsl new file mode 100644 index 0000000000..800ccf625d --- /dev/null +++ b/test/tint/buffer/uniform/std140/array/mat4x2/static_index_via_ptr.wgsl.expected.wgsl @@ -0,0 +1,11 @@ +@group(0) @binding(0) var a : array, 4>; + +@compute @workgroup_size(1) +fn f() { + let p_a = &(a); + let p_a_2 = &((*(p_a))[2]); + let p_a_2_1 = &((*(p_a_2))[1]); + let l_a : array, 4> = *(p_a); + let l_a_i : mat4x2 = *(p_a_2); + let l_a_i_i : vec2 = *(p_a_2_1); +} diff --git a/test/tint/buffer/uniform/std140/array/mat4x2/to_fn.wgsl b/test/tint/buffer/uniform/std140/array/mat4x2/to_fn.wgsl new file mode 100644 index 0000000000..9657c4a6c3 --- /dev/null +++ b/test/tint/buffer/uniform/std140/array/mat4x2/to_fn.wgsl @@ -0,0 +1,14 @@ +@group(0) @binding(0) var u : array, 4>; + +fn a(a : array, 4>) {} +fn b(m : mat4x2) {} +fn c(v : vec2) {} +fn d(f : f32) {} + +@compute @workgroup_size(1) +fn f() { + a(u); + b(u[1]); + c(u[1][0].yx); + d(u[1][0].yx.x); +} diff --git a/test/tint/buffer/uniform/std140/array/mat4x2/to_fn.wgsl.expected.dxc.hlsl b/test/tint/buffer/uniform/std140/array/mat4x2/to_fn.wgsl.expected.dxc.hlsl new file mode 100644 index 0000000000..9bb94e2125 --- /dev/null +++ b/test/tint/buffer/uniform/std140/array/mat4x2/to_fn.wgsl.expected.dxc.hlsl @@ -0,0 +1,47 @@ +cbuffer cbuffer_u : register(b0, space0) { + uint4 u[8]; +}; + +void a(float4x2 a_1[4]) { +} + +void b(float4x2 m) { +} + +void c(float2 v) { +} + +void d(float f_1) { +} + +float4x2 tint_symbol_1(uint4 buffer[8], uint offset) { + const uint scalar_offset = ((offset + 0u)) / 4; + uint4 ubo_load = buffer[scalar_offset / 4]; + const uint scalar_offset_1 = ((offset + 8u)) / 4; + uint4 ubo_load_1 = buffer[scalar_offset_1 / 4]; + const uint scalar_offset_2 = ((offset + 16u)) / 4; + uint4 ubo_load_2 = buffer[scalar_offset_2 / 4]; + const uint scalar_offset_3 = ((offset + 24u)) / 4; + uint4 ubo_load_3 = buffer[scalar_offset_3 / 4]; + return float4x2(asfloat(((scalar_offset & 2) ? ubo_load.zw : ubo_load.xy)), asfloat(((scalar_offset_1 & 2) ? ubo_load_1.zw : ubo_load_1.xy)), asfloat(((scalar_offset_2 & 2) ? ubo_load_2.zw : ubo_load_2.xy)), asfloat(((scalar_offset_3 & 2) ? ubo_load_3.zw : ubo_load_3.xy))); +} + +typedef float4x2 tint_symbol_ret[4]; +tint_symbol_ret tint_symbol(uint4 buffer[8], uint offset) { + float4x2 arr[4] = (float4x2[4])0; + { + [loop] for(uint i = 0u; (i < 4u); i = (i + 1u)) { + arr[i] = tint_symbol_1(buffer, (offset + (i * 32u))); + } + } + return arr; +} + +[numthreads(1, 1, 1)] +void f() { + a(tint_symbol(u, 0u)); + b(tint_symbol_1(u, 32u)); + c(asfloat(u[2].xy).yx); + d(asfloat(u[2].xy).yx.x); + return; +} diff --git a/test/tint/buffer/uniform/std140/array/mat4x2/to_fn.wgsl.expected.fxc.hlsl b/test/tint/buffer/uniform/std140/array/mat4x2/to_fn.wgsl.expected.fxc.hlsl new file mode 100644 index 0000000000..9bb94e2125 --- /dev/null +++ b/test/tint/buffer/uniform/std140/array/mat4x2/to_fn.wgsl.expected.fxc.hlsl @@ -0,0 +1,47 @@ +cbuffer cbuffer_u : register(b0, space0) { + uint4 u[8]; +}; + +void a(float4x2 a_1[4]) { +} + +void b(float4x2 m) { +} + +void c(float2 v) { +} + +void d(float f_1) { +} + +float4x2 tint_symbol_1(uint4 buffer[8], uint offset) { + const uint scalar_offset = ((offset + 0u)) / 4; + uint4 ubo_load = buffer[scalar_offset / 4]; + const uint scalar_offset_1 = ((offset + 8u)) / 4; + uint4 ubo_load_1 = buffer[scalar_offset_1 / 4]; + const uint scalar_offset_2 = ((offset + 16u)) / 4; + uint4 ubo_load_2 = buffer[scalar_offset_2 / 4]; + const uint scalar_offset_3 = ((offset + 24u)) / 4; + uint4 ubo_load_3 = buffer[scalar_offset_3 / 4]; + return float4x2(asfloat(((scalar_offset & 2) ? ubo_load.zw : ubo_load.xy)), asfloat(((scalar_offset_1 & 2) ? ubo_load_1.zw : ubo_load_1.xy)), asfloat(((scalar_offset_2 & 2) ? ubo_load_2.zw : ubo_load_2.xy)), asfloat(((scalar_offset_3 & 2) ? ubo_load_3.zw : ubo_load_3.xy))); +} + +typedef float4x2 tint_symbol_ret[4]; +tint_symbol_ret tint_symbol(uint4 buffer[8], uint offset) { + float4x2 arr[4] = (float4x2[4])0; + { + [loop] for(uint i = 0u; (i < 4u); i = (i + 1u)) { + arr[i] = tint_symbol_1(buffer, (offset + (i * 32u))); + } + } + return arr; +} + +[numthreads(1, 1, 1)] +void f() { + a(tint_symbol(u, 0u)); + b(tint_symbol_1(u, 32u)); + c(asfloat(u[2].xy).yx); + d(asfloat(u[2].xy).yx.x); + return; +} diff --git a/test/tint/buffer/uniform/std140/array/mat4x2/to_fn.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/array/mat4x2/to_fn.wgsl.expected.glsl new file mode 100644 index 0000000000..850d58623c --- /dev/null +++ b/test/tint/buffer/uniform/std140/array/mat4x2/to_fn.wgsl.expected.glsl @@ -0,0 +1,30 @@ +#version 310 es + +layout(binding = 0, std140) uniform u_block_ubo { + mat4x2 inner[4]; +} u; + +void a(mat4x2 a_1[4]) { +} + +void b(mat4x2 m) { +} + +void c(vec2 v) { +} + +void d(float f_1) { +} + +void f() { + a(u.inner); + b(u.inner[1]); + c(u.inner[1][0].yx); + d(u.inner[1][0].yx.x); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + f(); + return; +} diff --git a/test/tint/buffer/uniform/std140/array/mat4x2/to_fn.wgsl.expected.msl b/test/tint/buffer/uniform/std140/array/mat4x2/to_fn.wgsl.expected.msl new file mode 100644 index 0000000000..4119424d92 --- /dev/null +++ b/test/tint/buffer/uniform/std140/array/mat4x2/to_fn.wgsl.expected.msl @@ -0,0 +1,36 @@ +#include + +using namespace metal; + +template +struct tint_array { + const constant T& operator[](size_t i) const constant { return elements[i]; } + device T& operator[](size_t i) device { return elements[i]; } + const device T& operator[](size_t i) const device { return elements[i]; } + thread T& operator[](size_t i) thread { return elements[i]; } + const thread T& operator[](size_t i) const thread { return elements[i]; } + threadgroup T& operator[](size_t i) threadgroup { return elements[i]; } + const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; } + T elements[N]; +}; + +void a(tint_array a_1) { +} + +void b(float4x2 m) { +} + +void c(float2 v) { +} + +void d(float f_1) { +} + +kernel void f(const constant tint_array* tint_symbol [[buffer(0)]]) { + a(*(tint_symbol)); + b((*(tint_symbol))[1]); + c(float2((*(tint_symbol))[1][0]).yx); + d(float2((*(tint_symbol))[1][0]).yx[0]); + return; +} + diff --git a/test/tint/buffer/uniform/std140/array/mat4x2/to_fn.wgsl.expected.spvasm b/test/tint/buffer/uniform/std140/array/mat4x2/to_fn.wgsl.expected.spvasm new file mode 100644 index 0000000000..8ee216d514 --- /dev/null +++ b/test/tint/buffer/uniform/std140/array/mat4x2/to_fn.wgsl.expected.spvasm @@ -0,0 +1,90 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 52 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %f "f" + OpExecutionMode %f LocalSize 1 1 1 + OpName %u_block "u_block" + OpMemberName %u_block 0 "inner" + OpName %u "u" + OpName %a "a" + OpName %a_1 "a_1" + OpName %b "b" + OpName %m "m" + OpName %c "c" + OpName %v "v" + OpName %d "d" + OpName %f_1 "f_1" + OpName %f "f" + OpDecorate %u_block Block + OpMemberDecorate %u_block 0 Offset 0 + OpMemberDecorate %u_block 0 ColMajor + OpMemberDecorate %u_block 0 MatrixStride 8 + OpDecorate %_arr_mat4v2float_uint_4 ArrayStride 32 + OpDecorate %u NonWritable + OpDecorate %u DescriptorSet 0 + OpDecorate %u Binding 0 + %float = OpTypeFloat 32 + %v2float = OpTypeVector %float 2 +%mat4v2float = OpTypeMatrix %v2float 4 + %uint = OpTypeInt 32 0 + %uint_4 = OpConstant %uint 4 +%_arr_mat4v2float_uint_4 = OpTypeArray %mat4v2float %uint_4 + %u_block = OpTypeStruct %_arr_mat4v2float_uint_4 +%_ptr_Uniform_u_block = OpTypePointer Uniform %u_block + %u = OpVariable %_ptr_Uniform_u_block Uniform + %void = OpTypeVoid + %10 = OpTypeFunction %void %_arr_mat4v2float_uint_4 + %15 = OpTypeFunction %void %mat4v2float + %19 = OpTypeFunction %void %v2float + %23 = OpTypeFunction %void %float + %27 = OpTypeFunction %void + %uint_0 = OpConstant %uint 0 +%_ptr_Uniform__arr_mat4v2float_uint_4 = OpTypePointer Uniform %_arr_mat4v2float_uint_4 + %int = OpTypeInt 32 1 + %int_1 = OpConstant %int 1 +%_ptr_Uniform_mat4v2float = OpTypePointer Uniform %mat4v2float + %42 = OpConstantNull %int +%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float + %a = OpFunction %void None %10 + %a_1 = OpFunctionParameter %_arr_mat4v2float_uint_4 + %14 = OpLabel + OpReturn + OpFunctionEnd + %b = OpFunction %void None %15 + %m = OpFunctionParameter %mat4v2float + %18 = OpLabel + OpReturn + OpFunctionEnd + %c = OpFunction %void None %19 + %v = OpFunctionParameter %v2float + %22 = OpLabel + OpReturn + OpFunctionEnd + %d = OpFunction %void None %23 + %f_1 = OpFunctionParameter %float + %26 = OpLabel + OpReturn + OpFunctionEnd + %f = OpFunction %void None %27 + %29 = OpLabel + %33 = OpAccessChain %_ptr_Uniform__arr_mat4v2float_uint_4 %u %uint_0 + %34 = OpLoad %_arr_mat4v2float_uint_4 %33 + %30 = OpFunctionCall %void %a %34 + %39 = OpAccessChain %_ptr_Uniform_mat4v2float %u %uint_0 %int_1 + %40 = OpLoad %mat4v2float %39 + %35 = OpFunctionCall %void %b %40 + %44 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 %int_1 %42 + %45 = OpLoad %v2float %44 + %46 = OpVectorShuffle %v2float %45 %45 1 0 + %41 = OpFunctionCall %void %c %46 + %48 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 %int_1 %42 + %49 = OpLoad %v2float %48 + %50 = OpVectorShuffle %v2float %49 %49 1 0 + %51 = OpCompositeExtract %float %50 0 + %47 = OpFunctionCall %void %d %51 + OpReturn + OpFunctionEnd diff --git a/test/tint/buffer/uniform/std140/array/mat4x2/to_fn.wgsl.expected.wgsl b/test/tint/buffer/uniform/std140/array/mat4x2/to_fn.wgsl.expected.wgsl new file mode 100644 index 0000000000..dfed7134f5 --- /dev/null +++ b/test/tint/buffer/uniform/std140/array/mat4x2/to_fn.wgsl.expected.wgsl @@ -0,0 +1,21 @@ +@group(0) @binding(0) var u : array, 4>; + +fn a(a : array, 4>) { +} + +fn b(m : mat4x2) { +} + +fn c(v : vec2) { +} + +fn d(f : f32) { +} + +@compute @workgroup_size(1) +fn f() { + a(u); + b(u[1]); + c(u[1][0].yx); + d(u[1][0].yx.x); +} diff --git a/test/tint/buffer/uniform/std140/array/mat4x2/to_private.wgsl b/test/tint/buffer/uniform/std140/array/mat4x2/to_private.wgsl new file mode 100644 index 0000000000..618416a702 --- /dev/null +++ b/test/tint/buffer/uniform/std140/array/mat4x2/to_private.wgsl @@ -0,0 +1,16 @@ +struct S { + before : i32, + m : mat4x2, + after : i32, +} + +@group(0) @binding(0) var u : array, 4>; +var p : array, 4>; + +@compute @workgroup_size(1) +fn f() { + p = u; + p[1] = u[2]; + p[1][0] = u[0][1].yx; + p[1][0].x = u[0][1].x; +} diff --git a/test/tint/buffer/uniform/std140/array/mat4x2/to_private.wgsl.expected.dxc.hlsl b/test/tint/buffer/uniform/std140/array/mat4x2/to_private.wgsl.expected.dxc.hlsl new file mode 100644 index 0000000000..1be04d4c3c --- /dev/null +++ b/test/tint/buffer/uniform/std140/array/mat4x2/to_private.wgsl.expected.dxc.hlsl @@ -0,0 +1,36 @@ +cbuffer cbuffer_u : register(b0, space0) { + uint4 u[8]; +}; +static float4x2 p[4] = (float4x2[4])0; + +float4x2 tint_symbol_1(uint4 buffer[8], uint offset) { + const uint scalar_offset = ((offset + 0u)) / 4; + uint4 ubo_load = buffer[scalar_offset / 4]; + const uint scalar_offset_1 = ((offset + 8u)) / 4; + uint4 ubo_load_1 = buffer[scalar_offset_1 / 4]; + const uint scalar_offset_2 = ((offset + 16u)) / 4; + uint4 ubo_load_2 = buffer[scalar_offset_2 / 4]; + const uint scalar_offset_3 = ((offset + 24u)) / 4; + uint4 ubo_load_3 = buffer[scalar_offset_3 / 4]; + return float4x2(asfloat(((scalar_offset & 2) ? ubo_load.zw : ubo_load.xy)), asfloat(((scalar_offset_1 & 2) ? ubo_load_1.zw : ubo_load_1.xy)), asfloat(((scalar_offset_2 & 2) ? ubo_load_2.zw : ubo_load_2.xy)), asfloat(((scalar_offset_3 & 2) ? ubo_load_3.zw : ubo_load_3.xy))); +} + +typedef float4x2 tint_symbol_ret[4]; +tint_symbol_ret tint_symbol(uint4 buffer[8], uint offset) { + float4x2 arr[4] = (float4x2[4])0; + { + [loop] for(uint i = 0u; (i < 4u); i = (i + 1u)) { + arr[i] = tint_symbol_1(buffer, (offset + (i * 32u))); + } + } + return arr; +} + +[numthreads(1, 1, 1)] +void f() { + p = tint_symbol(u, 0u); + p[1] = tint_symbol_1(u, 64u); + p[1][0] = asfloat(u[0].zw).yx; + p[1][0].x = asfloat(u[0].z); + return; +} diff --git a/test/tint/buffer/uniform/std140/array/mat4x2/to_private.wgsl.expected.fxc.hlsl b/test/tint/buffer/uniform/std140/array/mat4x2/to_private.wgsl.expected.fxc.hlsl new file mode 100644 index 0000000000..1be04d4c3c --- /dev/null +++ b/test/tint/buffer/uniform/std140/array/mat4x2/to_private.wgsl.expected.fxc.hlsl @@ -0,0 +1,36 @@ +cbuffer cbuffer_u : register(b0, space0) { + uint4 u[8]; +}; +static float4x2 p[4] = (float4x2[4])0; + +float4x2 tint_symbol_1(uint4 buffer[8], uint offset) { + const uint scalar_offset = ((offset + 0u)) / 4; + uint4 ubo_load = buffer[scalar_offset / 4]; + const uint scalar_offset_1 = ((offset + 8u)) / 4; + uint4 ubo_load_1 = buffer[scalar_offset_1 / 4]; + const uint scalar_offset_2 = ((offset + 16u)) / 4; + uint4 ubo_load_2 = buffer[scalar_offset_2 / 4]; + const uint scalar_offset_3 = ((offset + 24u)) / 4; + uint4 ubo_load_3 = buffer[scalar_offset_3 / 4]; + return float4x2(asfloat(((scalar_offset & 2) ? ubo_load.zw : ubo_load.xy)), asfloat(((scalar_offset_1 & 2) ? ubo_load_1.zw : ubo_load_1.xy)), asfloat(((scalar_offset_2 & 2) ? ubo_load_2.zw : ubo_load_2.xy)), asfloat(((scalar_offset_3 & 2) ? ubo_load_3.zw : ubo_load_3.xy))); +} + +typedef float4x2 tint_symbol_ret[4]; +tint_symbol_ret tint_symbol(uint4 buffer[8], uint offset) { + float4x2 arr[4] = (float4x2[4])0; + { + [loop] for(uint i = 0u; (i < 4u); i = (i + 1u)) { + arr[i] = tint_symbol_1(buffer, (offset + (i * 32u))); + } + } + return arr; +} + +[numthreads(1, 1, 1)] +void f() { + p = tint_symbol(u, 0u); + p[1] = tint_symbol_1(u, 64u); + p[1][0] = asfloat(u[0].zw).yx; + p[1][0].x = asfloat(u[0].z); + return; +} diff --git a/test/tint/buffer/uniform/std140/array/mat4x2/to_private.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/array/mat4x2/to_private.wgsl.expected.glsl new file mode 100644 index 0000000000..0b73e75e37 --- /dev/null +++ b/test/tint/buffer/uniform/std140/array/mat4x2/to_private.wgsl.expected.glsl @@ -0,0 +1,25 @@ +#version 310 es + +struct S { + int before; + mat4x2 m; + int after; +}; + +layout(binding = 0, std140) uniform u_block_ubo { + mat4x2 inner[4]; +} u; + +mat4x2 p[4] = mat4x2[4](mat4x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), mat4x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), mat4x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), mat4x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)); +void f() { + p = u.inner; + p[1] = u.inner[2]; + p[1][0] = u.inner[0][1].yx; + p[1][0].x = u.inner[0][1].x; +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + f(); + return; +} diff --git a/test/tint/buffer/uniform/std140/array/mat4x2/to_private.wgsl.expected.msl b/test/tint/buffer/uniform/std140/array/mat4x2/to_private.wgsl.expected.msl new file mode 100644 index 0000000000..cd97f910a5 --- /dev/null +++ b/test/tint/buffer/uniform/std140/array/mat4x2/to_private.wgsl.expected.msl @@ -0,0 +1,31 @@ +#include + +using namespace metal; + +template +struct tint_array { + const constant T& operator[](size_t i) const constant { return elements[i]; } + device T& operator[](size_t i) device { return elements[i]; } + const device T& operator[](size_t i) const device { return elements[i]; } + thread T& operator[](size_t i) thread { return elements[i]; } + const thread T& operator[](size_t i) const thread { return elements[i]; } + threadgroup T& operator[](size_t i) threadgroup { return elements[i]; } + const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; } + T elements[N]; +}; + +struct S { + int before; + float4x2 m; + int after; +}; + +kernel void f(const constant tint_array* tint_symbol_1 [[buffer(0)]]) { + thread tint_array tint_symbol = {}; + tint_symbol = *(tint_symbol_1); + tint_symbol[1] = (*(tint_symbol_1))[2]; + tint_symbol[1][0] = float2((*(tint_symbol_1))[0][1]).yx; + tint_symbol[1][0][0] = (*(tint_symbol_1))[0][1][0]; + return; +} + diff --git a/test/tint/buffer/uniform/std140/array/mat4x2/to_private.wgsl.expected.spvasm b/test/tint/buffer/uniform/std140/array/mat4x2/to_private.wgsl.expected.spvasm new file mode 100644 index 0000000000..41ac892634 --- /dev/null +++ b/test/tint/buffer/uniform/std140/array/mat4x2/to_private.wgsl.expected.spvasm @@ -0,0 +1,68 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 41 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %f "f" + OpExecutionMode %f LocalSize 1 1 1 + OpName %u_block "u_block" + OpMemberName %u_block 0 "inner" + OpName %u "u" + OpName %p "p" + OpName %f "f" + OpDecorate %u_block Block + OpMemberDecorate %u_block 0 Offset 0 + OpMemberDecorate %u_block 0 ColMajor + OpMemberDecorate %u_block 0 MatrixStride 8 + OpDecorate %_arr_mat4v2float_uint_4 ArrayStride 32 + OpDecorate %u NonWritable + OpDecorate %u DescriptorSet 0 + OpDecorate %u Binding 0 + %float = OpTypeFloat 32 + %v2float = OpTypeVector %float 2 +%mat4v2float = OpTypeMatrix %v2float 4 + %uint = OpTypeInt 32 0 + %uint_4 = OpConstant %uint 4 +%_arr_mat4v2float_uint_4 = OpTypeArray %mat4v2float %uint_4 + %u_block = OpTypeStruct %_arr_mat4v2float_uint_4 +%_ptr_Uniform_u_block = OpTypePointer Uniform %u_block + %u = OpVariable %_ptr_Uniform_u_block Uniform +%_ptr_Private__arr_mat4v2float_uint_4 = OpTypePointer Private %_arr_mat4v2float_uint_4 + %12 = OpConstantNull %_arr_mat4v2float_uint_4 + %p = OpVariable %_ptr_Private__arr_mat4v2float_uint_4 Private %12 + %void = OpTypeVoid + %13 = OpTypeFunction %void + %uint_0 = OpConstant %uint 0 +%_ptr_Uniform__arr_mat4v2float_uint_4 = OpTypePointer Uniform %_arr_mat4v2float_uint_4 + %int = OpTypeInt 32 1 + %int_1 = OpConstant %int 1 +%_ptr_Private_mat4v2float = OpTypePointer Private %mat4v2float + %int_2 = OpConstant %int 2 +%_ptr_Uniform_mat4v2float = OpTypePointer Uniform %mat4v2float + %29 = OpConstantNull %int +%_ptr_Private_v2float = OpTypePointer Private %v2float +%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float +%_ptr_Private_float = OpTypePointer Private %float +%_ptr_Uniform_float = OpTypePointer Uniform %float + %f = OpFunction %void None %13 + %16 = OpLabel + %19 = OpAccessChain %_ptr_Uniform__arr_mat4v2float_uint_4 %u %uint_0 + %20 = OpLoad %_arr_mat4v2float_uint_4 %19 + OpStore %p %20 + %24 = OpAccessChain %_ptr_Private_mat4v2float %p %int_1 + %27 = OpAccessChain %_ptr_Uniform_mat4v2float %u %uint_0 %int_2 + %28 = OpLoad %mat4v2float %27 + OpStore %24 %28 + %31 = OpAccessChain %_ptr_Private_v2float %p %int_1 %29 + %33 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 %29 %int_1 + %34 = OpLoad %v2float %33 + %35 = OpVectorShuffle %v2float %34 %34 1 0 + OpStore %31 %35 + %37 = OpAccessChain %_ptr_Private_float %p %int_1 %29 %uint_0 + %39 = OpAccessChain %_ptr_Uniform_float %u %uint_0 %29 %int_1 %uint_0 + %40 = OpLoad %float %39 + OpStore %37 %40 + OpReturn + OpFunctionEnd diff --git a/test/tint/buffer/uniform/std140/array/mat4x2/to_private.wgsl.expected.wgsl b/test/tint/buffer/uniform/std140/array/mat4x2/to_private.wgsl.expected.wgsl new file mode 100644 index 0000000000..04780dc276 --- /dev/null +++ b/test/tint/buffer/uniform/std140/array/mat4x2/to_private.wgsl.expected.wgsl @@ -0,0 +1,17 @@ +struct S { + before : i32, + m : mat4x2, + after : i32, +} + +@group(0) @binding(0) var u : array, 4>; + +var p : array, 4>; + +@compute @workgroup_size(1) +fn f() { + p = u; + p[1] = u[2]; + p[1][0] = u[0][1].yx; + p[1][0].x = u[0][1].x; +} diff --git a/test/tint/buffer/uniform/std140/array/mat4x2/to_storage.wgsl b/test/tint/buffer/uniform/std140/array/mat4x2/to_storage.wgsl new file mode 100644 index 0000000000..fcea4e7b9d --- /dev/null +++ b/test/tint/buffer/uniform/std140/array/mat4x2/to_storage.wgsl @@ -0,0 +1,16 @@ +struct S { + before : i32, + m : mat4x2, + after : i32, +} + +@group(0) @binding(0) var u : array, 4>; +@group(0) @binding(1) var s : array, 4>; + +@compute @workgroup_size(1) +fn f() { + s = u; + s[1] = u[2]; + s[1][0] = u[0][1].yx; + s[1][0].x = u[0][1].x; +} diff --git a/test/tint/buffer/uniform/std140/array/mat4x2/to_storage.wgsl.expected.dxc.hlsl b/test/tint/buffer/uniform/std140/array/mat4x2/to_storage.wgsl.expected.dxc.hlsl new file mode 100644 index 0000000000..bd2c38b458 --- /dev/null +++ b/test/tint/buffer/uniform/std140/array/mat4x2/to_storage.wgsl.expected.dxc.hlsl @@ -0,0 +1,52 @@ +cbuffer cbuffer_u : register(b0, space0) { + uint4 u[8]; +}; +RWByteAddressBuffer s : register(u1, space0); + +void tint_symbol_1(RWByteAddressBuffer buffer, uint offset, float4x2 value) { + buffer.Store2((offset + 0u), asuint(value[0u])); + buffer.Store2((offset + 8u), asuint(value[1u])); + buffer.Store2((offset + 16u), asuint(value[2u])); + buffer.Store2((offset + 24u), asuint(value[3u])); +} + +void tint_symbol(RWByteAddressBuffer buffer, uint offset, float4x2 value[4]) { + float4x2 array[4] = value; + { + [loop] for(uint i = 0u; (i < 4u); i = (i + 1u)) { + tint_symbol_1(buffer, (offset + (i * 32u)), array[i]); + } + } +} + +float4x2 tint_symbol_4(uint4 buffer[8], uint offset) { + const uint scalar_offset = ((offset + 0u)) / 4; + uint4 ubo_load = buffer[scalar_offset / 4]; + const uint scalar_offset_1 = ((offset + 8u)) / 4; + uint4 ubo_load_1 = buffer[scalar_offset_1 / 4]; + const uint scalar_offset_2 = ((offset + 16u)) / 4; + uint4 ubo_load_2 = buffer[scalar_offset_2 / 4]; + const uint scalar_offset_3 = ((offset + 24u)) / 4; + uint4 ubo_load_3 = buffer[scalar_offset_3 / 4]; + return float4x2(asfloat(((scalar_offset & 2) ? ubo_load.zw : ubo_load.xy)), asfloat(((scalar_offset_1 & 2) ? ubo_load_1.zw : ubo_load_1.xy)), asfloat(((scalar_offset_2 & 2) ? ubo_load_2.zw : ubo_load_2.xy)), asfloat(((scalar_offset_3 & 2) ? ubo_load_3.zw : ubo_load_3.xy))); +} + +typedef float4x2 tint_symbol_3_ret[4]; +tint_symbol_3_ret tint_symbol_3(uint4 buffer[8], uint offset) { + float4x2 arr[4] = (float4x2[4])0; + { + [loop] for(uint i_1 = 0u; (i_1 < 4u); i_1 = (i_1 + 1u)) { + arr[i_1] = tint_symbol_4(buffer, (offset + (i_1 * 32u))); + } + } + return arr; +} + +[numthreads(1, 1, 1)] +void f() { + tint_symbol(s, 0u, tint_symbol_3(u, 0u)); + tint_symbol_1(s, 32u, tint_symbol_4(u, 64u)); + s.Store2(32u, asuint(asfloat(u[0].zw).yx)); + s.Store(32u, asuint(asfloat(u[0].z))); + return; +} diff --git a/test/tint/buffer/uniform/std140/array/mat4x2/to_storage.wgsl.expected.fxc.hlsl b/test/tint/buffer/uniform/std140/array/mat4x2/to_storage.wgsl.expected.fxc.hlsl new file mode 100644 index 0000000000..bd2c38b458 --- /dev/null +++ b/test/tint/buffer/uniform/std140/array/mat4x2/to_storage.wgsl.expected.fxc.hlsl @@ -0,0 +1,52 @@ +cbuffer cbuffer_u : register(b0, space0) { + uint4 u[8]; +}; +RWByteAddressBuffer s : register(u1, space0); + +void tint_symbol_1(RWByteAddressBuffer buffer, uint offset, float4x2 value) { + buffer.Store2((offset + 0u), asuint(value[0u])); + buffer.Store2((offset + 8u), asuint(value[1u])); + buffer.Store2((offset + 16u), asuint(value[2u])); + buffer.Store2((offset + 24u), asuint(value[3u])); +} + +void tint_symbol(RWByteAddressBuffer buffer, uint offset, float4x2 value[4]) { + float4x2 array[4] = value; + { + [loop] for(uint i = 0u; (i < 4u); i = (i + 1u)) { + tint_symbol_1(buffer, (offset + (i * 32u)), array[i]); + } + } +} + +float4x2 tint_symbol_4(uint4 buffer[8], uint offset) { + const uint scalar_offset = ((offset + 0u)) / 4; + uint4 ubo_load = buffer[scalar_offset / 4]; + const uint scalar_offset_1 = ((offset + 8u)) / 4; + uint4 ubo_load_1 = buffer[scalar_offset_1 / 4]; + const uint scalar_offset_2 = ((offset + 16u)) / 4; + uint4 ubo_load_2 = buffer[scalar_offset_2 / 4]; + const uint scalar_offset_3 = ((offset + 24u)) / 4; + uint4 ubo_load_3 = buffer[scalar_offset_3 / 4]; + return float4x2(asfloat(((scalar_offset & 2) ? ubo_load.zw : ubo_load.xy)), asfloat(((scalar_offset_1 & 2) ? ubo_load_1.zw : ubo_load_1.xy)), asfloat(((scalar_offset_2 & 2) ? ubo_load_2.zw : ubo_load_2.xy)), asfloat(((scalar_offset_3 & 2) ? ubo_load_3.zw : ubo_load_3.xy))); +} + +typedef float4x2 tint_symbol_3_ret[4]; +tint_symbol_3_ret tint_symbol_3(uint4 buffer[8], uint offset) { + float4x2 arr[4] = (float4x2[4])0; + { + [loop] for(uint i_1 = 0u; (i_1 < 4u); i_1 = (i_1 + 1u)) { + arr[i_1] = tint_symbol_4(buffer, (offset + (i_1 * 32u))); + } + } + return arr; +} + +[numthreads(1, 1, 1)] +void f() { + tint_symbol(s, 0u, tint_symbol_3(u, 0u)); + tint_symbol_1(s, 32u, tint_symbol_4(u, 64u)); + s.Store2(32u, asuint(asfloat(u[0].zw).yx)); + s.Store(32u, asuint(asfloat(u[0].z))); + return; +} diff --git a/test/tint/buffer/uniform/std140/array/mat4x2/to_storage.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/array/mat4x2/to_storage.wgsl.expected.glsl new file mode 100644 index 0000000000..7eb1bf5a30 --- /dev/null +++ b/test/tint/buffer/uniform/std140/array/mat4x2/to_storage.wgsl.expected.glsl @@ -0,0 +1,28 @@ +#version 310 es + +struct S { + int before; + mat4x2 m; + int after; +}; + +layout(binding = 0, std140) uniform u_block_ubo { + mat4x2 inner[4]; +} u; + +layout(binding = 1, std430) buffer u_block_ssbo { + mat4x2 inner[4]; +} s; + +void f() { + s.inner = u.inner; + s.inner[1] = u.inner[2]; + s.inner[1][0] = u.inner[0][1].yx; + s.inner[1][0].x = u.inner[0][1].x; +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + f(); + return; +} diff --git a/test/tint/buffer/uniform/std140/array/mat4x2/to_storage.wgsl.expected.msl b/test/tint/buffer/uniform/std140/array/mat4x2/to_storage.wgsl.expected.msl new file mode 100644 index 0000000000..abded74860 --- /dev/null +++ b/test/tint/buffer/uniform/std140/array/mat4x2/to_storage.wgsl.expected.msl @@ -0,0 +1,30 @@ +#include + +using namespace metal; + +template +struct tint_array { + const constant T& operator[](size_t i) const constant { return elements[i]; } + device T& operator[](size_t i) device { return elements[i]; } + const device T& operator[](size_t i) const device { return elements[i]; } + thread T& operator[](size_t i) thread { return elements[i]; } + const thread T& operator[](size_t i) const thread { return elements[i]; } + threadgroup T& operator[](size_t i) threadgroup { return elements[i]; } + const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; } + T elements[N]; +}; + +struct S { + int before; + float4x2 m; + int after; +}; + +kernel void f(device tint_array* tint_symbol [[buffer(1)]], const constant tint_array* tint_symbol_1 [[buffer(0)]]) { + *(tint_symbol) = *(tint_symbol_1); + (*(tint_symbol))[1] = (*(tint_symbol_1))[2]; + (*(tint_symbol))[1][0] = float2((*(tint_symbol_1))[0][1]).yx; + (*(tint_symbol))[1][0][0] = (*(tint_symbol_1))[0][1][0]; + return; +} + diff --git a/test/tint/buffer/uniform/std140/array/mat4x2/to_storage.wgsl.expected.spvasm b/test/tint/buffer/uniform/std140/array/mat4x2/to_storage.wgsl.expected.spvasm new file mode 100644 index 0000000000..f922154b50 --- /dev/null +++ b/test/tint/buffer/uniform/std140/array/mat4x2/to_storage.wgsl.expected.spvasm @@ -0,0 +1,71 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 42 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %f "f" + OpExecutionMode %f LocalSize 1 1 1 + OpName %u_block "u_block" + OpMemberName %u_block 0 "inner" + OpName %u "u" + OpName %s "s" + OpName %f "f" + OpDecorate %u_block Block + OpMemberDecorate %u_block 0 Offset 0 + OpMemberDecorate %u_block 0 ColMajor + OpMemberDecorate %u_block 0 MatrixStride 8 + OpDecorate %_arr_mat4v2float_uint_4 ArrayStride 32 + OpDecorate %u NonWritable + OpDecorate %u DescriptorSet 0 + OpDecorate %u Binding 0 + OpDecorate %s DescriptorSet 0 + OpDecorate %s Binding 1 + %float = OpTypeFloat 32 + %v2float = OpTypeVector %float 2 +%mat4v2float = OpTypeMatrix %v2float 4 + %uint = OpTypeInt 32 0 + %uint_4 = OpConstant %uint 4 +%_arr_mat4v2float_uint_4 = OpTypeArray %mat4v2float %uint_4 + %u_block = OpTypeStruct %_arr_mat4v2float_uint_4 +%_ptr_Uniform_u_block = OpTypePointer Uniform %u_block + %u = OpVariable %_ptr_Uniform_u_block Uniform +%_ptr_StorageBuffer_u_block = OpTypePointer StorageBuffer %u_block + %s = OpVariable %_ptr_StorageBuffer_u_block StorageBuffer + %void = OpTypeVoid + %12 = OpTypeFunction %void + %uint_0 = OpConstant %uint 0 +%_ptr_StorageBuffer__arr_mat4v2float_uint_4 = OpTypePointer StorageBuffer %_arr_mat4v2float_uint_4 +%_ptr_Uniform__arr_mat4v2float_uint_4 = OpTypePointer Uniform %_arr_mat4v2float_uint_4 + %int = OpTypeInt 32 1 + %int_1 = OpConstant %int 1 +%_ptr_StorageBuffer_mat4v2float = OpTypePointer StorageBuffer %mat4v2float + %int_2 = OpConstant %int 2 +%_ptr_Uniform_mat4v2float = OpTypePointer Uniform %mat4v2float + %30 = OpConstantNull %int +%_ptr_StorageBuffer_v2float = OpTypePointer StorageBuffer %v2float +%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float +%_ptr_StorageBuffer_float = OpTypePointer StorageBuffer %float +%_ptr_Uniform_float = OpTypePointer Uniform %float + %f = OpFunction %void None %12 + %15 = OpLabel + %18 = OpAccessChain %_ptr_StorageBuffer__arr_mat4v2float_uint_4 %s %uint_0 + %20 = OpAccessChain %_ptr_Uniform__arr_mat4v2float_uint_4 %u %uint_0 + %21 = OpLoad %_arr_mat4v2float_uint_4 %20 + OpStore %18 %21 + %25 = OpAccessChain %_ptr_StorageBuffer_mat4v2float %s %uint_0 %int_1 + %28 = OpAccessChain %_ptr_Uniform_mat4v2float %u %uint_0 %int_2 + %29 = OpLoad %mat4v2float %28 + OpStore %25 %29 + %32 = OpAccessChain %_ptr_StorageBuffer_v2float %s %uint_0 %int_1 %30 + %34 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 %30 %int_1 + %35 = OpLoad %v2float %34 + %36 = OpVectorShuffle %v2float %35 %35 1 0 + OpStore %32 %36 + %38 = OpAccessChain %_ptr_StorageBuffer_float %s %uint_0 %int_1 %30 %uint_0 + %40 = OpAccessChain %_ptr_Uniform_float %u %uint_0 %30 %int_1 %uint_0 + %41 = OpLoad %float %40 + OpStore %38 %41 + OpReturn + OpFunctionEnd diff --git a/test/tint/buffer/uniform/std140/array/mat4x2/to_storage.wgsl.expected.wgsl b/test/tint/buffer/uniform/std140/array/mat4x2/to_storage.wgsl.expected.wgsl new file mode 100644 index 0000000000..d32f2280f0 --- /dev/null +++ b/test/tint/buffer/uniform/std140/array/mat4x2/to_storage.wgsl.expected.wgsl @@ -0,0 +1,17 @@ +struct S { + before : i32, + m : mat4x2, + after : i32, +} + +@group(0) @binding(0) var u : array, 4>; + +@group(0) @binding(1) var s : array, 4>; + +@compute @workgroup_size(1) +fn f() { + s = u; + s[1] = u[2]; + s[1][0] = u[0][1].yx; + s[1][0].x = u[0][1].x; +} diff --git a/test/tint/buffer/uniform/std140/array/mat4x2/to_workgroup.wgsl b/test/tint/buffer/uniform/std140/array/mat4x2/to_workgroup.wgsl new file mode 100644 index 0000000000..b1368c89ed --- /dev/null +++ b/test/tint/buffer/uniform/std140/array/mat4x2/to_workgroup.wgsl @@ -0,0 +1,16 @@ +struct S { + before : i32, + m : mat4x2, + after : i32, +} + +@group(0) @binding(0) var u : array, 4>; +var w : array, 4>; + +@compute @workgroup_size(1) +fn f() { + w = u; + w[1] = u[2]; + w[1][0] = u[0][1].yx; + w[1][0].x = u[0][1].x; +} diff --git a/test/tint/buffer/uniform/std140/array/mat4x2/to_workgroup.wgsl.expected.dxc.hlsl b/test/tint/buffer/uniform/std140/array/mat4x2/to_workgroup.wgsl.expected.dxc.hlsl new file mode 100644 index 0000000000..047cd82294 --- /dev/null +++ b/test/tint/buffer/uniform/std140/array/mat4x2/to_workgroup.wgsl.expected.dxc.hlsl @@ -0,0 +1,51 @@ +cbuffer cbuffer_u : register(b0, space0) { + uint4 u[8]; +}; +groupshared float4x2 w[4]; + +struct tint_symbol_1 { + uint local_invocation_index : SV_GroupIndex; +}; + +float4x2 tint_symbol_3(uint4 buffer[8], uint offset) { + const uint scalar_offset = ((offset + 0u)) / 4; + uint4 ubo_load = buffer[scalar_offset / 4]; + const uint scalar_offset_1 = ((offset + 8u)) / 4; + uint4 ubo_load_1 = buffer[scalar_offset_1 / 4]; + const uint scalar_offset_2 = ((offset + 16u)) / 4; + uint4 ubo_load_2 = buffer[scalar_offset_2 / 4]; + const uint scalar_offset_3 = ((offset + 24u)) / 4; + uint4 ubo_load_3 = buffer[scalar_offset_3 / 4]; + return float4x2(asfloat(((scalar_offset & 2) ? ubo_load.zw : ubo_load.xy)), asfloat(((scalar_offset_1 & 2) ? ubo_load_1.zw : ubo_load_1.xy)), asfloat(((scalar_offset_2 & 2) ? ubo_load_2.zw : ubo_load_2.xy)), asfloat(((scalar_offset_3 & 2) ? ubo_load_3.zw : ubo_load_3.xy))); +} + +typedef float4x2 tint_symbol_2_ret[4]; +tint_symbol_2_ret tint_symbol_2(uint4 buffer[8], uint offset) { + float4x2 arr[4] = (float4x2[4])0; + { + [loop] for(uint i_1 = 0u; (i_1 < 4u); i_1 = (i_1 + 1u)) { + arr[i_1] = tint_symbol_3(buffer, (offset + (i_1 * 32u))); + } + } + return arr; +} + +void f_inner(uint local_invocation_index) { + { + [loop] for(uint idx = local_invocation_index; (idx < 4u); idx = (idx + 1u)) { + const uint i = idx; + w[i] = float4x2((0.0f).xx, (0.0f).xx, (0.0f).xx, (0.0f).xx); + } + } + GroupMemoryBarrierWithGroupSync(); + w = tint_symbol_2(u, 0u); + w[1] = tint_symbol_3(u, 64u); + w[1][0] = asfloat(u[0].zw).yx; + w[1][0].x = asfloat(u[0].z); +} + +[numthreads(1, 1, 1)] +void f(tint_symbol_1 tint_symbol) { + f_inner(tint_symbol.local_invocation_index); + return; +} diff --git a/test/tint/buffer/uniform/std140/array/mat4x2/to_workgroup.wgsl.expected.fxc.hlsl b/test/tint/buffer/uniform/std140/array/mat4x2/to_workgroup.wgsl.expected.fxc.hlsl new file mode 100644 index 0000000000..047cd82294 --- /dev/null +++ b/test/tint/buffer/uniform/std140/array/mat4x2/to_workgroup.wgsl.expected.fxc.hlsl @@ -0,0 +1,51 @@ +cbuffer cbuffer_u : register(b0, space0) { + uint4 u[8]; +}; +groupshared float4x2 w[4]; + +struct tint_symbol_1 { + uint local_invocation_index : SV_GroupIndex; +}; + +float4x2 tint_symbol_3(uint4 buffer[8], uint offset) { + const uint scalar_offset = ((offset + 0u)) / 4; + uint4 ubo_load = buffer[scalar_offset / 4]; + const uint scalar_offset_1 = ((offset + 8u)) / 4; + uint4 ubo_load_1 = buffer[scalar_offset_1 / 4]; + const uint scalar_offset_2 = ((offset + 16u)) / 4; + uint4 ubo_load_2 = buffer[scalar_offset_2 / 4]; + const uint scalar_offset_3 = ((offset + 24u)) / 4; + uint4 ubo_load_3 = buffer[scalar_offset_3 / 4]; + return float4x2(asfloat(((scalar_offset & 2) ? ubo_load.zw : ubo_load.xy)), asfloat(((scalar_offset_1 & 2) ? ubo_load_1.zw : ubo_load_1.xy)), asfloat(((scalar_offset_2 & 2) ? ubo_load_2.zw : ubo_load_2.xy)), asfloat(((scalar_offset_3 & 2) ? ubo_load_3.zw : ubo_load_3.xy))); +} + +typedef float4x2 tint_symbol_2_ret[4]; +tint_symbol_2_ret tint_symbol_2(uint4 buffer[8], uint offset) { + float4x2 arr[4] = (float4x2[4])0; + { + [loop] for(uint i_1 = 0u; (i_1 < 4u); i_1 = (i_1 + 1u)) { + arr[i_1] = tint_symbol_3(buffer, (offset + (i_1 * 32u))); + } + } + return arr; +} + +void f_inner(uint local_invocation_index) { + { + [loop] for(uint idx = local_invocation_index; (idx < 4u); idx = (idx + 1u)) { + const uint i = idx; + w[i] = float4x2((0.0f).xx, (0.0f).xx, (0.0f).xx, (0.0f).xx); + } + } + GroupMemoryBarrierWithGroupSync(); + w = tint_symbol_2(u, 0u); + w[1] = tint_symbol_3(u, 64u); + w[1][0] = asfloat(u[0].zw).yx; + w[1][0].x = asfloat(u[0].z); +} + +[numthreads(1, 1, 1)] +void f(tint_symbol_1 tint_symbol) { + f_inner(tint_symbol.local_invocation_index); + return; +} diff --git a/test/tint/buffer/uniform/std140/array/mat4x2/to_workgroup.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/array/mat4x2/to_workgroup.wgsl.expected.glsl new file mode 100644 index 0000000000..6ca89c7f67 --- /dev/null +++ b/test/tint/buffer/uniform/std140/array/mat4x2/to_workgroup.wgsl.expected.glsl @@ -0,0 +1,32 @@ +#version 310 es + +struct S { + int before; + mat4x2 m; + int after; +}; + +layout(binding = 0, std140) uniform u_block_ubo { + mat4x2 inner[4]; +} u; + +shared mat4x2 w[4]; +void f(uint local_invocation_index) { + { + for(uint idx = local_invocation_index; (idx < 4u); idx = (idx + 1u)) { + uint i = idx; + w[i] = mat4x2(vec2(0.0f), vec2(0.0f), vec2(0.0f), vec2(0.0f)); + } + } + barrier(); + w = u.inner; + w[1] = u.inner[2]; + w[1][0] = u.inner[0][1].yx; + w[1][0].x = u.inner[0][1].x; +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + f(gl_LocalInvocationIndex); + return; +} diff --git a/test/tint/buffer/uniform/std140/array/mat4x2/to_workgroup.wgsl.expected.msl b/test/tint/buffer/uniform/std140/array/mat4x2/to_workgroup.wgsl.expected.msl new file mode 100644 index 0000000000..e4001f3657 --- /dev/null +++ b/test/tint/buffer/uniform/std140/array/mat4x2/to_workgroup.wgsl.expected.msl @@ -0,0 +1,44 @@ +#include + +using namespace metal; + +template +struct tint_array { + const constant T& operator[](size_t i) const constant { return elements[i]; } + device T& operator[](size_t i) device { return elements[i]; } + const device T& operator[](size_t i) const device { return elements[i]; } + thread T& operator[](size_t i) thread { return elements[i]; } + const thread T& operator[](size_t i) const thread { return elements[i]; } + threadgroup T& operator[](size_t i) threadgroup { return elements[i]; } + const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; } + T elements[N]; +}; + +struct tint_symbol_5 { + tint_array w; +}; + +struct S { + int before; + float4x2 m; + int after; +}; + +void f_inner(uint local_invocation_index, threadgroup tint_array* const tint_symbol, const constant tint_array* const tint_symbol_1) { + for(uint idx = local_invocation_index; (idx < 4u); idx = (idx + 1u)) { + uint const i = idx; + (*(tint_symbol))[i] = float4x2(float2(0.0f), float2(0.0f), float2(0.0f), float2(0.0f)); + } + threadgroup_barrier(mem_flags::mem_threadgroup); + *(tint_symbol) = *(tint_symbol_1); + (*(tint_symbol))[1] = (*(tint_symbol_1))[2]; + (*(tint_symbol))[1][0] = float2((*(tint_symbol_1))[0][1]).yx; + (*(tint_symbol))[1][0][0] = (*(tint_symbol_1))[0][1][0]; +} + +kernel void f(const constant tint_array* tint_symbol_4 [[buffer(0)]], threadgroup tint_symbol_5* tint_symbol_3 [[threadgroup(0)]], uint local_invocation_index [[thread_index_in_threadgroup]]) { + threadgroup tint_array* const tint_symbol_2 = &((*(tint_symbol_3)).w); + f_inner(local_invocation_index, tint_symbol_2, tint_symbol_4); + return; +} + diff --git a/test/tint/buffer/uniform/std140/array/mat4x2/to_workgroup.wgsl.expected.spvasm b/test/tint/buffer/uniform/std140/array/mat4x2/to_workgroup.wgsl.expected.spvasm new file mode 100644 index 0000000000..d38bf92da8 --- /dev/null +++ b/test/tint/buffer/uniform/std140/array/mat4x2/to_workgroup.wgsl.expected.spvasm @@ -0,0 +1,115 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 70 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %f "f" %local_invocation_index_1 + OpExecutionMode %f LocalSize 1 1 1 + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %u_block "u_block" + OpMemberName %u_block 0 "inner" + OpName %u "u" + OpName %w "w" + OpName %f_inner "f_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %idx "idx" + OpName %f "f" + OpDecorate %local_invocation_index_1 BuiltIn LocalInvocationIndex + OpDecorate %u_block Block + OpMemberDecorate %u_block 0 Offset 0 + OpMemberDecorate %u_block 0 ColMajor + OpMemberDecorate %u_block 0 MatrixStride 8 + OpDecorate %_arr_mat4v2float_uint_4 ArrayStride 32 + OpDecorate %u NonWritable + OpDecorate %u DescriptorSet 0 + OpDecorate %u Binding 0 + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1 = OpVariable %_ptr_Input_uint Input + %float = OpTypeFloat 32 + %v2float = OpTypeVector %float 2 +%mat4v2float = OpTypeMatrix %v2float 4 + %uint_4 = OpConstant %uint 4 +%_arr_mat4v2float_uint_4 = OpTypeArray %mat4v2float %uint_4 + %u_block = OpTypeStruct %_arr_mat4v2float_uint_4 +%_ptr_Uniform_u_block = OpTypePointer Uniform %u_block + %u = OpVariable %_ptr_Uniform_u_block Uniform +%_ptr_Workgroup__arr_mat4v2float_uint_4 = OpTypePointer Workgroup %_arr_mat4v2float_uint_4 + %w = OpVariable %_ptr_Workgroup__arr_mat4v2float_uint_4 Workgroup + %void = OpTypeVoid + %14 = OpTypeFunction %void %uint +%_ptr_Function_uint = OpTypePointer Function %uint + %21 = OpConstantNull %uint + %bool = OpTypeBool +%_ptr_Workgroup_mat4v2float = OpTypePointer Workgroup %mat4v2float + %35 = OpConstantNull %mat4v2float + %uint_1 = OpConstant %uint 1 + %uint_2 = OpConstant %uint 2 + %uint_264 = OpConstant %uint 264 + %uint_0 = OpConstant %uint 0 +%_ptr_Uniform__arr_mat4v2float_uint_4 = OpTypePointer Uniform %_arr_mat4v2float_uint_4 + %int = OpTypeInt 32 1 + %int_1 = OpConstant %int 1 + %int_2 = OpConstant %int 2 +%_ptr_Uniform_mat4v2float = OpTypePointer Uniform %mat4v2float + %53 = OpConstantNull %int +%_ptr_Workgroup_v2float = OpTypePointer Workgroup %v2float +%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float +%_ptr_Workgroup_float = OpTypePointer Workgroup %float +%_ptr_Uniform_float = OpTypePointer Uniform %float + %65 = OpTypeFunction %void + %f_inner = OpFunction %void None %14 +%local_invocation_index = OpFunctionParameter %uint + %18 = OpLabel + %idx = OpVariable %_ptr_Function_uint Function %21 + OpStore %idx %local_invocation_index + OpBranch %22 + %22 = OpLabel + OpLoopMerge %23 %24 None + OpBranch %25 + %25 = OpLabel + %27 = OpLoad %uint %idx + %28 = OpULessThan %bool %27 %uint_4 + %26 = OpLogicalNot %bool %28 + OpSelectionMerge %30 None + OpBranchConditional %26 %31 %30 + %31 = OpLabel + OpBranch %23 + %30 = OpLabel + %32 = OpLoad %uint %idx + %34 = OpAccessChain %_ptr_Workgroup_mat4v2float %w %32 + OpStore %34 %35 + OpBranch %24 + %24 = OpLabel + %36 = OpLoad %uint %idx + %38 = OpIAdd %uint %36 %uint_1 + OpStore %idx %38 + OpBranch %22 + %23 = OpLabel + OpControlBarrier %uint_2 %uint_2 %uint_264 + %44 = OpAccessChain %_ptr_Uniform__arr_mat4v2float_uint_4 %u %uint_0 + %45 = OpLoad %_arr_mat4v2float_uint_4 %44 + OpStore %w %45 + %48 = OpAccessChain %_ptr_Workgroup_mat4v2float %w %int_1 + %51 = OpAccessChain %_ptr_Uniform_mat4v2float %u %uint_0 %int_2 + %52 = OpLoad %mat4v2float %51 + OpStore %48 %52 + %55 = OpAccessChain %_ptr_Workgroup_v2float %w %int_1 %53 + %57 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 %53 %int_1 + %58 = OpLoad %v2float %57 + %59 = OpVectorShuffle %v2float %58 %58 1 0 + OpStore %55 %59 + %61 = OpAccessChain %_ptr_Workgroup_float %w %int_1 %53 %uint_0 + %63 = OpAccessChain %_ptr_Uniform_float %u %uint_0 %53 %int_1 %uint_0 + %64 = OpLoad %float %63 + OpStore %61 %64 + OpReturn + OpFunctionEnd + %f = OpFunction %void None %65 + %67 = OpLabel + %69 = OpLoad %uint %local_invocation_index_1 + %68 = OpFunctionCall %void %f_inner %69 + OpReturn + OpFunctionEnd diff --git a/test/tint/buffer/uniform/std140/array/mat4x2/to_workgroup.wgsl.expected.wgsl b/test/tint/buffer/uniform/std140/array/mat4x2/to_workgroup.wgsl.expected.wgsl new file mode 100644 index 0000000000..994885547c --- /dev/null +++ b/test/tint/buffer/uniform/std140/array/mat4x2/to_workgroup.wgsl.expected.wgsl @@ -0,0 +1,17 @@ +struct S { + before : i32, + m : mat4x2, + after : i32, +} + +@group(0) @binding(0) var u : array, 4>; + +var w : array, 4>; + +@compute @workgroup_size(1) +fn f() { + w = u; + w[1] = u[2]; + w[1][0] = u[0][1].yx; + w[1][0].x = u[0][1].x; +} diff --git a/test/tint/buffer/uniform/std140/mat2x2/to_builtin.wgsl.expected.spvasm b/test/tint/buffer/uniform/std140/mat2x2/to_builtin.wgsl.expected.spvasm deleted file mode 100644 index 641ded1f6a..0000000000 --- a/test/tint/buffer/uniform/std140/mat2x2/to_builtin.wgsl.expected.spvasm +++ /dev/null @@ -1,73 +0,0 @@ -; SPIR-V -; Version: 1.3 -; Generator: Google Tint Compiler; 0 -; Bound: 41 -; Schema: 0 - OpCapability Shader - %31 = OpExtInstImport "GLSL.std.450" - OpMemoryModel Logical GLSL450 - OpEntryPoint GLCompute %f "f" - OpExecutionMode %f LocalSize 1 1 1 - OpName %u_block "u_block" - OpMemberName %u_block 0 "inner" - OpName %S_std140 "S_std140" - OpMemberName %S_std140 0 "before" - OpMemberName %S_std140 1 "m_0" - OpMemberName %S_std140 2 "m_1" - OpMemberName %S_std140 3 "after" - OpName %u "u" - OpName %load_u_2_m "load_u_2_m" - OpName %f "f" - OpDecorate %u_block Block - OpMemberDecorate %u_block 0 Offset 0 - OpMemberDecorate %S_std140 0 Offset 0 - OpMemberDecorate %S_std140 1 Offset 8 - OpMemberDecorate %S_std140 2 Offset 16 - OpMemberDecorate %S_std140 3 Offset 24 - OpDecorate %_arr_S_std140_uint_4 ArrayStride 32 - OpDecorate %u NonWritable - OpDecorate %u DescriptorSet 0 - OpDecorate %u Binding 0 - %int = OpTypeInt 32 1 - %float = OpTypeFloat 32 - %v2float = OpTypeVector %float 2 - %S_std140 = OpTypeStruct %int %v2float %v2float %int - %uint = OpTypeInt 32 0 - %uint_4 = OpConstant %uint 4 -%_arr_S_std140_uint_4 = OpTypeArray %S_std140 %uint_4 - %u_block = OpTypeStruct %_arr_S_std140_uint_4 -%_ptr_Uniform_u_block = OpTypePointer Uniform %u_block - %u = OpVariable %_ptr_Uniform_u_block Uniform -%mat2v2float = OpTypeMatrix %v2float 2 - %11 = OpTypeFunction %mat2v2float - %uint_0 = OpConstant %uint 0 - %uint_2 = OpConstant %uint 2 - %uint_1 = OpConstant %uint 1 -%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float - %void = OpTypeVoid - %24 = OpTypeFunction %void - %32 = OpConstantNull %uint - %load_u_2_m = OpFunction %mat2v2float None %11 - %14 = OpLabel - %19 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 %uint_2 %uint_1 - %20 = OpLoad %v2float %19 - %21 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 %uint_2 %uint_2 - %22 = OpLoad %v2float %21 - %23 = OpCompositeConstruct %mat2v2float %20 %22 - OpReturnValue %23 - OpFunctionEnd - %f = OpFunction %void None %24 - %27 = OpLabel - %29 = OpFunctionCall %mat2v2float %load_u_2_m - %28 = OpTranspose %mat2v2float %29 - %33 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 %32 %uint_2 - %34 = OpLoad %v2float %33 - %35 = OpVectorShuffle %v2float %34 %34 1 0 - %30 = OpExtInst %float %31 Length %35 - %37 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 %32 %uint_2 - %38 = OpLoad %v2float %37 - %39 = OpVectorShuffle %v2float %38 %38 1 0 - %40 = OpCompositeExtract %float %39 0 - %36 = OpExtInst %float %31 FAbs %40 - OpReturn - OpFunctionEnd diff --git a/test/tint/buffer/uniform/std140/mat2x2/to_private.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/mat2x2/to_private.wgsl.expected.glsl deleted file mode 100644 index f21f59bac6..0000000000 --- a/test/tint/buffer/uniform/std140/mat2x2/to_private.wgsl.expected.glsl +++ /dev/null @@ -1,53 +0,0 @@ -#version 310 es - -struct S { - int before; - mat2 m; - int after; -}; - -struct S_std140 { - int before; - uint pad; - vec2 m_0; - vec2 m_1; - int after; - uint pad_1; -}; - -layout(binding = 0, std140) uniform u_block_ubo { - S_std140 inner[4]; -} u; - -S p[4] = S[4](S(0, mat2(0.0f, 0.0f, 0.0f, 0.0f), 0), S(0, mat2(0.0f, 0.0f, 0.0f, 0.0f), 0), S(0, mat2(0.0f, 0.0f, 0.0f, 0.0f), 0), S(0, mat2(0.0f, 0.0f, 0.0f, 0.0f), 0)); -S conv_S(S_std140 val) { - S tint_symbol = S(val.before, mat2(val.m_0, val.m_1), val.after); - return tint_symbol; -} - -S[4] conv_arr_4_S(S_std140 val[4]) { - S arr[4] = S[4](S(0, mat2(0.0f, 0.0f, 0.0f, 0.0f), 0), S(0, mat2(0.0f, 0.0f, 0.0f, 0.0f), 0), S(0, mat2(0.0f, 0.0f, 0.0f, 0.0f), 0), S(0, mat2(0.0f, 0.0f, 0.0f, 0.0f), 0)); - { - for(uint i = 0u; (i < 4u); i = (i + 1u)) { - arr[i] = conv_S(val[i]); - } - } - return arr; -} - -mat2 load_u_2_m() { - return mat2(u.inner[2u].m_0, u.inner[2u].m_1); -} - -void f() { - p = conv_arr_4_S(u.inner); - p[1] = conv_S(u.inner[2u]); - p[3].m = load_u_2_m(); - p[1].m[0] = u.inner[0u].m_1.yx; -} - -layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; -void main() { - f(); - return; -} diff --git a/test/tint/buffer/uniform/std140/mat3x2/dynamic_index_via_ptr.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/mat3x2/dynamic_index_via_ptr.wgsl.expected.glsl deleted file mode 100644 index c85ce1af03..0000000000 --- a/test/tint/buffer/uniform/std140/mat3x2/dynamic_index_via_ptr.wgsl.expected.glsl +++ /dev/null @@ -1,144 +0,0 @@ -#version 310 es - -struct Inner { - mat3x2 m; -}; - -struct Inner_std140 { - vec2 m_0; - vec2 m_1; - vec2 m_2; - uint pad; - uint pad_1; - uint pad_2; - uint pad_3; - uint pad_4; - uint pad_5; - uint pad_6; - uint pad_7; - uint pad_8; - uint pad_9; -}; - -struct Outer { - Inner a[4]; -}; - -struct Outer_std140 { - Inner_std140 a[4]; -}; - -layout(binding = 0, std140) uniform a_block_ubo { - Outer_std140 inner[4]; -} a; - -int counter = 0; -int i() { - counter = (counter + 1); - return counter; -} - -Inner conv_Inner(Inner_std140 val) { - Inner tint_symbol_4 = Inner(mat3x2(val.m_0, val.m_1, val.m_2)); - return tint_symbol_4; -} - -Inner[4] conv_arr_4_Inner(Inner_std140 val[4]) { - Inner arr[4] = Inner[4](Inner(mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)), Inner(mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)), Inner(mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)), Inner(mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f))); - { - for(uint i = 0u; (i < 4u); i = (i + 1u)) { - arr[i] = conv_Inner(val[i]); - } - } - return arr; -} - -Outer conv_Outer(Outer_std140 val) { - Outer tint_symbol_5 = Outer(conv_arr_4_Inner(val.a)); - return tint_symbol_5; -} - -Outer[4] conv_arr_4_Outer(Outer_std140 val[4]) { - Outer arr[4] = Outer[4](Outer(Inner[4](Inner(mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)), Inner(mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)), Inner(mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)), Inner(mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)))), Outer(Inner[4](Inner(mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)), Inner(mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)), Inner(mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)), Inner(mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)))), Outer(Inner[4](Inner(mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)), Inner(mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)), Inner(mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)), Inner(mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)))), Outer(Inner[4](Inner(mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)), Inner(mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)), Inner(mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)), Inner(mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f))))); - { - for(uint i = 0u; (i < 4u); i = (i + 1u)) { - arr[i] = conv_Outer(val[i]); - } - } - return arr; -} - -mat3x2 load_a_p0_a_p1_m(uint p0, uint p1) { - uint s_save = p0; - uint s_save_1 = p1; - return mat3x2(a.inner[s_save].a[s_save_1].m_0, a.inner[s_save].a[s_save_1].m_1, a.inner[s_save].a[s_save_1].m_2); -} - -vec2 load_a_p0_a_p1_m_p2(uint p0, uint p1, uint p2) { - switch(p2) { - case 0u: { - return a.inner[p0].a[p1].m_0; - break; - } - case 1u: { - return a.inner[p0].a[p1].m_1; - break; - } - case 2u: { - return a.inner[p0].a[p1].m_2; - break; - } - default: { - return vec2(0.0f); - break; - } - } -} - -float load_a_p0_a_p1_m_p2_p3(uint p0, uint p1, uint p2, uint p3) { - switch(p2) { - case 0u: { - return a.inner[p0].a[p1].m_0[p3]; - break; - } - case 1u: { - return a.inner[p0].a[p1].m_1[p3]; - break; - } - case 2u: { - return a.inner[p0].a[p1].m_2[p3]; - break; - } - default: { - return 0.0f; - break; - } - } -} - -void f() { - int I = 1; - Outer p_a[4] = conv_arr_4_Outer(a.inner); - int tint_symbol = i(); - Outer p_a_i = conv_Outer(a.inner[tint_symbol]); - Inner p_a_i_a[4] = conv_arr_4_Inner(a.inner[tint_symbol].a); - int tint_symbol_1 = i(); - Inner p_a_i_a_i = conv_Inner(a.inner[tint_symbol].a[tint_symbol_1]); - mat3x2 p_a_i_a_i_m = load_a_p0_a_p1_m(uint(tint_symbol), uint(tint_symbol_1)); - int tint_symbol_2 = i(); - vec2 p_a_i_a_i_m_i = load_a_p0_a_p1_m_p2(uint(tint_symbol), uint(tint_symbol_1), uint(tint_symbol_2)); - Outer l_a[4] = conv_arr_4_Outer(a.inner); - Outer l_a_i = conv_Outer(a.inner[tint_symbol]); - Inner l_a_i_a[4] = conv_arr_4_Inner(a.inner[tint_symbol].a); - Inner l_a_i_a_i = conv_Inner(a.inner[tint_symbol].a[tint_symbol_1]); - mat3x2 l_a_i_a_i_m = load_a_p0_a_p1_m(uint(tint_symbol), uint(tint_symbol_1)); - vec2 l_a_i_a_i_m_i = load_a_p0_a_p1_m_p2(uint(tint_symbol), uint(tint_symbol_1), uint(tint_symbol_2)); - int tint_symbol_3 = i(); - float l_a_i_a_i_m_i_i = load_a_p0_a_p1_m_p2_p3(uint(tint_symbol), uint(tint_symbol_1), uint(tint_symbol_2), uint(tint_symbol_3)); -} - -layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; -void main() { - f(); - return; -} diff --git a/test/tint/buffer/uniform/std140/mat3x2/static_index_via_ptr.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/mat3x2/static_index_via_ptr.wgsl.expected.glsl deleted file mode 100644 index 85ff44462c..0000000000 --- a/test/tint/buffer/uniform/std140/mat3x2/static_index_via_ptr.wgsl.expected.glsl +++ /dev/null @@ -1,90 +0,0 @@ -#version 310 es - -struct Inner { - mat3x2 m; -}; - -struct Inner_std140 { - vec2 m_0; - vec2 m_1; - vec2 m_2; - uint pad; - uint pad_1; - uint pad_2; - uint pad_3; - uint pad_4; - uint pad_5; - uint pad_6; - uint pad_7; - uint pad_8; - uint pad_9; -}; - -struct Outer { - Inner a[4]; -}; - -struct Outer_std140 { - Inner_std140 a[4]; -}; - -layout(binding = 0, std140) uniform a_block_ubo { - Outer_std140 inner[4]; -} a; - -Inner conv_Inner(Inner_std140 val) { - Inner tint_symbol = Inner(mat3x2(val.m_0, val.m_1, val.m_2)); - return tint_symbol; -} - -Inner[4] conv_arr_4_Inner(Inner_std140 val[4]) { - Inner arr[4] = Inner[4](Inner(mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)), Inner(mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)), Inner(mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)), Inner(mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f))); - { - for(uint i = 0u; (i < 4u); i = (i + 1u)) { - arr[i] = conv_Inner(val[i]); - } - } - return arr; -} - -Outer conv_Outer(Outer_std140 val) { - Outer tint_symbol_1 = Outer(conv_arr_4_Inner(val.a)); - return tint_symbol_1; -} - -Outer[4] conv_arr_4_Outer(Outer_std140 val[4]) { - Outer arr[4] = Outer[4](Outer(Inner[4](Inner(mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)), Inner(mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)), Inner(mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)), Inner(mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)))), Outer(Inner[4](Inner(mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)), Inner(mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)), Inner(mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)), Inner(mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)))), Outer(Inner[4](Inner(mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)), Inner(mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)), Inner(mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)), Inner(mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)))), Outer(Inner[4](Inner(mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)), Inner(mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)), Inner(mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f)), Inner(mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f))))); - { - for(uint i = 0u; (i < 4u); i = (i + 1u)) { - arr[i] = conv_Outer(val[i]); - } - } - return arr; -} - -mat3x2 load_a_3_a_2_m() { - return mat3x2(a.inner[3u].a[2u].m_0, a.inner[3u].a[2u].m_1, a.inner[3u].a[2u].m_2); -} - -void f() { - int I = 1; - Outer p_a[4] = conv_arr_4_Outer(a.inner); - Outer p_a_3 = conv_Outer(a.inner[3u]); - Inner p_a_3_a[4] = conv_arr_4_Inner(a.inner[3u].a); - Inner p_a_3_a_2 = conv_Inner(a.inner[3u].a[2u]); - mat3x2 p_a_3_a_2_m = load_a_3_a_2_m(); - vec2 p_a_3_a_2_m_1 = a.inner[3u].a[2u].m_1; - Outer l_a[4] = conv_arr_4_Outer(a.inner); - Outer l_a_3 = conv_Outer(a.inner[3u]); - Inner l_a_3_a[4] = conv_arr_4_Inner(a.inner[3u].a); - Inner l_a_3_a_2 = conv_Inner(a.inner[3u].a[2u]); - mat3x2 l_a_3_a_2_m = load_a_3_a_2_m(); - vec2 l_a_3_a_2_m_1 = a.inner[3u].a[2u].m_1; - float l_a_3_a_2_m_1_0 = a.inner[3u].a[2u].m_1[0u]; -} - -layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; -void main() { - f(); - return; -} diff --git a/test/tint/buffer/uniform/std140/mat3x2/to_private.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/mat3x2/to_private.wgsl.expected.glsl deleted file mode 100644 index afdcbcd33f..0000000000 --- a/test/tint/buffer/uniform/std140/mat3x2/to_private.wgsl.expected.glsl +++ /dev/null @@ -1,64 +0,0 @@ -#version 310 es - -struct S { - int before; - mat3x2 m; - int after; -}; - -struct S_std140 { - int before; - uint pad; - vec2 m_0; - vec2 m_1; - vec2 m_2; - uint pad_1; - uint pad_2; - uint pad_3; - uint pad_4; - uint pad_5; - uint pad_6; - uint pad_7; - uint pad_8; - uint pad_9; - uint pad_10; - int after; - uint pad_11; -}; - -layout(binding = 0, std140) uniform u_block_ubo { - S_std140 inner[4]; -} u; - -S p[4] = S[4](S(0, mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), 0), S(0, mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), 0), S(0, mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), 0), S(0, mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), 0)); -S conv_S(S_std140 val) { - S tint_symbol = S(val.before, mat3x2(val.m_0, val.m_1, val.m_2), val.after); - return tint_symbol; -} - -S[4] conv_arr_4_S(S_std140 val[4]) { - S arr[4] = S[4](S(0, mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), 0), S(0, mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), 0), S(0, mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), 0), S(0, mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), 0)); - { - for(uint i = 0u; (i < 4u); i = (i + 1u)) { - arr[i] = conv_S(val[i]); - } - } - return arr; -} - -mat3x2 load_u_2_m() { - return mat3x2(u.inner[2u].m_0, u.inner[2u].m_1, u.inner[2u].m_2); -} - -void f() { - p = conv_arr_4_S(u.inner); - p[1] = conv_S(u.inner[2u]); - p[3].m = load_u_2_m(); - p[1].m[0] = u.inner[0u].m_1.yx; -} - -layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; -void main() { - f(); - return; -} diff --git a/test/tint/buffer/uniform/std140/mat3x2/to_workgroup.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/mat3x2/to_workgroup.wgsl.expected.glsl deleted file mode 100644 index 17e4debbec..0000000000 --- a/test/tint/buffer/uniform/std140/mat3x2/to_workgroup.wgsl.expected.glsl +++ /dev/null @@ -1,72 +0,0 @@ -#version 310 es - -struct S { - int before; - mat3x2 m; - int after; -}; - -struct S_std140 { - int before; - uint pad; - vec2 m_0; - vec2 m_1; - vec2 m_2; - uint pad_1; - uint pad_2; - uint pad_3; - uint pad_4; - uint pad_5; - uint pad_6; - uint pad_7; - uint pad_8; - uint pad_9; - uint pad_10; - int after; - uint pad_11; -}; - -layout(binding = 0, std140) uniform u_block_ubo { - S_std140 inner[4]; -} u; - -shared S w[4]; -S conv_S(S_std140 val) { - S tint_symbol = S(val.before, mat3x2(val.m_0, val.m_1, val.m_2), val.after); - return tint_symbol; -} - -S[4] conv_arr_4_S(S_std140 val[4]) { - S arr[4] = S[4](S(0, mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), 0), S(0, mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), 0), S(0, mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), 0), S(0, mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), 0)); - { - for(uint i = 0u; (i < 4u); i = (i + 1u)) { - arr[i] = conv_S(val[i]); - } - } - return arr; -} - -mat3x2 load_u_2_m() { - return mat3x2(u.inner[2u].m_0, u.inner[2u].m_1, u.inner[2u].m_2); -} - -void f(uint local_invocation_index) { - { - for(uint idx = local_invocation_index; (idx < 4u); idx = (idx + 1u)) { - uint i = idx; - S tint_symbol_1 = S(0, mat3x2(vec2(0.0f), vec2(0.0f), vec2(0.0f)), 0); - w[i] = tint_symbol_1; - } - } - barrier(); - w = conv_arr_4_S(u.inner); - w[1] = conv_S(u.inner[2u]); - w[3].m = load_u_2_m(); - w[1].m[0] = u.inner[0u].m_1.yx; -} - -layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; -void main() { - f(gl_LocalInvocationIndex); - return; -} diff --git a/test/tint/buffer/uniform/std140/mat4x2/to_private.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/mat4x2/to_private.wgsl.expected.glsl deleted file mode 100644 index 235d81dcc6..0000000000 --- a/test/tint/buffer/uniform/std140/mat4x2/to_private.wgsl.expected.glsl +++ /dev/null @@ -1,55 +0,0 @@ -#version 310 es - -struct S { - int before; - mat4x2 m; - int after; -}; - -struct S_std140 { - int before; - uint pad; - vec2 m_0; - vec2 m_1; - vec2 m_2; - vec2 m_3; - int after; - uint pad_1; -}; - -layout(binding = 0, std140) uniform u_block_ubo { - S_std140 inner[4]; -} u; - -S p[4] = S[4](S(0, mat4x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), 0), S(0, mat4x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), 0), S(0, mat4x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), 0), S(0, mat4x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), 0)); -S conv_S(S_std140 val) { - S tint_symbol = S(val.before, mat4x2(val.m_0, val.m_1, val.m_2, val.m_3), val.after); - return tint_symbol; -} - -S[4] conv_arr_4_S(S_std140 val[4]) { - S arr[4] = S[4](S(0, mat4x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), 0), S(0, mat4x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), 0), S(0, mat4x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), 0), S(0, mat4x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), 0)); - { - for(uint i = 0u; (i < 4u); i = (i + 1u)) { - arr[i] = conv_S(val[i]); - } - } - return arr; -} - -mat4x2 load_u_2_m() { - return mat4x2(u.inner[2u].m_0, u.inner[2u].m_1, u.inner[2u].m_2, u.inner[2u].m_3); -} - -void f() { - p = conv_arr_4_S(u.inner); - p[1] = conv_S(u.inner[2u]); - p[3].m = load_u_2_m(); - p[1].m[0] = u.inner[0u].m_1.yx; -} - -layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; -void main() { - f(); - return; -} diff --git a/test/tint/buffer/uniform/std140/mat2x2/dynamic_index_via_ptr.wgsl b/test/tint/buffer/uniform/std140/struct/mat2x2/dynamic_index_via_ptr.wgsl similarity index 98% rename from test/tint/buffer/uniform/std140/mat2x2/dynamic_index_via_ptr.wgsl rename to test/tint/buffer/uniform/std140/struct/mat2x2/dynamic_index_via_ptr.wgsl index 2d14c16bad..fc1258e195 100644 --- a/test/tint/buffer/uniform/std140/mat2x2/dynamic_index_via_ptr.wgsl +++ b/test/tint/buffer/uniform/std140/struct/mat2x2/dynamic_index_via_ptr.wgsl @@ -13,8 +13,6 @@ fn i() -> i32 { counter++; return counter; } @compute @workgroup_size(1) fn f() { - let I = 1; - let p_a = &a; let p_a_i = &((*p_a)[i()]); let p_a_i_a = &((*p_a_i).a); diff --git a/test/tint/buffer/uniform/std140/mat2x2/dynamic_index_via_ptr.wgsl.expected.dxc.hlsl b/test/tint/buffer/uniform/std140/struct/mat2x2/dynamic_index_via_ptr.wgsl.expected.dxc.hlsl similarity index 99% rename from test/tint/buffer/uniform/std140/mat2x2/dynamic_index_via_ptr.wgsl.expected.dxc.hlsl rename to test/tint/buffer/uniform/std140/struct/mat2x2/dynamic_index_via_ptr.wgsl.expected.dxc.hlsl index 7a2acd88d1..10f609318f 100644 --- a/test/tint/buffer/uniform/std140/mat2x2/dynamic_index_via_ptr.wgsl.expected.dxc.hlsl +++ b/test/tint/buffer/uniform/std140/struct/mat2x2/dynamic_index_via_ptr.wgsl.expected.dxc.hlsl @@ -57,7 +57,6 @@ tint_symbol_4_ret tint_symbol_4(uint4 buffer[16], uint offset) { [numthreads(1, 1, 1)] void f() { - const int I = 1; const int p_a_i_save = i(); const int p_a_i_a_i_save = i(); const int p_a_i_a_i_m_i_save = i(); diff --git a/test/tint/buffer/uniform/std140/mat2x2/dynamic_index_via_ptr.wgsl.expected.fxc.hlsl b/test/tint/buffer/uniform/std140/struct/mat2x2/dynamic_index_via_ptr.wgsl.expected.fxc.hlsl similarity index 99% rename from test/tint/buffer/uniform/std140/mat2x2/dynamic_index_via_ptr.wgsl.expected.fxc.hlsl rename to test/tint/buffer/uniform/std140/struct/mat2x2/dynamic_index_via_ptr.wgsl.expected.fxc.hlsl index 7a2acd88d1..10f609318f 100644 --- a/test/tint/buffer/uniform/std140/mat2x2/dynamic_index_via_ptr.wgsl.expected.fxc.hlsl +++ b/test/tint/buffer/uniform/std140/struct/mat2x2/dynamic_index_via_ptr.wgsl.expected.fxc.hlsl @@ -57,7 +57,6 @@ tint_symbol_4_ret tint_symbol_4(uint4 buffer[16], uint offset) { [numthreads(1, 1, 1)] void f() { - const int I = 1; const int p_a_i_save = i(); const int p_a_i_a_i_save = i(); const int p_a_i_a_i_m_i_save = i(); diff --git a/test/tint/buffer/uniform/std140/mat2x2/dynamic_index_via_ptr.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/struct/mat2x2/dynamic_index_via_ptr.wgsl.expected.glsl similarity index 75% rename from test/tint/buffer/uniform/std140/mat2x2/dynamic_index_via_ptr.wgsl.expected.glsl rename to test/tint/buffer/uniform/std140/struct/mat2x2/dynamic_index_via_ptr.wgsl.expected.glsl index 70d9461a80..e27a6471de 100644 --- a/test/tint/buffer/uniform/std140/mat2x2/dynamic_index_via_ptr.wgsl.expected.glsl +++ b/test/tint/buffer/uniform/std140/struct/mat2x2/dynamic_index_via_ptr.wgsl.expected.glsl @@ -17,7 +17,7 @@ struct Outer_std140 { Inner_std140 a[4]; }; -layout(binding = 0, std140) uniform a_block_ubo { +layout(binding = 0, std140) uniform a_block_std140_ubo { Outer_std140 inner[4]; } a; @@ -28,8 +28,7 @@ int i() { } Inner conv_Inner(Inner_std140 val) { - Inner tint_symbol_4 = Inner(mat2(val.m_0, val.m_1)); - return tint_symbol_4; + return Inner(mat2(val.m_0, val.m_1)); } Inner[4] conv_arr_4_Inner(Inner_std140 val[4]) { @@ -43,8 +42,7 @@ Inner[4] conv_arr_4_Inner(Inner_std140 val[4]) { } Outer conv_Outer(Outer_std140 val) { - Outer tint_symbol_5 = Outer(conv_arr_4_Inner(val.a)); - return tint_symbol_5; + return Outer(conv_arr_4_Inner(val.a)); } Outer[4] conv_arr_4_Outer(Outer_std140 val[4]) { @@ -57,13 +55,13 @@ Outer[4] conv_arr_4_Outer(Outer_std140 val[4]) { return arr; } -mat2 load_a_p0_a_p1_m(uint p0, uint p1) { +mat2 load_a_inner_p0_a_p1_m(uint p0, uint p1) { uint s_save = p0; uint s_save_1 = p1; return mat2(a.inner[s_save].a[s_save_1].m_0, a.inner[s_save].a[s_save_1].m_1); } -vec2 load_a_p0_a_p1_m_p2(uint p0, uint p1, uint p2) { +vec2 load_a_inner_p0_a_p1_m_p2(uint p0, uint p1, uint p2) { switch(p2) { case 0u: { return a.inner[p0].a[p1].m_0; @@ -80,7 +78,7 @@ vec2 load_a_p0_a_p1_m_p2(uint p0, uint p1, uint p2) { } } -float load_a_p0_a_p1_m_p2_p3(uint p0, uint p1, uint p2, uint p3) { +float load_a_inner_p0_a_p1_m_p2_p3(uint p0, uint p1, uint p2, uint p3) { switch(p2) { case 0u: { return a.inner[p0].a[p1].m_0[p3]; @@ -98,24 +96,23 @@ float load_a_p0_a_p1_m_p2_p3(uint p0, uint p1, uint p2, uint p3) { } void f() { - int I = 1; Outer p_a[4] = conv_arr_4_Outer(a.inner); int tint_symbol = i(); Outer p_a_i = conv_Outer(a.inner[tint_symbol]); Inner p_a_i_a[4] = conv_arr_4_Inner(a.inner[tint_symbol].a); int tint_symbol_1 = i(); Inner p_a_i_a_i = conv_Inner(a.inner[tint_symbol].a[tint_symbol_1]); - mat2 p_a_i_a_i_m = load_a_p0_a_p1_m(uint(tint_symbol), uint(tint_symbol_1)); + mat2 p_a_i_a_i_m = load_a_inner_p0_a_p1_m(uint(tint_symbol), uint(tint_symbol_1)); int tint_symbol_2 = i(); - vec2 p_a_i_a_i_m_i = load_a_p0_a_p1_m_p2(uint(tint_symbol), uint(tint_symbol_1), uint(tint_symbol_2)); + vec2 p_a_i_a_i_m_i = load_a_inner_p0_a_p1_m_p2(uint(tint_symbol), uint(tint_symbol_1), uint(tint_symbol_2)); Outer l_a[4] = conv_arr_4_Outer(a.inner); Outer l_a_i = conv_Outer(a.inner[tint_symbol]); Inner l_a_i_a[4] = conv_arr_4_Inner(a.inner[tint_symbol].a); Inner l_a_i_a_i = conv_Inner(a.inner[tint_symbol].a[tint_symbol_1]); - mat2 l_a_i_a_i_m = load_a_p0_a_p1_m(uint(tint_symbol), uint(tint_symbol_1)); - vec2 l_a_i_a_i_m_i = load_a_p0_a_p1_m_p2(uint(tint_symbol), uint(tint_symbol_1), uint(tint_symbol_2)); + mat2 l_a_i_a_i_m = load_a_inner_p0_a_p1_m(uint(tint_symbol), uint(tint_symbol_1)); + vec2 l_a_i_a_i_m_i = load_a_inner_p0_a_p1_m_p2(uint(tint_symbol), uint(tint_symbol_1), uint(tint_symbol_2)); int tint_symbol_3 = i(); - float l_a_i_a_i_m_i_i = load_a_p0_a_p1_m_p2_p3(uint(tint_symbol), uint(tint_symbol_1), uint(tint_symbol_2), uint(tint_symbol_3)); + float l_a_i_a_i_m_i_i = load_a_inner_p0_a_p1_m_p2_p3(uint(tint_symbol), uint(tint_symbol_1), uint(tint_symbol_2), uint(tint_symbol_3)); } layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; diff --git a/test/tint/buffer/uniform/std140/mat2x2/dynamic_index_via_ptr.wgsl.expected.msl b/test/tint/buffer/uniform/std140/struct/mat2x2/dynamic_index_via_ptr.wgsl.expected.msl similarity index 98% rename from test/tint/buffer/uniform/std140/mat2x2/dynamic_index_via_ptr.wgsl.expected.msl rename to test/tint/buffer/uniform/std140/struct/mat2x2/dynamic_index_via_ptr.wgsl.expected.msl index b362cb8134..c1d8152fba 100644 --- a/test/tint/buffer/uniform/std140/mat2x2/dynamic_index_via_ptr.wgsl.expected.msl +++ b/test/tint/buffer/uniform/std140/struct/mat2x2/dynamic_index_via_ptr.wgsl.expected.msl @@ -29,7 +29,6 @@ int i() { } kernel void f(const constant tint_array* tint_symbol_5 [[buffer(0)]]) { - int const I = 1; int const tint_symbol = i(); int const p_a_i_save = tint_symbol; int const tint_symbol_1 = i(); diff --git a/test/tint/buffer/uniform/std140/mat2x2/dynamic_index_via_ptr.wgsl.expected.spvasm b/test/tint/buffer/uniform/std140/struct/mat2x2/dynamic_index_via_ptr.wgsl.expected.spvasm similarity index 63% rename from test/tint/buffer/uniform/std140/mat2x2/dynamic_index_via_ptr.wgsl.expected.spvasm rename to test/tint/buffer/uniform/std140/struct/mat2x2/dynamic_index_via_ptr.wgsl.expected.spvasm index 218f94c855..7950eacff3 100644 --- a/test/tint/buffer/uniform/std140/mat2x2/dynamic_index_via_ptr.wgsl.expected.spvasm +++ b/test/tint/buffer/uniform/std140/struct/mat2x2/dynamic_index_via_ptr.wgsl.expected.spvasm @@ -1,14 +1,14 @@ ; SPIR-V ; Version: 1.3 ; Generator: Google Tint Compiler; 0 -; Bound: 208 +; Bound: 193 ; Schema: 0 OpCapability Shader OpMemoryModel Logical GLSL450 OpEntryPoint GLCompute %f "f" OpExecutionMode %f LocalSize 1 1 1 - OpName %a_block "a_block" - OpMemberName %a_block 0 "inner" + OpName %a_block_std140 "a_block_std140" + OpMemberName %a_block_std140 0 "inner" OpName %Outer_std140 "Outer_std140" OpMemberName %Outer_std140 0 "a" OpName %Inner_std140 "Inner_std140" @@ -25,7 +25,7 @@ OpName %val_0 "val" OpName %arr "arr" OpName %i_0 "i" - OpName %var_for_index "var_for_index" + OpName %var_for_index_1 "var_for_index_1" OpName %Outer "Outer" OpMemberName %Outer 0 "a" OpName %conv_Outer "conv_Outer" @@ -34,22 +34,22 @@ OpName %val_2 "val" OpName %arr_0 "arr" OpName %i_1 "i" - OpName %var_for_index_1 "var_for_index_1" - OpName %load_a_p0_a_p1_m "load_a_p0_a_p1_m" + OpName %var_for_index "var_for_index" + OpName %load_a_inner_p0_a_p1_m "load_a_inner_p0_a_p1_m" OpName %p0 "p0" OpName %p1 "p1" - OpName %load_a_p0_a_p1_m_p2 "load_a_p0_a_p1_m_p2" + OpName %load_a_inner_p0_a_p1_m_p2 "load_a_inner_p0_a_p1_m_p2" OpName %p0_0 "p0" OpName %p1_0 "p1" OpName %p2 "p2" - OpName %load_a_p0_a_p1_m_p2_p3 "load_a_p0_a_p1_m_p2_p3" + OpName %load_a_inner_p0_a_p1_m_p2_p3 "load_a_inner_p0_a_p1_m_p2_p3" OpName %p0_1 "p0" OpName %p1_1 "p1" OpName %p2_0 "p2" OpName %p3 "p3" OpName %f "f" - OpDecorate %a_block Block - OpMemberDecorate %a_block 0 Offset 0 + OpDecorate %a_block_std140 Block + OpMemberDecorate %a_block_std140 0 Offset 0 OpMemberDecorate %Outer_std140 0 Offset 0 OpMemberDecorate %Inner_std140 0 Offset 0 OpMemberDecorate %Inner_std140 1 Offset 8 @@ -72,9 +72,9 @@ %_arr_Inner_std140_uint_4 = OpTypeArray %Inner_std140 %uint_4 %Outer_std140 = OpTypeStruct %_arr_Inner_std140_uint_4 %_arr_Outer_std140_uint_4 = OpTypeArray %Outer_std140 %uint_4 - %a_block = OpTypeStruct %_arr_Outer_std140_uint_4 -%_ptr_Uniform_a_block = OpTypePointer Uniform %a_block - %a = OpVariable %_ptr_Uniform_a_block Uniform +%a_block_std140 = OpTypeStruct %_arr_Outer_std140_uint_4 +%_ptr_Uniform_a_block_std140 = OpTypePointer Uniform %a_block_std140 + %a = OpVariable %_ptr_Uniform_a_block_std140 Uniform %int = OpTypeInt 32 1 %13 = OpConstantNull %int %_ptr_Private_int = OpTypePointer Private %int @@ -108,18 +108,18 @@ %_ptr_Function_Outer_std140 = OpTypePointer Function %Outer_std140 %109 = OpTypeFunction %mat2v2float %uint %uint %uint_0 = OpConstant %uint 0 +%_ptr_Uniform_Inner_std140 = OpTypePointer Uniform %Inner_std140 %_ptr_Uniform_v2float = OpTypePointer Uniform %v2float - %121 = OpTypeFunction %v2float %uint %uint %uint - %135 = OpConstantNull %v2float - %136 = OpTypeFunction %float %uint %uint %uint %uint + %126 = OpTypeFunction %v2float %uint %uint %uint + %140 = OpConstantNull %v2float + %141 = OpTypeFunction %float %uint %uint %uint %uint %_ptr_Uniform_float = OpTypePointer Uniform %float - %152 = OpConstantNull %float + %157 = OpConstantNull %float %void = OpTypeVoid - %153 = OpTypeFunction %void + %158 = OpTypeFunction %void %_ptr_Uniform__arr_Outer_std140_uint_4 = OpTypePointer Uniform %_arr_Outer_std140_uint_4 %_ptr_Uniform_Outer_std140 = OpTypePointer Uniform %Outer_std140 %_ptr_Uniform__arr_Inner_std140_uint_4 = OpTypePointer Uniform %_arr_Inner_std140_uint_4 -%_ptr_Uniform_Inner_std140 = OpTypePointer Uniform %Inner_std140 %i = OpFunction %int None %16 %18 = OpLabel %19 = OpLoad %int %counter @@ -142,7 +142,7 @@ %37 = OpLabel %arr = OpVariable %_ptr_Function__arr_Inner_uint_4 Function %40 %i_0 = OpVariable %_ptr_Function_uint Function %43 -%var_for_index = OpVariable %_ptr_Function__arr_Inner_std140_uint_4 Function %56 +%var_for_index_1 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4 Function %56 OpBranch %44 %44 = OpLabel OpLoopMerge %45 %46 None @@ -156,11 +156,11 @@ %53 = OpLabel OpBranch %45 %52 = OpLabel - OpStore %var_for_index %val_0 + OpStore %var_for_index_1 %val_0 %57 = OpLoad %uint %i_0 %59 = OpAccessChain %_ptr_Function_Inner %arr %57 %61 = OpLoad %uint %i_0 - %63 = OpAccessChain %_ptr_Function_Inner_std140 %var_for_index %61 + %63 = OpAccessChain %_ptr_Function_Inner_std140 %var_for_index_1 %61 %64 = OpLoad %Inner_std140 %63 %60 = OpFunctionCall %Inner %conv_Inner %64 OpStore %59 %60 @@ -187,7 +187,7 @@ %81 = OpLabel %arr_0 = OpVariable %_ptr_Function__arr_Outer_uint_4 Function %84 %i_1 = OpVariable %_ptr_Function_uint Function %43 -%var_for_index_1 = OpVariable %_ptr_Function__arr_Outer_std140_uint_4 Function %97 +%var_for_index = OpVariable %_ptr_Function__arr_Outer_std140_uint_4 Function %97 OpBranch %86 %86 = OpLabel OpLoopMerge %87 %88 None @@ -201,11 +201,11 @@ %94 = OpLabel OpBranch %87 %93 = OpLabel - OpStore %var_for_index_1 %val_2 + OpStore %var_for_index %val_2 %98 = OpLoad %uint %i_1 %100 = OpAccessChain %_ptr_Function_Outer %arr_0 %98 %102 = OpLoad %uint %i_1 - %104 = OpAccessChain %_ptr_Function_Outer_std140 %var_for_index_1 %102 + %104 = OpAccessChain %_ptr_Function_Outer_std140 %var_for_index %102 %105 = OpLoad %Outer_std140 %104 %101 = OpFunctionCall %Outer %conv_Outer %105 OpStore %100 %101 @@ -219,106 +219,88 @@ %108 = OpLoad %_arr_Outer_uint_4 %arr_0 OpReturnValue %108 OpFunctionEnd -%load_a_p0_a_p1_m = OpFunction %mat2v2float None %109 +%load_a_inner_p0_a_p1_m = OpFunction %mat2v2float None %109 %p0 = OpFunctionParameter %uint %p1 = OpFunctionParameter %uint %113 = OpLabel - %116 = OpAccessChain %_ptr_Uniform_v2float %a %uint_0 %p0 %uint_0 %p1 %uint_0 - %117 = OpLoad %v2float %116 - %118 = OpAccessChain %_ptr_Uniform_v2float %a %uint_0 %p0 %uint_0 %p1 %uint_1 - %119 = OpLoad %v2float %118 - %120 = OpCompositeConstruct %mat2v2float %117 %119 - OpReturnValue %120 + %117 = OpAccessChain %_ptr_Uniform_Inner_std140 %a %uint_0 %p0 %uint_0 %p1 + %120 = OpAccessChain %_ptr_Uniform_v2float %117 %uint_0 + %121 = OpLoad %v2float %120 + %123 = OpAccessChain %_ptr_Uniform_v2float %117 %uint_1 + %124 = OpLoad %v2float %123 + %125 = OpCompositeConstruct %mat2v2float %121 %124 + OpReturnValue %125 OpFunctionEnd -%load_a_p0_a_p1_m_p2 = OpFunction %v2float None %121 +%load_a_inner_p0_a_p1_m_p2 = OpFunction %v2float None %126 %p0_0 = OpFunctionParameter %uint %p1_0 = OpFunctionParameter %uint %p2 = OpFunctionParameter %uint - %126 = OpLabel - OpSelectionMerge %127 None - OpSwitch %p2 %128 0 %129 1 %130 - %129 = OpLabel - %131 = OpAccessChain %_ptr_Uniform_v2float %a %uint_0 %p0_0 %uint_0 %p1_0 %uint_0 - %132 = OpLoad %v2float %131 - OpReturnValue %132 - %130 = OpLabel - %133 = OpAccessChain %_ptr_Uniform_v2float %a %uint_0 %p0_0 %uint_0 %p1_0 %uint_1 - %134 = OpLoad %v2float %133 - OpReturnValue %134 - %128 = OpLabel - OpReturnValue %135 - %127 = OpLabel - OpReturnValue %135 + %131 = OpLabel + OpSelectionMerge %132 None + OpSwitch %p2 %133 0 %134 1 %135 + %134 = OpLabel + %136 = OpAccessChain %_ptr_Uniform_v2float %a %uint_0 %p0_0 %uint_0 %p1_0 %uint_0 + %137 = OpLoad %v2float %136 + OpReturnValue %137 + %135 = OpLabel + %138 = OpAccessChain %_ptr_Uniform_v2float %a %uint_0 %p0_0 %uint_0 %p1_0 %uint_1 + %139 = OpLoad %v2float %138 + OpReturnValue %139 + %133 = OpLabel + OpReturnValue %140 + %132 = OpLabel + OpReturnValue %140 OpFunctionEnd -%load_a_p0_a_p1_m_p2_p3 = OpFunction %float None %136 +%load_a_inner_p0_a_p1_m_p2_p3 = OpFunction %float None %141 %p0_1 = OpFunctionParameter %uint %p1_1 = OpFunctionParameter %uint %p2_0 = OpFunctionParameter %uint %p3 = OpFunctionParameter %uint - %142 = OpLabel - OpSelectionMerge %143 None - OpSwitch %p2_0 %144 0 %145 1 %146 - %145 = OpLabel - %148 = OpAccessChain %_ptr_Uniform_float %a %uint_0 %p0_1 %uint_0 %p1_1 %uint_0 %p3 - %149 = OpLoad %float %148 - OpReturnValue %149 - %146 = OpLabel - %150 = OpAccessChain %_ptr_Uniform_float %a %uint_0 %p0_1 %uint_0 %p1_1 %uint_1 %p3 - %151 = OpLoad %float %150 - OpReturnValue %151 - %144 = OpLabel - OpReturnValue %152 - %143 = OpLabel - OpReturnValue %152 + %147 = OpLabel + OpSelectionMerge %148 None + OpSwitch %p2_0 %149 0 %150 1 %151 + %150 = OpLabel + %153 = OpAccessChain %_ptr_Uniform_float %a %uint_0 %p0_1 %uint_0 %p1_1 %uint_0 %p3 + %154 = OpLoad %float %153 + OpReturnValue %154 + %151 = OpLabel + %155 = OpAccessChain %_ptr_Uniform_float %a %uint_0 %p0_1 %uint_0 %p1_1 %uint_1 %p3 + %156 = OpLoad %float %155 + OpReturnValue %156 + %149 = OpLabel + OpReturnValue %157 + %148 = OpLabel + OpReturnValue %157 OpFunctionEnd - %f = OpFunction %void None %153 - %156 = OpLabel - %159 = OpAccessChain %_ptr_Uniform__arr_Outer_std140_uint_4 %a %uint_0 - %160 = OpLoad %_arr_Outer_std140_uint_4 %159 - %157 = OpFunctionCall %_arr_Outer_uint_4 %conv_arr_4_Outer %160 - %161 = OpFunctionCall %int %i - %164 = OpAccessChain %_ptr_Uniform_Outer_std140 %a %uint_0 %161 - %165 = OpLoad %Outer_std140 %164 - %162 = OpFunctionCall %Outer %conv_Outer %165 - %168 = OpAccessChain %_ptr_Uniform__arr_Inner_std140_uint_4 %a %uint_0 %161 %uint_0 - %169 = OpLoad %_arr_Inner_std140_uint_4 %168 - %166 = OpFunctionCall %_arr_Inner_uint_4 %conv_arr_4_Inner %169 - %170 = OpFunctionCall %int %i - %173 = OpAccessChain %_ptr_Uniform_Inner_std140 %a %uint_0 %161 %uint_0 %170 - %174 = OpLoad %Inner_std140 %173 - %171 = OpFunctionCall %Inner %conv_Inner %174 - %176 = OpBitcast %uint %161 - %177 = OpBitcast %uint %170 - %175 = OpFunctionCall %mat2v2float %load_a_p0_a_p1_m %176 %177 - %178 = OpFunctionCall %int %i - %180 = OpBitcast %uint %161 - %181 = OpBitcast %uint %170 - %182 = OpBitcast %uint %178 - %179 = OpFunctionCall %v2float %load_a_p0_a_p1_m_p2 %180 %181 %182 - %184 = OpAccessChain %_ptr_Uniform__arr_Outer_std140_uint_4 %a %uint_0 - %185 = OpLoad %_arr_Outer_std140_uint_4 %184 - %183 = OpFunctionCall %_arr_Outer_uint_4 %conv_arr_4_Outer %185 - %187 = OpAccessChain %_ptr_Uniform_Outer_std140 %a %uint_0 %161 - %188 = OpLoad %Outer_std140 %187 - %186 = OpFunctionCall %Outer %conv_Outer %188 - %190 = OpAccessChain %_ptr_Uniform__arr_Inner_std140_uint_4 %a %uint_0 %161 %uint_0 - %191 = OpLoad %_arr_Inner_std140_uint_4 %190 - %189 = OpFunctionCall %_arr_Inner_uint_4 %conv_arr_4_Inner %191 - %193 = OpAccessChain %_ptr_Uniform_Inner_std140 %a %uint_0 %161 %uint_0 %170 - %194 = OpLoad %Inner_std140 %193 - %192 = OpFunctionCall %Inner %conv_Inner %194 - %196 = OpBitcast %uint %161 - %197 = OpBitcast %uint %170 - %195 = OpFunctionCall %mat2v2float %load_a_p0_a_p1_m %196 %197 - %199 = OpBitcast %uint %161 - %200 = OpBitcast %uint %170 - %201 = OpBitcast %uint %178 - %198 = OpFunctionCall %v2float %load_a_p0_a_p1_m_p2 %199 %200 %201 - %202 = OpFunctionCall %int %i - %204 = OpBitcast %uint %161 - %205 = OpBitcast %uint %170 - %206 = OpBitcast %uint %178 - %207 = OpBitcast %uint %202 - %203 = OpFunctionCall %float %load_a_p0_a_p1_m_p2_p3 %204 %205 %206 %207 + %f = OpFunction %void None %158 + %161 = OpLabel + %162 = OpFunctionCall %int %i + %163 = OpFunctionCall %int %i + %164 = OpFunctionCall %int %i + %167 = OpAccessChain %_ptr_Uniform__arr_Outer_std140_uint_4 %a %uint_0 + %168 = OpLoad %_arr_Outer_std140_uint_4 %167 + %165 = OpFunctionCall %_arr_Outer_uint_4 %conv_arr_4_Outer %168 + %171 = OpAccessChain %_ptr_Uniform_Outer_std140 %a %uint_0 %162 + %172 = OpLoad %Outer_std140 %171 + %169 = OpFunctionCall %Outer %conv_Outer %172 + %175 = OpAccessChain %_ptr_Uniform__arr_Inner_std140_uint_4 %a %uint_0 %162 %uint_0 + %176 = OpLoad %_arr_Inner_std140_uint_4 %175 + %173 = OpFunctionCall %_arr_Inner_uint_4 %conv_arr_4_Inner %176 + %178 = OpAccessChain %_ptr_Uniform_Inner_std140 %a %uint_0 %162 %uint_0 %163 + %179 = OpLoad %Inner_std140 %178 + %177 = OpFunctionCall %Inner %conv_Inner %179 + %181 = OpBitcast %uint %162 + %182 = OpBitcast %uint %163 + %180 = OpFunctionCall %mat2v2float %load_a_inner_p0_a_p1_m %181 %182 + %184 = OpBitcast %uint %162 + %185 = OpBitcast %uint %163 + %186 = OpBitcast %uint %164 + %183 = OpFunctionCall %v2float %load_a_inner_p0_a_p1_m_p2 %184 %185 %186 + %187 = OpFunctionCall %int %i + %189 = OpBitcast %uint %162 + %190 = OpBitcast %uint %163 + %191 = OpBitcast %uint %164 + %192 = OpBitcast %uint %187 + %188 = OpFunctionCall %float %load_a_inner_p0_a_p1_m_p2_p3 %189 %190 %191 %192 OpReturn OpFunctionEnd diff --git a/test/tint/buffer/uniform/std140/mat2x2/dynamic_index_via_ptr.wgsl.expected.wgsl b/test/tint/buffer/uniform/std140/struct/mat2x2/dynamic_index_via_ptr.wgsl.expected.wgsl similarity index 98% rename from test/tint/buffer/uniform/std140/mat2x2/dynamic_index_via_ptr.wgsl.expected.wgsl rename to test/tint/buffer/uniform/std140/struct/mat2x2/dynamic_index_via_ptr.wgsl.expected.wgsl index f9989789f6..97d514154d 100644 --- a/test/tint/buffer/uniform/std140/mat2x2/dynamic_index_via_ptr.wgsl.expected.wgsl +++ b/test/tint/buffer/uniform/std140/struct/mat2x2/dynamic_index_via_ptr.wgsl.expected.wgsl @@ -17,7 +17,6 @@ fn i() -> i32 { @compute @workgroup_size(1) fn f() { - let I = 1; let p_a = &(a); let p_a_i = &((*(p_a))[i()]); let p_a_i_a = &((*(p_a_i)).a); diff --git a/test/tint/buffer/uniform/std140/mat2x2/static_index_via_ptr.wgsl b/test/tint/buffer/uniform/std140/struct/mat2x2/static_index_via_ptr.wgsl similarity index 98% rename from test/tint/buffer/uniform/std140/mat2x2/static_index_via_ptr.wgsl rename to test/tint/buffer/uniform/std140/struct/mat2x2/static_index_via_ptr.wgsl index 1e620f4e96..0a790a99c8 100644 --- a/test/tint/buffer/uniform/std140/mat2x2/static_index_via_ptr.wgsl +++ b/test/tint/buffer/uniform/std140/struct/mat2x2/static_index_via_ptr.wgsl @@ -10,8 +10,6 @@ struct Outer { @compute @workgroup_size(1) fn f() { - let I = 1; - let p_a = &a; let p_a_3 = &((*p_a)[3]); let p_a_3_a = &((*p_a_3).a); diff --git a/test/tint/buffer/uniform/std140/mat2x2/static_index_via_ptr.wgsl.expected.dxc.hlsl b/test/tint/buffer/uniform/std140/struct/mat2x2/static_index_via_ptr.wgsl.expected.dxc.hlsl similarity index 98% rename from test/tint/buffer/uniform/std140/mat2x2/static_index_via_ptr.wgsl.expected.dxc.hlsl rename to test/tint/buffer/uniform/std140/struct/mat2x2/static_index_via_ptr.wgsl.expected.dxc.hlsl index d27e6df40f..b56950069d 100644 --- a/test/tint/buffer/uniform/std140/mat2x2/static_index_via_ptr.wgsl.expected.dxc.hlsl +++ b/test/tint/buffer/uniform/std140/struct/mat2x2/static_index_via_ptr.wgsl.expected.dxc.hlsl @@ -51,7 +51,6 @@ tint_symbol_ret tint_symbol(uint4 buffer[16], uint offset) { [numthreads(1, 1, 1)] void f() { - const int I = 1; const Outer l_a[4] = tint_symbol(a, 0u); const Outer l_a_3 = tint_symbol_1(a, 192u); const Inner l_a_3_a[4] = tint_symbol_2(a, 192u); diff --git a/test/tint/buffer/uniform/std140/mat2x2/static_index_via_ptr.wgsl.expected.fxc.hlsl b/test/tint/buffer/uniform/std140/struct/mat2x2/static_index_via_ptr.wgsl.expected.fxc.hlsl similarity index 98% rename from test/tint/buffer/uniform/std140/mat2x2/static_index_via_ptr.wgsl.expected.fxc.hlsl rename to test/tint/buffer/uniform/std140/struct/mat2x2/static_index_via_ptr.wgsl.expected.fxc.hlsl index d27e6df40f..b56950069d 100644 --- a/test/tint/buffer/uniform/std140/mat2x2/static_index_via_ptr.wgsl.expected.fxc.hlsl +++ b/test/tint/buffer/uniform/std140/struct/mat2x2/static_index_via_ptr.wgsl.expected.fxc.hlsl @@ -51,7 +51,6 @@ tint_symbol_ret tint_symbol(uint4 buffer[16], uint offset) { [numthreads(1, 1, 1)] void f() { - const int I = 1; const Outer l_a[4] = tint_symbol(a, 0u); const Outer l_a_3 = tint_symbol_1(a, 192u); const Inner l_a_3_a[4] = tint_symbol_2(a, 192u); diff --git a/test/tint/buffer/uniform/std140/mat2x2/static_index_via_ptr.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/struct/mat2x2/static_index_via_ptr.wgsl.expected.glsl similarity index 87% rename from test/tint/buffer/uniform/std140/mat2x2/static_index_via_ptr.wgsl.expected.glsl rename to test/tint/buffer/uniform/std140/struct/mat2x2/static_index_via_ptr.wgsl.expected.glsl index 6dccf2ad30..f00bbf5a17 100644 --- a/test/tint/buffer/uniform/std140/mat2x2/static_index_via_ptr.wgsl.expected.glsl +++ b/test/tint/buffer/uniform/std140/struct/mat2x2/static_index_via_ptr.wgsl.expected.glsl @@ -17,13 +17,12 @@ struct Outer_std140 { Inner_std140 a[4]; }; -layout(binding = 0, std140) uniform a_block_ubo { +layout(binding = 0, std140) uniform a_block_std140_ubo { Outer_std140 inner[4]; } a; Inner conv_Inner(Inner_std140 val) { - Inner tint_symbol = Inner(mat2(val.m_0, val.m_1)); - return tint_symbol; + return Inner(mat2(val.m_0, val.m_1)); } Inner[4] conv_arr_4_Inner(Inner_std140 val[4]) { @@ -37,8 +36,7 @@ Inner[4] conv_arr_4_Inner(Inner_std140 val[4]) { } Outer conv_Outer(Outer_std140 val) { - Outer tint_symbol_1 = Outer(conv_arr_4_Inner(val.a)); - return tint_symbol_1; + return Outer(conv_arr_4_Inner(val.a)); } Outer[4] conv_arr_4_Outer(Outer_std140 val[4]) { @@ -51,23 +49,22 @@ Outer[4] conv_arr_4_Outer(Outer_std140 val[4]) { return arr; } -mat2 load_a_3_a_2_m() { +mat2 load_a_inner_3_a_2_m() { return mat2(a.inner[3u].a[2u].m_0, a.inner[3u].a[2u].m_1); } void f() { - int I = 1; Outer p_a[4] = conv_arr_4_Outer(a.inner); Outer p_a_3 = conv_Outer(a.inner[3u]); Inner p_a_3_a[4] = conv_arr_4_Inner(a.inner[3u].a); Inner p_a_3_a_2 = conv_Inner(a.inner[3u].a[2u]); - mat2 p_a_3_a_2_m = load_a_3_a_2_m(); + mat2 p_a_3_a_2_m = load_a_inner_3_a_2_m(); vec2 p_a_3_a_2_m_1 = a.inner[3u].a[2u].m_1; Outer l_a[4] = conv_arr_4_Outer(a.inner); Outer l_a_3 = conv_Outer(a.inner[3u]); Inner l_a_3_a[4] = conv_arr_4_Inner(a.inner[3u].a); Inner l_a_3_a_2 = conv_Inner(a.inner[3u].a[2u]); - mat2 l_a_3_a_2_m = load_a_3_a_2_m(); + mat2 l_a_3_a_2_m = load_a_inner_3_a_2_m(); vec2 l_a_3_a_2_m_1 = a.inner[3u].a[2u].m_1; float l_a_3_a_2_m_1_0 = a.inner[3u].a[2u].m_1[0u]; } diff --git a/test/tint/buffer/uniform/std140/mat2x2/static_index_via_ptr.wgsl.expected.msl b/test/tint/buffer/uniform/std140/struct/mat2x2/static_index_via_ptr.wgsl.expected.msl similarity index 98% rename from test/tint/buffer/uniform/std140/mat2x2/static_index_via_ptr.wgsl.expected.msl rename to test/tint/buffer/uniform/std140/struct/mat2x2/static_index_via_ptr.wgsl.expected.msl index a731312ac0..e0658acac6 100644 --- a/test/tint/buffer/uniform/std140/mat2x2/static_index_via_ptr.wgsl.expected.msl +++ b/test/tint/buffer/uniform/std140/struct/mat2x2/static_index_via_ptr.wgsl.expected.msl @@ -23,7 +23,6 @@ struct Outer { }; kernel void f(const constant tint_array* tint_symbol [[buffer(0)]]) { - int const I = 1; tint_array const l_a = *(tint_symbol); Outer const l_a_3 = (*(tint_symbol))[3]; tint_array const l_a_3_a = (*(tint_symbol))[3].a; diff --git a/test/tint/buffer/uniform/std140/mat2x2/static_index_via_ptr.wgsl.expected.spvasm b/test/tint/buffer/uniform/std140/struct/mat2x2/static_index_via_ptr.wgsl.expected.spvasm similarity index 71% rename from test/tint/buffer/uniform/std140/mat2x2/static_index_via_ptr.wgsl.expected.spvasm rename to test/tint/buffer/uniform/std140/struct/mat2x2/static_index_via_ptr.wgsl.expected.spvasm index 92ff1cbc95..6a3a339a97 100644 --- a/test/tint/buffer/uniform/std140/mat2x2/static_index_via_ptr.wgsl.expected.spvasm +++ b/test/tint/buffer/uniform/std140/struct/mat2x2/static_index_via_ptr.wgsl.expected.spvasm @@ -1,14 +1,14 @@ ; SPIR-V ; Version: 1.3 ; Generator: Google Tint Compiler; 0 -; Bound: 153 +; Bound: 140 ; Schema: 0 OpCapability Shader OpMemoryModel Logical GLSL450 OpEntryPoint GLCompute %f "f" OpExecutionMode %f LocalSize 1 1 1 - OpName %a_block "a_block" - OpMemberName %a_block 0 "inner" + OpName %a_block_std140 "a_block_std140" + OpMemberName %a_block_std140 0 "inner" OpName %Outer_std140 "Outer_std140" OpMemberName %Outer_std140 0 "a" OpName %Inner_std140 "Inner_std140" @@ -23,7 +23,7 @@ OpName %val_0 "val" OpName %arr "arr" OpName %i "i" - OpName %var_for_index "var_for_index" + OpName %var_for_index_1 "var_for_index_1" OpName %Outer "Outer" OpMemberName %Outer 0 "a" OpName %conv_Outer "conv_Outer" @@ -32,11 +32,11 @@ OpName %val_2 "val" OpName %arr_0 "arr" OpName %i_0 "i" - OpName %var_for_index_1 "var_for_index_1" - OpName %load_a_3_a_2_m "load_a_3_a_2_m" + OpName %var_for_index "var_for_index" + OpName %load_a_inner_3_a_2_m "load_a_inner_3_a_2_m" OpName %f "f" - OpDecorate %a_block Block - OpMemberDecorate %a_block 0 Offset 0 + OpDecorate %a_block_std140 Block + OpMemberDecorate %a_block_std140 0 Offset 0 OpMemberDecorate %Outer_std140 0 Offset 0 OpMemberDecorate %Inner_std140 0 Offset 0 OpMemberDecorate %Inner_std140 1 Offset 8 @@ -59,9 +59,9 @@ %_arr_Inner_std140_uint_4 = OpTypeArray %Inner_std140 %uint_4 %Outer_std140 = OpTypeStruct %_arr_Inner_std140_uint_4 %_arr_Outer_std140_uint_4 = OpTypeArray %Outer_std140 %uint_4 - %a_block = OpTypeStruct %_arr_Outer_std140_uint_4 -%_ptr_Uniform_a_block = OpTypePointer Uniform %a_block - %a = OpVariable %_ptr_Uniform_a_block Uniform +%a_block_std140 = OpTypeStruct %_arr_Outer_std140_uint_4 +%_ptr_Uniform_a_block_std140 = OpTypePointer Uniform %a_block_std140 + %a = OpVariable %_ptr_Uniform_a_block_std140 Uniform %mat2v2float = OpTypeMatrix %v2float 2 %Inner = OpTypeStruct %mat2v2float %12 = OpTypeFunction %Inner %Inner_std140 @@ -91,15 +91,13 @@ %uint_0 = OpConstant %uint 0 %uint_3 = OpConstant %uint 3 %uint_2 = OpConstant %uint 2 +%_ptr_Uniform_Inner_std140 = OpTypePointer Uniform %Inner_std140 %_ptr_Uniform_v2float = OpTypePointer Uniform %v2float %void = OpTypeVoid - %110 = OpTypeFunction %void - %int = OpTypeInt 32 1 - %int_1 = OpConstant %int 1 + %115 = OpTypeFunction %void %_ptr_Uniform__arr_Outer_std140_uint_4 = OpTypePointer Uniform %_arr_Outer_std140_uint_4 %_ptr_Uniform_Outer_std140 = OpTypePointer Uniform %Outer_std140 %_ptr_Uniform__arr_Inner_std140_uint_4 = OpTypePointer Uniform %_arr_Inner_std140_uint_4 -%_ptr_Uniform_Inner_std140 = OpTypePointer Uniform %Inner_std140 %_ptr_Uniform_float = OpTypePointer Uniform %float %conv_Inner = OpFunction %Inner None %12 %val = OpFunctionParameter %Inner_std140 @@ -115,7 +113,7 @@ %26 = OpLabel %arr = OpVariable %_ptr_Function__arr_Inner_uint_4 Function %29 %i = OpVariable %_ptr_Function_uint Function %32 -%var_for_index = OpVariable %_ptr_Function__arr_Inner_std140_uint_4 Function %45 +%var_for_index_1 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4 Function %45 OpBranch %33 %33 = OpLabel OpLoopMerge %34 %35 None @@ -129,11 +127,11 @@ %42 = OpLabel OpBranch %34 %41 = OpLabel - OpStore %var_for_index %val_0 + OpStore %var_for_index_1 %val_0 %46 = OpLoad %uint %i %48 = OpAccessChain %_ptr_Function_Inner %arr %46 %50 = OpLoad %uint %i - %52 = OpAccessChain %_ptr_Function_Inner_std140 %var_for_index %50 + %52 = OpAccessChain %_ptr_Function_Inner_std140 %var_for_index_1 %50 %53 = OpLoad %Inner_std140 %52 %49 = OpFunctionCall %Inner %conv_Inner %53 OpStore %48 %49 @@ -160,7 +158,7 @@ %70 = OpLabel %arr_0 = OpVariable %_ptr_Function__arr_Outer_uint_4 Function %73 %i_0 = OpVariable %_ptr_Function_uint Function %32 -%var_for_index_1 = OpVariable %_ptr_Function__arr_Outer_std140_uint_4 Function %86 +%var_for_index = OpVariable %_ptr_Function__arr_Outer_std140_uint_4 Function %86 OpBranch %75 %75 = OpLabel OpLoopMerge %76 %77 None @@ -174,11 +172,11 @@ %83 = OpLabel OpBranch %76 %82 = OpLabel - OpStore %var_for_index_1 %val_2 + OpStore %var_for_index %val_2 %87 = OpLoad %uint %i_0 %89 = OpAccessChain %_ptr_Function_Outer %arr_0 %87 %91 = OpLoad %uint %i_0 - %93 = OpAccessChain %_ptr_Function_Outer_std140 %var_for_index_1 %91 + %93 = OpAccessChain %_ptr_Function_Outer_std140 %var_for_index %91 %94 = OpLoad %Outer_std140 %93 %90 = OpFunctionCall %Outer %conv_Outer %94 OpStore %89 %90 @@ -192,48 +190,34 @@ %97 = OpLoad %_arr_Outer_uint_4 %arr_0 OpReturnValue %97 OpFunctionEnd -%load_a_3_a_2_m = OpFunction %mat2v2float None %98 +%load_a_inner_3_a_2_m = OpFunction %mat2v2float None %98 %100 = OpLabel - %105 = OpAccessChain %_ptr_Uniform_v2float %a %uint_0 %uint_3 %uint_0 %uint_2 %uint_0 - %106 = OpLoad %v2float %105 - %107 = OpAccessChain %_ptr_Uniform_v2float %a %uint_0 %uint_3 %uint_0 %uint_2 %uint_1 - %108 = OpLoad %v2float %107 - %109 = OpCompositeConstruct %mat2v2float %106 %108 - OpReturnValue %109 + %106 = OpAccessChain %_ptr_Uniform_Inner_std140 %a %uint_0 %uint_3 %uint_0 %uint_2 + %109 = OpAccessChain %_ptr_Uniform_v2float %106 %uint_0 + %110 = OpLoad %v2float %109 + %112 = OpAccessChain %_ptr_Uniform_v2float %106 %uint_1 + %113 = OpLoad %v2float %112 + %114 = OpCompositeConstruct %mat2v2float %110 %113 + OpReturnValue %114 OpFunctionEnd - %f = OpFunction %void None %110 - %113 = OpLabel - %118 = OpAccessChain %_ptr_Uniform__arr_Outer_std140_uint_4 %a %uint_0 - %119 = OpLoad %_arr_Outer_std140_uint_4 %118 - %116 = OpFunctionCall %_arr_Outer_uint_4 %conv_arr_4_Outer %119 - %122 = OpAccessChain %_ptr_Uniform_Outer_std140 %a %uint_0 %uint_3 - %123 = OpLoad %Outer_std140 %122 - %120 = OpFunctionCall %Outer %conv_Outer %123 - %126 = OpAccessChain %_ptr_Uniform__arr_Inner_std140_uint_4 %a %uint_0 %uint_3 %uint_0 - %127 = OpLoad %_arr_Inner_std140_uint_4 %126 - %124 = OpFunctionCall %_arr_Inner_uint_4 %conv_arr_4_Inner %127 - %130 = OpAccessChain %_ptr_Uniform_Inner_std140 %a %uint_0 %uint_3 %uint_0 %uint_2 - %131 = OpLoad %Inner_std140 %130 - %128 = OpFunctionCall %Inner %conv_Inner %131 - %132 = OpFunctionCall %mat2v2float %load_a_3_a_2_m - %133 = OpAccessChain %_ptr_Uniform_v2float %a %uint_0 %uint_3 %uint_0 %uint_2 %uint_1 - %134 = OpLoad %v2float %133 - %136 = OpAccessChain %_ptr_Uniform__arr_Outer_std140_uint_4 %a %uint_0 - %137 = OpLoad %_arr_Outer_std140_uint_4 %136 - %135 = OpFunctionCall %_arr_Outer_uint_4 %conv_arr_4_Outer %137 - %139 = OpAccessChain %_ptr_Uniform_Outer_std140 %a %uint_0 %uint_3 - %140 = OpLoad %Outer_std140 %139 - %138 = OpFunctionCall %Outer %conv_Outer %140 - %142 = OpAccessChain %_ptr_Uniform__arr_Inner_std140_uint_4 %a %uint_0 %uint_3 %uint_0 - %143 = OpLoad %_arr_Inner_std140_uint_4 %142 - %141 = OpFunctionCall %_arr_Inner_uint_4 %conv_arr_4_Inner %143 - %145 = OpAccessChain %_ptr_Uniform_Inner_std140 %a %uint_0 %uint_3 %uint_0 %uint_2 - %146 = OpLoad %Inner_std140 %145 - %144 = OpFunctionCall %Inner %conv_Inner %146 - %147 = OpFunctionCall %mat2v2float %load_a_3_a_2_m - %148 = OpAccessChain %_ptr_Uniform_v2float %a %uint_0 %uint_3 %uint_0 %uint_2 %uint_1 - %149 = OpLoad %v2float %148 - %151 = OpAccessChain %_ptr_Uniform_float %a %uint_0 %uint_3 %uint_0 %uint_2 %uint_1 %32 - %152 = OpLoad %float %151 + %f = OpFunction %void None %115 + %118 = OpLabel + %121 = OpAccessChain %_ptr_Uniform__arr_Outer_std140_uint_4 %a %uint_0 + %122 = OpLoad %_arr_Outer_std140_uint_4 %121 + %119 = OpFunctionCall %_arr_Outer_uint_4 %conv_arr_4_Outer %122 + %125 = OpAccessChain %_ptr_Uniform_Outer_std140 %a %uint_0 %uint_3 + %126 = OpLoad %Outer_std140 %125 + %123 = OpFunctionCall %Outer %conv_Outer %126 + %129 = OpAccessChain %_ptr_Uniform__arr_Inner_std140_uint_4 %a %uint_0 %uint_3 %uint_0 + %130 = OpLoad %_arr_Inner_std140_uint_4 %129 + %127 = OpFunctionCall %_arr_Inner_uint_4 %conv_arr_4_Inner %130 + %132 = OpAccessChain %_ptr_Uniform_Inner_std140 %a %uint_0 %uint_3 %uint_0 %uint_2 + %133 = OpLoad %Inner_std140 %132 + %131 = OpFunctionCall %Inner %conv_Inner %133 + %134 = OpFunctionCall %mat2v2float %load_a_inner_3_a_2_m + %135 = OpAccessChain %_ptr_Uniform_v2float %a %uint_0 %uint_3 %uint_0 %uint_2 %uint_1 + %136 = OpLoad %v2float %135 + %138 = OpAccessChain %_ptr_Uniform_float %a %uint_0 %uint_3 %uint_0 %uint_2 %uint_1 %32 + %139 = OpLoad %float %138 OpReturn OpFunctionEnd diff --git a/test/tint/buffer/uniform/std140/mat2x2/static_index_via_ptr.wgsl.expected.wgsl b/test/tint/buffer/uniform/std140/struct/mat2x2/static_index_via_ptr.wgsl.expected.wgsl similarity index 98% rename from test/tint/buffer/uniform/std140/mat2x2/static_index_via_ptr.wgsl.expected.wgsl rename to test/tint/buffer/uniform/std140/struct/mat2x2/static_index_via_ptr.wgsl.expected.wgsl index 67b881fdb3..2e24f26dd1 100644 --- a/test/tint/buffer/uniform/std140/mat2x2/static_index_via_ptr.wgsl.expected.wgsl +++ b/test/tint/buffer/uniform/std140/struct/mat2x2/static_index_via_ptr.wgsl.expected.wgsl @@ -10,7 +10,6 @@ struct Outer { @compute @workgroup_size(1) fn f() { - let I = 1; let p_a = &(a); let p_a_3 = &((*(p_a))[3]); let p_a_3_a = &((*(p_a_3)).a); diff --git a/test/tint/buffer/uniform/std140/mat2x2/to_builtin.wgsl b/test/tint/buffer/uniform/std140/struct/mat2x2/to_builtin.wgsl similarity index 100% rename from test/tint/buffer/uniform/std140/mat2x2/to_builtin.wgsl rename to test/tint/buffer/uniform/std140/struct/mat2x2/to_builtin.wgsl diff --git a/test/tint/buffer/uniform/std140/mat2x2/to_builtin.wgsl.expected.dxc.hlsl b/test/tint/buffer/uniform/std140/struct/mat2x2/to_builtin.wgsl.expected.dxc.hlsl similarity index 100% rename from test/tint/buffer/uniform/std140/mat2x2/to_builtin.wgsl.expected.dxc.hlsl rename to test/tint/buffer/uniform/std140/struct/mat2x2/to_builtin.wgsl.expected.dxc.hlsl diff --git a/test/tint/buffer/uniform/std140/mat2x2/to_builtin.wgsl.expected.fxc.hlsl b/test/tint/buffer/uniform/std140/struct/mat2x2/to_builtin.wgsl.expected.fxc.hlsl similarity index 100% rename from test/tint/buffer/uniform/std140/mat2x2/to_builtin.wgsl.expected.fxc.hlsl rename to test/tint/buffer/uniform/std140/struct/mat2x2/to_builtin.wgsl.expected.fxc.hlsl diff --git a/test/tint/buffer/uniform/std140/mat2x2/to_builtin.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/struct/mat2x2/to_builtin.wgsl.expected.glsl similarity index 74% rename from test/tint/buffer/uniform/std140/mat2x2/to_builtin.wgsl.expected.glsl rename to test/tint/buffer/uniform/std140/struct/mat2x2/to_builtin.wgsl.expected.glsl index d6c96b0560..ee2a35b9b0 100644 --- a/test/tint/buffer/uniform/std140/mat2x2/to_builtin.wgsl.expected.glsl +++ b/test/tint/buffer/uniform/std140/struct/mat2x2/to_builtin.wgsl.expected.glsl @@ -2,8 +2,10 @@ struct S { int before; + uint pad; mat2 m; int after; + uint pad_1; }; struct S_std140 { @@ -15,16 +17,16 @@ struct S_std140 { uint pad_1; }; -layout(binding = 0, std140) uniform u_block_ubo { +layout(binding = 0, std140) uniform u_block_std140_ubo { S_std140 inner[4]; } u; -mat2 load_u_2_m() { +mat2 load_u_inner_2_m() { return mat2(u.inner[2u].m_0, u.inner[2u].m_1); } void f() { - mat2 t = transpose(load_u_2_m()); + mat2 t = transpose(load_u_inner_2_m()); float l = length(u.inner[0u].m_1.yx); float a = abs(u.inner[0u].m_1.yx[0u]); } diff --git a/test/tint/buffer/uniform/std140/mat2x2/to_builtin.wgsl.expected.msl b/test/tint/buffer/uniform/std140/struct/mat2x2/to_builtin.wgsl.expected.msl similarity index 100% rename from test/tint/buffer/uniform/std140/mat2x2/to_builtin.wgsl.expected.msl rename to test/tint/buffer/uniform/std140/struct/mat2x2/to_builtin.wgsl.expected.msl diff --git a/test/tint/buffer/uniform/std140/mat3x2/to_builtin.wgsl.expected.spvasm b/test/tint/buffer/uniform/std140/struct/mat2x2/to_builtin.wgsl.expected.spvasm similarity index 55% rename from test/tint/buffer/uniform/std140/mat3x2/to_builtin.wgsl.expected.spvasm rename to test/tint/buffer/uniform/std140/struct/mat2x2/to_builtin.wgsl.expected.spvasm index df0b5fd2fc..e4863acde8 100644 --- a/test/tint/buffer/uniform/std140/mat3x2/to_builtin.wgsl.expected.spvasm +++ b/test/tint/buffer/uniform/std140/struct/mat2x2/to_builtin.wgsl.expected.spvasm @@ -8,65 +8,60 @@ OpMemoryModel Logical GLSL450 OpEntryPoint GLCompute %f "f" OpExecutionMode %f LocalSize 1 1 1 - OpName %u_block "u_block" - OpMemberName %u_block 0 "inner" + OpName %u_block_std140 "u_block_std140" + OpMemberName %u_block_std140 0 "inner" OpName %S_std140 "S_std140" OpMemberName %S_std140 0 "before" OpMemberName %S_std140 1 "m_0" OpMemberName %S_std140 2 "m_1" - OpMemberName %S_std140 3 "m_2" - OpMemberName %S_std140 4 "after" + OpMemberName %S_std140 3 "after" OpName %u "u" - OpName %load_u_2_m "load_u_2_m" + OpName %load_u_inner_2_m "load_u_inner_2_m" OpName %f "f" - OpDecorate %u_block Block - OpMemberDecorate %u_block 0 Offset 0 + OpDecorate %u_block_std140 Block + OpMemberDecorate %u_block_std140 0 Offset 0 OpMemberDecorate %S_std140 0 Offset 0 OpMemberDecorate %S_std140 1 Offset 8 OpMemberDecorate %S_std140 2 Offset 16 OpMemberDecorate %S_std140 3 Offset 24 - OpMemberDecorate %S_std140 4 Offset 40 - OpDecorate %_arr_S_std140_uint_4 ArrayStride 48 + OpDecorate %_arr_S_std140_uint_4 ArrayStride 32 OpDecorate %u NonWritable OpDecorate %u DescriptorSet 0 OpDecorate %u Binding 0 %int = OpTypeInt 32 1 %float = OpTypeFloat 32 %v2float = OpTypeVector %float 2 - %S_std140 = OpTypeStruct %int %v2float %v2float %v2float %int + %S_std140 = OpTypeStruct %int %v2float %v2float %int %uint = OpTypeInt 32 0 %uint_4 = OpConstant %uint 4 %_arr_S_std140_uint_4 = OpTypeArray %S_std140 %uint_4 - %u_block = OpTypeStruct %_arr_S_std140_uint_4 -%_ptr_Uniform_u_block = OpTypePointer Uniform %u_block - %u = OpVariable %_ptr_Uniform_u_block Uniform -%mat3v2float = OpTypeMatrix %v2float 3 - %11 = OpTypeFunction %mat3v2float +%u_block_std140 = OpTypeStruct %_arr_S_std140_uint_4 +%_ptr_Uniform_u_block_std140 = OpTypePointer Uniform %u_block_std140 + %u = OpVariable %_ptr_Uniform_u_block_std140 Uniform +%mat2v2float = OpTypeMatrix %v2float 2 + %11 = OpTypeFunction %mat2v2float %uint_0 = OpConstant %uint 0 %uint_2 = OpConstant %uint 2 +%_ptr_Uniform_S_std140 = OpTypePointer Uniform %S_std140 %uint_1 = OpConstant %uint 1 %_ptr_Uniform_v2float = OpTypePointer Uniform %v2float - %uint_3 = OpConstant %uint 3 %void = OpTypeVoid - %27 = OpTypeFunction %void - %v3float = OpTypeVector %float 3 -%mat2v3float = OpTypeMatrix %v3float 2 + %29 = OpTypeFunction %void %37 = OpConstantNull %uint - %load_u_2_m = OpFunction %mat3v2float None %11 +%load_u_inner_2_m = OpFunction %mat2v2float None %11 %14 = OpLabel - %19 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 %uint_2 %uint_1 - %20 = OpLoad %v2float %19 - %21 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 %uint_2 %uint_2 - %22 = OpLoad %v2float %21 - %24 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 %uint_2 %uint_3 - %25 = OpLoad %v2float %24 - %26 = OpCompositeConstruct %mat3v2float %20 %22 %25 - OpReturnValue %26 + %19 = OpAccessChain %_ptr_Uniform_S_std140 %u %uint_0 %uint_2 + %23 = OpAccessChain %_ptr_Uniform_v2float %19 %uint_1 + %24 = OpLoad %v2float %23 + %26 = OpAccessChain %_ptr_Uniform_v2float %19 %uint_2 + %27 = OpLoad %v2float %26 + %28 = OpCompositeConstruct %mat2v2float %24 %27 + OpReturnValue %28 OpFunctionEnd - %f = OpFunction %void None %27 - %30 = OpLabel - %34 = OpFunctionCall %mat3v2float %load_u_2_m - %31 = OpTranspose %mat2v3float %34 + %f = OpFunction %void None %29 + %32 = OpLabel + %34 = OpFunctionCall %mat2v2float %load_u_inner_2_m + %33 = OpTranspose %mat2v2float %34 %38 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 %37 %uint_2 %39 = OpLoad %v2float %38 %40 = OpVectorShuffle %v2float %39 %39 1 0 diff --git a/test/tint/buffer/uniform/std140/mat2x2/to_builtin.wgsl.expected.wgsl b/test/tint/buffer/uniform/std140/struct/mat2x2/to_builtin.wgsl.expected.wgsl similarity index 100% rename from test/tint/buffer/uniform/std140/mat2x2/to_builtin.wgsl.expected.wgsl rename to test/tint/buffer/uniform/std140/struct/mat2x2/to_builtin.wgsl.expected.wgsl diff --git a/test/tint/buffer/uniform/std140/mat2x2/to_fn.wgsl b/test/tint/buffer/uniform/std140/struct/mat2x2/to_fn.wgsl similarity index 100% rename from test/tint/buffer/uniform/std140/mat2x2/to_fn.wgsl rename to test/tint/buffer/uniform/std140/struct/mat2x2/to_fn.wgsl diff --git a/test/tint/buffer/uniform/std140/mat2x2/to_fn.wgsl.expected.dxc.hlsl b/test/tint/buffer/uniform/std140/struct/mat2x2/to_fn.wgsl.expected.dxc.hlsl similarity index 100% rename from test/tint/buffer/uniform/std140/mat2x2/to_fn.wgsl.expected.dxc.hlsl rename to test/tint/buffer/uniform/std140/struct/mat2x2/to_fn.wgsl.expected.dxc.hlsl diff --git a/test/tint/buffer/uniform/std140/mat2x2/to_fn.wgsl.expected.fxc.hlsl b/test/tint/buffer/uniform/std140/struct/mat2x2/to_fn.wgsl.expected.fxc.hlsl similarity index 100% rename from test/tint/buffer/uniform/std140/mat2x2/to_fn.wgsl.expected.fxc.hlsl rename to test/tint/buffer/uniform/std140/struct/mat2x2/to_fn.wgsl.expected.fxc.hlsl diff --git a/test/tint/buffer/uniform/std140/mat2x2/to_fn.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/struct/mat2x2/to_fn.wgsl.expected.glsl similarity index 63% rename from test/tint/buffer/uniform/std140/mat2x2/to_fn.wgsl.expected.glsl rename to test/tint/buffer/uniform/std140/struct/mat2x2/to_fn.wgsl.expected.glsl index 1d5f1334cb..452c603aaa 100644 --- a/test/tint/buffer/uniform/std140/mat2x2/to_fn.wgsl.expected.glsl +++ b/test/tint/buffer/uniform/std140/struct/mat2x2/to_fn.wgsl.expected.glsl @@ -2,8 +2,10 @@ struct S { int before; + uint pad; mat2 m; int after; + uint pad_1; }; struct S_std140 { @@ -15,7 +17,7 @@ struct S_std140 { uint pad_1; }; -layout(binding = 0, std140) uniform u_block_ubo { +layout(binding = 0, std140) uniform u_block_std140_ubo { S_std140 inner[4]; } u; @@ -35,12 +37,11 @@ void e(float f_1) { } S conv_S(S_std140 val) { - S tint_symbol = S(val.before, mat2(val.m_0, val.m_1), val.after); - return tint_symbol; + return S(val.before, val.pad, mat2(val.m_0, val.m_1), val.after, val.pad_1); } S[4] conv_arr_4_S(S_std140 val[4]) { - S arr[4] = S[4](S(0, mat2(0.0f, 0.0f, 0.0f, 0.0f), 0), S(0, mat2(0.0f, 0.0f, 0.0f, 0.0f), 0), S(0, mat2(0.0f, 0.0f, 0.0f, 0.0f), 0), S(0, mat2(0.0f, 0.0f, 0.0f, 0.0f), 0)); + S arr[4] = S[4](S(0, 0u, mat2(0.0f, 0.0f, 0.0f, 0.0f), 0, 0u), S(0, 0u, mat2(0.0f, 0.0f, 0.0f, 0.0f), 0, 0u), S(0, 0u, mat2(0.0f, 0.0f, 0.0f, 0.0f), 0, 0u), S(0, 0u, mat2(0.0f, 0.0f, 0.0f, 0.0f), 0, 0u)); { for(uint i = 0u; (i < 4u); i = (i + 1u)) { arr[i] = conv_S(val[i]); @@ -49,14 +50,14 @@ S[4] conv_arr_4_S(S_std140 val[4]) { return arr; } -mat2 load_u_2_m() { +mat2 load_u_inner_2_m() { return mat2(u.inner[2u].m_0, u.inner[2u].m_1); } void f() { a(conv_arr_4_S(u.inner)); b(conv_S(u.inner[2u])); - c(load_u_2_m()); + c(load_u_inner_2_m()); d(u.inner[0u].m_1.yx); e(u.inner[0u].m_1.yx[0u]); } diff --git a/test/tint/buffer/uniform/std140/mat2x2/to_fn.wgsl.expected.msl b/test/tint/buffer/uniform/std140/struct/mat2x2/to_fn.wgsl.expected.msl similarity index 100% rename from test/tint/buffer/uniform/std140/mat2x2/to_fn.wgsl.expected.msl rename to test/tint/buffer/uniform/std140/struct/mat2x2/to_fn.wgsl.expected.msl diff --git a/test/tint/buffer/uniform/std140/mat2x2/to_fn.wgsl.expected.spvasm b/test/tint/buffer/uniform/std140/struct/mat2x2/to_fn.wgsl.expected.spvasm similarity index 78% rename from test/tint/buffer/uniform/std140/mat2x2/to_fn.wgsl.expected.spvasm rename to test/tint/buffer/uniform/std140/struct/mat2x2/to_fn.wgsl.expected.spvasm index 52b17ad291..627852bd46 100644 --- a/test/tint/buffer/uniform/std140/mat2x2/to_fn.wgsl.expected.spvasm +++ b/test/tint/buffer/uniform/std140/struct/mat2x2/to_fn.wgsl.expected.spvasm @@ -1,14 +1,14 @@ ; SPIR-V ; Version: 1.3 ; Generator: Google Tint Compiler; 0 -; Bound: 115 +; Bound: 119 ; Schema: 0 OpCapability Shader OpMemoryModel Logical GLSL450 OpEntryPoint GLCompute %f "f" OpExecutionMode %f LocalSize 1 1 1 - OpName %u_block "u_block" - OpMemberName %u_block 0 "inner" + OpName %u_block_std140 "u_block_std140" + OpMemberName %u_block_std140 0 "inner" OpName %S_std140 "S_std140" OpMemberName %S_std140 0 "before" OpMemberName %S_std140 1 "m_0" @@ -36,10 +36,10 @@ OpName %arr "arr" OpName %i "i" OpName %var_for_index "var_for_index" - OpName %load_u_2_m "load_u_2_m" + OpName %load_u_inner_2_m "load_u_inner_2_m" OpName %f "f" - OpDecorate %u_block Block - OpMemberDecorate %u_block 0 Offset 0 + OpDecorate %u_block_std140 Block + OpMemberDecorate %u_block_std140 0 Offset 0 OpMemberDecorate %S_std140 0 Offset 0 OpMemberDecorate %S_std140 1 Offset 8 OpMemberDecorate %S_std140 2 Offset 16 @@ -61,9 +61,9 @@ %uint = OpTypeInt 32 0 %uint_4 = OpConstant %uint 4 %_arr_S_std140_uint_4 = OpTypeArray %S_std140 %uint_4 - %u_block = OpTypeStruct %_arr_S_std140_uint_4 -%_ptr_Uniform_u_block = OpTypePointer Uniform %u_block - %u = OpVariable %_ptr_Uniform_u_block Uniform +%u_block_std140 = OpTypeStruct %_arr_S_std140_uint_4 +%_ptr_Uniform_u_block_std140 = OpTypePointer Uniform %u_block_std140 + %u = OpVariable %_ptr_Uniform_u_block_std140 Uniform %void = OpTypeVoid %mat2v2float = OpTypeMatrix %v2float 2 %S = OpTypeStruct %int %mat2v2float %int @@ -88,10 +88,10 @@ %80 = OpTypeFunction %mat2v2float %uint_0 = OpConstant %uint 0 %uint_2 = OpConstant %uint 2 -%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float - %91 = OpTypeFunction %void -%_ptr_Uniform__arr_S_std140_uint_4 = OpTypePointer Uniform %_arr_S_std140_uint_4 %_ptr_Uniform_S_std140 = OpTypePointer Uniform %S_std140 +%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float + %96 = OpTypeFunction %void +%_ptr_Uniform__arr_S_std140_uint_4 = OpTypePointer Uniform %_arr_S_std140_uint_4 %a = OpFunction %void None %11 %a_1 = OpFunctionParameter %_arr_S_uint_4 %18 = OpLabel @@ -165,35 +165,36 @@ %79 = OpLoad %_arr_S_uint_4 %arr OpReturnValue %79 OpFunctionEnd - %load_u_2_m = OpFunction %mat2v2float None %80 +%load_u_inner_2_m = OpFunction %mat2v2float None %80 %82 = OpLabel - %86 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 %uint_2 %uint_1 - %87 = OpLoad %v2float %86 - %88 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 %uint_2 %uint_2 - %89 = OpLoad %v2float %88 - %90 = OpCompositeConstruct %mat2v2float %87 %89 - OpReturnValue %90 + %87 = OpAccessChain %_ptr_Uniform_S_std140 %u %uint_0 %uint_2 + %90 = OpAccessChain %_ptr_Uniform_v2float %87 %uint_1 + %91 = OpLoad %v2float %90 + %93 = OpAccessChain %_ptr_Uniform_v2float %87 %uint_2 + %94 = OpLoad %v2float %93 + %95 = OpCompositeConstruct %mat2v2float %91 %94 + OpReturnValue %95 OpFunctionEnd - %f = OpFunction %void None %91 - %93 = OpLabel - %97 = OpAccessChain %_ptr_Uniform__arr_S_std140_uint_4 %u %uint_0 - %98 = OpLoad %_arr_S_std140_uint_4 %97 - %95 = OpFunctionCall %_arr_S_uint_4 %conv_arr_4_S %98 - %94 = OpFunctionCall %void %a %95 - %102 = OpAccessChain %_ptr_Uniform_S_std140 %u %uint_0 %uint_2 - %103 = OpLoad %S_std140 %102 - %100 = OpFunctionCall %S %conv_S %103 - %99 = OpFunctionCall %void %b %100 - %105 = OpFunctionCall %mat2v2float %load_u_2_m - %104 = OpFunctionCall %void %c %105 - %107 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 %54 %uint_2 - %108 = OpLoad %v2float %107 - %109 = OpVectorShuffle %v2float %108 %108 1 0 - %106 = OpFunctionCall %void %d %109 + %f = OpFunction %void None %96 + %98 = OpLabel + %102 = OpAccessChain %_ptr_Uniform__arr_S_std140_uint_4 %u %uint_0 + %103 = OpLoad %_arr_S_std140_uint_4 %102 + %100 = OpFunctionCall %_arr_S_uint_4 %conv_arr_4_S %103 + %99 = OpFunctionCall %void %a %100 + %106 = OpAccessChain %_ptr_Uniform_S_std140 %u %uint_0 %uint_2 + %107 = OpLoad %S_std140 %106 + %105 = OpFunctionCall %S %conv_S %107 + %104 = OpFunctionCall %void %b %105 + %109 = OpFunctionCall %mat2v2float %load_u_inner_2_m + %108 = OpFunctionCall %void %c %109 %111 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 %54 %uint_2 %112 = OpLoad %v2float %111 %113 = OpVectorShuffle %v2float %112 %112 1 0 - %114 = OpCompositeExtract %float %113 0 - %110 = OpFunctionCall %void %e %114 + %110 = OpFunctionCall %void %d %113 + %115 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 %54 %uint_2 + %116 = OpLoad %v2float %115 + %117 = OpVectorShuffle %v2float %116 %116 1 0 + %118 = OpCompositeExtract %float %117 0 + %114 = OpFunctionCall %void %e %118 OpReturn OpFunctionEnd diff --git a/test/tint/buffer/uniform/std140/mat2x2/to_fn.wgsl.expected.wgsl b/test/tint/buffer/uniform/std140/struct/mat2x2/to_fn.wgsl.expected.wgsl similarity index 100% rename from test/tint/buffer/uniform/std140/mat2x2/to_fn.wgsl.expected.wgsl rename to test/tint/buffer/uniform/std140/struct/mat2x2/to_fn.wgsl.expected.wgsl diff --git a/test/tint/buffer/uniform/std140/mat2x2/to_private.wgsl b/test/tint/buffer/uniform/std140/struct/mat2x2/to_private.wgsl similarity index 100% rename from test/tint/buffer/uniform/std140/mat2x2/to_private.wgsl rename to test/tint/buffer/uniform/std140/struct/mat2x2/to_private.wgsl diff --git a/test/tint/buffer/uniform/std140/mat2x2/to_private.wgsl.expected.dxc.hlsl b/test/tint/buffer/uniform/std140/struct/mat2x2/to_private.wgsl.expected.dxc.hlsl similarity index 100% rename from test/tint/buffer/uniform/std140/mat2x2/to_private.wgsl.expected.dxc.hlsl rename to test/tint/buffer/uniform/std140/struct/mat2x2/to_private.wgsl.expected.dxc.hlsl diff --git a/test/tint/buffer/uniform/std140/mat2x2/to_private.wgsl.expected.fxc.hlsl b/test/tint/buffer/uniform/std140/struct/mat2x2/to_private.wgsl.expected.fxc.hlsl similarity index 100% rename from test/tint/buffer/uniform/std140/mat2x2/to_private.wgsl.expected.fxc.hlsl rename to test/tint/buffer/uniform/std140/struct/mat2x2/to_private.wgsl.expected.fxc.hlsl diff --git a/test/tint/buffer/uniform/std140/struct/mat2x2/to_private.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/struct/mat2x2/to_private.wgsl.expected.glsl new file mode 100644 index 0000000000..ce7f2cef46 --- /dev/null +++ b/test/tint/buffer/uniform/std140/struct/mat2x2/to_private.wgsl.expected.glsl @@ -0,0 +1,54 @@ +#version 310 es + +struct S { + int before; + uint pad; + mat2 m; + int after; + uint pad_1; +}; + +struct S_std140 { + int before; + uint pad; + vec2 m_0; + vec2 m_1; + int after; + uint pad_1; +}; + +layout(binding = 0, std140) uniform u_block_std140_ubo { + S_std140 inner[4]; +} u; + +S p[4] = S[4](S(0, 0u, mat2(0.0f, 0.0f, 0.0f, 0.0f), 0, 0u), S(0, 0u, mat2(0.0f, 0.0f, 0.0f, 0.0f), 0, 0u), S(0, 0u, mat2(0.0f, 0.0f, 0.0f, 0.0f), 0, 0u), S(0, 0u, mat2(0.0f, 0.0f, 0.0f, 0.0f), 0, 0u)); +S conv_S(S_std140 val) { + return S(val.before, val.pad, mat2(val.m_0, val.m_1), val.after, val.pad_1); +} + +S[4] conv_arr_4_S(S_std140 val[4]) { + S arr[4] = S[4](S(0, 0u, mat2(0.0f, 0.0f, 0.0f, 0.0f), 0, 0u), S(0, 0u, mat2(0.0f, 0.0f, 0.0f, 0.0f), 0, 0u), S(0, 0u, mat2(0.0f, 0.0f, 0.0f, 0.0f), 0, 0u), S(0, 0u, mat2(0.0f, 0.0f, 0.0f, 0.0f), 0, 0u)); + { + for(uint i = 0u; (i < 4u); i = (i + 1u)) { + arr[i] = conv_S(val[i]); + } + } + return arr; +} + +mat2 load_u_inner_2_m() { + return mat2(u.inner[2u].m_0, u.inner[2u].m_1); +} + +void f() { + p = conv_arr_4_S(u.inner); + p[1] = conv_S(u.inner[2u]); + p[3].m = load_u_inner_2_m(); + p[1].m[0] = u.inner[0u].m_1.yx; +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + f(); + return; +} diff --git a/test/tint/buffer/uniform/std140/mat2x2/to_private.wgsl.expected.msl b/test/tint/buffer/uniform/std140/struct/mat2x2/to_private.wgsl.expected.msl similarity index 100% rename from test/tint/buffer/uniform/std140/mat2x2/to_private.wgsl.expected.msl rename to test/tint/buffer/uniform/std140/struct/mat2x2/to_private.wgsl.expected.msl diff --git a/test/tint/buffer/uniform/std140/mat2x2/to_private.wgsl.expected.spvasm b/test/tint/buffer/uniform/std140/struct/mat2x2/to_private.wgsl.expected.spvasm similarity index 74% rename from test/tint/buffer/uniform/std140/mat2x2/to_private.wgsl.expected.spvasm rename to test/tint/buffer/uniform/std140/struct/mat2x2/to_private.wgsl.expected.spvasm index ecca4eeb1d..118e47614e 100644 --- a/test/tint/buffer/uniform/std140/mat2x2/to_private.wgsl.expected.spvasm +++ b/test/tint/buffer/uniform/std140/struct/mat2x2/to_private.wgsl.expected.spvasm @@ -1,14 +1,14 @@ ; SPIR-V ; Version: 1.3 ; Generator: Google Tint Compiler; 0 -; Bound: 97 +; Bound: 101 ; Schema: 0 OpCapability Shader OpMemoryModel Logical GLSL450 OpEntryPoint GLCompute %f "f" OpExecutionMode %f LocalSize 1 1 1 - OpName %u_block "u_block" - OpMemberName %u_block 0 "inner" + OpName %u_block_std140 "u_block_std140" + OpMemberName %u_block_std140 0 "inner" OpName %S_std140 "S_std140" OpMemberName %S_std140 0 "before" OpMemberName %S_std140 1 "m_0" @@ -27,10 +27,10 @@ OpName %arr "arr" OpName %i "i" OpName %var_for_index "var_for_index" - OpName %load_u_2_m "load_u_2_m" + OpName %load_u_inner_2_m "load_u_inner_2_m" OpName %f "f" - OpDecorate %u_block Block - OpMemberDecorate %u_block 0 Offset 0 + OpDecorate %u_block_std140 Block + OpMemberDecorate %u_block_std140 0 Offset 0 OpMemberDecorate %S_std140 0 Offset 0 OpMemberDecorate %S_std140 1 Offset 8 OpMemberDecorate %S_std140 2 Offset 16 @@ -52,9 +52,9 @@ %uint = OpTypeInt 32 0 %uint_4 = OpConstant %uint 4 %_arr_S_std140_uint_4 = OpTypeArray %S_std140 %uint_4 - %u_block = OpTypeStruct %_arr_S_std140_uint_4 -%_ptr_Uniform_u_block = OpTypePointer Uniform %u_block - %u = OpVariable %_ptr_Uniform_u_block Uniform +%u_block_std140 = OpTypeStruct %_arr_S_std140_uint_4 +%_ptr_Uniform_u_block_std140 = OpTypePointer Uniform %u_block_std140 + %u = OpVariable %_ptr_Uniform_u_block_std140 Uniform %mat2v2float = OpTypeMatrix %v2float 2 %S = OpTypeStruct %int %mat2v2float %int %_arr_S_uint_4 = OpTypeArray %S %uint_4 @@ -75,16 +75,16 @@ %61 = OpTypeFunction %mat2v2float %uint_0 = OpConstant %uint 0 %uint_2 = OpConstant %uint 2 +%_ptr_Uniform_S_std140 = OpTypePointer Uniform %S_std140 %_ptr_Uniform_v2float = OpTypePointer Uniform %v2float %void = OpTypeVoid - %72 = OpTypeFunction %void + %77 = OpTypeFunction %void %_ptr_Uniform__arr_S_std140_uint_4 = OpTypePointer Uniform %_arr_S_std140_uint_4 %int_1 = OpConstant %int 1 %_ptr_Private_S = OpTypePointer Private %S -%_ptr_Uniform_S_std140 = OpTypePointer Uniform %S_std140 %int_3 = OpConstant %int 3 %_ptr_Private_mat2v2float = OpTypePointer Private %mat2v2float - %91 = OpConstantNull %int + %95 = OpConstantNull %int %_ptr_Private_v2float = OpTypePointer Private %v2float %conv_S = OpFunction %S None %17 %val = OpFunctionParameter %S_std140 @@ -134,33 +134,34 @@ %60 = OpLoad %_arr_S_uint_4 %arr OpReturnValue %60 OpFunctionEnd - %load_u_2_m = OpFunction %mat2v2float None %61 +%load_u_inner_2_m = OpFunction %mat2v2float None %61 %63 = OpLabel - %67 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 %uint_2 %uint_1 - %68 = OpLoad %v2float %67 - %69 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 %uint_2 %uint_2 - %70 = OpLoad %v2float %69 - %71 = OpCompositeConstruct %mat2v2float %68 %70 - OpReturnValue %71 + %68 = OpAccessChain %_ptr_Uniform_S_std140 %u %uint_0 %uint_2 + %71 = OpAccessChain %_ptr_Uniform_v2float %68 %uint_1 + %72 = OpLoad %v2float %71 + %74 = OpAccessChain %_ptr_Uniform_v2float %68 %uint_2 + %75 = OpLoad %v2float %74 + %76 = OpCompositeConstruct %mat2v2float %72 %75 + OpReturnValue %76 OpFunctionEnd - %f = OpFunction %void None %72 - %75 = OpLabel - %78 = OpAccessChain %_ptr_Uniform__arr_S_std140_uint_4 %u %uint_0 - %79 = OpLoad %_arr_S_std140_uint_4 %78 - %76 = OpFunctionCall %_arr_S_uint_4 %conv_arr_4_S %79 - OpStore %p %76 - %82 = OpAccessChain %_ptr_Private_S %p %int_1 - %85 = OpAccessChain %_ptr_Uniform_S_std140 %u %uint_0 %uint_2 - %86 = OpLoad %S_std140 %85 - %83 = OpFunctionCall %S %conv_S %86 - OpStore %82 %83 - %89 = OpAccessChain %_ptr_Private_mat2v2float %p %int_3 %uint_1 - %90 = OpFunctionCall %mat2v2float %load_u_2_m - OpStore %89 %90 - %93 = OpAccessChain %_ptr_Private_v2float %p %int_1 %uint_1 %91 - %94 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 %35 %uint_2 - %95 = OpLoad %v2float %94 - %96 = OpVectorShuffle %v2float %95 %95 1 0 - OpStore %93 %96 + %f = OpFunction %void None %77 + %80 = OpLabel + %83 = OpAccessChain %_ptr_Uniform__arr_S_std140_uint_4 %u %uint_0 + %84 = OpLoad %_arr_S_std140_uint_4 %83 + %81 = OpFunctionCall %_arr_S_uint_4 %conv_arr_4_S %84 + OpStore %p %81 + %87 = OpAccessChain %_ptr_Private_S %p %int_1 + %89 = OpAccessChain %_ptr_Uniform_S_std140 %u %uint_0 %uint_2 + %90 = OpLoad %S_std140 %89 + %88 = OpFunctionCall %S %conv_S %90 + OpStore %87 %88 + %93 = OpAccessChain %_ptr_Private_mat2v2float %p %int_3 %uint_1 + %94 = OpFunctionCall %mat2v2float %load_u_inner_2_m + OpStore %93 %94 + %97 = OpAccessChain %_ptr_Private_v2float %p %int_1 %uint_1 %95 + %98 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 %35 %uint_2 + %99 = OpLoad %v2float %98 + %100 = OpVectorShuffle %v2float %99 %99 1 0 + OpStore %97 %100 OpReturn OpFunctionEnd diff --git a/test/tint/buffer/uniform/std140/mat2x2/to_private.wgsl.expected.wgsl b/test/tint/buffer/uniform/std140/struct/mat2x2/to_private.wgsl.expected.wgsl similarity index 100% rename from test/tint/buffer/uniform/std140/mat2x2/to_private.wgsl.expected.wgsl rename to test/tint/buffer/uniform/std140/struct/mat2x2/to_private.wgsl.expected.wgsl diff --git a/test/tint/buffer/uniform/std140/mat2x2/to_storage.wgsl b/test/tint/buffer/uniform/std140/struct/mat2x2/to_storage.wgsl similarity index 100% rename from test/tint/buffer/uniform/std140/mat2x2/to_storage.wgsl rename to test/tint/buffer/uniform/std140/struct/mat2x2/to_storage.wgsl diff --git a/test/tint/buffer/uniform/std140/mat2x2/to_storage.wgsl.expected.dxc.hlsl b/test/tint/buffer/uniform/std140/struct/mat2x2/to_storage.wgsl.expected.dxc.hlsl similarity index 100% rename from test/tint/buffer/uniform/std140/mat2x2/to_storage.wgsl.expected.dxc.hlsl rename to test/tint/buffer/uniform/std140/struct/mat2x2/to_storage.wgsl.expected.dxc.hlsl diff --git a/test/tint/buffer/uniform/std140/mat2x2/to_storage.wgsl.expected.fxc.hlsl b/test/tint/buffer/uniform/std140/struct/mat2x2/to_storage.wgsl.expected.fxc.hlsl similarity index 100% rename from test/tint/buffer/uniform/std140/mat2x2/to_storage.wgsl.expected.fxc.hlsl rename to test/tint/buffer/uniform/std140/struct/mat2x2/to_storage.wgsl.expected.fxc.hlsl diff --git a/test/tint/buffer/uniform/std140/mat2x2/to_storage.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/struct/mat2x2/to_storage.wgsl.expected.glsl similarity index 75% rename from test/tint/buffer/uniform/std140/mat2x2/to_storage.wgsl.expected.glsl rename to test/tint/buffer/uniform/std140/struct/mat2x2/to_storage.wgsl.expected.glsl index b6b2c362c0..0fdf832225 100644 --- a/test/tint/buffer/uniform/std140/mat2x2/to_storage.wgsl.expected.glsl +++ b/test/tint/buffer/uniform/std140/struct/mat2x2/to_storage.wgsl.expected.glsl @@ -10,24 +10,23 @@ struct S { struct S_std140 { int before; - uint pad_2; + uint pad; vec2 m_0; vec2 m_1; int after; - uint pad_3; + uint pad_1; }; -layout(binding = 0, std140) uniform u_block_ubo { +layout(binding = 0, std140) uniform u_block_std140_ubo { S_std140 inner[4]; } u; -layout(binding = 1, std430) buffer s_block_ssbo { +layout(binding = 1, std430) buffer u_block_ssbo { S inner[4]; } s; S conv_S(S_std140 val) { - S tint_symbol = S(val.before, 0u, mat2(val.m_0, val.m_1), val.after, 0u); - return tint_symbol; + return S(val.before, val.pad, mat2(val.m_0, val.m_1), val.after, val.pad_1); } S[4] conv_arr_4_S(S_std140 val[4]) { @@ -40,14 +39,14 @@ S[4] conv_arr_4_S(S_std140 val[4]) { return arr; } -mat2 load_u_2_m() { +mat2 load_u_inner_2_m() { return mat2(u.inner[2u].m_0, u.inner[2u].m_1); } void f() { s.inner = conv_arr_4_S(u.inner); s.inner[1] = conv_S(u.inner[2u]); - s.inner[3].m = load_u_2_m(); + s.inner[3].m = load_u_inner_2_m(); s.inner[1].m[0] = u.inner[0u].m_1.yx; } diff --git a/test/tint/buffer/uniform/std140/mat2x2/to_storage.wgsl.expected.msl b/test/tint/buffer/uniform/std140/struct/mat2x2/to_storage.wgsl.expected.msl similarity index 100% rename from test/tint/buffer/uniform/std140/mat2x2/to_storage.wgsl.expected.msl rename to test/tint/buffer/uniform/std140/struct/mat2x2/to_storage.wgsl.expected.msl diff --git a/test/tint/buffer/uniform/std140/mat2x2/to_storage.wgsl.expected.spvasm b/test/tint/buffer/uniform/std140/struct/mat2x2/to_storage.wgsl.expected.spvasm similarity index 72% rename from test/tint/buffer/uniform/std140/mat2x2/to_storage.wgsl.expected.spvasm rename to test/tint/buffer/uniform/std140/struct/mat2x2/to_storage.wgsl.expected.spvasm index 03f28a759f..8769096618 100644 --- a/test/tint/buffer/uniform/std140/mat2x2/to_storage.wgsl.expected.spvasm +++ b/test/tint/buffer/uniform/std140/struct/mat2x2/to_storage.wgsl.expected.spvasm @@ -1,22 +1,22 @@ ; SPIR-V ; Version: 1.3 ; Generator: Google Tint Compiler; 0 -; Bound: 100 +; Bound: 104 ; Schema: 0 OpCapability Shader OpMemoryModel Logical GLSL450 OpEntryPoint GLCompute %f "f" OpExecutionMode %f LocalSize 1 1 1 - OpName %u_block "u_block" - OpMemberName %u_block 0 "inner" + OpName %u_block_std140 "u_block_std140" + OpMemberName %u_block_std140 0 "inner" OpName %S_std140 "S_std140" OpMemberName %S_std140 0 "before" OpMemberName %S_std140 1 "m_0" OpMemberName %S_std140 2 "m_1" OpMemberName %S_std140 3 "after" OpName %u "u" - OpName %s_block "s_block" - OpMemberName %s_block 0 "inner" + OpName %u_block "u_block" + OpMemberName %u_block 0 "inner" OpName %S "S" OpMemberName %S 0 "before" OpMemberName %S 1 "m" @@ -29,10 +29,10 @@ OpName %arr "arr" OpName %i "i" OpName %var_for_index "var_for_index" - OpName %load_u_2_m "load_u_2_m" + OpName %load_u_inner_2_m "load_u_inner_2_m" OpName %f "f" - OpDecorate %u_block Block - OpMemberDecorate %u_block 0 Offset 0 + OpDecorate %u_block_std140 Block + OpMemberDecorate %u_block_std140 0 Offset 0 OpMemberDecorate %S_std140 0 Offset 0 OpMemberDecorate %S_std140 1 Offset 8 OpMemberDecorate %S_std140 2 Offset 16 @@ -41,8 +41,8 @@ OpDecorate %u NonWritable OpDecorate %u DescriptorSet 0 OpDecorate %u Binding 0 - OpDecorate %s_block Block - OpMemberDecorate %s_block 0 Offset 0 + OpDecorate %u_block Block + OpMemberDecorate %u_block 0 Offset 0 OpMemberDecorate %S 0 Offset 0 OpMemberDecorate %S 1 Offset 8 OpMemberDecorate %S 1 ColMajor @@ -58,15 +58,15 @@ %uint = OpTypeInt 32 0 %uint_4 = OpConstant %uint 4 %_arr_S_std140_uint_4 = OpTypeArray %S_std140 %uint_4 - %u_block = OpTypeStruct %_arr_S_std140_uint_4 -%_ptr_Uniform_u_block = OpTypePointer Uniform %u_block - %u = OpVariable %_ptr_Uniform_u_block Uniform +%u_block_std140 = OpTypeStruct %_arr_S_std140_uint_4 +%_ptr_Uniform_u_block_std140 = OpTypePointer Uniform %u_block_std140 + %u = OpVariable %_ptr_Uniform_u_block_std140 Uniform %mat2v2float = OpTypeMatrix %v2float 2 %S = OpTypeStruct %int %mat2v2float %int %_arr_S_uint_4 = OpTypeArray %S %uint_4 - %s_block = OpTypeStruct %_arr_S_uint_4 -%_ptr_StorageBuffer_s_block = OpTypePointer StorageBuffer %s_block - %s = OpVariable %_ptr_StorageBuffer_s_block StorageBuffer + %u_block = OpTypeStruct %_arr_S_uint_4 +%_ptr_StorageBuffer_u_block = OpTypePointer StorageBuffer %u_block + %s = OpVariable %_ptr_StorageBuffer_u_block StorageBuffer %17 = OpTypeFunction %S %S_std140 %27 = OpTypeFunction %_arr_S_uint_4 %_arr_S_std140_uint_4 %_ptr_Function__arr_S_uint_4 = OpTypePointer Function %_arr_S_uint_4 @@ -82,17 +82,17 @@ %62 = OpTypeFunction %mat2v2float %uint_0 = OpConstant %uint 0 %uint_2 = OpConstant %uint 2 +%_ptr_Uniform_S_std140 = OpTypePointer Uniform %S_std140 %_ptr_Uniform_v2float = OpTypePointer Uniform %v2float %void = OpTypeVoid - %73 = OpTypeFunction %void + %78 = OpTypeFunction %void %_ptr_StorageBuffer__arr_S_uint_4 = OpTypePointer StorageBuffer %_arr_S_uint_4 %_ptr_Uniform__arr_S_std140_uint_4 = OpTypePointer Uniform %_arr_S_std140_uint_4 %int_1 = OpConstant %int 1 %_ptr_StorageBuffer_S = OpTypePointer StorageBuffer %S -%_ptr_Uniform_S_std140 = OpTypePointer Uniform %S_std140 %int_3 = OpConstant %int 3 %_ptr_StorageBuffer_mat2v2float = OpTypePointer StorageBuffer %mat2v2float - %94 = OpConstantNull %int + %98 = OpConstantNull %int %_ptr_StorageBuffer_v2float = OpTypePointer StorageBuffer %v2float %conv_S = OpFunction %S None %17 %val = OpFunctionParameter %S_std140 @@ -142,34 +142,35 @@ %61 = OpLoad %_arr_S_uint_4 %arr OpReturnValue %61 OpFunctionEnd - %load_u_2_m = OpFunction %mat2v2float None %62 +%load_u_inner_2_m = OpFunction %mat2v2float None %62 %64 = OpLabel - %68 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 %uint_2 %uint_1 - %69 = OpLoad %v2float %68 - %70 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 %uint_2 %uint_2 - %71 = OpLoad %v2float %70 - %72 = OpCompositeConstruct %mat2v2float %69 %71 - OpReturnValue %72 + %69 = OpAccessChain %_ptr_Uniform_S_std140 %u %uint_0 %uint_2 + %72 = OpAccessChain %_ptr_Uniform_v2float %69 %uint_1 + %73 = OpLoad %v2float %72 + %75 = OpAccessChain %_ptr_Uniform_v2float %69 %uint_2 + %76 = OpLoad %v2float %75 + %77 = OpCompositeConstruct %mat2v2float %73 %76 + OpReturnValue %77 OpFunctionEnd - %f = OpFunction %void None %73 - %76 = OpLabel - %78 = OpAccessChain %_ptr_StorageBuffer__arr_S_uint_4 %s %uint_0 - %81 = OpAccessChain %_ptr_Uniform__arr_S_std140_uint_4 %u %uint_0 - %82 = OpLoad %_arr_S_std140_uint_4 %81 - %79 = OpFunctionCall %_arr_S_uint_4 %conv_arr_4_S %82 - OpStore %78 %79 - %85 = OpAccessChain %_ptr_StorageBuffer_S %s %uint_0 %int_1 - %88 = OpAccessChain %_ptr_Uniform_S_std140 %u %uint_0 %uint_2 - %89 = OpLoad %S_std140 %88 - %86 = OpFunctionCall %S %conv_S %89 - OpStore %85 %86 - %92 = OpAccessChain %_ptr_StorageBuffer_mat2v2float %s %uint_0 %int_3 %uint_1 - %93 = OpFunctionCall %mat2v2float %load_u_2_m - OpStore %92 %93 - %96 = OpAccessChain %_ptr_StorageBuffer_v2float %s %uint_0 %int_1 %uint_1 %94 - %97 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 %36 %uint_2 - %98 = OpLoad %v2float %97 - %99 = OpVectorShuffle %v2float %98 %98 1 0 - OpStore %96 %99 + %f = OpFunction %void None %78 + %81 = OpLabel + %83 = OpAccessChain %_ptr_StorageBuffer__arr_S_uint_4 %s %uint_0 + %86 = OpAccessChain %_ptr_Uniform__arr_S_std140_uint_4 %u %uint_0 + %87 = OpLoad %_arr_S_std140_uint_4 %86 + %84 = OpFunctionCall %_arr_S_uint_4 %conv_arr_4_S %87 + OpStore %83 %84 + %90 = OpAccessChain %_ptr_StorageBuffer_S %s %uint_0 %int_1 + %92 = OpAccessChain %_ptr_Uniform_S_std140 %u %uint_0 %uint_2 + %93 = OpLoad %S_std140 %92 + %91 = OpFunctionCall %S %conv_S %93 + OpStore %90 %91 + %96 = OpAccessChain %_ptr_StorageBuffer_mat2v2float %s %uint_0 %int_3 %uint_1 + %97 = OpFunctionCall %mat2v2float %load_u_inner_2_m + OpStore %96 %97 + %100 = OpAccessChain %_ptr_StorageBuffer_v2float %s %uint_0 %int_1 %uint_1 %98 + %101 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 %36 %uint_2 + %102 = OpLoad %v2float %101 + %103 = OpVectorShuffle %v2float %102 %102 1 0 + OpStore %100 %103 OpReturn OpFunctionEnd diff --git a/test/tint/buffer/uniform/std140/mat2x2/to_storage.wgsl.expected.wgsl b/test/tint/buffer/uniform/std140/struct/mat2x2/to_storage.wgsl.expected.wgsl similarity index 100% rename from test/tint/buffer/uniform/std140/mat2x2/to_storage.wgsl.expected.wgsl rename to test/tint/buffer/uniform/std140/struct/mat2x2/to_storage.wgsl.expected.wgsl diff --git a/test/tint/buffer/uniform/std140/mat2x2/to_workgroup.wgsl b/test/tint/buffer/uniform/std140/struct/mat2x2/to_workgroup.wgsl similarity index 100% rename from test/tint/buffer/uniform/std140/mat2x2/to_workgroup.wgsl rename to test/tint/buffer/uniform/std140/struct/mat2x2/to_workgroup.wgsl diff --git a/test/tint/buffer/uniform/std140/mat2x2/to_workgroup.wgsl.expected.dxc.hlsl b/test/tint/buffer/uniform/std140/struct/mat2x2/to_workgroup.wgsl.expected.dxc.hlsl similarity index 100% rename from test/tint/buffer/uniform/std140/mat2x2/to_workgroup.wgsl.expected.dxc.hlsl rename to test/tint/buffer/uniform/std140/struct/mat2x2/to_workgroup.wgsl.expected.dxc.hlsl diff --git a/test/tint/buffer/uniform/std140/mat2x2/to_workgroup.wgsl.expected.fxc.hlsl b/test/tint/buffer/uniform/std140/struct/mat2x2/to_workgroup.wgsl.expected.fxc.hlsl similarity index 100% rename from test/tint/buffer/uniform/std140/mat2x2/to_workgroup.wgsl.expected.fxc.hlsl rename to test/tint/buffer/uniform/std140/struct/mat2x2/to_workgroup.wgsl.expected.fxc.hlsl diff --git a/test/tint/buffer/uniform/std140/mat2x2/to_workgroup.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/struct/mat2x2/to_workgroup.wgsl.expected.glsl similarity index 60% rename from test/tint/buffer/uniform/std140/mat2x2/to_workgroup.wgsl.expected.glsl rename to test/tint/buffer/uniform/std140/struct/mat2x2/to_workgroup.wgsl.expected.glsl index b75753ca4f..9204f46935 100644 --- a/test/tint/buffer/uniform/std140/mat2x2/to_workgroup.wgsl.expected.glsl +++ b/test/tint/buffer/uniform/std140/struct/mat2x2/to_workgroup.wgsl.expected.glsl @@ -2,8 +2,10 @@ struct S { int before; + uint pad; mat2 m; int after; + uint pad_1; }; struct S_std140 { @@ -15,18 +17,17 @@ struct S_std140 { uint pad_1; }; -layout(binding = 0, std140) uniform u_block_ubo { +layout(binding = 0, std140) uniform u_block_std140_ubo { S_std140 inner[4]; } u; shared S w[4]; S conv_S(S_std140 val) { - S tint_symbol = S(val.before, mat2(val.m_0, val.m_1), val.after); - return tint_symbol; + return S(val.before, val.pad, mat2(val.m_0, val.m_1), val.after, val.pad_1); } S[4] conv_arr_4_S(S_std140 val[4]) { - S arr[4] = S[4](S(0, mat2(0.0f, 0.0f, 0.0f, 0.0f), 0), S(0, mat2(0.0f, 0.0f, 0.0f, 0.0f), 0), S(0, mat2(0.0f, 0.0f, 0.0f, 0.0f), 0), S(0, mat2(0.0f, 0.0f, 0.0f, 0.0f), 0)); + S arr[4] = S[4](S(0, 0u, mat2(0.0f, 0.0f, 0.0f, 0.0f), 0, 0u), S(0, 0u, mat2(0.0f, 0.0f, 0.0f, 0.0f), 0, 0u), S(0, 0u, mat2(0.0f, 0.0f, 0.0f, 0.0f), 0, 0u), S(0, 0u, mat2(0.0f, 0.0f, 0.0f, 0.0f), 0, 0u)); { for(uint i = 0u; (i < 4u); i = (i + 1u)) { arr[i] = conv_S(val[i]); @@ -35,7 +36,7 @@ S[4] conv_arr_4_S(S_std140 val[4]) { return arr; } -mat2 load_u_2_m() { +mat2 load_u_inner_2_m() { return mat2(u.inner[2u].m_0, u.inner[2u].m_1); } @@ -43,14 +44,14 @@ void f(uint local_invocation_index) { { for(uint idx = local_invocation_index; (idx < 4u); idx = (idx + 1u)) { uint i = idx; - S tint_symbol_1 = S(0, mat2(vec2(0.0f), vec2(0.0f)), 0); - w[i] = tint_symbol_1; + S tint_symbol = S(0, 0u, mat2(vec2(0.0f), vec2(0.0f)), 0, 0u); + w[i] = tint_symbol; } } barrier(); w = conv_arr_4_S(u.inner); w[1] = conv_S(u.inner[2u]); - w[3].m = load_u_2_m(); + w[3].m = load_u_inner_2_m(); w[1].m[0] = u.inner[0u].m_1.yx; } diff --git a/test/tint/buffer/uniform/std140/mat2x2/to_workgroup.wgsl.expected.msl b/test/tint/buffer/uniform/std140/struct/mat2x2/to_workgroup.wgsl.expected.msl similarity index 100% rename from test/tint/buffer/uniform/std140/mat2x2/to_workgroup.wgsl.expected.msl rename to test/tint/buffer/uniform/std140/struct/mat2x2/to_workgroup.wgsl.expected.msl diff --git a/test/tint/buffer/uniform/std140/mat2x2/to_workgroup.wgsl.expected.spvasm b/test/tint/buffer/uniform/std140/struct/mat2x2/to_workgroup.wgsl.expected.spvasm similarity index 68% rename from test/tint/buffer/uniform/std140/mat2x2/to_workgroup.wgsl.expected.spvasm rename to test/tint/buffer/uniform/std140/struct/mat2x2/to_workgroup.wgsl.expected.spvasm index 305e172fb3..5e253f9518 100644 --- a/test/tint/buffer/uniform/std140/mat2x2/to_workgroup.wgsl.expected.spvasm +++ b/test/tint/buffer/uniform/std140/struct/mat2x2/to_workgroup.wgsl.expected.spvasm @@ -1,15 +1,15 @@ ; SPIR-V ; Version: 1.3 ; Generator: Google Tint Compiler; 0 -; Bound: 122 +; Bound: 126 ; Schema: 0 OpCapability Shader OpMemoryModel Logical GLSL450 OpEntryPoint GLCompute %f "f" %local_invocation_index_1 OpExecutionMode %f LocalSize 1 1 1 OpName %local_invocation_index_1 "local_invocation_index_1" - OpName %u_block "u_block" - OpMemberName %u_block 0 "inner" + OpName %u_block_std140 "u_block_std140" + OpMemberName %u_block_std140 0 "inner" OpName %S_std140 "S_std140" OpMemberName %S_std140 0 "before" OpMemberName %S_std140 1 "m_0" @@ -28,14 +28,14 @@ OpName %arr "arr" OpName %i "i" OpName %var_for_index "var_for_index" - OpName %load_u_2_m "load_u_2_m" + OpName %load_u_inner_2_m "load_u_inner_2_m" OpName %f_inner "f_inner" OpName %local_invocation_index "local_invocation_index" OpName %idx "idx" OpName %f "f" OpDecorate %local_invocation_index_1 BuiltIn LocalInvocationIndex - OpDecorate %u_block Block - OpMemberDecorate %u_block 0 Offset 0 + OpDecorate %u_block_std140 Block + OpMemberDecorate %u_block_std140 0 Offset 0 OpMemberDecorate %S_std140 0 Offset 0 OpMemberDecorate %S_std140 1 Offset 8 OpMemberDecorate %S_std140 2 Offset 16 @@ -59,9 +59,9 @@ %S_std140 = OpTypeStruct %int %v2float %v2float %int %uint_4 = OpConstant %uint 4 %_arr_S_std140_uint_4 = OpTypeArray %S_std140 %uint_4 - %u_block = OpTypeStruct %_arr_S_std140_uint_4 -%_ptr_Uniform_u_block = OpTypePointer Uniform %u_block - %u = OpVariable %_ptr_Uniform_u_block Uniform +%u_block_std140 = OpTypeStruct %_arr_S_std140_uint_4 +%_ptr_Uniform_u_block_std140 = OpTypePointer Uniform %u_block_std140 + %u = OpVariable %_ptr_Uniform_u_block_std140 Uniform %mat2v2float = OpTypeMatrix %v2float 2 %S = OpTypeStruct %int %mat2v2float %int %_arr_S_uint_4 = OpTypeArray %S %uint_4 @@ -82,20 +82,20 @@ %63 = OpTypeFunction %mat2v2float %uint_0 = OpConstant %uint 0 %uint_2 = OpConstant %uint 2 +%_ptr_Uniform_S_std140 = OpTypePointer Uniform %S_std140 %_ptr_Uniform_v2float = OpTypePointer Uniform %v2float %void = OpTypeVoid - %74 = OpTypeFunction %void %uint + %79 = OpTypeFunction %void %uint %_ptr_Workgroup_S = OpTypePointer Workgroup %S - %92 = OpConstantNull %S + %97 = OpConstantNull %S %uint_264 = OpConstant %uint 264 %_ptr_Uniform__arr_S_std140_uint_4 = OpTypePointer Uniform %_arr_S_std140_uint_4 %int_1 = OpConstant %int 1 -%_ptr_Uniform_S_std140 = OpTypePointer Uniform %S_std140 %int_3 = OpConstant %int 3 %_ptr_Workgroup_mat2v2float = OpTypePointer Workgroup %mat2v2float - %111 = OpConstantNull %int + %115 = OpConstantNull %int %_ptr_Workgroup_v2float = OpTypePointer Workgroup %v2float - %117 = OpTypeFunction %void + %121 = OpTypeFunction %void %conv_S = OpFunction %S None %18 %val = OpFunctionParameter %S_std140 %21 = OpLabel @@ -144,66 +144,67 @@ %62 = OpLoad %_arr_S_uint_4 %arr OpReturnValue %62 OpFunctionEnd - %load_u_2_m = OpFunction %mat2v2float None %63 +%load_u_inner_2_m = OpFunction %mat2v2float None %63 %65 = OpLabel - %69 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 %uint_2 %uint_1 - %70 = OpLoad %v2float %69 - %71 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 %uint_2 %uint_2 - %72 = OpLoad %v2float %71 - %73 = OpCompositeConstruct %mat2v2float %70 %72 - OpReturnValue %73 + %70 = OpAccessChain %_ptr_Uniform_S_std140 %u %uint_0 %uint_2 + %73 = OpAccessChain %_ptr_Uniform_v2float %70 %uint_1 + %74 = OpLoad %v2float %73 + %76 = OpAccessChain %_ptr_Uniform_v2float %70 %uint_2 + %77 = OpLoad %v2float %76 + %78 = OpCompositeConstruct %mat2v2float %74 %77 + OpReturnValue %78 OpFunctionEnd - %f_inner = OpFunction %void None %74 + %f_inner = OpFunction %void None %79 %local_invocation_index = OpFunctionParameter %uint - %78 = OpLabel + %83 = OpLabel %idx = OpVariable %_ptr_Function_uint Function %37 OpStore %idx %local_invocation_index - OpBranch %80 - %80 = OpLabel - OpLoopMerge %81 %82 None - OpBranch %83 - %83 = OpLabel - %85 = OpLoad %uint %idx - %86 = OpULessThan %bool %85 %uint_4 - %84 = OpLogicalNot %bool %86 - OpSelectionMerge %87 None - OpBranchConditional %84 %88 %87 + OpBranch %85 + %85 = OpLabel + OpLoopMerge %86 %87 None + OpBranch %88 %88 = OpLabel - OpBranch %81 + %90 = OpLoad %uint %idx + %91 = OpULessThan %bool %90 %uint_4 + %89 = OpLogicalNot %bool %91 + OpSelectionMerge %92 None + OpBranchConditional %89 %93 %92 + %93 = OpLabel + OpBranch %86 + %92 = OpLabel + %94 = OpLoad %uint %idx + %96 = OpAccessChain %_ptr_Workgroup_S %w %94 + OpStore %96 %97 + OpBranch %87 %87 = OpLabel - %89 = OpLoad %uint %idx - %91 = OpAccessChain %_ptr_Workgroup_S %w %89 - OpStore %91 %92 - OpBranch %82 - %82 = OpLabel - %93 = OpLoad %uint %idx - %94 = OpIAdd %uint %93 %uint_1 - OpStore %idx %94 - OpBranch %80 - %81 = OpLabel + %98 = OpLoad %uint %idx + %99 = OpIAdd %uint %98 %uint_1 + OpStore %idx %99 + OpBranch %85 + %86 = OpLabel OpControlBarrier %uint_2 %uint_2 %uint_264 - %99 = OpAccessChain %_ptr_Uniform__arr_S_std140_uint_4 %u %uint_0 - %100 = OpLoad %_arr_S_std140_uint_4 %99 - %97 = OpFunctionCall %_arr_S_uint_4 %conv_arr_4_S %100 - OpStore %w %97 - %102 = OpAccessChain %_ptr_Workgroup_S %w %int_1 - %105 = OpAccessChain %_ptr_Uniform_S_std140 %u %uint_0 %uint_2 - %106 = OpLoad %S_std140 %105 - %103 = OpFunctionCall %S %conv_S %106 - OpStore %102 %103 - %109 = OpAccessChain %_ptr_Workgroup_mat2v2float %w %int_3 %uint_1 - %110 = OpFunctionCall %mat2v2float %load_u_2_m - OpStore %109 %110 - %113 = OpAccessChain %_ptr_Workgroup_v2float %w %int_1 %uint_1 %111 - %114 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 %37 %uint_2 - %115 = OpLoad %v2float %114 - %116 = OpVectorShuffle %v2float %115 %115 1 0 - OpStore %113 %116 + %104 = OpAccessChain %_ptr_Uniform__arr_S_std140_uint_4 %u %uint_0 + %105 = OpLoad %_arr_S_std140_uint_4 %104 + %102 = OpFunctionCall %_arr_S_uint_4 %conv_arr_4_S %105 + OpStore %w %102 + %107 = OpAccessChain %_ptr_Workgroup_S %w %int_1 + %109 = OpAccessChain %_ptr_Uniform_S_std140 %u %uint_0 %uint_2 + %110 = OpLoad %S_std140 %109 + %108 = OpFunctionCall %S %conv_S %110 + OpStore %107 %108 + %113 = OpAccessChain %_ptr_Workgroup_mat2v2float %w %int_3 %uint_1 + %114 = OpFunctionCall %mat2v2float %load_u_inner_2_m + OpStore %113 %114 + %117 = OpAccessChain %_ptr_Workgroup_v2float %w %int_1 %uint_1 %115 + %118 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 %37 %uint_2 + %119 = OpLoad %v2float %118 + %120 = OpVectorShuffle %v2float %119 %119 1 0 + OpStore %117 %120 OpReturn OpFunctionEnd - %f = OpFunction %void None %117 - %119 = OpLabel - %121 = OpLoad %uint %local_invocation_index_1 - %120 = OpFunctionCall %void %f_inner %121 + %f = OpFunction %void None %121 + %123 = OpLabel + %125 = OpLoad %uint %local_invocation_index_1 + %124 = OpFunctionCall %void %f_inner %125 OpReturn OpFunctionEnd diff --git a/test/tint/buffer/uniform/std140/mat2x2/to_workgroup.wgsl.expected.wgsl b/test/tint/buffer/uniform/std140/struct/mat2x2/to_workgroup.wgsl.expected.wgsl similarity index 100% rename from test/tint/buffer/uniform/std140/mat2x2/to_workgroup.wgsl.expected.wgsl rename to test/tint/buffer/uniform/std140/struct/mat2x2/to_workgroup.wgsl.expected.wgsl diff --git a/test/tint/buffer/uniform/std140/mat3x2/dynamic_index_via_ptr.wgsl b/test/tint/buffer/uniform/std140/struct/mat3x2/dynamic_index_via_ptr.wgsl similarity index 98% rename from test/tint/buffer/uniform/std140/mat3x2/dynamic_index_via_ptr.wgsl rename to test/tint/buffer/uniform/std140/struct/mat3x2/dynamic_index_via_ptr.wgsl index 86bae97c4a..92c91a8b9a 100644 --- a/test/tint/buffer/uniform/std140/mat3x2/dynamic_index_via_ptr.wgsl +++ b/test/tint/buffer/uniform/std140/struct/mat3x2/dynamic_index_via_ptr.wgsl @@ -13,8 +13,6 @@ fn i() -> i32 { counter++; return counter; } @compute @workgroup_size(1) fn f() { - let I = 1; - let p_a = &a; let p_a_i = &((*p_a)[i()]); let p_a_i_a = &((*p_a_i).a); diff --git a/test/tint/buffer/uniform/std140/mat3x2/dynamic_index_via_ptr.wgsl.expected.dxc.hlsl b/test/tint/buffer/uniform/std140/struct/mat3x2/dynamic_index_via_ptr.wgsl.expected.dxc.hlsl similarity index 99% rename from test/tint/buffer/uniform/std140/mat3x2/dynamic_index_via_ptr.wgsl.expected.dxc.hlsl rename to test/tint/buffer/uniform/std140/struct/mat3x2/dynamic_index_via_ptr.wgsl.expected.dxc.hlsl index 014b25d01e..c1513d2980 100644 --- a/test/tint/buffer/uniform/std140/mat3x2/dynamic_index_via_ptr.wgsl.expected.dxc.hlsl +++ b/test/tint/buffer/uniform/std140/struct/mat3x2/dynamic_index_via_ptr.wgsl.expected.dxc.hlsl @@ -59,7 +59,6 @@ tint_symbol_4_ret tint_symbol_4(uint4 buffer[64], uint offset) { [numthreads(1, 1, 1)] void f() { - const int I = 1; const int p_a_i_save = i(); const int p_a_i_a_i_save = i(); const int p_a_i_a_i_m_i_save = i(); diff --git a/test/tint/buffer/uniform/std140/mat3x2/dynamic_index_via_ptr.wgsl.expected.fxc.hlsl b/test/tint/buffer/uniform/std140/struct/mat3x2/dynamic_index_via_ptr.wgsl.expected.fxc.hlsl similarity index 99% rename from test/tint/buffer/uniform/std140/mat3x2/dynamic_index_via_ptr.wgsl.expected.fxc.hlsl rename to test/tint/buffer/uniform/std140/struct/mat3x2/dynamic_index_via_ptr.wgsl.expected.fxc.hlsl index 014b25d01e..c1513d2980 100644 --- a/test/tint/buffer/uniform/std140/mat3x2/dynamic_index_via_ptr.wgsl.expected.fxc.hlsl +++ b/test/tint/buffer/uniform/std140/struct/mat3x2/dynamic_index_via_ptr.wgsl.expected.fxc.hlsl @@ -59,7 +59,6 @@ tint_symbol_4_ret tint_symbol_4(uint4 buffer[64], uint offset) { [numthreads(1, 1, 1)] void f() { - const int I = 1; const int p_a_i_save = i(); const int p_a_i_a_i_save = i(); const int p_a_i_a_i_m_i_save = i(); diff --git a/test/tint/buffer/uniform/std140/struct/mat3x2/dynamic_index_via_ptr.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/struct/mat3x2/dynamic_index_via_ptr.wgsl.expected.glsl new file mode 100644 index 0000000000..accf517b6f --- /dev/null +++ b/test/tint/buffer/uniform/std140/struct/mat3x2/dynamic_index_via_ptr.wgsl.expected.glsl @@ -0,0 +1,151 @@ +#version 310 es + +struct Inner { + mat3x2 m; + uint pad; + uint pad_1; + uint pad_2; + uint pad_3; + uint pad_4; + uint pad_5; + uint pad_6; + uint pad_7; + uint pad_8; + uint pad_9; +}; + +struct Inner_std140 { + vec2 m_0; + vec2 m_1; + vec2 m_2; + uint pad; + uint pad_1; + uint pad_2; + uint pad_3; + uint pad_4; + uint pad_5; + uint pad_6; + uint pad_7; + uint pad_8; + uint pad_9; +}; + +struct Outer { + Inner a[4]; +}; + +struct Outer_std140 { + Inner_std140 a[4]; +}; + +layout(binding = 0, std140) uniform a_block_std140_ubo { + Outer_std140 inner[4]; +} a; + +int counter = 0; +int i() { + counter = (counter + 1); + return counter; +} + +Inner conv_Inner(Inner_std140 val) { + return Inner(mat3x2(val.m_0, val.m_1, val.m_2), val.pad, val.pad_1, val.pad_2, val.pad_3, val.pad_4, val.pad_5, val.pad_6, val.pad_7, val.pad_8, val.pad_9); +} + +Inner[4] conv_arr_4_Inner(Inner_std140 val[4]) { + Inner arr[4] = Inner[4](Inner(mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u), Inner(mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u), Inner(mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u), Inner(mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u)); + { + for(uint i = 0u; (i < 4u); i = (i + 1u)) { + arr[i] = conv_Inner(val[i]); + } + } + return arr; +} + +Outer conv_Outer(Outer_std140 val) { + return Outer(conv_arr_4_Inner(val.a)); +} + +Outer[4] conv_arr_4_Outer(Outer_std140 val[4]) { + Outer arr[4] = Outer[4](Outer(Inner[4](Inner(mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u), Inner(mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u), Inner(mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u), Inner(mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u))), Outer(Inner[4](Inner(mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u), Inner(mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u), Inner(mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u), Inner(mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u))), Outer(Inner[4](Inner(mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u), Inner(mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u), Inner(mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u), Inner(mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u))), Outer(Inner[4](Inner(mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u), Inner(mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u), Inner(mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u), Inner(mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u)))); + { + for(uint i = 0u; (i < 4u); i = (i + 1u)) { + arr[i] = conv_Outer(val[i]); + } + } + return arr; +} + +mat3x2 load_a_inner_p0_a_p1_m(uint p0, uint p1) { + uint s_save = p0; + uint s_save_1 = p1; + return mat3x2(a.inner[s_save].a[s_save_1].m_0, a.inner[s_save].a[s_save_1].m_1, a.inner[s_save].a[s_save_1].m_2); +} + +vec2 load_a_inner_p0_a_p1_m_p2(uint p0, uint p1, uint p2) { + switch(p2) { + case 0u: { + return a.inner[p0].a[p1].m_0; + break; + } + case 1u: { + return a.inner[p0].a[p1].m_1; + break; + } + case 2u: { + return a.inner[p0].a[p1].m_2; + break; + } + default: { + return vec2(0.0f); + break; + } + } +} + +float load_a_inner_p0_a_p1_m_p2_p3(uint p0, uint p1, uint p2, uint p3) { + switch(p2) { + case 0u: { + return a.inner[p0].a[p1].m_0[p3]; + break; + } + case 1u: { + return a.inner[p0].a[p1].m_1[p3]; + break; + } + case 2u: { + return a.inner[p0].a[p1].m_2[p3]; + break; + } + default: { + return 0.0f; + break; + } + } +} + +void f() { + Outer p_a[4] = conv_arr_4_Outer(a.inner); + int tint_symbol = i(); + Outer p_a_i = conv_Outer(a.inner[tint_symbol]); + Inner p_a_i_a[4] = conv_arr_4_Inner(a.inner[tint_symbol].a); + int tint_symbol_1 = i(); + Inner p_a_i_a_i = conv_Inner(a.inner[tint_symbol].a[tint_symbol_1]); + mat3x2 p_a_i_a_i_m = load_a_inner_p0_a_p1_m(uint(tint_symbol), uint(tint_symbol_1)); + int tint_symbol_2 = i(); + vec2 p_a_i_a_i_m_i = load_a_inner_p0_a_p1_m_p2(uint(tint_symbol), uint(tint_symbol_1), uint(tint_symbol_2)); + Outer l_a[4] = conv_arr_4_Outer(a.inner); + Outer l_a_i = conv_Outer(a.inner[tint_symbol]); + Inner l_a_i_a[4] = conv_arr_4_Inner(a.inner[tint_symbol].a); + Inner l_a_i_a_i = conv_Inner(a.inner[tint_symbol].a[tint_symbol_1]); + mat3x2 l_a_i_a_i_m = load_a_inner_p0_a_p1_m(uint(tint_symbol), uint(tint_symbol_1)); + vec2 l_a_i_a_i_m_i = load_a_inner_p0_a_p1_m_p2(uint(tint_symbol), uint(tint_symbol_1), uint(tint_symbol_2)); + int tint_symbol_3 = i(); + float l_a_i_a_i_m_i_i = load_a_inner_p0_a_p1_m_p2_p3(uint(tint_symbol), uint(tint_symbol_1), uint(tint_symbol_2), uint(tint_symbol_3)); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + f(); + return; +} diff --git a/test/tint/buffer/uniform/std140/mat3x2/dynamic_index_via_ptr.wgsl.expected.msl b/test/tint/buffer/uniform/std140/struct/mat3x2/dynamic_index_via_ptr.wgsl.expected.msl similarity index 98% rename from test/tint/buffer/uniform/std140/mat3x2/dynamic_index_via_ptr.wgsl.expected.msl rename to test/tint/buffer/uniform/std140/struct/mat3x2/dynamic_index_via_ptr.wgsl.expected.msl index 572eb1c261..02f86ed1b2 100644 --- a/test/tint/buffer/uniform/std140/mat3x2/dynamic_index_via_ptr.wgsl.expected.msl +++ b/test/tint/buffer/uniform/std140/struct/mat3x2/dynamic_index_via_ptr.wgsl.expected.msl @@ -30,7 +30,6 @@ int i() { } kernel void f(const constant tint_array* tint_symbol_5 [[buffer(0)]]) { - int const I = 1; int const tint_symbol = i(); int const p_a_i_save = tint_symbol; int const tint_symbol_1 = i(); diff --git a/test/tint/buffer/uniform/std140/mat3x2/dynamic_index_via_ptr.wgsl.expected.spvasm b/test/tint/buffer/uniform/std140/struct/mat3x2/dynamic_index_via_ptr.wgsl.expected.spvasm similarity index 62% rename from test/tint/buffer/uniform/std140/mat3x2/dynamic_index_via_ptr.wgsl.expected.spvasm rename to test/tint/buffer/uniform/std140/struct/mat3x2/dynamic_index_via_ptr.wgsl.expected.spvasm index 726683fa26..bb1c3508b9 100644 --- a/test/tint/buffer/uniform/std140/mat3x2/dynamic_index_via_ptr.wgsl.expected.spvasm +++ b/test/tint/buffer/uniform/std140/struct/mat3x2/dynamic_index_via_ptr.wgsl.expected.spvasm @@ -1,14 +1,14 @@ ; SPIR-V ; Version: 1.3 ; Generator: Google Tint Compiler; 0 -; Bound: 218 +; Bound: 204 ; Schema: 0 OpCapability Shader OpMemoryModel Logical GLSL450 OpEntryPoint GLCompute %f "f" OpExecutionMode %f LocalSize 1 1 1 - OpName %a_block "a_block" - OpMemberName %a_block 0 "inner" + OpName %a_block_std140 "a_block_std140" + OpMemberName %a_block_std140 0 "inner" OpName %Outer_std140 "Outer_std140" OpMemberName %Outer_std140 0 "a" OpName %Inner_std140 "Inner_std140" @@ -26,7 +26,7 @@ OpName %val_0 "val" OpName %arr "arr" OpName %i_0 "i" - OpName %var_for_index "var_for_index" + OpName %var_for_index_1 "var_for_index_1" OpName %Outer "Outer" OpMemberName %Outer 0 "a" OpName %conv_Outer "conv_Outer" @@ -35,22 +35,22 @@ OpName %val_2 "val" OpName %arr_0 "arr" OpName %i_1 "i" - OpName %var_for_index_1 "var_for_index_1" - OpName %load_a_p0_a_p1_m "load_a_p0_a_p1_m" + OpName %var_for_index "var_for_index" + OpName %load_a_inner_p0_a_p1_m "load_a_inner_p0_a_p1_m" OpName %p0 "p0" OpName %p1 "p1" - OpName %load_a_p0_a_p1_m_p2 "load_a_p0_a_p1_m_p2" + OpName %load_a_inner_p0_a_p1_m_p2 "load_a_inner_p0_a_p1_m_p2" OpName %p0_0 "p0" OpName %p1_0 "p1" OpName %p2 "p2" - OpName %load_a_p0_a_p1_m_p2_p3 "load_a_p0_a_p1_m_p2_p3" + OpName %load_a_inner_p0_a_p1_m_p2_p3 "load_a_inner_p0_a_p1_m_p2_p3" OpName %p0_1 "p0" OpName %p1_1 "p1" OpName %p2_0 "p2" OpName %p3 "p3" OpName %f "f" - OpDecorate %a_block Block - OpMemberDecorate %a_block 0 Offset 0 + OpDecorate %a_block_std140 Block + OpMemberDecorate %a_block_std140 0 Offset 0 OpMemberDecorate %Outer_std140 0 Offset 0 OpMemberDecorate %Inner_std140 0 Offset 0 OpMemberDecorate %Inner_std140 1 Offset 8 @@ -74,9 +74,9 @@ %_arr_Inner_std140_uint_4 = OpTypeArray %Inner_std140 %uint_4 %Outer_std140 = OpTypeStruct %_arr_Inner_std140_uint_4 %_arr_Outer_std140_uint_4 = OpTypeArray %Outer_std140 %uint_4 - %a_block = OpTypeStruct %_arr_Outer_std140_uint_4 -%_ptr_Uniform_a_block = OpTypePointer Uniform %a_block - %a = OpVariable %_ptr_Uniform_a_block Uniform +%a_block_std140 = OpTypeStruct %_arr_Outer_std140_uint_4 +%_ptr_Uniform_a_block_std140 = OpTypePointer Uniform %a_block_std140 + %a = OpVariable %_ptr_Uniform_a_block_std140 Uniform %int = OpTypeInt 32 1 %13 = OpConstantNull %int %_ptr_Private_int = OpTypePointer Private %int @@ -110,19 +110,19 @@ %_ptr_Function_Outer_std140 = OpTypePointer Function %Outer_std140 %110 = OpTypeFunction %mat3v2float %uint %uint %uint_0 = OpConstant %uint 0 +%_ptr_Uniform_Inner_std140 = OpTypePointer Uniform %Inner_std140 %_ptr_Uniform_v2float = OpTypePointer Uniform %v2float %uint_2 = OpConstant %uint 2 - %125 = OpTypeFunction %v2float %uint %uint %uint - %142 = OpConstantNull %v2float - %143 = OpTypeFunction %float %uint %uint %uint %uint + %131 = OpTypeFunction %v2float %uint %uint %uint + %148 = OpConstantNull %v2float + %149 = OpTypeFunction %float %uint %uint %uint %uint %_ptr_Uniform_float = OpTypePointer Uniform %float - %162 = OpConstantNull %float + %168 = OpConstantNull %float %void = OpTypeVoid - %163 = OpTypeFunction %void + %169 = OpTypeFunction %void %_ptr_Uniform__arr_Outer_std140_uint_4 = OpTypePointer Uniform %_arr_Outer_std140_uint_4 %_ptr_Uniform_Outer_std140 = OpTypePointer Uniform %Outer_std140 %_ptr_Uniform__arr_Inner_std140_uint_4 = OpTypePointer Uniform %_arr_Inner_std140_uint_4 -%_ptr_Uniform_Inner_std140 = OpTypePointer Uniform %Inner_std140 %i = OpFunction %int None %16 %18 = OpLabel %19 = OpLoad %int %counter @@ -146,7 +146,7 @@ %38 = OpLabel %arr = OpVariable %_ptr_Function__arr_Inner_uint_4 Function %41 %i_0 = OpVariable %_ptr_Function_uint Function %44 -%var_for_index = OpVariable %_ptr_Function__arr_Inner_std140_uint_4 Function %57 +%var_for_index_1 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4 Function %57 OpBranch %45 %45 = OpLabel OpLoopMerge %46 %47 None @@ -160,11 +160,11 @@ %54 = OpLabel OpBranch %46 %53 = OpLabel - OpStore %var_for_index %val_0 + OpStore %var_for_index_1 %val_0 %58 = OpLoad %uint %i_0 %60 = OpAccessChain %_ptr_Function_Inner %arr %58 %62 = OpLoad %uint %i_0 - %64 = OpAccessChain %_ptr_Function_Inner_std140 %var_for_index %62 + %64 = OpAccessChain %_ptr_Function_Inner_std140 %var_for_index_1 %62 %65 = OpLoad %Inner_std140 %64 %61 = OpFunctionCall %Inner %conv_Inner %65 OpStore %60 %61 @@ -191,7 +191,7 @@ %82 = OpLabel %arr_0 = OpVariable %_ptr_Function__arr_Outer_uint_4 Function %85 %i_1 = OpVariable %_ptr_Function_uint Function %44 -%var_for_index_1 = OpVariable %_ptr_Function__arr_Outer_std140_uint_4 Function %98 +%var_for_index = OpVariable %_ptr_Function__arr_Outer_std140_uint_4 Function %98 OpBranch %87 %87 = OpLabel OpLoopMerge %88 %89 None @@ -205,11 +205,11 @@ %95 = OpLabel OpBranch %88 %94 = OpLabel - OpStore %var_for_index_1 %val_2 + OpStore %var_for_index %val_2 %99 = OpLoad %uint %i_1 %101 = OpAccessChain %_ptr_Function_Outer %arr_0 %99 %103 = OpLoad %uint %i_1 - %105 = OpAccessChain %_ptr_Function_Outer_std140 %var_for_index_1 %103 + %105 = OpAccessChain %_ptr_Function_Outer_std140 %var_for_index %103 %106 = OpLoad %Outer_std140 %105 %102 = OpFunctionCall %Outer %conv_Outer %106 OpStore %101 %102 @@ -223,116 +223,98 @@ %109 = OpLoad %_arr_Outer_uint_4 %arr_0 OpReturnValue %109 OpFunctionEnd -%load_a_p0_a_p1_m = OpFunction %mat3v2float None %110 +%load_a_inner_p0_a_p1_m = OpFunction %mat3v2float None %110 %p0 = OpFunctionParameter %uint %p1 = OpFunctionParameter %uint %114 = OpLabel - %117 = OpAccessChain %_ptr_Uniform_v2float %a %uint_0 %p0 %uint_0 %p1 %uint_0 - %118 = OpLoad %v2float %117 - %119 = OpAccessChain %_ptr_Uniform_v2float %a %uint_0 %p0 %uint_0 %p1 %uint_1 - %120 = OpLoad %v2float %119 - %122 = OpAccessChain %_ptr_Uniform_v2float %a %uint_0 %p0 %uint_0 %p1 %uint_2 - %123 = OpLoad %v2float %122 - %124 = OpCompositeConstruct %mat3v2float %118 %120 %123 - OpReturnValue %124 + %118 = OpAccessChain %_ptr_Uniform_Inner_std140 %a %uint_0 %p0 %uint_0 %p1 + %121 = OpAccessChain %_ptr_Uniform_v2float %118 %uint_0 + %122 = OpLoad %v2float %121 + %124 = OpAccessChain %_ptr_Uniform_v2float %118 %uint_1 + %125 = OpLoad %v2float %124 + %128 = OpAccessChain %_ptr_Uniform_v2float %118 %uint_2 + %129 = OpLoad %v2float %128 + %130 = OpCompositeConstruct %mat3v2float %122 %125 %129 + OpReturnValue %130 OpFunctionEnd -%load_a_p0_a_p1_m_p2 = OpFunction %v2float None %125 +%load_a_inner_p0_a_p1_m_p2 = OpFunction %v2float None %131 %p0_0 = OpFunctionParameter %uint %p1_0 = OpFunctionParameter %uint %p2 = OpFunctionParameter %uint - %130 = OpLabel - OpSelectionMerge %131 None - OpSwitch %p2 %132 0 %133 1 %134 2 %135 - %133 = OpLabel - %136 = OpAccessChain %_ptr_Uniform_v2float %a %uint_0 %p0_0 %uint_0 %p1_0 %uint_0 - %137 = OpLoad %v2float %136 - OpReturnValue %137 - %134 = OpLabel - %138 = OpAccessChain %_ptr_Uniform_v2float %a %uint_0 %p0_0 %uint_0 %p1_0 %uint_1 - %139 = OpLoad %v2float %138 - OpReturnValue %139 - %135 = OpLabel - %140 = OpAccessChain %_ptr_Uniform_v2float %a %uint_0 %p0_0 %uint_0 %p1_0 %uint_2 - %141 = OpLoad %v2float %140 - OpReturnValue %141 - %132 = OpLabel - OpReturnValue %142 - %131 = OpLabel - OpReturnValue %142 + %136 = OpLabel + OpSelectionMerge %137 None + OpSwitch %p2 %138 0 %139 1 %140 2 %141 + %139 = OpLabel + %142 = OpAccessChain %_ptr_Uniform_v2float %a %uint_0 %p0_0 %uint_0 %p1_0 %uint_0 + %143 = OpLoad %v2float %142 + OpReturnValue %143 + %140 = OpLabel + %144 = OpAccessChain %_ptr_Uniform_v2float %a %uint_0 %p0_0 %uint_0 %p1_0 %uint_1 + %145 = OpLoad %v2float %144 + OpReturnValue %145 + %141 = OpLabel + %146 = OpAccessChain %_ptr_Uniform_v2float %a %uint_0 %p0_0 %uint_0 %p1_0 %uint_2 + %147 = OpLoad %v2float %146 + OpReturnValue %147 + %138 = OpLabel + OpReturnValue %148 + %137 = OpLabel + OpReturnValue %148 OpFunctionEnd -%load_a_p0_a_p1_m_p2_p3 = OpFunction %float None %143 +%load_a_inner_p0_a_p1_m_p2_p3 = OpFunction %float None %149 %p0_1 = OpFunctionParameter %uint %p1_1 = OpFunctionParameter %uint %p2_0 = OpFunctionParameter %uint %p3 = OpFunctionParameter %uint - %149 = OpLabel - OpSelectionMerge %150 None - OpSwitch %p2_0 %151 0 %152 1 %153 2 %154 - %152 = OpLabel - %156 = OpAccessChain %_ptr_Uniform_float %a %uint_0 %p0_1 %uint_0 %p1_1 %uint_0 %p3 - %157 = OpLoad %float %156 - OpReturnValue %157 - %153 = OpLabel - %158 = OpAccessChain %_ptr_Uniform_float %a %uint_0 %p0_1 %uint_0 %p1_1 %uint_1 %p3 - %159 = OpLoad %float %158 - OpReturnValue %159 - %154 = OpLabel - %160 = OpAccessChain %_ptr_Uniform_float %a %uint_0 %p0_1 %uint_0 %p1_1 %uint_2 %p3 - %161 = OpLoad %float %160 - OpReturnValue %161 - %151 = OpLabel - OpReturnValue %162 - %150 = OpLabel - OpReturnValue %162 + %155 = OpLabel + OpSelectionMerge %156 None + OpSwitch %p2_0 %157 0 %158 1 %159 2 %160 + %158 = OpLabel + %162 = OpAccessChain %_ptr_Uniform_float %a %uint_0 %p0_1 %uint_0 %p1_1 %uint_0 %p3 + %163 = OpLoad %float %162 + OpReturnValue %163 + %159 = OpLabel + %164 = OpAccessChain %_ptr_Uniform_float %a %uint_0 %p0_1 %uint_0 %p1_1 %uint_1 %p3 + %165 = OpLoad %float %164 + OpReturnValue %165 + %160 = OpLabel + %166 = OpAccessChain %_ptr_Uniform_float %a %uint_0 %p0_1 %uint_0 %p1_1 %uint_2 %p3 + %167 = OpLoad %float %166 + OpReturnValue %167 + %157 = OpLabel + OpReturnValue %168 + %156 = OpLabel + OpReturnValue %168 OpFunctionEnd - %f = OpFunction %void None %163 - %166 = OpLabel - %169 = OpAccessChain %_ptr_Uniform__arr_Outer_std140_uint_4 %a %uint_0 - %170 = OpLoad %_arr_Outer_std140_uint_4 %169 - %167 = OpFunctionCall %_arr_Outer_uint_4 %conv_arr_4_Outer %170 - %171 = OpFunctionCall %int %i - %174 = OpAccessChain %_ptr_Uniform_Outer_std140 %a %uint_0 %171 - %175 = OpLoad %Outer_std140 %174 - %172 = OpFunctionCall %Outer %conv_Outer %175 - %178 = OpAccessChain %_ptr_Uniform__arr_Inner_std140_uint_4 %a %uint_0 %171 %uint_0 - %179 = OpLoad %_arr_Inner_std140_uint_4 %178 - %176 = OpFunctionCall %_arr_Inner_uint_4 %conv_arr_4_Inner %179 - %180 = OpFunctionCall %int %i - %183 = OpAccessChain %_ptr_Uniform_Inner_std140 %a %uint_0 %171 %uint_0 %180 - %184 = OpLoad %Inner_std140 %183 - %181 = OpFunctionCall %Inner %conv_Inner %184 - %186 = OpBitcast %uint %171 - %187 = OpBitcast %uint %180 - %185 = OpFunctionCall %mat3v2float %load_a_p0_a_p1_m %186 %187 - %188 = OpFunctionCall %int %i - %190 = OpBitcast %uint %171 - %191 = OpBitcast %uint %180 - %192 = OpBitcast %uint %188 - %189 = OpFunctionCall %v2float %load_a_p0_a_p1_m_p2 %190 %191 %192 - %194 = OpAccessChain %_ptr_Uniform__arr_Outer_std140_uint_4 %a %uint_0 - %195 = OpLoad %_arr_Outer_std140_uint_4 %194 - %193 = OpFunctionCall %_arr_Outer_uint_4 %conv_arr_4_Outer %195 - %197 = OpAccessChain %_ptr_Uniform_Outer_std140 %a %uint_0 %171 - %198 = OpLoad %Outer_std140 %197 - %196 = OpFunctionCall %Outer %conv_Outer %198 - %200 = OpAccessChain %_ptr_Uniform__arr_Inner_std140_uint_4 %a %uint_0 %171 %uint_0 - %201 = OpLoad %_arr_Inner_std140_uint_4 %200 - %199 = OpFunctionCall %_arr_Inner_uint_4 %conv_arr_4_Inner %201 - %203 = OpAccessChain %_ptr_Uniform_Inner_std140 %a %uint_0 %171 %uint_0 %180 - %204 = OpLoad %Inner_std140 %203 - %202 = OpFunctionCall %Inner %conv_Inner %204 - %206 = OpBitcast %uint %171 - %207 = OpBitcast %uint %180 - %205 = OpFunctionCall %mat3v2float %load_a_p0_a_p1_m %206 %207 - %209 = OpBitcast %uint %171 - %210 = OpBitcast %uint %180 - %211 = OpBitcast %uint %188 - %208 = OpFunctionCall %v2float %load_a_p0_a_p1_m_p2 %209 %210 %211 - %212 = OpFunctionCall %int %i - %214 = OpBitcast %uint %171 - %215 = OpBitcast %uint %180 - %216 = OpBitcast %uint %188 - %217 = OpBitcast %uint %212 - %213 = OpFunctionCall %float %load_a_p0_a_p1_m_p2_p3 %214 %215 %216 %217 + %f = OpFunction %void None %169 + %172 = OpLabel + %173 = OpFunctionCall %int %i + %174 = OpFunctionCall %int %i + %175 = OpFunctionCall %int %i + %178 = OpAccessChain %_ptr_Uniform__arr_Outer_std140_uint_4 %a %uint_0 + %179 = OpLoad %_arr_Outer_std140_uint_4 %178 + %176 = OpFunctionCall %_arr_Outer_uint_4 %conv_arr_4_Outer %179 + %182 = OpAccessChain %_ptr_Uniform_Outer_std140 %a %uint_0 %173 + %183 = OpLoad %Outer_std140 %182 + %180 = OpFunctionCall %Outer %conv_Outer %183 + %186 = OpAccessChain %_ptr_Uniform__arr_Inner_std140_uint_4 %a %uint_0 %173 %uint_0 + %187 = OpLoad %_arr_Inner_std140_uint_4 %186 + %184 = OpFunctionCall %_arr_Inner_uint_4 %conv_arr_4_Inner %187 + %189 = OpAccessChain %_ptr_Uniform_Inner_std140 %a %uint_0 %173 %uint_0 %174 + %190 = OpLoad %Inner_std140 %189 + %188 = OpFunctionCall %Inner %conv_Inner %190 + %192 = OpBitcast %uint %173 + %193 = OpBitcast %uint %174 + %191 = OpFunctionCall %mat3v2float %load_a_inner_p0_a_p1_m %192 %193 + %195 = OpBitcast %uint %173 + %196 = OpBitcast %uint %174 + %197 = OpBitcast %uint %175 + %194 = OpFunctionCall %v2float %load_a_inner_p0_a_p1_m_p2 %195 %196 %197 + %198 = OpFunctionCall %int %i + %200 = OpBitcast %uint %173 + %201 = OpBitcast %uint %174 + %202 = OpBitcast %uint %175 + %203 = OpBitcast %uint %198 + %199 = OpFunctionCall %float %load_a_inner_p0_a_p1_m_p2_p3 %200 %201 %202 %203 OpReturn OpFunctionEnd diff --git a/test/tint/buffer/uniform/std140/mat3x2/dynamic_index_via_ptr.wgsl.expected.wgsl b/test/tint/buffer/uniform/std140/struct/mat3x2/dynamic_index_via_ptr.wgsl.expected.wgsl similarity index 98% rename from test/tint/buffer/uniform/std140/mat3x2/dynamic_index_via_ptr.wgsl.expected.wgsl rename to test/tint/buffer/uniform/std140/struct/mat3x2/dynamic_index_via_ptr.wgsl.expected.wgsl index aea4e87931..2ee243940a 100644 --- a/test/tint/buffer/uniform/std140/mat3x2/dynamic_index_via_ptr.wgsl.expected.wgsl +++ b/test/tint/buffer/uniform/std140/struct/mat3x2/dynamic_index_via_ptr.wgsl.expected.wgsl @@ -18,7 +18,6 @@ fn i() -> i32 { @compute @workgroup_size(1) fn f() { - let I = 1; let p_a = &(a); let p_a_i = &((*(p_a))[i()]); let p_a_i_a = &((*(p_a_i)).a); diff --git a/test/tint/buffer/uniform/std140/mat3x2/static_index_via_ptr.wgsl b/test/tint/buffer/uniform/std140/struct/mat3x2/static_index_via_ptr.wgsl similarity index 98% rename from test/tint/buffer/uniform/std140/mat3x2/static_index_via_ptr.wgsl rename to test/tint/buffer/uniform/std140/struct/mat3x2/static_index_via_ptr.wgsl index f52dbc0b80..d6e6f10edb 100644 --- a/test/tint/buffer/uniform/std140/mat3x2/static_index_via_ptr.wgsl +++ b/test/tint/buffer/uniform/std140/struct/mat3x2/static_index_via_ptr.wgsl @@ -10,8 +10,6 @@ struct Outer { @compute @workgroup_size(1) fn f() { - let I = 1; - let p_a = &a; let p_a_3 = &((*p_a)[3]); let p_a_3_a = &((*p_a_3).a); diff --git a/test/tint/buffer/uniform/std140/mat3x2/static_index_via_ptr.wgsl.expected.dxc.hlsl b/test/tint/buffer/uniform/std140/struct/mat3x2/static_index_via_ptr.wgsl.expected.dxc.hlsl similarity index 99% rename from test/tint/buffer/uniform/std140/mat3x2/static_index_via_ptr.wgsl.expected.dxc.hlsl rename to test/tint/buffer/uniform/std140/struct/mat3x2/static_index_via_ptr.wgsl.expected.dxc.hlsl index 5c6206245d..355820650f 100644 --- a/test/tint/buffer/uniform/std140/mat3x2/static_index_via_ptr.wgsl.expected.dxc.hlsl +++ b/test/tint/buffer/uniform/std140/struct/mat3x2/static_index_via_ptr.wgsl.expected.dxc.hlsl @@ -53,7 +53,6 @@ tint_symbol_ret tint_symbol(uint4 buffer[64], uint offset) { [numthreads(1, 1, 1)] void f() { - const int I = 1; const Outer l_a[4] = tint_symbol(a, 0u); const Outer l_a_3 = tint_symbol_1(a, 768u); const Inner l_a_3_a[4] = tint_symbol_2(a, 768u); diff --git a/test/tint/buffer/uniform/std140/mat3x2/static_index_via_ptr.wgsl.expected.fxc.hlsl b/test/tint/buffer/uniform/std140/struct/mat3x2/static_index_via_ptr.wgsl.expected.fxc.hlsl similarity index 99% rename from test/tint/buffer/uniform/std140/mat3x2/static_index_via_ptr.wgsl.expected.fxc.hlsl rename to test/tint/buffer/uniform/std140/struct/mat3x2/static_index_via_ptr.wgsl.expected.fxc.hlsl index 5c6206245d..355820650f 100644 --- a/test/tint/buffer/uniform/std140/mat3x2/static_index_via_ptr.wgsl.expected.fxc.hlsl +++ b/test/tint/buffer/uniform/std140/struct/mat3x2/static_index_via_ptr.wgsl.expected.fxc.hlsl @@ -53,7 +53,6 @@ tint_symbol_ret tint_symbol(uint4 buffer[64], uint offset) { [numthreads(1, 1, 1)] void f() { - const int I = 1; const Outer l_a[4] = tint_symbol(a, 0u); const Outer l_a_3 = tint_symbol_1(a, 768u); const Inner l_a_3_a[4] = tint_symbol_2(a, 768u); diff --git a/test/tint/buffer/uniform/std140/struct/mat3x2/static_index_via_ptr.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/struct/mat3x2/static_index_via_ptr.wgsl.expected.glsl new file mode 100644 index 0000000000..2d72a86a2e --- /dev/null +++ b/test/tint/buffer/uniform/std140/struct/mat3x2/static_index_via_ptr.wgsl.expected.glsl @@ -0,0 +1,97 @@ +#version 310 es + +struct Inner { + mat3x2 m; + uint pad; + uint pad_1; + uint pad_2; + uint pad_3; + uint pad_4; + uint pad_5; + uint pad_6; + uint pad_7; + uint pad_8; + uint pad_9; +}; + +struct Inner_std140 { + vec2 m_0; + vec2 m_1; + vec2 m_2; + uint pad; + uint pad_1; + uint pad_2; + uint pad_3; + uint pad_4; + uint pad_5; + uint pad_6; + uint pad_7; + uint pad_8; + uint pad_9; +}; + +struct Outer { + Inner a[4]; +}; + +struct Outer_std140 { + Inner_std140 a[4]; +}; + +layout(binding = 0, std140) uniform a_block_std140_ubo { + Outer_std140 inner[4]; +} a; + +Inner conv_Inner(Inner_std140 val) { + return Inner(mat3x2(val.m_0, val.m_1, val.m_2), val.pad, val.pad_1, val.pad_2, val.pad_3, val.pad_4, val.pad_5, val.pad_6, val.pad_7, val.pad_8, val.pad_9); +} + +Inner[4] conv_arr_4_Inner(Inner_std140 val[4]) { + Inner arr[4] = Inner[4](Inner(mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u), Inner(mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u), Inner(mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u), Inner(mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u)); + { + for(uint i = 0u; (i < 4u); i = (i + 1u)) { + arr[i] = conv_Inner(val[i]); + } + } + return arr; +} + +Outer conv_Outer(Outer_std140 val) { + return Outer(conv_arr_4_Inner(val.a)); +} + +Outer[4] conv_arr_4_Outer(Outer_std140 val[4]) { + Outer arr[4] = Outer[4](Outer(Inner[4](Inner(mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u), Inner(mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u), Inner(mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u), Inner(mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u))), Outer(Inner[4](Inner(mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u), Inner(mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u), Inner(mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u), Inner(mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u))), Outer(Inner[4](Inner(mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u), Inner(mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u), Inner(mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u), Inner(mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u))), Outer(Inner[4](Inner(mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u), Inner(mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u), Inner(mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u), Inner(mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u)))); + { + for(uint i = 0u; (i < 4u); i = (i + 1u)) { + arr[i] = conv_Outer(val[i]); + } + } + return arr; +} + +mat3x2 load_a_inner_3_a_2_m() { + return mat3x2(a.inner[3u].a[2u].m_0, a.inner[3u].a[2u].m_1, a.inner[3u].a[2u].m_2); +} + +void f() { + Outer p_a[4] = conv_arr_4_Outer(a.inner); + Outer p_a_3 = conv_Outer(a.inner[3u]); + Inner p_a_3_a[4] = conv_arr_4_Inner(a.inner[3u].a); + Inner p_a_3_a_2 = conv_Inner(a.inner[3u].a[2u]); + mat3x2 p_a_3_a_2_m = load_a_inner_3_a_2_m(); + vec2 p_a_3_a_2_m_1 = a.inner[3u].a[2u].m_1; + Outer l_a[4] = conv_arr_4_Outer(a.inner); + Outer l_a_3 = conv_Outer(a.inner[3u]); + Inner l_a_3_a[4] = conv_arr_4_Inner(a.inner[3u].a); + Inner l_a_3_a_2 = conv_Inner(a.inner[3u].a[2u]); + mat3x2 l_a_3_a_2_m = load_a_inner_3_a_2_m(); + vec2 l_a_3_a_2_m_1 = a.inner[3u].a[2u].m_1; + float l_a_3_a_2_m_1_0 = a.inner[3u].a[2u].m_1[0u]; +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + f(); + return; +} diff --git a/test/tint/buffer/uniform/std140/mat3x2/static_index_via_ptr.wgsl.expected.msl b/test/tint/buffer/uniform/std140/struct/mat3x2/static_index_via_ptr.wgsl.expected.msl similarity index 98% rename from test/tint/buffer/uniform/std140/mat3x2/static_index_via_ptr.wgsl.expected.msl rename to test/tint/buffer/uniform/std140/struct/mat3x2/static_index_via_ptr.wgsl.expected.msl index e9a1217867..e47575622d 100644 --- a/test/tint/buffer/uniform/std140/mat3x2/static_index_via_ptr.wgsl.expected.msl +++ b/test/tint/buffer/uniform/std140/struct/mat3x2/static_index_via_ptr.wgsl.expected.msl @@ -24,7 +24,6 @@ struct Outer { }; kernel void f(const constant tint_array* tint_symbol [[buffer(0)]]) { - int const I = 1; tint_array const l_a = *(tint_symbol); Outer const l_a_3 = (*(tint_symbol))[3]; tint_array const l_a_3_a = (*(tint_symbol))[3].a; diff --git a/test/tint/buffer/uniform/std140/mat3x2/static_index_via_ptr.wgsl.expected.spvasm b/test/tint/buffer/uniform/std140/struct/mat3x2/static_index_via_ptr.wgsl.expected.spvasm similarity index 71% rename from test/tint/buffer/uniform/std140/mat3x2/static_index_via_ptr.wgsl.expected.spvasm rename to test/tint/buffer/uniform/std140/struct/mat3x2/static_index_via_ptr.wgsl.expected.spvasm index 63a09e65e5..cfe19266b1 100644 --- a/test/tint/buffer/uniform/std140/mat3x2/static_index_via_ptr.wgsl.expected.spvasm +++ b/test/tint/buffer/uniform/std140/struct/mat3x2/static_index_via_ptr.wgsl.expected.spvasm @@ -1,14 +1,14 @@ ; SPIR-V ; Version: 1.3 ; Generator: Google Tint Compiler; 0 -; Bound: 156 +; Bound: 144 ; Schema: 0 OpCapability Shader OpMemoryModel Logical GLSL450 OpEntryPoint GLCompute %f "f" OpExecutionMode %f LocalSize 1 1 1 - OpName %a_block "a_block" - OpMemberName %a_block 0 "inner" + OpName %a_block_std140 "a_block_std140" + OpMemberName %a_block_std140 0 "inner" OpName %Outer_std140 "Outer_std140" OpMemberName %Outer_std140 0 "a" OpName %Inner_std140 "Inner_std140" @@ -24,7 +24,7 @@ OpName %val_0 "val" OpName %arr "arr" OpName %i "i" - OpName %var_for_index "var_for_index" + OpName %var_for_index_1 "var_for_index_1" OpName %Outer "Outer" OpMemberName %Outer 0 "a" OpName %conv_Outer "conv_Outer" @@ -33,11 +33,11 @@ OpName %val_2 "val" OpName %arr_0 "arr" OpName %i_0 "i" - OpName %var_for_index_1 "var_for_index_1" - OpName %load_a_3_a_2_m "load_a_3_a_2_m" + OpName %var_for_index "var_for_index" + OpName %load_a_inner_3_a_2_m "load_a_inner_3_a_2_m" OpName %f "f" - OpDecorate %a_block Block - OpMemberDecorate %a_block 0 Offset 0 + OpDecorate %a_block_std140 Block + OpMemberDecorate %a_block_std140 0 Offset 0 OpMemberDecorate %Outer_std140 0 Offset 0 OpMemberDecorate %Inner_std140 0 Offset 0 OpMemberDecorate %Inner_std140 1 Offset 8 @@ -61,9 +61,9 @@ %_arr_Inner_std140_uint_4 = OpTypeArray %Inner_std140 %uint_4 %Outer_std140 = OpTypeStruct %_arr_Inner_std140_uint_4 %_arr_Outer_std140_uint_4 = OpTypeArray %Outer_std140 %uint_4 - %a_block = OpTypeStruct %_arr_Outer_std140_uint_4 -%_ptr_Uniform_a_block = OpTypePointer Uniform %a_block - %a = OpVariable %_ptr_Uniform_a_block Uniform +%a_block_std140 = OpTypeStruct %_arr_Outer_std140_uint_4 +%_ptr_Uniform_a_block_std140 = OpTypePointer Uniform %a_block_std140 + %a = OpVariable %_ptr_Uniform_a_block_std140 Uniform %mat3v2float = OpTypeMatrix %v2float 3 %Inner = OpTypeStruct %mat3v2float %12 = OpTypeFunction %Inner %Inner_std140 @@ -93,15 +93,13 @@ %uint_0 = OpConstant %uint 0 %uint_3 = OpConstant %uint 3 %uint_2 = OpConstant %uint 2 +%_ptr_Uniform_Inner_std140 = OpTypePointer Uniform %Inner_std140 %_ptr_Uniform_v2float = OpTypePointer Uniform %v2float %void = OpTypeVoid - %113 = OpTypeFunction %void - %int = OpTypeInt 32 1 - %int_1 = OpConstant %int 1 + %119 = OpTypeFunction %void %_ptr_Uniform__arr_Outer_std140_uint_4 = OpTypePointer Uniform %_arr_Outer_std140_uint_4 %_ptr_Uniform_Outer_std140 = OpTypePointer Uniform %Outer_std140 %_ptr_Uniform__arr_Inner_std140_uint_4 = OpTypePointer Uniform %_arr_Inner_std140_uint_4 -%_ptr_Uniform_Inner_std140 = OpTypePointer Uniform %Inner_std140 %_ptr_Uniform_float = OpTypePointer Uniform %float %conv_Inner = OpFunction %Inner None %12 %val = OpFunctionParameter %Inner_std140 @@ -118,7 +116,7 @@ %27 = OpLabel %arr = OpVariable %_ptr_Function__arr_Inner_uint_4 Function %30 %i = OpVariable %_ptr_Function_uint Function %33 -%var_for_index = OpVariable %_ptr_Function__arr_Inner_std140_uint_4 Function %46 +%var_for_index_1 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4 Function %46 OpBranch %34 %34 = OpLabel OpLoopMerge %35 %36 None @@ -132,11 +130,11 @@ %43 = OpLabel OpBranch %35 %42 = OpLabel - OpStore %var_for_index %val_0 + OpStore %var_for_index_1 %val_0 %47 = OpLoad %uint %i %49 = OpAccessChain %_ptr_Function_Inner %arr %47 %51 = OpLoad %uint %i - %53 = OpAccessChain %_ptr_Function_Inner_std140 %var_for_index %51 + %53 = OpAccessChain %_ptr_Function_Inner_std140 %var_for_index_1 %51 %54 = OpLoad %Inner_std140 %53 %50 = OpFunctionCall %Inner %conv_Inner %54 OpStore %49 %50 @@ -163,7 +161,7 @@ %71 = OpLabel %arr_0 = OpVariable %_ptr_Function__arr_Outer_uint_4 Function %74 %i_0 = OpVariable %_ptr_Function_uint Function %33 -%var_for_index_1 = OpVariable %_ptr_Function__arr_Outer_std140_uint_4 Function %87 +%var_for_index = OpVariable %_ptr_Function__arr_Outer_std140_uint_4 Function %87 OpBranch %76 %76 = OpLabel OpLoopMerge %77 %78 None @@ -177,11 +175,11 @@ %84 = OpLabel OpBranch %77 %83 = OpLabel - OpStore %var_for_index_1 %val_2 + OpStore %var_for_index %val_2 %88 = OpLoad %uint %i_0 %90 = OpAccessChain %_ptr_Function_Outer %arr_0 %88 %92 = OpLoad %uint %i_0 - %94 = OpAccessChain %_ptr_Function_Outer_std140 %var_for_index_1 %92 + %94 = OpAccessChain %_ptr_Function_Outer_std140 %var_for_index %92 %95 = OpLoad %Outer_std140 %94 %91 = OpFunctionCall %Outer %conv_Outer %95 OpStore %90 %91 @@ -195,50 +193,36 @@ %98 = OpLoad %_arr_Outer_uint_4 %arr_0 OpReturnValue %98 OpFunctionEnd -%load_a_3_a_2_m = OpFunction %mat3v2float None %99 +%load_a_inner_3_a_2_m = OpFunction %mat3v2float None %99 %101 = OpLabel - %106 = OpAccessChain %_ptr_Uniform_v2float %a %uint_0 %uint_3 %uint_0 %uint_2 %uint_0 - %107 = OpLoad %v2float %106 - %108 = OpAccessChain %_ptr_Uniform_v2float %a %uint_0 %uint_3 %uint_0 %uint_2 %uint_1 - %109 = OpLoad %v2float %108 - %110 = OpAccessChain %_ptr_Uniform_v2float %a %uint_0 %uint_3 %uint_0 %uint_2 %uint_2 + %107 = OpAccessChain %_ptr_Uniform_Inner_std140 %a %uint_0 %uint_3 %uint_0 %uint_2 + %110 = OpAccessChain %_ptr_Uniform_v2float %107 %uint_0 %111 = OpLoad %v2float %110 - %112 = OpCompositeConstruct %mat3v2float %107 %109 %111 - OpReturnValue %112 + %113 = OpAccessChain %_ptr_Uniform_v2float %107 %uint_1 + %114 = OpLoad %v2float %113 + %116 = OpAccessChain %_ptr_Uniform_v2float %107 %uint_2 + %117 = OpLoad %v2float %116 + %118 = OpCompositeConstruct %mat3v2float %111 %114 %117 + OpReturnValue %118 OpFunctionEnd - %f = OpFunction %void None %113 - %116 = OpLabel - %121 = OpAccessChain %_ptr_Uniform__arr_Outer_std140_uint_4 %a %uint_0 - %122 = OpLoad %_arr_Outer_std140_uint_4 %121 - %119 = OpFunctionCall %_arr_Outer_uint_4 %conv_arr_4_Outer %122 - %125 = OpAccessChain %_ptr_Uniform_Outer_std140 %a %uint_0 %uint_3 - %126 = OpLoad %Outer_std140 %125 - %123 = OpFunctionCall %Outer %conv_Outer %126 - %129 = OpAccessChain %_ptr_Uniform__arr_Inner_std140_uint_4 %a %uint_0 %uint_3 %uint_0 - %130 = OpLoad %_arr_Inner_std140_uint_4 %129 - %127 = OpFunctionCall %_arr_Inner_uint_4 %conv_arr_4_Inner %130 - %133 = OpAccessChain %_ptr_Uniform_Inner_std140 %a %uint_0 %uint_3 %uint_0 %uint_2 - %134 = OpLoad %Inner_std140 %133 - %131 = OpFunctionCall %Inner %conv_Inner %134 - %135 = OpFunctionCall %mat3v2float %load_a_3_a_2_m - %136 = OpAccessChain %_ptr_Uniform_v2float %a %uint_0 %uint_3 %uint_0 %uint_2 %uint_1 - %137 = OpLoad %v2float %136 - %139 = OpAccessChain %_ptr_Uniform__arr_Outer_std140_uint_4 %a %uint_0 - %140 = OpLoad %_arr_Outer_std140_uint_4 %139 - %138 = OpFunctionCall %_arr_Outer_uint_4 %conv_arr_4_Outer %140 - %142 = OpAccessChain %_ptr_Uniform_Outer_std140 %a %uint_0 %uint_3 - %143 = OpLoad %Outer_std140 %142 - %141 = OpFunctionCall %Outer %conv_Outer %143 - %145 = OpAccessChain %_ptr_Uniform__arr_Inner_std140_uint_4 %a %uint_0 %uint_3 %uint_0 - %146 = OpLoad %_arr_Inner_std140_uint_4 %145 - %144 = OpFunctionCall %_arr_Inner_uint_4 %conv_arr_4_Inner %146 - %148 = OpAccessChain %_ptr_Uniform_Inner_std140 %a %uint_0 %uint_3 %uint_0 %uint_2 - %149 = OpLoad %Inner_std140 %148 - %147 = OpFunctionCall %Inner %conv_Inner %149 - %150 = OpFunctionCall %mat3v2float %load_a_3_a_2_m - %151 = OpAccessChain %_ptr_Uniform_v2float %a %uint_0 %uint_3 %uint_0 %uint_2 %uint_1 - %152 = OpLoad %v2float %151 - %154 = OpAccessChain %_ptr_Uniform_float %a %uint_0 %uint_3 %uint_0 %uint_2 %uint_1 %33 - %155 = OpLoad %float %154 + %f = OpFunction %void None %119 + %122 = OpLabel + %125 = OpAccessChain %_ptr_Uniform__arr_Outer_std140_uint_4 %a %uint_0 + %126 = OpLoad %_arr_Outer_std140_uint_4 %125 + %123 = OpFunctionCall %_arr_Outer_uint_4 %conv_arr_4_Outer %126 + %129 = OpAccessChain %_ptr_Uniform_Outer_std140 %a %uint_0 %uint_3 + %130 = OpLoad %Outer_std140 %129 + %127 = OpFunctionCall %Outer %conv_Outer %130 + %133 = OpAccessChain %_ptr_Uniform__arr_Inner_std140_uint_4 %a %uint_0 %uint_3 %uint_0 + %134 = OpLoad %_arr_Inner_std140_uint_4 %133 + %131 = OpFunctionCall %_arr_Inner_uint_4 %conv_arr_4_Inner %134 + %136 = OpAccessChain %_ptr_Uniform_Inner_std140 %a %uint_0 %uint_3 %uint_0 %uint_2 + %137 = OpLoad %Inner_std140 %136 + %135 = OpFunctionCall %Inner %conv_Inner %137 + %138 = OpFunctionCall %mat3v2float %load_a_inner_3_a_2_m + %139 = OpAccessChain %_ptr_Uniform_v2float %a %uint_0 %uint_3 %uint_0 %uint_2 %uint_1 + %140 = OpLoad %v2float %139 + %142 = OpAccessChain %_ptr_Uniform_float %a %uint_0 %uint_3 %uint_0 %uint_2 %uint_1 %33 + %143 = OpLoad %float %142 OpReturn OpFunctionEnd diff --git a/test/tint/buffer/uniform/std140/mat3x2/static_index_via_ptr.wgsl.expected.wgsl b/test/tint/buffer/uniform/std140/struct/mat3x2/static_index_via_ptr.wgsl.expected.wgsl similarity index 98% rename from test/tint/buffer/uniform/std140/mat3x2/static_index_via_ptr.wgsl.expected.wgsl rename to test/tint/buffer/uniform/std140/struct/mat3x2/static_index_via_ptr.wgsl.expected.wgsl index bea0f53e25..73396eed3a 100644 --- a/test/tint/buffer/uniform/std140/mat3x2/static_index_via_ptr.wgsl.expected.wgsl +++ b/test/tint/buffer/uniform/std140/struct/mat3x2/static_index_via_ptr.wgsl.expected.wgsl @@ -11,7 +11,6 @@ struct Outer { @compute @workgroup_size(1) fn f() { - let I = 1; let p_a = &(a); let p_a_3 = &((*(p_a))[3]); let p_a_3_a = &((*(p_a_3)).a); diff --git a/test/tint/buffer/uniform/std140/mat3x2/to_builtin.wgsl b/test/tint/buffer/uniform/std140/struct/mat3x2/to_builtin.wgsl similarity index 100% rename from test/tint/buffer/uniform/std140/mat3x2/to_builtin.wgsl rename to test/tint/buffer/uniform/std140/struct/mat3x2/to_builtin.wgsl diff --git a/test/tint/buffer/uniform/std140/mat3x2/to_builtin.wgsl.expected.dxc.hlsl b/test/tint/buffer/uniform/std140/struct/mat3x2/to_builtin.wgsl.expected.dxc.hlsl similarity index 100% rename from test/tint/buffer/uniform/std140/mat3x2/to_builtin.wgsl.expected.dxc.hlsl rename to test/tint/buffer/uniform/std140/struct/mat3x2/to_builtin.wgsl.expected.dxc.hlsl diff --git a/test/tint/buffer/uniform/std140/mat3x2/to_builtin.wgsl.expected.fxc.hlsl b/test/tint/buffer/uniform/std140/struct/mat3x2/to_builtin.wgsl.expected.fxc.hlsl similarity index 100% rename from test/tint/buffer/uniform/std140/mat3x2/to_builtin.wgsl.expected.fxc.hlsl rename to test/tint/buffer/uniform/std140/struct/mat3x2/to_builtin.wgsl.expected.fxc.hlsl diff --git a/test/tint/buffer/uniform/std140/mat3x2/to_builtin.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/struct/mat3x2/to_builtin.wgsl.expected.glsl similarity index 73% rename from test/tint/buffer/uniform/std140/mat3x2/to_builtin.wgsl.expected.glsl rename to test/tint/buffer/uniform/std140/struct/mat3x2/to_builtin.wgsl.expected.glsl index 2d02c4d32a..93a683e0ce 100644 --- a/test/tint/buffer/uniform/std140/mat3x2/to_builtin.wgsl.expected.glsl +++ b/test/tint/buffer/uniform/std140/struct/mat3x2/to_builtin.wgsl.expected.glsl @@ -2,8 +2,12 @@ struct S { int before; + uint pad; mat3x2 m; + uint pad_1; + uint pad_2; int after; + uint pad_3; }; struct S_std140 { @@ -18,16 +22,16 @@ struct S_std140 { uint pad_3; }; -layout(binding = 0, std140) uniform u_block_ubo { +layout(binding = 0, std140) uniform u_block_std140_ubo { S_std140 inner[4]; } u; -mat3x2 load_u_2_m() { +mat3x2 load_u_inner_2_m() { return mat3x2(u.inner[2u].m_0, u.inner[2u].m_1, u.inner[2u].m_2); } void f() { - mat2x3 t = transpose(load_u_2_m()); + mat2x3 t = transpose(load_u_inner_2_m()); float l = length(u.inner[0u].m_1.yx); float a = abs(u.inner[0u].m_1.yx[0u]); } diff --git a/test/tint/buffer/uniform/std140/mat3x2/to_builtin.wgsl.expected.msl b/test/tint/buffer/uniform/std140/struct/mat3x2/to_builtin.wgsl.expected.msl similarity index 100% rename from test/tint/buffer/uniform/std140/mat3x2/to_builtin.wgsl.expected.msl rename to test/tint/buffer/uniform/std140/struct/mat3x2/to_builtin.wgsl.expected.msl diff --git a/test/tint/buffer/uniform/std140/struct/mat3x2/to_builtin.wgsl.expected.spvasm b/test/tint/buffer/uniform/std140/struct/mat3x2/to_builtin.wgsl.expected.spvasm new file mode 100644 index 0000000000..ab0ed96e4c --- /dev/null +++ b/test/tint/buffer/uniform/std140/struct/mat3x2/to_builtin.wgsl.expected.spvasm @@ -0,0 +1,82 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 52 +; Schema: 0 + OpCapability Shader + %42 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %f "f" + OpExecutionMode %f LocalSize 1 1 1 + OpName %u_block_std140 "u_block_std140" + OpMemberName %u_block_std140 0 "inner" + OpName %S_std140 "S_std140" + OpMemberName %S_std140 0 "before" + OpMemberName %S_std140 1 "m_0" + OpMemberName %S_std140 2 "m_1" + OpMemberName %S_std140 3 "m_2" + OpMemberName %S_std140 4 "after" + OpName %u "u" + OpName %load_u_inner_2_m "load_u_inner_2_m" + OpName %f "f" + OpDecorate %u_block_std140 Block + OpMemberDecorate %u_block_std140 0 Offset 0 + OpMemberDecorate %S_std140 0 Offset 0 + OpMemberDecorate %S_std140 1 Offset 8 + OpMemberDecorate %S_std140 2 Offset 16 + OpMemberDecorate %S_std140 3 Offset 24 + OpMemberDecorate %S_std140 4 Offset 40 + OpDecorate %_arr_S_std140_uint_4 ArrayStride 48 + OpDecorate %u NonWritable + OpDecorate %u DescriptorSet 0 + OpDecorate %u Binding 0 + %int = OpTypeInt 32 1 + %float = OpTypeFloat 32 + %v2float = OpTypeVector %float 2 + %S_std140 = OpTypeStruct %int %v2float %v2float %v2float %int + %uint = OpTypeInt 32 0 + %uint_4 = OpConstant %uint 4 +%_arr_S_std140_uint_4 = OpTypeArray %S_std140 %uint_4 +%u_block_std140 = OpTypeStruct %_arr_S_std140_uint_4 +%_ptr_Uniform_u_block_std140 = OpTypePointer Uniform %u_block_std140 + %u = OpVariable %_ptr_Uniform_u_block_std140 Uniform +%mat3v2float = OpTypeMatrix %v2float 3 + %11 = OpTypeFunction %mat3v2float + %uint_0 = OpConstant %uint 0 + %uint_2 = OpConstant %uint 2 +%_ptr_Uniform_S_std140 = OpTypePointer Uniform %S_std140 + %uint_1 = OpConstant %uint 1 +%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float + %uint_3 = OpConstant %uint 3 + %void = OpTypeVoid + %33 = OpTypeFunction %void + %v3float = OpTypeVector %float 3 +%mat2v3float = OpTypeMatrix %v3float 2 + %43 = OpConstantNull %uint +%load_u_inner_2_m = OpFunction %mat3v2float None %11 + %14 = OpLabel + %19 = OpAccessChain %_ptr_Uniform_S_std140 %u %uint_0 %uint_2 + %23 = OpAccessChain %_ptr_Uniform_v2float %19 %uint_1 + %24 = OpLoad %v2float %23 + %26 = OpAccessChain %_ptr_Uniform_v2float %19 %uint_2 + %27 = OpLoad %v2float %26 + %30 = OpAccessChain %_ptr_Uniform_v2float %19 %uint_3 + %31 = OpLoad %v2float %30 + %32 = OpCompositeConstruct %mat3v2float %24 %27 %31 + OpReturnValue %32 + OpFunctionEnd + %f = OpFunction %void None %33 + %36 = OpLabel + %40 = OpFunctionCall %mat3v2float %load_u_inner_2_m + %37 = OpTranspose %mat2v3float %40 + %44 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 %43 %uint_2 + %45 = OpLoad %v2float %44 + %46 = OpVectorShuffle %v2float %45 %45 1 0 + %41 = OpExtInst %float %42 Length %46 + %48 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 %43 %uint_2 + %49 = OpLoad %v2float %48 + %50 = OpVectorShuffle %v2float %49 %49 1 0 + %51 = OpCompositeExtract %float %50 0 + %47 = OpExtInst %float %42 FAbs %51 + OpReturn + OpFunctionEnd diff --git a/test/tint/buffer/uniform/std140/mat3x2/to_builtin.wgsl.expected.wgsl b/test/tint/buffer/uniform/std140/struct/mat3x2/to_builtin.wgsl.expected.wgsl similarity index 100% rename from test/tint/buffer/uniform/std140/mat3x2/to_builtin.wgsl.expected.wgsl rename to test/tint/buffer/uniform/std140/struct/mat3x2/to_builtin.wgsl.expected.wgsl diff --git a/test/tint/buffer/uniform/std140/mat3x2/to_fn.wgsl b/test/tint/buffer/uniform/std140/struct/mat3x2/to_fn.wgsl similarity index 100% rename from test/tint/buffer/uniform/std140/mat3x2/to_fn.wgsl rename to test/tint/buffer/uniform/std140/struct/mat3x2/to_fn.wgsl diff --git a/test/tint/buffer/uniform/std140/mat3x2/to_fn.wgsl.expected.dxc.hlsl b/test/tint/buffer/uniform/std140/struct/mat3x2/to_fn.wgsl.expected.dxc.hlsl similarity index 100% rename from test/tint/buffer/uniform/std140/mat3x2/to_fn.wgsl.expected.dxc.hlsl rename to test/tint/buffer/uniform/std140/struct/mat3x2/to_fn.wgsl.expected.dxc.hlsl diff --git a/test/tint/buffer/uniform/std140/mat3x2/to_fn.wgsl.expected.fxc.hlsl b/test/tint/buffer/uniform/std140/struct/mat3x2/to_fn.wgsl.expected.fxc.hlsl similarity index 100% rename from test/tint/buffer/uniform/std140/mat3x2/to_fn.wgsl.expected.fxc.hlsl rename to test/tint/buffer/uniform/std140/struct/mat3x2/to_fn.wgsl.expected.fxc.hlsl diff --git a/test/tint/buffer/uniform/std140/mat3x2/to_fn.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/struct/mat3x2/to_fn.wgsl.expected.glsl similarity index 50% rename from test/tint/buffer/uniform/std140/mat3x2/to_fn.wgsl.expected.glsl rename to test/tint/buffer/uniform/std140/struct/mat3x2/to_fn.wgsl.expected.glsl index cb73e8774d..720e66bcd0 100644 --- a/test/tint/buffer/uniform/std140/mat3x2/to_fn.wgsl.expected.glsl +++ b/test/tint/buffer/uniform/std140/struct/mat3x2/to_fn.wgsl.expected.glsl @@ -2,8 +2,20 @@ struct S { int before; + uint pad; mat3x2 m; + uint pad_1; + uint pad_2; + uint pad_3; + uint pad_4; + uint pad_5; + uint pad_6; + uint pad_7; + uint pad_8; + uint pad_9; + uint pad_10; int after; + uint pad_11; }; struct S_std140 { @@ -26,7 +38,7 @@ struct S_std140 { uint pad_11; }; -layout(binding = 0, std140) uniform u_block_ubo { +layout(binding = 0, std140) uniform u_block_std140_ubo { S_std140 inner[4]; } u; @@ -46,12 +58,11 @@ void e(float f_1) { } S conv_S(S_std140 val) { - S tint_symbol = S(val.before, mat3x2(val.m_0, val.m_1, val.m_2), val.after); - return tint_symbol; + return S(val.before, val.pad, mat3x2(val.m_0, val.m_1, val.m_2), val.pad_1, val.pad_2, val.pad_3, val.pad_4, val.pad_5, val.pad_6, val.pad_7, val.pad_8, val.pad_9, val.pad_10, val.after, val.pad_11); } S[4] conv_arr_4_S(S_std140 val[4]) { - S arr[4] = S[4](S(0, mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), 0), S(0, mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), 0), S(0, mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), 0), S(0, mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), 0)); + S arr[4] = S[4](S(0, 0u, mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0, 0u), S(0, 0u, mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0, 0u), S(0, 0u, mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0, 0u), S(0, 0u, mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0, 0u)); { for(uint i = 0u; (i < 4u); i = (i + 1u)) { arr[i] = conv_S(val[i]); @@ -60,14 +71,14 @@ S[4] conv_arr_4_S(S_std140 val[4]) { return arr; } -mat3x2 load_u_2_m() { +mat3x2 load_u_inner_2_m() { return mat3x2(u.inner[2u].m_0, u.inner[2u].m_1, u.inner[2u].m_2); } void f() { a(conv_arr_4_S(u.inner)); b(conv_S(u.inner[2u])); - c(load_u_2_m()); + c(load_u_inner_2_m()); d(u.inner[0u].m_1.yx); e(u.inner[0u].m_1.yx[0u]); } diff --git a/test/tint/buffer/uniform/std140/mat3x2/to_fn.wgsl.expected.msl b/test/tint/buffer/uniform/std140/struct/mat3x2/to_fn.wgsl.expected.msl similarity index 100% rename from test/tint/buffer/uniform/std140/mat3x2/to_fn.wgsl.expected.msl rename to test/tint/buffer/uniform/std140/struct/mat3x2/to_fn.wgsl.expected.msl diff --git a/test/tint/buffer/uniform/std140/mat3x2/to_fn.wgsl.expected.spvasm b/test/tint/buffer/uniform/std140/struct/mat3x2/to_fn.wgsl.expected.spvasm similarity index 76% rename from test/tint/buffer/uniform/std140/mat3x2/to_fn.wgsl.expected.spvasm rename to test/tint/buffer/uniform/std140/struct/mat3x2/to_fn.wgsl.expected.spvasm index b6ae5ab285..148b7b6d9d 100644 --- a/test/tint/buffer/uniform/std140/mat3x2/to_fn.wgsl.expected.spvasm +++ b/test/tint/buffer/uniform/std140/struct/mat3x2/to_fn.wgsl.expected.spvasm @@ -1,14 +1,14 @@ ; SPIR-V ; Version: 1.3 ; Generator: Google Tint Compiler; 0 -; Bound: 119 +; Bound: 124 ; Schema: 0 OpCapability Shader OpMemoryModel Logical GLSL450 OpEntryPoint GLCompute %f "f" OpExecutionMode %f LocalSize 1 1 1 - OpName %u_block "u_block" - OpMemberName %u_block 0 "inner" + OpName %u_block_std140 "u_block_std140" + OpMemberName %u_block_std140 0 "inner" OpName %S_std140 "S_std140" OpMemberName %S_std140 0 "before" OpMemberName %S_std140 1 "m_0" @@ -37,10 +37,10 @@ OpName %arr "arr" OpName %i "i" OpName %var_for_index "var_for_index" - OpName %load_u_2_m "load_u_2_m" + OpName %load_u_inner_2_m "load_u_inner_2_m" OpName %f "f" - OpDecorate %u_block Block - OpMemberDecorate %u_block 0 Offset 0 + OpDecorate %u_block_std140 Block + OpMemberDecorate %u_block_std140 0 Offset 0 OpMemberDecorate %S_std140 0 Offset 0 OpMemberDecorate %S_std140 1 Offset 8 OpMemberDecorate %S_std140 2 Offset 16 @@ -63,9 +63,9 @@ %uint = OpTypeInt 32 0 %uint_4 = OpConstant %uint 4 %_arr_S_std140_uint_4 = OpTypeArray %S_std140 %uint_4 - %u_block = OpTypeStruct %_arr_S_std140_uint_4 -%_ptr_Uniform_u_block = OpTypePointer Uniform %u_block - %u = OpVariable %_ptr_Uniform_u_block Uniform +%u_block_std140 = OpTypeStruct %_arr_S_std140_uint_4 +%_ptr_Uniform_u_block_std140 = OpTypePointer Uniform %u_block_std140 + %u = OpVariable %_ptr_Uniform_u_block_std140 Uniform %void = OpTypeVoid %mat3v2float = OpTypeMatrix %v2float 3 %S = OpTypeStruct %int %mat3v2float %int @@ -90,11 +90,11 @@ %81 = OpTypeFunction %mat3v2float %uint_0 = OpConstant %uint 0 %uint_2 = OpConstant %uint 2 +%_ptr_Uniform_S_std140 = OpTypePointer Uniform %S_std140 %_ptr_Uniform_v2float = OpTypePointer Uniform %v2float %uint_3 = OpConstant %uint 3 - %95 = OpTypeFunction %void + %101 = OpTypeFunction %void %_ptr_Uniform__arr_S_std140_uint_4 = OpTypePointer Uniform %_arr_S_std140_uint_4 -%_ptr_Uniform_S_std140 = OpTypePointer Uniform %S_std140 %a = OpFunction %void None %11 %a_1 = OpFunctionParameter %_arr_S_uint_4 %18 = OpLabel @@ -169,37 +169,38 @@ %80 = OpLoad %_arr_S_uint_4 %arr OpReturnValue %80 OpFunctionEnd - %load_u_2_m = OpFunction %mat3v2float None %81 +%load_u_inner_2_m = OpFunction %mat3v2float None %81 %83 = OpLabel - %87 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 %uint_2 %uint_1 - %88 = OpLoad %v2float %87 - %89 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 %uint_2 %uint_2 - %90 = OpLoad %v2float %89 - %92 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 %uint_2 %uint_3 - %93 = OpLoad %v2float %92 - %94 = OpCompositeConstruct %mat3v2float %88 %90 %93 - OpReturnValue %94 + %88 = OpAccessChain %_ptr_Uniform_S_std140 %u %uint_0 %uint_2 + %91 = OpAccessChain %_ptr_Uniform_v2float %88 %uint_1 + %92 = OpLoad %v2float %91 + %94 = OpAccessChain %_ptr_Uniform_v2float %88 %uint_2 + %95 = OpLoad %v2float %94 + %98 = OpAccessChain %_ptr_Uniform_v2float %88 %uint_3 + %99 = OpLoad %v2float %98 + %100 = OpCompositeConstruct %mat3v2float %92 %95 %99 + OpReturnValue %100 OpFunctionEnd - %f = OpFunction %void None %95 - %97 = OpLabel - %101 = OpAccessChain %_ptr_Uniform__arr_S_std140_uint_4 %u %uint_0 - %102 = OpLoad %_arr_S_std140_uint_4 %101 - %99 = OpFunctionCall %_arr_S_uint_4 %conv_arr_4_S %102 - %98 = OpFunctionCall %void %a %99 - %106 = OpAccessChain %_ptr_Uniform_S_std140 %u %uint_0 %uint_2 - %107 = OpLoad %S_std140 %106 - %104 = OpFunctionCall %S %conv_S %107 - %103 = OpFunctionCall %void %b %104 - %109 = OpFunctionCall %mat3v2float %load_u_2_m - %108 = OpFunctionCall %void %c %109 - %111 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 %55 %uint_2 - %112 = OpLoad %v2float %111 - %113 = OpVectorShuffle %v2float %112 %112 1 0 - %110 = OpFunctionCall %void %d %113 - %115 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 %55 %uint_2 - %116 = OpLoad %v2float %115 - %117 = OpVectorShuffle %v2float %116 %116 1 0 - %118 = OpCompositeExtract %float %117 0 - %114 = OpFunctionCall %void %e %118 + %f = OpFunction %void None %101 + %103 = OpLabel + %107 = OpAccessChain %_ptr_Uniform__arr_S_std140_uint_4 %u %uint_0 + %108 = OpLoad %_arr_S_std140_uint_4 %107 + %105 = OpFunctionCall %_arr_S_uint_4 %conv_arr_4_S %108 + %104 = OpFunctionCall %void %a %105 + %111 = OpAccessChain %_ptr_Uniform_S_std140 %u %uint_0 %uint_2 + %112 = OpLoad %S_std140 %111 + %110 = OpFunctionCall %S %conv_S %112 + %109 = OpFunctionCall %void %b %110 + %114 = OpFunctionCall %mat3v2float %load_u_inner_2_m + %113 = OpFunctionCall %void %c %114 + %116 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 %55 %uint_2 + %117 = OpLoad %v2float %116 + %118 = OpVectorShuffle %v2float %117 %117 1 0 + %115 = OpFunctionCall %void %d %118 + %120 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 %55 %uint_2 + %121 = OpLoad %v2float %120 + %122 = OpVectorShuffle %v2float %121 %121 1 0 + %123 = OpCompositeExtract %float %122 0 + %119 = OpFunctionCall %void %e %123 OpReturn OpFunctionEnd diff --git a/test/tint/buffer/uniform/std140/mat3x2/to_fn.wgsl.expected.wgsl b/test/tint/buffer/uniform/std140/struct/mat3x2/to_fn.wgsl.expected.wgsl similarity index 100% rename from test/tint/buffer/uniform/std140/mat3x2/to_fn.wgsl.expected.wgsl rename to test/tint/buffer/uniform/std140/struct/mat3x2/to_fn.wgsl.expected.wgsl diff --git a/test/tint/buffer/uniform/std140/mat3x2/to_private.wgsl b/test/tint/buffer/uniform/std140/struct/mat3x2/to_private.wgsl similarity index 100% rename from test/tint/buffer/uniform/std140/mat3x2/to_private.wgsl rename to test/tint/buffer/uniform/std140/struct/mat3x2/to_private.wgsl diff --git a/test/tint/buffer/uniform/std140/mat3x2/to_private.wgsl.expected.dxc.hlsl b/test/tint/buffer/uniform/std140/struct/mat3x2/to_private.wgsl.expected.dxc.hlsl similarity index 100% rename from test/tint/buffer/uniform/std140/mat3x2/to_private.wgsl.expected.dxc.hlsl rename to test/tint/buffer/uniform/std140/struct/mat3x2/to_private.wgsl.expected.dxc.hlsl diff --git a/test/tint/buffer/uniform/std140/mat3x2/to_private.wgsl.expected.fxc.hlsl b/test/tint/buffer/uniform/std140/struct/mat3x2/to_private.wgsl.expected.fxc.hlsl similarity index 100% rename from test/tint/buffer/uniform/std140/mat3x2/to_private.wgsl.expected.fxc.hlsl rename to test/tint/buffer/uniform/std140/struct/mat3x2/to_private.wgsl.expected.fxc.hlsl diff --git a/test/tint/buffer/uniform/std140/struct/mat3x2/to_private.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/struct/mat3x2/to_private.wgsl.expected.glsl new file mode 100644 index 0000000000..5fa11e4e82 --- /dev/null +++ b/test/tint/buffer/uniform/std140/struct/mat3x2/to_private.wgsl.expected.glsl @@ -0,0 +1,75 @@ +#version 310 es + +struct S { + int before; + uint pad; + mat3x2 m; + uint pad_1; + uint pad_2; + uint pad_3; + uint pad_4; + uint pad_5; + uint pad_6; + uint pad_7; + uint pad_8; + uint pad_9; + uint pad_10; + int after; + uint pad_11; +}; + +struct S_std140 { + int before; + uint pad; + vec2 m_0; + vec2 m_1; + vec2 m_2; + uint pad_1; + uint pad_2; + uint pad_3; + uint pad_4; + uint pad_5; + uint pad_6; + uint pad_7; + uint pad_8; + uint pad_9; + uint pad_10; + int after; + uint pad_11; +}; + +layout(binding = 0, std140) uniform u_block_std140_ubo { + S_std140 inner[4]; +} u; + +S p[4] = S[4](S(0, 0u, mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0, 0u), S(0, 0u, mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0, 0u), S(0, 0u, mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0, 0u), S(0, 0u, mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0, 0u)); +S conv_S(S_std140 val) { + return S(val.before, val.pad, mat3x2(val.m_0, val.m_1, val.m_2), val.pad_1, val.pad_2, val.pad_3, val.pad_4, val.pad_5, val.pad_6, val.pad_7, val.pad_8, val.pad_9, val.pad_10, val.after, val.pad_11); +} + +S[4] conv_arr_4_S(S_std140 val[4]) { + S arr[4] = S[4](S(0, 0u, mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0, 0u), S(0, 0u, mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0, 0u), S(0, 0u, mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0, 0u), S(0, 0u, mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0, 0u)); + { + for(uint i = 0u; (i < 4u); i = (i + 1u)) { + arr[i] = conv_S(val[i]); + } + } + return arr; +} + +mat3x2 load_u_inner_2_m() { + return mat3x2(u.inner[2u].m_0, u.inner[2u].m_1, u.inner[2u].m_2); +} + +void f() { + p = conv_arr_4_S(u.inner); + p[1] = conv_S(u.inner[2u]); + p[3].m = load_u_inner_2_m(); + p[1].m[0] = u.inner[0u].m_1.yx; +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + f(); + return; +} diff --git a/test/tint/buffer/uniform/std140/mat3x2/to_private.wgsl.expected.msl b/test/tint/buffer/uniform/std140/struct/mat3x2/to_private.wgsl.expected.msl similarity index 100% rename from test/tint/buffer/uniform/std140/mat3x2/to_private.wgsl.expected.msl rename to test/tint/buffer/uniform/std140/struct/mat3x2/to_private.wgsl.expected.msl diff --git a/test/tint/buffer/uniform/std140/mat3x2/to_private.wgsl.expected.spvasm b/test/tint/buffer/uniform/std140/struct/mat3x2/to_private.wgsl.expected.spvasm similarity index 73% rename from test/tint/buffer/uniform/std140/mat3x2/to_private.wgsl.expected.spvasm rename to test/tint/buffer/uniform/std140/struct/mat3x2/to_private.wgsl.expected.spvasm index 915609981c..0320931564 100644 --- a/test/tint/buffer/uniform/std140/mat3x2/to_private.wgsl.expected.spvasm +++ b/test/tint/buffer/uniform/std140/struct/mat3x2/to_private.wgsl.expected.spvasm @@ -1,14 +1,14 @@ ; SPIR-V ; Version: 1.3 ; Generator: Google Tint Compiler; 0 -; Bound: 101 +; Bound: 106 ; Schema: 0 OpCapability Shader OpMemoryModel Logical GLSL450 OpEntryPoint GLCompute %f "f" OpExecutionMode %f LocalSize 1 1 1 - OpName %u_block "u_block" - OpMemberName %u_block 0 "inner" + OpName %u_block_std140 "u_block_std140" + OpMemberName %u_block_std140 0 "inner" OpName %S_std140 "S_std140" OpMemberName %S_std140 0 "before" OpMemberName %S_std140 1 "m_0" @@ -28,10 +28,10 @@ OpName %arr "arr" OpName %i "i" OpName %var_for_index "var_for_index" - OpName %load_u_2_m "load_u_2_m" + OpName %load_u_inner_2_m "load_u_inner_2_m" OpName %f "f" - OpDecorate %u_block Block - OpMemberDecorate %u_block 0 Offset 0 + OpDecorate %u_block_std140 Block + OpMemberDecorate %u_block_std140 0 Offset 0 OpMemberDecorate %S_std140 0 Offset 0 OpMemberDecorate %S_std140 1 Offset 8 OpMemberDecorate %S_std140 2 Offset 16 @@ -54,9 +54,9 @@ %uint = OpTypeInt 32 0 %uint_4 = OpConstant %uint 4 %_arr_S_std140_uint_4 = OpTypeArray %S_std140 %uint_4 - %u_block = OpTypeStruct %_arr_S_std140_uint_4 -%_ptr_Uniform_u_block = OpTypePointer Uniform %u_block - %u = OpVariable %_ptr_Uniform_u_block Uniform +%u_block_std140 = OpTypeStruct %_arr_S_std140_uint_4 +%_ptr_Uniform_u_block_std140 = OpTypePointer Uniform %u_block_std140 + %u = OpVariable %_ptr_Uniform_u_block_std140 Uniform %mat3v2float = OpTypeMatrix %v2float 3 %S = OpTypeStruct %int %mat3v2float %int %_arr_S_uint_4 = OpTypeArray %S %uint_4 @@ -77,17 +77,17 @@ %62 = OpTypeFunction %mat3v2float %uint_0 = OpConstant %uint 0 %uint_2 = OpConstant %uint 2 +%_ptr_Uniform_S_std140 = OpTypePointer Uniform %S_std140 %_ptr_Uniform_v2float = OpTypePointer Uniform %v2float %uint_3 = OpConstant %uint 3 %void = OpTypeVoid - %76 = OpTypeFunction %void + %82 = OpTypeFunction %void %_ptr_Uniform__arr_S_std140_uint_4 = OpTypePointer Uniform %_arr_S_std140_uint_4 %int_1 = OpConstant %int 1 %_ptr_Private_S = OpTypePointer Private %S -%_ptr_Uniform_S_std140 = OpTypePointer Uniform %S_std140 %int_3 = OpConstant %int 3 %_ptr_Private_mat3v2float = OpTypePointer Private %mat3v2float - %95 = OpConstantNull %int + %100 = OpConstantNull %int %_ptr_Private_v2float = OpTypePointer Private %v2float %conv_S = OpFunction %S None %17 %val = OpFunctionParameter %S_std140 @@ -138,35 +138,36 @@ %61 = OpLoad %_arr_S_uint_4 %arr OpReturnValue %61 OpFunctionEnd - %load_u_2_m = OpFunction %mat3v2float None %62 +%load_u_inner_2_m = OpFunction %mat3v2float None %62 %64 = OpLabel - %68 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 %uint_2 %uint_1 - %69 = OpLoad %v2float %68 - %70 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 %uint_2 %uint_2 - %71 = OpLoad %v2float %70 - %73 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 %uint_2 %uint_3 - %74 = OpLoad %v2float %73 - %75 = OpCompositeConstruct %mat3v2float %69 %71 %74 - OpReturnValue %75 + %69 = OpAccessChain %_ptr_Uniform_S_std140 %u %uint_0 %uint_2 + %72 = OpAccessChain %_ptr_Uniform_v2float %69 %uint_1 + %73 = OpLoad %v2float %72 + %75 = OpAccessChain %_ptr_Uniform_v2float %69 %uint_2 + %76 = OpLoad %v2float %75 + %79 = OpAccessChain %_ptr_Uniform_v2float %69 %uint_3 + %80 = OpLoad %v2float %79 + %81 = OpCompositeConstruct %mat3v2float %73 %76 %80 + OpReturnValue %81 OpFunctionEnd - %f = OpFunction %void None %76 - %79 = OpLabel - %82 = OpAccessChain %_ptr_Uniform__arr_S_std140_uint_4 %u %uint_0 - %83 = OpLoad %_arr_S_std140_uint_4 %82 - %80 = OpFunctionCall %_arr_S_uint_4 %conv_arr_4_S %83 - OpStore %p %80 - %86 = OpAccessChain %_ptr_Private_S %p %int_1 - %89 = OpAccessChain %_ptr_Uniform_S_std140 %u %uint_0 %uint_2 - %90 = OpLoad %S_std140 %89 - %87 = OpFunctionCall %S %conv_S %90 - OpStore %86 %87 - %93 = OpAccessChain %_ptr_Private_mat3v2float %p %int_3 %uint_1 - %94 = OpFunctionCall %mat3v2float %load_u_2_m - OpStore %93 %94 - %97 = OpAccessChain %_ptr_Private_v2float %p %int_1 %uint_1 %95 - %98 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 %36 %uint_2 - %99 = OpLoad %v2float %98 - %100 = OpVectorShuffle %v2float %99 %99 1 0 - OpStore %97 %100 + %f = OpFunction %void None %82 + %85 = OpLabel + %88 = OpAccessChain %_ptr_Uniform__arr_S_std140_uint_4 %u %uint_0 + %89 = OpLoad %_arr_S_std140_uint_4 %88 + %86 = OpFunctionCall %_arr_S_uint_4 %conv_arr_4_S %89 + OpStore %p %86 + %92 = OpAccessChain %_ptr_Private_S %p %int_1 + %94 = OpAccessChain %_ptr_Uniform_S_std140 %u %uint_0 %uint_2 + %95 = OpLoad %S_std140 %94 + %93 = OpFunctionCall %S %conv_S %95 + OpStore %92 %93 + %98 = OpAccessChain %_ptr_Private_mat3v2float %p %int_3 %uint_1 + %99 = OpFunctionCall %mat3v2float %load_u_inner_2_m + OpStore %98 %99 + %102 = OpAccessChain %_ptr_Private_v2float %p %int_1 %uint_1 %100 + %103 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 %36 %uint_2 + %104 = OpLoad %v2float %103 + %105 = OpVectorShuffle %v2float %104 %104 1 0 + OpStore %102 %105 OpReturn OpFunctionEnd diff --git a/test/tint/buffer/uniform/std140/mat3x2/to_private.wgsl.expected.wgsl b/test/tint/buffer/uniform/std140/struct/mat3x2/to_private.wgsl.expected.wgsl similarity index 100% rename from test/tint/buffer/uniform/std140/mat3x2/to_private.wgsl.expected.wgsl rename to test/tint/buffer/uniform/std140/struct/mat3x2/to_private.wgsl.expected.wgsl diff --git a/test/tint/buffer/uniform/std140/mat3x2/to_storage.wgsl b/test/tint/buffer/uniform/std140/struct/mat3x2/to_storage.wgsl similarity index 100% rename from test/tint/buffer/uniform/std140/mat3x2/to_storage.wgsl rename to test/tint/buffer/uniform/std140/struct/mat3x2/to_storage.wgsl diff --git a/test/tint/buffer/uniform/std140/mat3x2/to_storage.wgsl.expected.dxc.hlsl b/test/tint/buffer/uniform/std140/struct/mat3x2/to_storage.wgsl.expected.dxc.hlsl similarity index 100% rename from test/tint/buffer/uniform/std140/mat3x2/to_storage.wgsl.expected.dxc.hlsl rename to test/tint/buffer/uniform/std140/struct/mat3x2/to_storage.wgsl.expected.dxc.hlsl diff --git a/test/tint/buffer/uniform/std140/mat3x2/to_storage.wgsl.expected.fxc.hlsl b/test/tint/buffer/uniform/std140/struct/mat3x2/to_storage.wgsl.expected.fxc.hlsl similarity index 100% rename from test/tint/buffer/uniform/std140/mat3x2/to_storage.wgsl.expected.fxc.hlsl rename to test/tint/buffer/uniform/std140/struct/mat3x2/to_storage.wgsl.expected.fxc.hlsl diff --git a/test/tint/buffer/uniform/std140/mat3x2/to_storage.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/struct/mat3x2/to_storage.wgsl.expected.glsl similarity index 69% rename from test/tint/buffer/uniform/std140/mat3x2/to_storage.wgsl.expected.glsl rename to test/tint/buffer/uniform/std140/struct/mat3x2/to_storage.wgsl.expected.glsl index fd4678d25f..ccd6e8815f 100644 --- a/test/tint/buffer/uniform/std140/mat3x2/to_storage.wgsl.expected.glsl +++ b/test/tint/buffer/uniform/std140/struct/mat3x2/to_storage.wgsl.expected.glsl @@ -20,35 +20,34 @@ struct S { struct S_std140 { int before; - uint pad_12; + uint pad; vec2 m_0; vec2 m_1; vec2 m_2; - uint pad_13; - uint pad_14; - uint pad_15; - uint pad_16; - uint pad_17; - uint pad_18; - uint pad_19; - uint pad_20; - uint pad_21; - uint pad_22; + uint pad_1; + uint pad_2; + uint pad_3; + uint pad_4; + uint pad_5; + uint pad_6; + uint pad_7; + uint pad_8; + uint pad_9; + uint pad_10; int after; - uint pad_23; + uint pad_11; }; -layout(binding = 0, std140) uniform u_block_ubo { +layout(binding = 0, std140) uniform u_block_std140_ubo { S_std140 inner[4]; } u; -layout(binding = 1, std430) buffer s_block_ssbo { +layout(binding = 1, std430) buffer u_block_ssbo { S inner[4]; } s; S conv_S(S_std140 val) { - S tint_symbol = S(val.before, 0u, mat3x2(val.m_0, val.m_1, val.m_2), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, val.after, 0u); - return tint_symbol; + return S(val.before, val.pad, mat3x2(val.m_0, val.m_1, val.m_2), val.pad_1, val.pad_2, val.pad_3, val.pad_4, val.pad_5, val.pad_6, val.pad_7, val.pad_8, val.pad_9, val.pad_10, val.after, val.pad_11); } S[4] conv_arr_4_S(S_std140 val[4]) { @@ -61,14 +60,14 @@ S[4] conv_arr_4_S(S_std140 val[4]) { return arr; } -mat3x2 load_u_2_m() { +mat3x2 load_u_inner_2_m() { return mat3x2(u.inner[2u].m_0, u.inner[2u].m_1, u.inner[2u].m_2); } void f() { s.inner = conv_arr_4_S(u.inner); s.inner[1] = conv_S(u.inner[2u]); - s.inner[3].m = load_u_2_m(); + s.inner[3].m = load_u_inner_2_m(); s.inner[1].m[0] = u.inner[0u].m_1.yx; } diff --git a/test/tint/buffer/uniform/std140/mat3x2/to_storage.wgsl.expected.msl b/test/tint/buffer/uniform/std140/struct/mat3x2/to_storage.wgsl.expected.msl similarity index 100% rename from test/tint/buffer/uniform/std140/mat3x2/to_storage.wgsl.expected.msl rename to test/tint/buffer/uniform/std140/struct/mat3x2/to_storage.wgsl.expected.msl diff --git a/test/tint/buffer/uniform/std140/mat3x2/to_storage.wgsl.expected.spvasm b/test/tint/buffer/uniform/std140/struct/mat3x2/to_storage.wgsl.expected.spvasm similarity index 72% rename from test/tint/buffer/uniform/std140/mat3x2/to_storage.wgsl.expected.spvasm rename to test/tint/buffer/uniform/std140/struct/mat3x2/to_storage.wgsl.expected.spvasm index ec518fd124..30329536ef 100644 --- a/test/tint/buffer/uniform/std140/mat3x2/to_storage.wgsl.expected.spvasm +++ b/test/tint/buffer/uniform/std140/struct/mat3x2/to_storage.wgsl.expected.spvasm @@ -1,14 +1,14 @@ ; SPIR-V ; Version: 1.3 ; Generator: Google Tint Compiler; 0 -; Bound: 104 +; Bound: 109 ; Schema: 0 OpCapability Shader OpMemoryModel Logical GLSL450 OpEntryPoint GLCompute %f "f" OpExecutionMode %f LocalSize 1 1 1 - OpName %u_block "u_block" - OpMemberName %u_block 0 "inner" + OpName %u_block_std140 "u_block_std140" + OpMemberName %u_block_std140 0 "inner" OpName %S_std140 "S_std140" OpMemberName %S_std140 0 "before" OpMemberName %S_std140 1 "m_0" @@ -16,8 +16,8 @@ OpMemberName %S_std140 3 "m_2" OpMemberName %S_std140 4 "after" OpName %u "u" - OpName %s_block "s_block" - OpMemberName %s_block 0 "inner" + OpName %u_block "u_block" + OpMemberName %u_block 0 "inner" OpName %S "S" OpMemberName %S 0 "before" OpMemberName %S 1 "m" @@ -30,10 +30,10 @@ OpName %arr "arr" OpName %i "i" OpName %var_for_index "var_for_index" - OpName %load_u_2_m "load_u_2_m" + OpName %load_u_inner_2_m "load_u_inner_2_m" OpName %f "f" - OpDecorate %u_block Block - OpMemberDecorate %u_block 0 Offset 0 + OpDecorate %u_block_std140 Block + OpMemberDecorate %u_block_std140 0 Offset 0 OpMemberDecorate %S_std140 0 Offset 0 OpMemberDecorate %S_std140 1 Offset 8 OpMemberDecorate %S_std140 2 Offset 16 @@ -43,8 +43,8 @@ OpDecorate %u NonWritable OpDecorate %u DescriptorSet 0 OpDecorate %u Binding 0 - OpDecorate %s_block Block - OpMemberDecorate %s_block 0 Offset 0 + OpDecorate %u_block Block + OpMemberDecorate %u_block 0 Offset 0 OpMemberDecorate %S 0 Offset 0 OpMemberDecorate %S 1 Offset 8 OpMemberDecorate %S 1 ColMajor @@ -60,15 +60,15 @@ %uint = OpTypeInt 32 0 %uint_4 = OpConstant %uint 4 %_arr_S_std140_uint_4 = OpTypeArray %S_std140 %uint_4 - %u_block = OpTypeStruct %_arr_S_std140_uint_4 -%_ptr_Uniform_u_block = OpTypePointer Uniform %u_block - %u = OpVariable %_ptr_Uniform_u_block Uniform +%u_block_std140 = OpTypeStruct %_arr_S_std140_uint_4 +%_ptr_Uniform_u_block_std140 = OpTypePointer Uniform %u_block_std140 + %u = OpVariable %_ptr_Uniform_u_block_std140 Uniform %mat3v2float = OpTypeMatrix %v2float 3 %S = OpTypeStruct %int %mat3v2float %int %_arr_S_uint_4 = OpTypeArray %S %uint_4 - %s_block = OpTypeStruct %_arr_S_uint_4 -%_ptr_StorageBuffer_s_block = OpTypePointer StorageBuffer %s_block - %s = OpVariable %_ptr_StorageBuffer_s_block StorageBuffer + %u_block = OpTypeStruct %_arr_S_uint_4 +%_ptr_StorageBuffer_u_block = OpTypePointer StorageBuffer %u_block + %s = OpVariable %_ptr_StorageBuffer_u_block StorageBuffer %17 = OpTypeFunction %S %S_std140 %28 = OpTypeFunction %_arr_S_uint_4 %_arr_S_std140_uint_4 %_ptr_Function__arr_S_uint_4 = OpTypePointer Function %_arr_S_uint_4 @@ -84,18 +84,18 @@ %63 = OpTypeFunction %mat3v2float %uint_0 = OpConstant %uint 0 %uint_2 = OpConstant %uint 2 +%_ptr_Uniform_S_std140 = OpTypePointer Uniform %S_std140 %_ptr_Uniform_v2float = OpTypePointer Uniform %v2float %uint_3 = OpConstant %uint 3 %void = OpTypeVoid - %77 = OpTypeFunction %void + %83 = OpTypeFunction %void %_ptr_StorageBuffer__arr_S_uint_4 = OpTypePointer StorageBuffer %_arr_S_uint_4 %_ptr_Uniform__arr_S_std140_uint_4 = OpTypePointer Uniform %_arr_S_std140_uint_4 %int_1 = OpConstant %int 1 %_ptr_StorageBuffer_S = OpTypePointer StorageBuffer %S -%_ptr_Uniform_S_std140 = OpTypePointer Uniform %S_std140 %int_3 = OpConstant %int 3 %_ptr_StorageBuffer_mat3v2float = OpTypePointer StorageBuffer %mat3v2float - %98 = OpConstantNull %int + %103 = OpConstantNull %int %_ptr_StorageBuffer_v2float = OpTypePointer StorageBuffer %v2float %conv_S = OpFunction %S None %17 %val = OpFunctionParameter %S_std140 @@ -146,36 +146,37 @@ %62 = OpLoad %_arr_S_uint_4 %arr OpReturnValue %62 OpFunctionEnd - %load_u_2_m = OpFunction %mat3v2float None %63 +%load_u_inner_2_m = OpFunction %mat3v2float None %63 %65 = OpLabel - %69 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 %uint_2 %uint_1 - %70 = OpLoad %v2float %69 - %71 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 %uint_2 %uint_2 - %72 = OpLoad %v2float %71 - %74 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 %uint_2 %uint_3 - %75 = OpLoad %v2float %74 - %76 = OpCompositeConstruct %mat3v2float %70 %72 %75 - OpReturnValue %76 + %70 = OpAccessChain %_ptr_Uniform_S_std140 %u %uint_0 %uint_2 + %73 = OpAccessChain %_ptr_Uniform_v2float %70 %uint_1 + %74 = OpLoad %v2float %73 + %76 = OpAccessChain %_ptr_Uniform_v2float %70 %uint_2 + %77 = OpLoad %v2float %76 + %80 = OpAccessChain %_ptr_Uniform_v2float %70 %uint_3 + %81 = OpLoad %v2float %80 + %82 = OpCompositeConstruct %mat3v2float %74 %77 %81 + OpReturnValue %82 OpFunctionEnd - %f = OpFunction %void None %77 - %80 = OpLabel - %82 = OpAccessChain %_ptr_StorageBuffer__arr_S_uint_4 %s %uint_0 - %85 = OpAccessChain %_ptr_Uniform__arr_S_std140_uint_4 %u %uint_0 - %86 = OpLoad %_arr_S_std140_uint_4 %85 - %83 = OpFunctionCall %_arr_S_uint_4 %conv_arr_4_S %86 - OpStore %82 %83 - %89 = OpAccessChain %_ptr_StorageBuffer_S %s %uint_0 %int_1 - %92 = OpAccessChain %_ptr_Uniform_S_std140 %u %uint_0 %uint_2 - %93 = OpLoad %S_std140 %92 - %90 = OpFunctionCall %S %conv_S %93 - OpStore %89 %90 - %96 = OpAccessChain %_ptr_StorageBuffer_mat3v2float %s %uint_0 %int_3 %uint_1 - %97 = OpFunctionCall %mat3v2float %load_u_2_m - OpStore %96 %97 - %100 = OpAccessChain %_ptr_StorageBuffer_v2float %s %uint_0 %int_1 %uint_1 %98 - %101 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 %37 %uint_2 - %102 = OpLoad %v2float %101 - %103 = OpVectorShuffle %v2float %102 %102 1 0 - OpStore %100 %103 + %f = OpFunction %void None %83 + %86 = OpLabel + %88 = OpAccessChain %_ptr_StorageBuffer__arr_S_uint_4 %s %uint_0 + %91 = OpAccessChain %_ptr_Uniform__arr_S_std140_uint_4 %u %uint_0 + %92 = OpLoad %_arr_S_std140_uint_4 %91 + %89 = OpFunctionCall %_arr_S_uint_4 %conv_arr_4_S %92 + OpStore %88 %89 + %95 = OpAccessChain %_ptr_StorageBuffer_S %s %uint_0 %int_1 + %97 = OpAccessChain %_ptr_Uniform_S_std140 %u %uint_0 %uint_2 + %98 = OpLoad %S_std140 %97 + %96 = OpFunctionCall %S %conv_S %98 + OpStore %95 %96 + %101 = OpAccessChain %_ptr_StorageBuffer_mat3v2float %s %uint_0 %int_3 %uint_1 + %102 = OpFunctionCall %mat3v2float %load_u_inner_2_m + OpStore %101 %102 + %105 = OpAccessChain %_ptr_StorageBuffer_v2float %s %uint_0 %int_1 %uint_1 %103 + %106 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 %37 %uint_2 + %107 = OpLoad %v2float %106 + %108 = OpVectorShuffle %v2float %107 %107 1 0 + OpStore %105 %108 OpReturn OpFunctionEnd diff --git a/test/tint/buffer/uniform/std140/mat3x2/to_storage.wgsl.expected.wgsl b/test/tint/buffer/uniform/std140/struct/mat3x2/to_storage.wgsl.expected.wgsl similarity index 100% rename from test/tint/buffer/uniform/std140/mat3x2/to_storage.wgsl.expected.wgsl rename to test/tint/buffer/uniform/std140/struct/mat3x2/to_storage.wgsl.expected.wgsl diff --git a/test/tint/buffer/uniform/std140/mat3x2/to_workgroup.wgsl b/test/tint/buffer/uniform/std140/struct/mat3x2/to_workgroup.wgsl similarity index 100% rename from test/tint/buffer/uniform/std140/mat3x2/to_workgroup.wgsl rename to test/tint/buffer/uniform/std140/struct/mat3x2/to_workgroup.wgsl diff --git a/test/tint/buffer/uniform/std140/mat3x2/to_workgroup.wgsl.expected.dxc.hlsl b/test/tint/buffer/uniform/std140/struct/mat3x2/to_workgroup.wgsl.expected.dxc.hlsl similarity index 100% rename from test/tint/buffer/uniform/std140/mat3x2/to_workgroup.wgsl.expected.dxc.hlsl rename to test/tint/buffer/uniform/std140/struct/mat3x2/to_workgroup.wgsl.expected.dxc.hlsl diff --git a/test/tint/buffer/uniform/std140/mat3x2/to_workgroup.wgsl.expected.fxc.hlsl b/test/tint/buffer/uniform/std140/struct/mat3x2/to_workgroup.wgsl.expected.fxc.hlsl similarity index 100% rename from test/tint/buffer/uniform/std140/mat3x2/to_workgroup.wgsl.expected.fxc.hlsl rename to test/tint/buffer/uniform/std140/struct/mat3x2/to_workgroup.wgsl.expected.fxc.hlsl diff --git a/test/tint/buffer/uniform/std140/struct/mat3x2/to_workgroup.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/struct/mat3x2/to_workgroup.wgsl.expected.glsl new file mode 100644 index 0000000000..fd14f19bda --- /dev/null +++ b/test/tint/buffer/uniform/std140/struct/mat3x2/to_workgroup.wgsl.expected.glsl @@ -0,0 +1,83 @@ +#version 310 es + +struct S { + int before; + uint pad; + mat3x2 m; + uint pad_1; + uint pad_2; + uint pad_3; + uint pad_4; + uint pad_5; + uint pad_6; + uint pad_7; + uint pad_8; + uint pad_9; + uint pad_10; + int after; + uint pad_11; +}; + +struct S_std140 { + int before; + uint pad; + vec2 m_0; + vec2 m_1; + vec2 m_2; + uint pad_1; + uint pad_2; + uint pad_3; + uint pad_4; + uint pad_5; + uint pad_6; + uint pad_7; + uint pad_8; + uint pad_9; + uint pad_10; + int after; + uint pad_11; +}; + +layout(binding = 0, std140) uniform u_block_std140_ubo { + S_std140 inner[4]; +} u; + +shared S w[4]; +S conv_S(S_std140 val) { + return S(val.before, val.pad, mat3x2(val.m_0, val.m_1, val.m_2), val.pad_1, val.pad_2, val.pad_3, val.pad_4, val.pad_5, val.pad_6, val.pad_7, val.pad_8, val.pad_9, val.pad_10, val.after, val.pad_11); +} + +S[4] conv_arr_4_S(S_std140 val[4]) { + S arr[4] = S[4](S(0, 0u, mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0, 0u), S(0, 0u, mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0, 0u), S(0, 0u, mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0, 0u), S(0, 0u, mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0, 0u)); + { + for(uint i = 0u; (i < 4u); i = (i + 1u)) { + arr[i] = conv_S(val[i]); + } + } + return arr; +} + +mat3x2 load_u_inner_2_m() { + return mat3x2(u.inner[2u].m_0, u.inner[2u].m_1, u.inner[2u].m_2); +} + +void f(uint local_invocation_index) { + { + for(uint idx = local_invocation_index; (idx < 4u); idx = (idx + 1u)) { + uint i = idx; + S tint_symbol = S(0, 0u, mat3x2(vec2(0.0f), vec2(0.0f), vec2(0.0f)), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0, 0u); + w[i] = tint_symbol; + } + } + barrier(); + w = conv_arr_4_S(u.inner); + w[1] = conv_S(u.inner[2u]); + w[3].m = load_u_inner_2_m(); + w[1].m[0] = u.inner[0u].m_1.yx; +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + f(gl_LocalInvocationIndex); + return; +} diff --git a/test/tint/buffer/uniform/std140/mat3x2/to_workgroup.wgsl.expected.msl b/test/tint/buffer/uniform/std140/struct/mat3x2/to_workgroup.wgsl.expected.msl similarity index 100% rename from test/tint/buffer/uniform/std140/mat3x2/to_workgroup.wgsl.expected.msl rename to test/tint/buffer/uniform/std140/struct/mat3x2/to_workgroup.wgsl.expected.msl diff --git a/test/tint/buffer/uniform/std140/mat3x2/to_workgroup.wgsl.expected.spvasm b/test/tint/buffer/uniform/std140/struct/mat3x2/to_workgroup.wgsl.expected.spvasm similarity index 68% rename from test/tint/buffer/uniform/std140/mat3x2/to_workgroup.wgsl.expected.spvasm rename to test/tint/buffer/uniform/std140/struct/mat3x2/to_workgroup.wgsl.expected.spvasm index 325aa7e0a8..9db5af8d2c 100644 --- a/test/tint/buffer/uniform/std140/mat3x2/to_workgroup.wgsl.expected.spvasm +++ b/test/tint/buffer/uniform/std140/struct/mat3x2/to_workgroup.wgsl.expected.spvasm @@ -1,15 +1,15 @@ ; SPIR-V ; Version: 1.3 ; Generator: Google Tint Compiler; 0 -; Bound: 126 +; Bound: 131 ; Schema: 0 OpCapability Shader OpMemoryModel Logical GLSL450 OpEntryPoint GLCompute %f "f" %local_invocation_index_1 OpExecutionMode %f LocalSize 1 1 1 OpName %local_invocation_index_1 "local_invocation_index_1" - OpName %u_block "u_block" - OpMemberName %u_block 0 "inner" + OpName %u_block_std140 "u_block_std140" + OpMemberName %u_block_std140 0 "inner" OpName %S_std140 "S_std140" OpMemberName %S_std140 0 "before" OpMemberName %S_std140 1 "m_0" @@ -29,14 +29,14 @@ OpName %arr "arr" OpName %i "i" OpName %var_for_index "var_for_index" - OpName %load_u_2_m "load_u_2_m" + OpName %load_u_inner_2_m "load_u_inner_2_m" OpName %f_inner "f_inner" OpName %local_invocation_index "local_invocation_index" OpName %idx "idx" OpName %f "f" OpDecorate %local_invocation_index_1 BuiltIn LocalInvocationIndex - OpDecorate %u_block Block - OpMemberDecorate %u_block 0 Offset 0 + OpDecorate %u_block_std140 Block + OpMemberDecorate %u_block_std140 0 Offset 0 OpMemberDecorate %S_std140 0 Offset 0 OpMemberDecorate %S_std140 1 Offset 8 OpMemberDecorate %S_std140 2 Offset 16 @@ -61,9 +61,9 @@ %S_std140 = OpTypeStruct %int %v2float %v2float %v2float %int %uint_4 = OpConstant %uint 4 %_arr_S_std140_uint_4 = OpTypeArray %S_std140 %uint_4 - %u_block = OpTypeStruct %_arr_S_std140_uint_4 -%_ptr_Uniform_u_block = OpTypePointer Uniform %u_block - %u = OpVariable %_ptr_Uniform_u_block Uniform +%u_block_std140 = OpTypeStruct %_arr_S_std140_uint_4 +%_ptr_Uniform_u_block_std140 = OpTypePointer Uniform %u_block_std140 + %u = OpVariable %_ptr_Uniform_u_block_std140 Uniform %mat3v2float = OpTypeMatrix %v2float 3 %S = OpTypeStruct %int %mat3v2float %int %_arr_S_uint_4 = OpTypeArray %S %uint_4 @@ -84,21 +84,21 @@ %64 = OpTypeFunction %mat3v2float %uint_0 = OpConstant %uint 0 %uint_2 = OpConstant %uint 2 +%_ptr_Uniform_S_std140 = OpTypePointer Uniform %S_std140 %_ptr_Uniform_v2float = OpTypePointer Uniform %v2float %uint_3 = OpConstant %uint 3 %void = OpTypeVoid - %78 = OpTypeFunction %void %uint + %84 = OpTypeFunction %void %uint %_ptr_Workgroup_S = OpTypePointer Workgroup %S - %96 = OpConstantNull %S + %102 = OpConstantNull %S %uint_264 = OpConstant %uint 264 %_ptr_Uniform__arr_S_std140_uint_4 = OpTypePointer Uniform %_arr_S_std140_uint_4 %int_1 = OpConstant %int 1 -%_ptr_Uniform_S_std140 = OpTypePointer Uniform %S_std140 %int_3 = OpConstant %int 3 %_ptr_Workgroup_mat3v2float = OpTypePointer Workgroup %mat3v2float - %115 = OpConstantNull %int + %120 = OpConstantNull %int %_ptr_Workgroup_v2float = OpTypePointer Workgroup %v2float - %121 = OpTypeFunction %void + %126 = OpTypeFunction %void %conv_S = OpFunction %S None %18 %val = OpFunctionParameter %S_std140 %21 = OpLabel @@ -148,68 +148,69 @@ %63 = OpLoad %_arr_S_uint_4 %arr OpReturnValue %63 OpFunctionEnd - %load_u_2_m = OpFunction %mat3v2float None %64 +%load_u_inner_2_m = OpFunction %mat3v2float None %64 %66 = OpLabel - %70 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 %uint_2 %uint_1 - %71 = OpLoad %v2float %70 - %72 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 %uint_2 %uint_2 - %73 = OpLoad %v2float %72 - %75 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 %uint_2 %uint_3 - %76 = OpLoad %v2float %75 - %77 = OpCompositeConstruct %mat3v2float %71 %73 %76 - OpReturnValue %77 + %71 = OpAccessChain %_ptr_Uniform_S_std140 %u %uint_0 %uint_2 + %74 = OpAccessChain %_ptr_Uniform_v2float %71 %uint_1 + %75 = OpLoad %v2float %74 + %77 = OpAccessChain %_ptr_Uniform_v2float %71 %uint_2 + %78 = OpLoad %v2float %77 + %81 = OpAccessChain %_ptr_Uniform_v2float %71 %uint_3 + %82 = OpLoad %v2float %81 + %83 = OpCompositeConstruct %mat3v2float %75 %78 %82 + OpReturnValue %83 OpFunctionEnd - %f_inner = OpFunction %void None %78 + %f_inner = OpFunction %void None %84 %local_invocation_index = OpFunctionParameter %uint - %82 = OpLabel + %88 = OpLabel %idx = OpVariable %_ptr_Function_uint Function %38 OpStore %idx %local_invocation_index - OpBranch %84 - %84 = OpLabel - OpLoopMerge %85 %86 None - OpBranch %87 - %87 = OpLabel - %89 = OpLoad %uint %idx - %90 = OpULessThan %bool %89 %uint_4 - %88 = OpLogicalNot %bool %90 - OpSelectionMerge %91 None - OpBranchConditional %88 %92 %91 + OpBranch %90 + %90 = OpLabel + OpLoopMerge %91 %92 None + OpBranch %93 + %93 = OpLabel + %95 = OpLoad %uint %idx + %96 = OpULessThan %bool %95 %uint_4 + %94 = OpLogicalNot %bool %96 + OpSelectionMerge %97 None + OpBranchConditional %94 %98 %97 + %98 = OpLabel + OpBranch %91 + %97 = OpLabel + %99 = OpLoad %uint %idx + %101 = OpAccessChain %_ptr_Workgroup_S %w %99 + OpStore %101 %102 + OpBranch %92 %92 = OpLabel - OpBranch %85 + %103 = OpLoad %uint %idx + %104 = OpIAdd %uint %103 %uint_1 + OpStore %idx %104 + OpBranch %90 %91 = OpLabel - %93 = OpLoad %uint %idx - %95 = OpAccessChain %_ptr_Workgroup_S %w %93 - OpStore %95 %96 - OpBranch %86 - %86 = OpLabel - %97 = OpLoad %uint %idx - %98 = OpIAdd %uint %97 %uint_1 - OpStore %idx %98 - OpBranch %84 - %85 = OpLabel OpControlBarrier %uint_2 %uint_2 %uint_264 - %103 = OpAccessChain %_ptr_Uniform__arr_S_std140_uint_4 %u %uint_0 - %104 = OpLoad %_arr_S_std140_uint_4 %103 - %101 = OpFunctionCall %_arr_S_uint_4 %conv_arr_4_S %104 - OpStore %w %101 - %106 = OpAccessChain %_ptr_Workgroup_S %w %int_1 - %109 = OpAccessChain %_ptr_Uniform_S_std140 %u %uint_0 %uint_2 - %110 = OpLoad %S_std140 %109 - %107 = OpFunctionCall %S %conv_S %110 - OpStore %106 %107 - %113 = OpAccessChain %_ptr_Workgroup_mat3v2float %w %int_3 %uint_1 - %114 = OpFunctionCall %mat3v2float %load_u_2_m - OpStore %113 %114 - %117 = OpAccessChain %_ptr_Workgroup_v2float %w %int_1 %uint_1 %115 - %118 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 %38 %uint_2 - %119 = OpLoad %v2float %118 - %120 = OpVectorShuffle %v2float %119 %119 1 0 - OpStore %117 %120 + %109 = OpAccessChain %_ptr_Uniform__arr_S_std140_uint_4 %u %uint_0 + %110 = OpLoad %_arr_S_std140_uint_4 %109 + %107 = OpFunctionCall %_arr_S_uint_4 %conv_arr_4_S %110 + OpStore %w %107 + %112 = OpAccessChain %_ptr_Workgroup_S %w %int_1 + %114 = OpAccessChain %_ptr_Uniform_S_std140 %u %uint_0 %uint_2 + %115 = OpLoad %S_std140 %114 + %113 = OpFunctionCall %S %conv_S %115 + OpStore %112 %113 + %118 = OpAccessChain %_ptr_Workgroup_mat3v2float %w %int_3 %uint_1 + %119 = OpFunctionCall %mat3v2float %load_u_inner_2_m + OpStore %118 %119 + %122 = OpAccessChain %_ptr_Workgroup_v2float %w %int_1 %uint_1 %120 + %123 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 %38 %uint_2 + %124 = OpLoad %v2float %123 + %125 = OpVectorShuffle %v2float %124 %124 1 0 + OpStore %122 %125 OpReturn OpFunctionEnd - %f = OpFunction %void None %121 - %123 = OpLabel - %125 = OpLoad %uint %local_invocation_index_1 - %124 = OpFunctionCall %void %f_inner %125 + %f = OpFunction %void None %126 + %128 = OpLabel + %130 = OpLoad %uint %local_invocation_index_1 + %129 = OpFunctionCall %void %f_inner %130 OpReturn OpFunctionEnd diff --git a/test/tint/buffer/uniform/std140/mat3x2/to_workgroup.wgsl.expected.wgsl b/test/tint/buffer/uniform/std140/struct/mat3x2/to_workgroup.wgsl.expected.wgsl similarity index 100% rename from test/tint/buffer/uniform/std140/mat3x2/to_workgroup.wgsl.expected.wgsl rename to test/tint/buffer/uniform/std140/struct/mat3x2/to_workgroup.wgsl.expected.wgsl diff --git a/test/tint/buffer/uniform/std140/mat4x2/dynamic_index_via_ptr.wgsl b/test/tint/buffer/uniform/std140/struct/mat4x2/dynamic_index_via_ptr.wgsl similarity index 98% rename from test/tint/buffer/uniform/std140/mat4x2/dynamic_index_via_ptr.wgsl rename to test/tint/buffer/uniform/std140/struct/mat4x2/dynamic_index_via_ptr.wgsl index ea019e1e40..512ab8c8fc 100644 --- a/test/tint/buffer/uniform/std140/mat4x2/dynamic_index_via_ptr.wgsl +++ b/test/tint/buffer/uniform/std140/struct/mat4x2/dynamic_index_via_ptr.wgsl @@ -13,8 +13,6 @@ fn i() -> i32 { counter++; return counter; } @compute @workgroup_size(1) fn f() { - let I = 1; - let p_a = &a; let p_a_i = &((*p_a)[i()]); let p_a_i_a = &((*p_a_i).a); diff --git a/test/tint/buffer/uniform/std140/mat4x2/dynamic_index_via_ptr.wgsl.expected.dxc.hlsl b/test/tint/buffer/uniform/std140/struct/mat4x2/dynamic_index_via_ptr.wgsl.expected.dxc.hlsl similarity index 99% rename from test/tint/buffer/uniform/std140/mat4x2/dynamic_index_via_ptr.wgsl.expected.dxc.hlsl rename to test/tint/buffer/uniform/std140/struct/mat4x2/dynamic_index_via_ptr.wgsl.expected.dxc.hlsl index e6bf304c39..e8e8cbacc9 100644 --- a/test/tint/buffer/uniform/std140/mat4x2/dynamic_index_via_ptr.wgsl.expected.dxc.hlsl +++ b/test/tint/buffer/uniform/std140/struct/mat4x2/dynamic_index_via_ptr.wgsl.expected.dxc.hlsl @@ -61,7 +61,6 @@ tint_symbol_4_ret tint_symbol_4(uint4 buffer[32], uint offset) { [numthreads(1, 1, 1)] void f() { - const int I = 1; const int p_a_i_save = i(); const int p_a_i_a_i_save = i(); const int p_a_i_a_i_m_i_save = i(); diff --git a/test/tint/buffer/uniform/std140/mat4x2/dynamic_index_via_ptr.wgsl.expected.fxc.hlsl b/test/tint/buffer/uniform/std140/struct/mat4x2/dynamic_index_via_ptr.wgsl.expected.fxc.hlsl similarity index 99% rename from test/tint/buffer/uniform/std140/mat4x2/dynamic_index_via_ptr.wgsl.expected.fxc.hlsl rename to test/tint/buffer/uniform/std140/struct/mat4x2/dynamic_index_via_ptr.wgsl.expected.fxc.hlsl index e6bf304c39..e8e8cbacc9 100644 --- a/test/tint/buffer/uniform/std140/mat4x2/dynamic_index_via_ptr.wgsl.expected.fxc.hlsl +++ b/test/tint/buffer/uniform/std140/struct/mat4x2/dynamic_index_via_ptr.wgsl.expected.fxc.hlsl @@ -61,7 +61,6 @@ tint_symbol_4_ret tint_symbol_4(uint4 buffer[32], uint offset) { [numthreads(1, 1, 1)] void f() { - const int I = 1; const int p_a_i_save = i(); const int p_a_i_a_i_save = i(); const int p_a_i_a_i_m_i_save = i(); diff --git a/test/tint/buffer/uniform/std140/mat4x2/dynamic_index_via_ptr.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/struct/mat4x2/dynamic_index_via_ptr.wgsl.expected.glsl similarity index 80% rename from test/tint/buffer/uniform/std140/mat4x2/dynamic_index_via_ptr.wgsl.expected.glsl rename to test/tint/buffer/uniform/std140/struct/mat4x2/dynamic_index_via_ptr.wgsl.expected.glsl index da098b6f70..7e60332ae2 100644 --- a/test/tint/buffer/uniform/std140/mat4x2/dynamic_index_via_ptr.wgsl.expected.glsl +++ b/test/tint/buffer/uniform/std140/struct/mat4x2/dynamic_index_via_ptr.wgsl.expected.glsl @@ -19,7 +19,7 @@ struct Outer_std140 { Inner_std140 a[4]; }; -layout(binding = 0, std140) uniform a_block_ubo { +layout(binding = 0, std140) uniform a_block_std140_ubo { Outer_std140 inner[4]; } a; @@ -30,8 +30,7 @@ int i() { } Inner conv_Inner(Inner_std140 val) { - Inner tint_symbol_4 = Inner(mat4x2(val.m_0, val.m_1, val.m_2, val.m_3)); - return tint_symbol_4; + return Inner(mat4x2(val.m_0, val.m_1, val.m_2, val.m_3)); } Inner[4] conv_arr_4_Inner(Inner_std140 val[4]) { @@ -45,8 +44,7 @@ Inner[4] conv_arr_4_Inner(Inner_std140 val[4]) { } Outer conv_Outer(Outer_std140 val) { - Outer tint_symbol_5 = Outer(conv_arr_4_Inner(val.a)); - return tint_symbol_5; + return Outer(conv_arr_4_Inner(val.a)); } Outer[4] conv_arr_4_Outer(Outer_std140 val[4]) { @@ -59,13 +57,13 @@ Outer[4] conv_arr_4_Outer(Outer_std140 val[4]) { return arr; } -mat4x2 load_a_p0_a_p1_m(uint p0, uint p1) { +mat4x2 load_a_inner_p0_a_p1_m(uint p0, uint p1) { uint s_save = p0; uint s_save_1 = p1; return mat4x2(a.inner[s_save].a[s_save_1].m_0, a.inner[s_save].a[s_save_1].m_1, a.inner[s_save].a[s_save_1].m_2, a.inner[s_save].a[s_save_1].m_3); } -vec2 load_a_p0_a_p1_m_p2(uint p0, uint p1, uint p2) { +vec2 load_a_inner_p0_a_p1_m_p2(uint p0, uint p1, uint p2) { switch(p2) { case 0u: { return a.inner[p0].a[p1].m_0; @@ -90,7 +88,7 @@ vec2 load_a_p0_a_p1_m_p2(uint p0, uint p1, uint p2) { } } -float load_a_p0_a_p1_m_p2_p3(uint p0, uint p1, uint p2, uint p3) { +float load_a_inner_p0_a_p1_m_p2_p3(uint p0, uint p1, uint p2, uint p3) { switch(p2) { case 0u: { return a.inner[p0].a[p1].m_0[p3]; @@ -116,24 +114,23 @@ float load_a_p0_a_p1_m_p2_p3(uint p0, uint p1, uint p2, uint p3) { } void f() { - int I = 1; Outer p_a[4] = conv_arr_4_Outer(a.inner); int tint_symbol = i(); Outer p_a_i = conv_Outer(a.inner[tint_symbol]); Inner p_a_i_a[4] = conv_arr_4_Inner(a.inner[tint_symbol].a); int tint_symbol_1 = i(); Inner p_a_i_a_i = conv_Inner(a.inner[tint_symbol].a[tint_symbol_1]); - mat4x2 p_a_i_a_i_m = load_a_p0_a_p1_m(uint(tint_symbol), uint(tint_symbol_1)); + mat4x2 p_a_i_a_i_m = load_a_inner_p0_a_p1_m(uint(tint_symbol), uint(tint_symbol_1)); int tint_symbol_2 = i(); - vec2 p_a_i_a_i_m_i = load_a_p0_a_p1_m_p2(uint(tint_symbol), uint(tint_symbol_1), uint(tint_symbol_2)); + vec2 p_a_i_a_i_m_i = load_a_inner_p0_a_p1_m_p2(uint(tint_symbol), uint(tint_symbol_1), uint(tint_symbol_2)); Outer l_a[4] = conv_arr_4_Outer(a.inner); Outer l_a_i = conv_Outer(a.inner[tint_symbol]); Inner l_a_i_a[4] = conv_arr_4_Inner(a.inner[tint_symbol].a); Inner l_a_i_a_i = conv_Inner(a.inner[tint_symbol].a[tint_symbol_1]); - mat4x2 l_a_i_a_i_m = load_a_p0_a_p1_m(uint(tint_symbol), uint(tint_symbol_1)); - vec2 l_a_i_a_i_m_i = load_a_p0_a_p1_m_p2(uint(tint_symbol), uint(tint_symbol_1), uint(tint_symbol_2)); + mat4x2 l_a_i_a_i_m = load_a_inner_p0_a_p1_m(uint(tint_symbol), uint(tint_symbol_1)); + vec2 l_a_i_a_i_m_i = load_a_inner_p0_a_p1_m_p2(uint(tint_symbol), uint(tint_symbol_1), uint(tint_symbol_2)); int tint_symbol_3 = i(); - float l_a_i_a_i_m_i_i = load_a_p0_a_p1_m_p2_p3(uint(tint_symbol), uint(tint_symbol_1), uint(tint_symbol_2), uint(tint_symbol_3)); + float l_a_i_a_i_m_i_i = load_a_inner_p0_a_p1_m_p2_p3(uint(tint_symbol), uint(tint_symbol_1), uint(tint_symbol_2), uint(tint_symbol_3)); } layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; diff --git a/test/tint/buffer/uniform/std140/mat4x2/dynamic_index_via_ptr.wgsl.expected.msl b/test/tint/buffer/uniform/std140/struct/mat4x2/dynamic_index_via_ptr.wgsl.expected.msl similarity index 98% rename from test/tint/buffer/uniform/std140/mat4x2/dynamic_index_via_ptr.wgsl.expected.msl rename to test/tint/buffer/uniform/std140/struct/mat4x2/dynamic_index_via_ptr.wgsl.expected.msl index 017e1e8a30..2f43afe25f 100644 --- a/test/tint/buffer/uniform/std140/mat4x2/dynamic_index_via_ptr.wgsl.expected.msl +++ b/test/tint/buffer/uniform/std140/struct/mat4x2/dynamic_index_via_ptr.wgsl.expected.msl @@ -29,7 +29,6 @@ int i() { } kernel void f(const constant tint_array* tint_symbol_5 [[buffer(0)]]) { - int const I = 1; int const tint_symbol = i(); int const p_a_i_save = tint_symbol; int const tint_symbol_1 = i(); diff --git a/test/tint/buffer/uniform/std140/mat4x2/dynamic_index_via_ptr.wgsl.expected.spvasm b/test/tint/buffer/uniform/std140/struct/mat4x2/dynamic_index_via_ptr.wgsl.expected.spvasm similarity index 61% rename from test/tint/buffer/uniform/std140/mat4x2/dynamic_index_via_ptr.wgsl.expected.spvasm rename to test/tint/buffer/uniform/std140/struct/mat4x2/dynamic_index_via_ptr.wgsl.expected.spvasm index 5de20f52f6..2a4d2cae56 100644 --- a/test/tint/buffer/uniform/std140/mat4x2/dynamic_index_via_ptr.wgsl.expected.spvasm +++ b/test/tint/buffer/uniform/std140/struct/mat4x2/dynamic_index_via_ptr.wgsl.expected.spvasm @@ -1,14 +1,14 @@ ; SPIR-V ; Version: 1.3 ; Generator: Google Tint Compiler; 0 -; Bound: 228 +; Bound: 215 ; Schema: 0 OpCapability Shader OpMemoryModel Logical GLSL450 OpEntryPoint GLCompute %f "f" OpExecutionMode %f LocalSize 1 1 1 - OpName %a_block "a_block" - OpMemberName %a_block 0 "inner" + OpName %a_block_std140 "a_block_std140" + OpMemberName %a_block_std140 0 "inner" OpName %Outer_std140 "Outer_std140" OpMemberName %Outer_std140 0 "a" OpName %Inner_std140 "Inner_std140" @@ -27,7 +27,7 @@ OpName %val_0 "val" OpName %arr "arr" OpName %i_0 "i" - OpName %var_for_index "var_for_index" + OpName %var_for_index_1 "var_for_index_1" OpName %Outer "Outer" OpMemberName %Outer 0 "a" OpName %conv_Outer "conv_Outer" @@ -36,22 +36,22 @@ OpName %val_2 "val" OpName %arr_0 "arr" OpName %i_1 "i" - OpName %var_for_index_1 "var_for_index_1" - OpName %load_a_p0_a_p1_m "load_a_p0_a_p1_m" + OpName %var_for_index "var_for_index" + OpName %load_a_inner_p0_a_p1_m "load_a_inner_p0_a_p1_m" OpName %p0 "p0" OpName %p1 "p1" - OpName %load_a_p0_a_p1_m_p2 "load_a_p0_a_p1_m_p2" + OpName %load_a_inner_p0_a_p1_m_p2 "load_a_inner_p0_a_p1_m_p2" OpName %p0_0 "p0" OpName %p1_0 "p1" OpName %p2 "p2" - OpName %load_a_p0_a_p1_m_p2_p3 "load_a_p0_a_p1_m_p2_p3" + OpName %load_a_inner_p0_a_p1_m_p2_p3 "load_a_inner_p0_a_p1_m_p2_p3" OpName %p0_1 "p0" OpName %p1_1 "p1" OpName %p2_0 "p2" OpName %p3 "p3" OpName %f "f" - OpDecorate %a_block Block - OpMemberDecorate %a_block 0 Offset 0 + OpDecorate %a_block_std140 Block + OpMemberDecorate %a_block_std140 0 Offset 0 OpMemberDecorate %Outer_std140 0 Offset 0 OpMemberDecorate %Inner_std140 0 Offset 0 OpMemberDecorate %Inner_std140 1 Offset 8 @@ -76,9 +76,9 @@ %_arr_Inner_std140_uint_4 = OpTypeArray %Inner_std140 %uint_4 %Outer_std140 = OpTypeStruct %_arr_Inner_std140_uint_4 %_arr_Outer_std140_uint_4 = OpTypeArray %Outer_std140 %uint_4 - %a_block = OpTypeStruct %_arr_Outer_std140_uint_4 -%_ptr_Uniform_a_block = OpTypePointer Uniform %a_block - %a = OpVariable %_ptr_Uniform_a_block Uniform +%a_block_std140 = OpTypeStruct %_arr_Outer_std140_uint_4 +%_ptr_Uniform_a_block_std140 = OpTypePointer Uniform %a_block_std140 + %a = OpVariable %_ptr_Uniform_a_block_std140 Uniform %int = OpTypeInt 32 1 %13 = OpConstantNull %int %_ptr_Private_int = OpTypePointer Private %int @@ -112,20 +112,20 @@ %_ptr_Function_Outer_std140 = OpTypePointer Function %Outer_std140 %111 = OpTypeFunction %mat4v2float %uint %uint %uint_0 = OpConstant %uint 0 +%_ptr_Uniform_Inner_std140 = OpTypePointer Uniform %Inner_std140 %_ptr_Uniform_v2float = OpTypePointer Uniform %v2float %uint_2 = OpConstant %uint 2 %uint_3 = OpConstant %uint 3 - %129 = OpTypeFunction %v2float %uint %uint %uint - %149 = OpConstantNull %v2float - %150 = OpTypeFunction %float %uint %uint %uint %uint + %136 = OpTypeFunction %v2float %uint %uint %uint + %156 = OpConstantNull %v2float + %157 = OpTypeFunction %float %uint %uint %uint %uint %_ptr_Uniform_float = OpTypePointer Uniform %float - %172 = OpConstantNull %float + %179 = OpConstantNull %float %void = OpTypeVoid - %173 = OpTypeFunction %void + %180 = OpTypeFunction %void %_ptr_Uniform__arr_Outer_std140_uint_4 = OpTypePointer Uniform %_arr_Outer_std140_uint_4 %_ptr_Uniform_Outer_std140 = OpTypePointer Uniform %Outer_std140 %_ptr_Uniform__arr_Inner_std140_uint_4 = OpTypePointer Uniform %_arr_Inner_std140_uint_4 -%_ptr_Uniform_Inner_std140 = OpTypePointer Uniform %Inner_std140 %i = OpFunction %int None %16 %18 = OpLabel %19 = OpLoad %int %counter @@ -150,7 +150,7 @@ %39 = OpLabel %arr = OpVariable %_ptr_Function__arr_Inner_uint_4 Function %42 %i_0 = OpVariable %_ptr_Function_uint Function %45 -%var_for_index = OpVariable %_ptr_Function__arr_Inner_std140_uint_4 Function %58 +%var_for_index_1 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4 Function %58 OpBranch %46 %46 = OpLabel OpLoopMerge %47 %48 None @@ -164,11 +164,11 @@ %55 = OpLabel OpBranch %47 %54 = OpLabel - OpStore %var_for_index %val_0 + OpStore %var_for_index_1 %val_0 %59 = OpLoad %uint %i_0 %61 = OpAccessChain %_ptr_Function_Inner %arr %59 %63 = OpLoad %uint %i_0 - %65 = OpAccessChain %_ptr_Function_Inner_std140 %var_for_index %63 + %65 = OpAccessChain %_ptr_Function_Inner_std140 %var_for_index_1 %63 %66 = OpLoad %Inner_std140 %65 %62 = OpFunctionCall %Inner %conv_Inner %66 OpStore %61 %62 @@ -195,7 +195,7 @@ %83 = OpLabel %arr_0 = OpVariable %_ptr_Function__arr_Outer_uint_4 Function %86 %i_1 = OpVariable %_ptr_Function_uint Function %45 -%var_for_index_1 = OpVariable %_ptr_Function__arr_Outer_std140_uint_4 Function %99 +%var_for_index = OpVariable %_ptr_Function__arr_Outer_std140_uint_4 Function %99 OpBranch %88 %88 = OpLabel OpLoopMerge %89 %90 None @@ -209,11 +209,11 @@ %96 = OpLabel OpBranch %89 %95 = OpLabel - OpStore %var_for_index_1 %val_2 + OpStore %var_for_index %val_2 %100 = OpLoad %uint %i_1 %102 = OpAccessChain %_ptr_Function_Outer %arr_0 %100 %104 = OpLoad %uint %i_1 - %106 = OpAccessChain %_ptr_Function_Outer_std140 %var_for_index_1 %104 + %106 = OpAccessChain %_ptr_Function_Outer_std140 %var_for_index %104 %107 = OpLoad %Outer_std140 %106 %103 = OpFunctionCall %Outer %conv_Outer %107 OpStore %102 %103 @@ -227,126 +227,108 @@ %110 = OpLoad %_arr_Outer_uint_4 %arr_0 OpReturnValue %110 OpFunctionEnd -%load_a_p0_a_p1_m = OpFunction %mat4v2float None %111 +%load_a_inner_p0_a_p1_m = OpFunction %mat4v2float None %111 %p0 = OpFunctionParameter %uint %p1 = OpFunctionParameter %uint %115 = OpLabel - %118 = OpAccessChain %_ptr_Uniform_v2float %a %uint_0 %p0 %uint_0 %p1 %uint_0 - %119 = OpLoad %v2float %118 - %120 = OpAccessChain %_ptr_Uniform_v2float %a %uint_0 %p0 %uint_0 %p1 %uint_1 - %121 = OpLoad %v2float %120 - %123 = OpAccessChain %_ptr_Uniform_v2float %a %uint_0 %p0 %uint_0 %p1 %uint_2 - %124 = OpLoad %v2float %123 - %126 = OpAccessChain %_ptr_Uniform_v2float %a %uint_0 %p0 %uint_0 %p1 %uint_3 - %127 = OpLoad %v2float %126 - %128 = OpCompositeConstruct %mat4v2float %119 %121 %124 %127 - OpReturnValue %128 + %119 = OpAccessChain %_ptr_Uniform_Inner_std140 %a %uint_0 %p0 %uint_0 %p1 + %122 = OpAccessChain %_ptr_Uniform_v2float %119 %uint_0 + %123 = OpLoad %v2float %122 + %125 = OpAccessChain %_ptr_Uniform_v2float %119 %uint_1 + %126 = OpLoad %v2float %125 + %129 = OpAccessChain %_ptr_Uniform_v2float %119 %uint_2 + %130 = OpLoad %v2float %129 + %133 = OpAccessChain %_ptr_Uniform_v2float %119 %uint_3 + %134 = OpLoad %v2float %133 + %135 = OpCompositeConstruct %mat4v2float %123 %126 %130 %134 + OpReturnValue %135 OpFunctionEnd -%load_a_p0_a_p1_m_p2 = OpFunction %v2float None %129 +%load_a_inner_p0_a_p1_m_p2 = OpFunction %v2float None %136 %p0_0 = OpFunctionParameter %uint %p1_0 = OpFunctionParameter %uint %p2 = OpFunctionParameter %uint - %134 = OpLabel - OpSelectionMerge %135 None - OpSwitch %p2 %136 0 %137 1 %138 2 %139 3 %140 - %137 = OpLabel - %141 = OpAccessChain %_ptr_Uniform_v2float %a %uint_0 %p0_0 %uint_0 %p1_0 %uint_0 - %142 = OpLoad %v2float %141 - OpReturnValue %142 - %138 = OpLabel - %143 = OpAccessChain %_ptr_Uniform_v2float %a %uint_0 %p0_0 %uint_0 %p1_0 %uint_1 - %144 = OpLoad %v2float %143 - OpReturnValue %144 - %139 = OpLabel - %145 = OpAccessChain %_ptr_Uniform_v2float %a %uint_0 %p0_0 %uint_0 %p1_0 %uint_2 - %146 = OpLoad %v2float %145 - OpReturnValue %146 - %140 = OpLabel - %147 = OpAccessChain %_ptr_Uniform_v2float %a %uint_0 %p0_0 %uint_0 %p1_0 %uint_3 - %148 = OpLoad %v2float %147 - OpReturnValue %148 - %136 = OpLabel - OpReturnValue %149 - %135 = OpLabel + %141 = OpLabel + OpSelectionMerge %142 None + OpSwitch %p2 %143 0 %144 1 %145 2 %146 3 %147 + %144 = OpLabel + %148 = OpAccessChain %_ptr_Uniform_v2float %a %uint_0 %p0_0 %uint_0 %p1_0 %uint_0 + %149 = OpLoad %v2float %148 OpReturnValue %149 + %145 = OpLabel + %150 = OpAccessChain %_ptr_Uniform_v2float %a %uint_0 %p0_0 %uint_0 %p1_0 %uint_1 + %151 = OpLoad %v2float %150 + OpReturnValue %151 + %146 = OpLabel + %152 = OpAccessChain %_ptr_Uniform_v2float %a %uint_0 %p0_0 %uint_0 %p1_0 %uint_2 + %153 = OpLoad %v2float %152 + OpReturnValue %153 + %147 = OpLabel + %154 = OpAccessChain %_ptr_Uniform_v2float %a %uint_0 %p0_0 %uint_0 %p1_0 %uint_3 + %155 = OpLoad %v2float %154 + OpReturnValue %155 + %143 = OpLabel + OpReturnValue %156 + %142 = OpLabel + OpReturnValue %156 OpFunctionEnd -%load_a_p0_a_p1_m_p2_p3 = OpFunction %float None %150 +%load_a_inner_p0_a_p1_m_p2_p3 = OpFunction %float None %157 %p0_1 = OpFunctionParameter %uint %p1_1 = OpFunctionParameter %uint %p2_0 = OpFunctionParameter %uint %p3 = OpFunctionParameter %uint - %156 = OpLabel - OpSelectionMerge %157 None - OpSwitch %p2_0 %158 0 %159 1 %160 2 %161 3 %162 - %159 = OpLabel - %164 = OpAccessChain %_ptr_Uniform_float %a %uint_0 %p0_1 %uint_0 %p1_1 %uint_0 %p3 - %165 = OpLoad %float %164 - OpReturnValue %165 - %160 = OpLabel - %166 = OpAccessChain %_ptr_Uniform_float %a %uint_0 %p0_1 %uint_0 %p1_1 %uint_1 %p3 - %167 = OpLoad %float %166 - OpReturnValue %167 - %161 = OpLabel - %168 = OpAccessChain %_ptr_Uniform_float %a %uint_0 %p0_1 %uint_0 %p1_1 %uint_2 %p3 - %169 = OpLoad %float %168 - OpReturnValue %169 - %162 = OpLabel - %170 = OpAccessChain %_ptr_Uniform_float %a %uint_0 %p0_1 %uint_0 %p1_1 %uint_3 %p3 - %171 = OpLoad %float %170 - OpReturnValue %171 - %158 = OpLabel - OpReturnValue %172 - %157 = OpLabel + %163 = OpLabel + OpSelectionMerge %164 None + OpSwitch %p2_0 %165 0 %166 1 %167 2 %168 3 %169 + %166 = OpLabel + %171 = OpAccessChain %_ptr_Uniform_float %a %uint_0 %p0_1 %uint_0 %p1_1 %uint_0 %p3 + %172 = OpLoad %float %171 OpReturnValue %172 + %167 = OpLabel + %173 = OpAccessChain %_ptr_Uniform_float %a %uint_0 %p0_1 %uint_0 %p1_1 %uint_1 %p3 + %174 = OpLoad %float %173 + OpReturnValue %174 + %168 = OpLabel + %175 = OpAccessChain %_ptr_Uniform_float %a %uint_0 %p0_1 %uint_0 %p1_1 %uint_2 %p3 + %176 = OpLoad %float %175 + OpReturnValue %176 + %169 = OpLabel + %177 = OpAccessChain %_ptr_Uniform_float %a %uint_0 %p0_1 %uint_0 %p1_1 %uint_3 %p3 + %178 = OpLoad %float %177 + OpReturnValue %178 + %165 = OpLabel + OpReturnValue %179 + %164 = OpLabel + OpReturnValue %179 OpFunctionEnd - %f = OpFunction %void None %173 - %176 = OpLabel - %179 = OpAccessChain %_ptr_Uniform__arr_Outer_std140_uint_4 %a %uint_0 - %180 = OpLoad %_arr_Outer_std140_uint_4 %179 - %177 = OpFunctionCall %_arr_Outer_uint_4 %conv_arr_4_Outer %180 - %181 = OpFunctionCall %int %i - %184 = OpAccessChain %_ptr_Uniform_Outer_std140 %a %uint_0 %181 - %185 = OpLoad %Outer_std140 %184 - %182 = OpFunctionCall %Outer %conv_Outer %185 - %188 = OpAccessChain %_ptr_Uniform__arr_Inner_std140_uint_4 %a %uint_0 %181 %uint_0 - %189 = OpLoad %_arr_Inner_std140_uint_4 %188 - %186 = OpFunctionCall %_arr_Inner_uint_4 %conv_arr_4_Inner %189 - %190 = OpFunctionCall %int %i - %193 = OpAccessChain %_ptr_Uniform_Inner_std140 %a %uint_0 %181 %uint_0 %190 - %194 = OpLoad %Inner_std140 %193 - %191 = OpFunctionCall %Inner %conv_Inner %194 - %196 = OpBitcast %uint %181 - %197 = OpBitcast %uint %190 - %195 = OpFunctionCall %mat4v2float %load_a_p0_a_p1_m %196 %197 - %198 = OpFunctionCall %int %i - %200 = OpBitcast %uint %181 - %201 = OpBitcast %uint %190 - %202 = OpBitcast %uint %198 - %199 = OpFunctionCall %v2float %load_a_p0_a_p1_m_p2 %200 %201 %202 - %204 = OpAccessChain %_ptr_Uniform__arr_Outer_std140_uint_4 %a %uint_0 - %205 = OpLoad %_arr_Outer_std140_uint_4 %204 - %203 = OpFunctionCall %_arr_Outer_uint_4 %conv_arr_4_Outer %205 - %207 = OpAccessChain %_ptr_Uniform_Outer_std140 %a %uint_0 %181 - %208 = OpLoad %Outer_std140 %207 - %206 = OpFunctionCall %Outer %conv_Outer %208 - %210 = OpAccessChain %_ptr_Uniform__arr_Inner_std140_uint_4 %a %uint_0 %181 %uint_0 - %211 = OpLoad %_arr_Inner_std140_uint_4 %210 - %209 = OpFunctionCall %_arr_Inner_uint_4 %conv_arr_4_Inner %211 - %213 = OpAccessChain %_ptr_Uniform_Inner_std140 %a %uint_0 %181 %uint_0 %190 - %214 = OpLoad %Inner_std140 %213 - %212 = OpFunctionCall %Inner %conv_Inner %214 - %216 = OpBitcast %uint %181 - %217 = OpBitcast %uint %190 - %215 = OpFunctionCall %mat4v2float %load_a_p0_a_p1_m %216 %217 - %219 = OpBitcast %uint %181 - %220 = OpBitcast %uint %190 - %221 = OpBitcast %uint %198 - %218 = OpFunctionCall %v2float %load_a_p0_a_p1_m_p2 %219 %220 %221 - %222 = OpFunctionCall %int %i - %224 = OpBitcast %uint %181 - %225 = OpBitcast %uint %190 - %226 = OpBitcast %uint %198 - %227 = OpBitcast %uint %222 - %223 = OpFunctionCall %float %load_a_p0_a_p1_m_p2_p3 %224 %225 %226 %227 + %f = OpFunction %void None %180 + %183 = OpLabel + %184 = OpFunctionCall %int %i + %185 = OpFunctionCall %int %i + %186 = OpFunctionCall %int %i + %189 = OpAccessChain %_ptr_Uniform__arr_Outer_std140_uint_4 %a %uint_0 + %190 = OpLoad %_arr_Outer_std140_uint_4 %189 + %187 = OpFunctionCall %_arr_Outer_uint_4 %conv_arr_4_Outer %190 + %193 = OpAccessChain %_ptr_Uniform_Outer_std140 %a %uint_0 %184 + %194 = OpLoad %Outer_std140 %193 + %191 = OpFunctionCall %Outer %conv_Outer %194 + %197 = OpAccessChain %_ptr_Uniform__arr_Inner_std140_uint_4 %a %uint_0 %184 %uint_0 + %198 = OpLoad %_arr_Inner_std140_uint_4 %197 + %195 = OpFunctionCall %_arr_Inner_uint_4 %conv_arr_4_Inner %198 + %200 = OpAccessChain %_ptr_Uniform_Inner_std140 %a %uint_0 %184 %uint_0 %185 + %201 = OpLoad %Inner_std140 %200 + %199 = OpFunctionCall %Inner %conv_Inner %201 + %203 = OpBitcast %uint %184 + %204 = OpBitcast %uint %185 + %202 = OpFunctionCall %mat4v2float %load_a_inner_p0_a_p1_m %203 %204 + %206 = OpBitcast %uint %184 + %207 = OpBitcast %uint %185 + %208 = OpBitcast %uint %186 + %205 = OpFunctionCall %v2float %load_a_inner_p0_a_p1_m_p2 %206 %207 %208 + %209 = OpFunctionCall %int %i + %211 = OpBitcast %uint %184 + %212 = OpBitcast %uint %185 + %213 = OpBitcast %uint %186 + %214 = OpBitcast %uint %209 + %210 = OpFunctionCall %float %load_a_inner_p0_a_p1_m_p2_p3 %211 %212 %213 %214 OpReturn OpFunctionEnd diff --git a/test/tint/buffer/uniform/std140/mat4x2/dynamic_index_via_ptr.wgsl.expected.wgsl b/test/tint/buffer/uniform/std140/struct/mat4x2/dynamic_index_via_ptr.wgsl.expected.wgsl similarity index 98% rename from test/tint/buffer/uniform/std140/mat4x2/dynamic_index_via_ptr.wgsl.expected.wgsl rename to test/tint/buffer/uniform/std140/struct/mat4x2/dynamic_index_via_ptr.wgsl.expected.wgsl index 8417933479..7cc47feae0 100644 --- a/test/tint/buffer/uniform/std140/mat4x2/dynamic_index_via_ptr.wgsl.expected.wgsl +++ b/test/tint/buffer/uniform/std140/struct/mat4x2/dynamic_index_via_ptr.wgsl.expected.wgsl @@ -17,7 +17,6 @@ fn i() -> i32 { @compute @workgroup_size(1) fn f() { - let I = 1; let p_a = &(a); let p_a_i = &((*(p_a))[i()]); let p_a_i_a = &((*(p_a_i)).a); diff --git a/test/tint/buffer/uniform/std140/mat4x2/static_index_via_ptr.wgsl b/test/tint/buffer/uniform/std140/struct/mat4x2/static_index_via_ptr.wgsl similarity index 98% rename from test/tint/buffer/uniform/std140/mat4x2/static_index_via_ptr.wgsl rename to test/tint/buffer/uniform/std140/struct/mat4x2/static_index_via_ptr.wgsl index 8731181770..582e8aca21 100644 --- a/test/tint/buffer/uniform/std140/mat4x2/static_index_via_ptr.wgsl +++ b/test/tint/buffer/uniform/std140/struct/mat4x2/static_index_via_ptr.wgsl @@ -10,8 +10,6 @@ struct Outer { @compute @workgroup_size(1) fn f() { - let I = 1; - let p_a = &a; let p_a_3 = &((*p_a)[3]); let p_a_3_a = &((*p_a_3).a); diff --git a/test/tint/buffer/uniform/std140/mat4x2/static_index_via_ptr.wgsl.expected.dxc.hlsl b/test/tint/buffer/uniform/std140/struct/mat4x2/static_index_via_ptr.wgsl.expected.dxc.hlsl similarity index 99% rename from test/tint/buffer/uniform/std140/mat4x2/static_index_via_ptr.wgsl.expected.dxc.hlsl rename to test/tint/buffer/uniform/std140/struct/mat4x2/static_index_via_ptr.wgsl.expected.dxc.hlsl index 597afeff5b..512f6ba557 100644 --- a/test/tint/buffer/uniform/std140/mat4x2/static_index_via_ptr.wgsl.expected.dxc.hlsl +++ b/test/tint/buffer/uniform/std140/struct/mat4x2/static_index_via_ptr.wgsl.expected.dxc.hlsl @@ -55,7 +55,6 @@ tint_symbol_ret tint_symbol(uint4 buffer[32], uint offset) { [numthreads(1, 1, 1)] void f() { - const int I = 1; const Outer l_a[4] = tint_symbol(a, 0u); const Outer l_a_3 = tint_symbol_1(a, 384u); const Inner l_a_3_a[4] = tint_symbol_2(a, 384u); diff --git a/test/tint/buffer/uniform/std140/mat4x2/static_index_via_ptr.wgsl.expected.fxc.hlsl b/test/tint/buffer/uniform/std140/struct/mat4x2/static_index_via_ptr.wgsl.expected.fxc.hlsl similarity index 99% rename from test/tint/buffer/uniform/std140/mat4x2/static_index_via_ptr.wgsl.expected.fxc.hlsl rename to test/tint/buffer/uniform/std140/struct/mat4x2/static_index_via_ptr.wgsl.expected.fxc.hlsl index 597afeff5b..512f6ba557 100644 --- a/test/tint/buffer/uniform/std140/mat4x2/static_index_via_ptr.wgsl.expected.fxc.hlsl +++ b/test/tint/buffer/uniform/std140/struct/mat4x2/static_index_via_ptr.wgsl.expected.fxc.hlsl @@ -55,7 +55,6 @@ tint_symbol_ret tint_symbol(uint4 buffer[32], uint offset) { [numthreads(1, 1, 1)] void f() { - const int I = 1; const Outer l_a[4] = tint_symbol(a, 0u); const Outer l_a_3 = tint_symbol_1(a, 384u); const Inner l_a_3_a[4] = tint_symbol_2(a, 384u); diff --git a/test/tint/buffer/uniform/std140/mat4x2/static_index_via_ptr.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/struct/mat4x2/static_index_via_ptr.wgsl.expected.glsl similarity index 88% rename from test/tint/buffer/uniform/std140/mat4x2/static_index_via_ptr.wgsl.expected.glsl rename to test/tint/buffer/uniform/std140/struct/mat4x2/static_index_via_ptr.wgsl.expected.glsl index 99394e5547..c14425b14a 100644 --- a/test/tint/buffer/uniform/std140/mat4x2/static_index_via_ptr.wgsl.expected.glsl +++ b/test/tint/buffer/uniform/std140/struct/mat4x2/static_index_via_ptr.wgsl.expected.glsl @@ -19,13 +19,12 @@ struct Outer_std140 { Inner_std140 a[4]; }; -layout(binding = 0, std140) uniform a_block_ubo { +layout(binding = 0, std140) uniform a_block_std140_ubo { Outer_std140 inner[4]; } a; Inner conv_Inner(Inner_std140 val) { - Inner tint_symbol = Inner(mat4x2(val.m_0, val.m_1, val.m_2, val.m_3)); - return tint_symbol; + return Inner(mat4x2(val.m_0, val.m_1, val.m_2, val.m_3)); } Inner[4] conv_arr_4_Inner(Inner_std140 val[4]) { @@ -39,8 +38,7 @@ Inner[4] conv_arr_4_Inner(Inner_std140 val[4]) { } Outer conv_Outer(Outer_std140 val) { - Outer tint_symbol_1 = Outer(conv_arr_4_Inner(val.a)); - return tint_symbol_1; + return Outer(conv_arr_4_Inner(val.a)); } Outer[4] conv_arr_4_Outer(Outer_std140 val[4]) { @@ -53,23 +51,22 @@ Outer[4] conv_arr_4_Outer(Outer_std140 val[4]) { return arr; } -mat4x2 load_a_3_a_2_m() { +mat4x2 load_a_inner_3_a_2_m() { return mat4x2(a.inner[3u].a[2u].m_0, a.inner[3u].a[2u].m_1, a.inner[3u].a[2u].m_2, a.inner[3u].a[2u].m_3); } void f() { - int I = 1; Outer p_a[4] = conv_arr_4_Outer(a.inner); Outer p_a_3 = conv_Outer(a.inner[3u]); Inner p_a_3_a[4] = conv_arr_4_Inner(a.inner[3u].a); Inner p_a_3_a_2 = conv_Inner(a.inner[3u].a[2u]); - mat4x2 p_a_3_a_2_m = load_a_3_a_2_m(); + mat4x2 p_a_3_a_2_m = load_a_inner_3_a_2_m(); vec2 p_a_3_a_2_m_1 = a.inner[3u].a[2u].m_1; Outer l_a[4] = conv_arr_4_Outer(a.inner); Outer l_a_3 = conv_Outer(a.inner[3u]); Inner l_a_3_a[4] = conv_arr_4_Inner(a.inner[3u].a); Inner l_a_3_a_2 = conv_Inner(a.inner[3u].a[2u]); - mat4x2 l_a_3_a_2_m = load_a_3_a_2_m(); + mat4x2 l_a_3_a_2_m = load_a_inner_3_a_2_m(); vec2 l_a_3_a_2_m_1 = a.inner[3u].a[2u].m_1; float l_a_3_a_2_m_1_0 = a.inner[3u].a[2u].m_1[0u]; } diff --git a/test/tint/buffer/uniform/std140/mat4x2/static_index_via_ptr.wgsl.expected.msl b/test/tint/buffer/uniform/std140/struct/mat4x2/static_index_via_ptr.wgsl.expected.msl similarity index 98% rename from test/tint/buffer/uniform/std140/mat4x2/static_index_via_ptr.wgsl.expected.msl rename to test/tint/buffer/uniform/std140/struct/mat4x2/static_index_via_ptr.wgsl.expected.msl index ef14c73884..457e6203a6 100644 --- a/test/tint/buffer/uniform/std140/mat4x2/static_index_via_ptr.wgsl.expected.msl +++ b/test/tint/buffer/uniform/std140/struct/mat4x2/static_index_via_ptr.wgsl.expected.msl @@ -23,7 +23,6 @@ struct Outer { }; kernel void f(const constant tint_array* tint_symbol [[buffer(0)]]) { - int const I = 1; tint_array const l_a = *(tint_symbol); Outer const l_a_3 = (*(tint_symbol))[3]; tint_array const l_a_3_a = (*(tint_symbol))[3].a; diff --git a/test/tint/buffer/uniform/std140/mat4x2/static_index_via_ptr.wgsl.expected.spvasm b/test/tint/buffer/uniform/std140/struct/mat4x2/static_index_via_ptr.wgsl.expected.spvasm similarity index 71% rename from test/tint/buffer/uniform/std140/mat4x2/static_index_via_ptr.wgsl.expected.spvasm rename to test/tint/buffer/uniform/std140/struct/mat4x2/static_index_via_ptr.wgsl.expected.spvasm index f75294515d..3cd3ef39d7 100644 --- a/test/tint/buffer/uniform/std140/mat4x2/static_index_via_ptr.wgsl.expected.spvasm +++ b/test/tint/buffer/uniform/std140/struct/mat4x2/static_index_via_ptr.wgsl.expected.spvasm @@ -1,14 +1,14 @@ ; SPIR-V ; Version: 1.3 ; Generator: Google Tint Compiler; 0 -; Bound: 159 +; Bound: 148 ; Schema: 0 OpCapability Shader OpMemoryModel Logical GLSL450 OpEntryPoint GLCompute %f "f" OpExecutionMode %f LocalSize 1 1 1 - OpName %a_block "a_block" - OpMemberName %a_block 0 "inner" + OpName %a_block_std140 "a_block_std140" + OpMemberName %a_block_std140 0 "inner" OpName %Outer_std140 "Outer_std140" OpMemberName %Outer_std140 0 "a" OpName %Inner_std140 "Inner_std140" @@ -25,7 +25,7 @@ OpName %val_0 "val" OpName %arr "arr" OpName %i "i" - OpName %var_for_index "var_for_index" + OpName %var_for_index_1 "var_for_index_1" OpName %Outer "Outer" OpMemberName %Outer 0 "a" OpName %conv_Outer "conv_Outer" @@ -34,11 +34,11 @@ OpName %val_2 "val" OpName %arr_0 "arr" OpName %i_0 "i" - OpName %var_for_index_1 "var_for_index_1" - OpName %load_a_3_a_2_m "load_a_3_a_2_m" + OpName %var_for_index "var_for_index" + OpName %load_a_inner_3_a_2_m "load_a_inner_3_a_2_m" OpName %f "f" - OpDecorate %a_block Block - OpMemberDecorate %a_block 0 Offset 0 + OpDecorate %a_block_std140 Block + OpMemberDecorate %a_block_std140 0 Offset 0 OpMemberDecorate %Outer_std140 0 Offset 0 OpMemberDecorate %Inner_std140 0 Offset 0 OpMemberDecorate %Inner_std140 1 Offset 8 @@ -63,9 +63,9 @@ %_arr_Inner_std140_uint_4 = OpTypeArray %Inner_std140 %uint_4 %Outer_std140 = OpTypeStruct %_arr_Inner_std140_uint_4 %_arr_Outer_std140_uint_4 = OpTypeArray %Outer_std140 %uint_4 - %a_block = OpTypeStruct %_arr_Outer_std140_uint_4 -%_ptr_Uniform_a_block = OpTypePointer Uniform %a_block - %a = OpVariable %_ptr_Uniform_a_block Uniform +%a_block_std140 = OpTypeStruct %_arr_Outer_std140_uint_4 +%_ptr_Uniform_a_block_std140 = OpTypePointer Uniform %a_block_std140 + %a = OpVariable %_ptr_Uniform_a_block_std140 Uniform %mat4v2float = OpTypeMatrix %v2float 4 %Inner = OpTypeStruct %mat4v2float %12 = OpTypeFunction %Inner %Inner_std140 @@ -95,15 +95,13 @@ %uint_0 = OpConstant %uint 0 %uint_3 = OpConstant %uint 3 %uint_2 = OpConstant %uint 2 +%_ptr_Uniform_Inner_std140 = OpTypePointer Uniform %Inner_std140 %_ptr_Uniform_v2float = OpTypePointer Uniform %v2float %void = OpTypeVoid - %116 = OpTypeFunction %void - %int = OpTypeInt 32 1 - %int_1 = OpConstant %int 1 + %123 = OpTypeFunction %void %_ptr_Uniform__arr_Outer_std140_uint_4 = OpTypePointer Uniform %_arr_Outer_std140_uint_4 %_ptr_Uniform_Outer_std140 = OpTypePointer Uniform %Outer_std140 %_ptr_Uniform__arr_Inner_std140_uint_4 = OpTypePointer Uniform %_arr_Inner_std140_uint_4 -%_ptr_Uniform_Inner_std140 = OpTypePointer Uniform %Inner_std140 %_ptr_Uniform_float = OpTypePointer Uniform %float %conv_Inner = OpFunction %Inner None %12 %val = OpFunctionParameter %Inner_std140 @@ -121,7 +119,7 @@ %28 = OpLabel %arr = OpVariable %_ptr_Function__arr_Inner_uint_4 Function %31 %i = OpVariable %_ptr_Function_uint Function %34 -%var_for_index = OpVariable %_ptr_Function__arr_Inner_std140_uint_4 Function %47 +%var_for_index_1 = OpVariable %_ptr_Function__arr_Inner_std140_uint_4 Function %47 OpBranch %35 %35 = OpLabel OpLoopMerge %36 %37 None @@ -135,11 +133,11 @@ %44 = OpLabel OpBranch %36 %43 = OpLabel - OpStore %var_for_index %val_0 + OpStore %var_for_index_1 %val_0 %48 = OpLoad %uint %i %50 = OpAccessChain %_ptr_Function_Inner %arr %48 %52 = OpLoad %uint %i - %54 = OpAccessChain %_ptr_Function_Inner_std140 %var_for_index %52 + %54 = OpAccessChain %_ptr_Function_Inner_std140 %var_for_index_1 %52 %55 = OpLoad %Inner_std140 %54 %51 = OpFunctionCall %Inner %conv_Inner %55 OpStore %50 %51 @@ -166,7 +164,7 @@ %72 = OpLabel %arr_0 = OpVariable %_ptr_Function__arr_Outer_uint_4 Function %75 %i_0 = OpVariable %_ptr_Function_uint Function %34 -%var_for_index_1 = OpVariable %_ptr_Function__arr_Outer_std140_uint_4 Function %88 +%var_for_index = OpVariable %_ptr_Function__arr_Outer_std140_uint_4 Function %88 OpBranch %77 %77 = OpLabel OpLoopMerge %78 %79 None @@ -180,11 +178,11 @@ %85 = OpLabel OpBranch %78 %84 = OpLabel - OpStore %var_for_index_1 %val_2 + OpStore %var_for_index %val_2 %89 = OpLoad %uint %i_0 %91 = OpAccessChain %_ptr_Function_Outer %arr_0 %89 %93 = OpLoad %uint %i_0 - %95 = OpAccessChain %_ptr_Function_Outer_std140 %var_for_index_1 %93 + %95 = OpAccessChain %_ptr_Function_Outer_std140 %var_for_index %93 %96 = OpLoad %Outer_std140 %95 %92 = OpFunctionCall %Outer %conv_Outer %96 OpStore %91 %92 @@ -198,52 +196,38 @@ %99 = OpLoad %_arr_Outer_uint_4 %arr_0 OpReturnValue %99 OpFunctionEnd -%load_a_3_a_2_m = OpFunction %mat4v2float None %100 +%load_a_inner_3_a_2_m = OpFunction %mat4v2float None %100 %102 = OpLabel - %107 = OpAccessChain %_ptr_Uniform_v2float %a %uint_0 %uint_3 %uint_0 %uint_2 %uint_0 - %108 = OpLoad %v2float %107 - %109 = OpAccessChain %_ptr_Uniform_v2float %a %uint_0 %uint_3 %uint_0 %uint_2 %uint_1 - %110 = OpLoad %v2float %109 - %111 = OpAccessChain %_ptr_Uniform_v2float %a %uint_0 %uint_3 %uint_0 %uint_2 %uint_2 + %108 = OpAccessChain %_ptr_Uniform_Inner_std140 %a %uint_0 %uint_3 %uint_0 %uint_2 + %111 = OpAccessChain %_ptr_Uniform_v2float %108 %uint_0 %112 = OpLoad %v2float %111 - %113 = OpAccessChain %_ptr_Uniform_v2float %a %uint_0 %uint_3 %uint_0 %uint_2 %uint_3 - %114 = OpLoad %v2float %113 - %115 = OpCompositeConstruct %mat4v2float %108 %110 %112 %114 - OpReturnValue %115 + %114 = OpAccessChain %_ptr_Uniform_v2float %108 %uint_1 + %115 = OpLoad %v2float %114 + %117 = OpAccessChain %_ptr_Uniform_v2float %108 %uint_2 + %118 = OpLoad %v2float %117 + %120 = OpAccessChain %_ptr_Uniform_v2float %108 %uint_3 + %121 = OpLoad %v2float %120 + %122 = OpCompositeConstruct %mat4v2float %112 %115 %118 %121 + OpReturnValue %122 OpFunctionEnd - %f = OpFunction %void None %116 - %119 = OpLabel - %124 = OpAccessChain %_ptr_Uniform__arr_Outer_std140_uint_4 %a %uint_0 - %125 = OpLoad %_arr_Outer_std140_uint_4 %124 - %122 = OpFunctionCall %_arr_Outer_uint_4 %conv_arr_4_Outer %125 - %128 = OpAccessChain %_ptr_Uniform_Outer_std140 %a %uint_0 %uint_3 - %129 = OpLoad %Outer_std140 %128 - %126 = OpFunctionCall %Outer %conv_Outer %129 - %132 = OpAccessChain %_ptr_Uniform__arr_Inner_std140_uint_4 %a %uint_0 %uint_3 %uint_0 - %133 = OpLoad %_arr_Inner_std140_uint_4 %132 - %130 = OpFunctionCall %_arr_Inner_uint_4 %conv_arr_4_Inner %133 - %136 = OpAccessChain %_ptr_Uniform_Inner_std140 %a %uint_0 %uint_3 %uint_0 %uint_2 - %137 = OpLoad %Inner_std140 %136 - %134 = OpFunctionCall %Inner %conv_Inner %137 - %138 = OpFunctionCall %mat4v2float %load_a_3_a_2_m - %139 = OpAccessChain %_ptr_Uniform_v2float %a %uint_0 %uint_3 %uint_0 %uint_2 %uint_1 - %140 = OpLoad %v2float %139 - %142 = OpAccessChain %_ptr_Uniform__arr_Outer_std140_uint_4 %a %uint_0 - %143 = OpLoad %_arr_Outer_std140_uint_4 %142 - %141 = OpFunctionCall %_arr_Outer_uint_4 %conv_arr_4_Outer %143 - %145 = OpAccessChain %_ptr_Uniform_Outer_std140 %a %uint_0 %uint_3 - %146 = OpLoad %Outer_std140 %145 - %144 = OpFunctionCall %Outer %conv_Outer %146 - %148 = OpAccessChain %_ptr_Uniform__arr_Inner_std140_uint_4 %a %uint_0 %uint_3 %uint_0 - %149 = OpLoad %_arr_Inner_std140_uint_4 %148 - %147 = OpFunctionCall %_arr_Inner_uint_4 %conv_arr_4_Inner %149 - %151 = OpAccessChain %_ptr_Uniform_Inner_std140 %a %uint_0 %uint_3 %uint_0 %uint_2 - %152 = OpLoad %Inner_std140 %151 - %150 = OpFunctionCall %Inner %conv_Inner %152 - %153 = OpFunctionCall %mat4v2float %load_a_3_a_2_m - %154 = OpAccessChain %_ptr_Uniform_v2float %a %uint_0 %uint_3 %uint_0 %uint_2 %uint_1 - %155 = OpLoad %v2float %154 - %157 = OpAccessChain %_ptr_Uniform_float %a %uint_0 %uint_3 %uint_0 %uint_2 %uint_1 %34 - %158 = OpLoad %float %157 + %f = OpFunction %void None %123 + %126 = OpLabel + %129 = OpAccessChain %_ptr_Uniform__arr_Outer_std140_uint_4 %a %uint_0 + %130 = OpLoad %_arr_Outer_std140_uint_4 %129 + %127 = OpFunctionCall %_arr_Outer_uint_4 %conv_arr_4_Outer %130 + %133 = OpAccessChain %_ptr_Uniform_Outer_std140 %a %uint_0 %uint_3 + %134 = OpLoad %Outer_std140 %133 + %131 = OpFunctionCall %Outer %conv_Outer %134 + %137 = OpAccessChain %_ptr_Uniform__arr_Inner_std140_uint_4 %a %uint_0 %uint_3 %uint_0 + %138 = OpLoad %_arr_Inner_std140_uint_4 %137 + %135 = OpFunctionCall %_arr_Inner_uint_4 %conv_arr_4_Inner %138 + %140 = OpAccessChain %_ptr_Uniform_Inner_std140 %a %uint_0 %uint_3 %uint_0 %uint_2 + %141 = OpLoad %Inner_std140 %140 + %139 = OpFunctionCall %Inner %conv_Inner %141 + %142 = OpFunctionCall %mat4v2float %load_a_inner_3_a_2_m + %143 = OpAccessChain %_ptr_Uniform_v2float %a %uint_0 %uint_3 %uint_0 %uint_2 %uint_1 + %144 = OpLoad %v2float %143 + %146 = OpAccessChain %_ptr_Uniform_float %a %uint_0 %uint_3 %uint_0 %uint_2 %uint_1 %34 + %147 = OpLoad %float %146 OpReturn OpFunctionEnd diff --git a/test/tint/buffer/uniform/std140/mat4x2/static_index_via_ptr.wgsl.expected.wgsl b/test/tint/buffer/uniform/std140/struct/mat4x2/static_index_via_ptr.wgsl.expected.wgsl similarity index 98% rename from test/tint/buffer/uniform/std140/mat4x2/static_index_via_ptr.wgsl.expected.wgsl rename to test/tint/buffer/uniform/std140/struct/mat4x2/static_index_via_ptr.wgsl.expected.wgsl index ff8de06ca5..6347a0ea7e 100644 --- a/test/tint/buffer/uniform/std140/mat4x2/static_index_via_ptr.wgsl.expected.wgsl +++ b/test/tint/buffer/uniform/std140/struct/mat4x2/static_index_via_ptr.wgsl.expected.wgsl @@ -10,7 +10,6 @@ struct Outer { @compute @workgroup_size(1) fn f() { - let I = 1; let p_a = &(a); let p_a_3 = &((*(p_a))[3]); let p_a_3_a = &((*(p_a_3)).a); diff --git a/test/tint/buffer/uniform/std140/mat4x2/to_builtin.wgsl b/test/tint/buffer/uniform/std140/struct/mat4x2/to_builtin.wgsl similarity index 100% rename from test/tint/buffer/uniform/std140/mat4x2/to_builtin.wgsl rename to test/tint/buffer/uniform/std140/struct/mat4x2/to_builtin.wgsl diff --git a/test/tint/buffer/uniform/std140/mat4x2/to_builtin.wgsl.expected.dxc.hlsl b/test/tint/buffer/uniform/std140/struct/mat4x2/to_builtin.wgsl.expected.dxc.hlsl similarity index 100% rename from test/tint/buffer/uniform/std140/mat4x2/to_builtin.wgsl.expected.dxc.hlsl rename to test/tint/buffer/uniform/std140/struct/mat4x2/to_builtin.wgsl.expected.dxc.hlsl diff --git a/test/tint/buffer/uniform/std140/mat4x2/to_builtin.wgsl.expected.fxc.hlsl b/test/tint/buffer/uniform/std140/struct/mat4x2/to_builtin.wgsl.expected.fxc.hlsl similarity index 100% rename from test/tint/buffer/uniform/std140/mat4x2/to_builtin.wgsl.expected.fxc.hlsl rename to test/tint/buffer/uniform/std140/struct/mat4x2/to_builtin.wgsl.expected.fxc.hlsl diff --git a/test/tint/buffer/uniform/std140/mat4x2/to_builtin.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/struct/mat4x2/to_builtin.wgsl.expected.glsl similarity index 76% rename from test/tint/buffer/uniform/std140/mat4x2/to_builtin.wgsl.expected.glsl rename to test/tint/buffer/uniform/std140/struct/mat4x2/to_builtin.wgsl.expected.glsl index 9eede3ec25..b5bbb97e74 100644 --- a/test/tint/buffer/uniform/std140/mat4x2/to_builtin.wgsl.expected.glsl +++ b/test/tint/buffer/uniform/std140/struct/mat4x2/to_builtin.wgsl.expected.glsl @@ -2,8 +2,10 @@ struct S { int before; + uint pad; mat4x2 m; int after; + uint pad_1; }; struct S_std140 { @@ -17,16 +19,16 @@ struct S_std140 { uint pad_1; }; -layout(binding = 0, std140) uniform u_block_ubo { +layout(binding = 0, std140) uniform u_block_std140_ubo { S_std140 inner[4]; } u; -mat4x2 load_u_2_m() { +mat4x2 load_u_inner_2_m() { return mat4x2(u.inner[2u].m_0, u.inner[2u].m_1, u.inner[2u].m_2, u.inner[2u].m_3); } void f() { - mat2x4 t = transpose(load_u_2_m()); + mat2x4 t = transpose(load_u_inner_2_m()); float l = length(u.inner[0u].m_1.yx); float a = abs(u.inner[0u].m_1.yx[0u]); } diff --git a/test/tint/buffer/uniform/std140/mat4x2/to_builtin.wgsl.expected.msl b/test/tint/buffer/uniform/std140/struct/mat4x2/to_builtin.wgsl.expected.msl similarity index 100% rename from test/tint/buffer/uniform/std140/mat4x2/to_builtin.wgsl.expected.msl rename to test/tint/buffer/uniform/std140/struct/mat4x2/to_builtin.wgsl.expected.msl diff --git a/test/tint/buffer/uniform/std140/mat4x2/to_builtin.wgsl.expected.spvasm b/test/tint/buffer/uniform/std140/struct/mat4x2/to_builtin.wgsl.expected.spvasm similarity index 51% rename from test/tint/buffer/uniform/std140/mat4x2/to_builtin.wgsl.expected.spvasm rename to test/tint/buffer/uniform/std140/struct/mat4x2/to_builtin.wgsl.expected.spvasm index a9f5647d22..831410fc74 100644 --- a/test/tint/buffer/uniform/std140/mat4x2/to_builtin.wgsl.expected.spvasm +++ b/test/tint/buffer/uniform/std140/struct/mat4x2/to_builtin.wgsl.expected.spvasm @@ -1,15 +1,15 @@ ; SPIR-V ; Version: 1.3 ; Generator: Google Tint Compiler; 0 -; Bound: 48 +; Bound: 55 ; Schema: 0 OpCapability Shader - %38 = OpExtInstImport "GLSL.std.450" + %45 = OpExtInstImport "GLSL.std.450" OpMemoryModel Logical GLSL450 OpEntryPoint GLCompute %f "f" OpExecutionMode %f LocalSize 1 1 1 - OpName %u_block "u_block" - OpMemberName %u_block 0 "inner" + OpName %u_block_std140 "u_block_std140" + OpMemberName %u_block_std140 0 "inner" OpName %S_std140 "S_std140" OpMemberName %S_std140 0 "before" OpMemberName %S_std140 1 "m_0" @@ -18,10 +18,10 @@ OpMemberName %S_std140 4 "m_3" OpMemberName %S_std140 5 "after" OpName %u "u" - OpName %load_u_2_m "load_u_2_m" + OpName %load_u_inner_2_m "load_u_inner_2_m" OpName %f "f" - OpDecorate %u_block Block - OpMemberDecorate %u_block 0 Offset 0 + OpDecorate %u_block_std140 Block + OpMemberDecorate %u_block_std140 0 Offset 0 OpMemberDecorate %S_std140 0 Offset 0 OpMemberDecorate %S_std140 1 Offset 8 OpMemberDecorate %S_std140 2 Offset 16 @@ -39,46 +39,48 @@ %uint = OpTypeInt 32 0 %uint_4 = OpConstant %uint 4 %_arr_S_std140_uint_4 = OpTypeArray %S_std140 %uint_4 - %u_block = OpTypeStruct %_arr_S_std140_uint_4 -%_ptr_Uniform_u_block = OpTypePointer Uniform %u_block - %u = OpVariable %_ptr_Uniform_u_block Uniform +%u_block_std140 = OpTypeStruct %_arr_S_std140_uint_4 +%_ptr_Uniform_u_block_std140 = OpTypePointer Uniform %u_block_std140 + %u = OpVariable %_ptr_Uniform_u_block_std140 Uniform %mat4v2float = OpTypeMatrix %v2float 4 %11 = OpTypeFunction %mat4v2float %uint_0 = OpConstant %uint 0 %uint_2 = OpConstant %uint 2 +%_ptr_Uniform_S_std140 = OpTypePointer Uniform %S_std140 %uint_1 = OpConstant %uint 1 %_ptr_Uniform_v2float = OpTypePointer Uniform %v2float %uint_3 = OpConstant %uint 3 %void = OpTypeVoid - %29 = OpTypeFunction %void + %36 = OpTypeFunction %void %v4float = OpTypeVector %float 4 %mat2v4float = OpTypeMatrix %v4float 2 - %39 = OpConstantNull %uint - %load_u_2_m = OpFunction %mat4v2float None %11 + %46 = OpConstantNull %uint +%load_u_inner_2_m = OpFunction %mat4v2float None %11 %14 = OpLabel - %19 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 %uint_2 %uint_1 - %20 = OpLoad %v2float %19 - %21 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 %uint_2 %uint_2 - %22 = OpLoad %v2float %21 - %24 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 %uint_2 %uint_3 - %25 = OpLoad %v2float %24 - %26 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 %uint_2 %uint_4 + %19 = OpAccessChain %_ptr_Uniform_S_std140 %u %uint_0 %uint_2 + %23 = OpAccessChain %_ptr_Uniform_v2float %19 %uint_1 + %24 = OpLoad %v2float %23 + %26 = OpAccessChain %_ptr_Uniform_v2float %19 %uint_2 %27 = OpLoad %v2float %26 - %28 = OpCompositeConstruct %mat4v2float %20 %22 %25 %27 - OpReturnValue %28 + %30 = OpAccessChain %_ptr_Uniform_v2float %19 %uint_3 + %31 = OpLoad %v2float %30 + %33 = OpAccessChain %_ptr_Uniform_v2float %19 %uint_4 + %34 = OpLoad %v2float %33 + %35 = OpCompositeConstruct %mat4v2float %24 %27 %31 %34 + OpReturnValue %35 OpFunctionEnd - %f = OpFunction %void None %29 - %32 = OpLabel - %36 = OpFunctionCall %mat4v2float %load_u_2_m - %33 = OpTranspose %mat2v4float %36 - %40 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 %39 %uint_2 - %41 = OpLoad %v2float %40 - %42 = OpVectorShuffle %v2float %41 %41 1 0 - %37 = OpExtInst %float %38 Length %42 - %44 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 %39 %uint_2 - %45 = OpLoad %v2float %44 - %46 = OpVectorShuffle %v2float %45 %45 1 0 - %47 = OpCompositeExtract %float %46 0 - %43 = OpExtInst %float %38 FAbs %47 + %f = OpFunction %void None %36 + %39 = OpLabel + %43 = OpFunctionCall %mat4v2float %load_u_inner_2_m + %40 = OpTranspose %mat2v4float %43 + %47 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 %46 %uint_2 + %48 = OpLoad %v2float %47 + %49 = OpVectorShuffle %v2float %48 %48 1 0 + %44 = OpExtInst %float %45 Length %49 + %51 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 %46 %uint_2 + %52 = OpLoad %v2float %51 + %53 = OpVectorShuffle %v2float %52 %52 1 0 + %54 = OpCompositeExtract %float %53 0 + %50 = OpExtInst %float %45 FAbs %54 OpReturn OpFunctionEnd diff --git a/test/tint/buffer/uniform/std140/mat4x2/to_builtin.wgsl.expected.wgsl b/test/tint/buffer/uniform/std140/struct/mat4x2/to_builtin.wgsl.expected.wgsl similarity index 100% rename from test/tint/buffer/uniform/std140/mat4x2/to_builtin.wgsl.expected.wgsl rename to test/tint/buffer/uniform/std140/struct/mat4x2/to_builtin.wgsl.expected.wgsl diff --git a/test/tint/buffer/uniform/std140/mat4x2/to_fn.wgsl b/test/tint/buffer/uniform/std140/struct/mat4x2/to_fn.wgsl similarity index 100% rename from test/tint/buffer/uniform/std140/mat4x2/to_fn.wgsl rename to test/tint/buffer/uniform/std140/struct/mat4x2/to_fn.wgsl diff --git a/test/tint/buffer/uniform/std140/mat4x2/to_fn.wgsl.expected.dxc.hlsl b/test/tint/buffer/uniform/std140/struct/mat4x2/to_fn.wgsl.expected.dxc.hlsl similarity index 100% rename from test/tint/buffer/uniform/std140/mat4x2/to_fn.wgsl.expected.dxc.hlsl rename to test/tint/buffer/uniform/std140/struct/mat4x2/to_fn.wgsl.expected.dxc.hlsl diff --git a/test/tint/buffer/uniform/std140/mat4x2/to_fn.wgsl.expected.fxc.hlsl b/test/tint/buffer/uniform/std140/struct/mat4x2/to_fn.wgsl.expected.fxc.hlsl similarity index 100% rename from test/tint/buffer/uniform/std140/mat4x2/to_fn.wgsl.expected.fxc.hlsl rename to test/tint/buffer/uniform/std140/struct/mat4x2/to_fn.wgsl.expected.fxc.hlsl diff --git a/test/tint/buffer/uniform/std140/mat4x2/to_fn.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/struct/mat4x2/to_fn.wgsl.expected.glsl similarity index 59% rename from test/tint/buffer/uniform/std140/mat4x2/to_fn.wgsl.expected.glsl rename to test/tint/buffer/uniform/std140/struct/mat4x2/to_fn.wgsl.expected.glsl index 837c23eb04..42fa3a1106 100644 --- a/test/tint/buffer/uniform/std140/mat4x2/to_fn.wgsl.expected.glsl +++ b/test/tint/buffer/uniform/std140/struct/mat4x2/to_fn.wgsl.expected.glsl @@ -2,8 +2,10 @@ struct S { int before; + uint pad; mat4x2 m; int after; + uint pad_1; }; struct S_std140 { @@ -17,7 +19,7 @@ struct S_std140 { uint pad_1; }; -layout(binding = 0, std140) uniform u_block_ubo { +layout(binding = 0, std140) uniform u_block_std140_ubo { S_std140 inner[4]; } u; @@ -37,12 +39,11 @@ void e(float f_1) { } S conv_S(S_std140 val) { - S tint_symbol = S(val.before, mat4x2(val.m_0, val.m_1, val.m_2, val.m_3), val.after); - return tint_symbol; + return S(val.before, val.pad, mat4x2(val.m_0, val.m_1, val.m_2, val.m_3), val.after, val.pad_1); } S[4] conv_arr_4_S(S_std140 val[4]) { - S arr[4] = S[4](S(0, mat4x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), 0), S(0, mat4x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), 0), S(0, mat4x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), 0), S(0, mat4x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), 0)); + S arr[4] = S[4](S(0, 0u, mat4x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), 0, 0u), S(0, 0u, mat4x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), 0, 0u), S(0, 0u, mat4x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), 0, 0u), S(0, 0u, mat4x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), 0, 0u)); { for(uint i = 0u; (i < 4u); i = (i + 1u)) { arr[i] = conv_S(val[i]); @@ -51,14 +52,14 @@ S[4] conv_arr_4_S(S_std140 val[4]) { return arr; } -mat4x2 load_u_2_m() { +mat4x2 load_u_inner_2_m() { return mat4x2(u.inner[2u].m_0, u.inner[2u].m_1, u.inner[2u].m_2, u.inner[2u].m_3); } void f() { a(conv_arr_4_S(u.inner)); b(conv_S(u.inner[2u])); - c(load_u_2_m()); + c(load_u_inner_2_m()); d(u.inner[0u].m_1.yx); e(u.inner[0u].m_1.yx[0u]); } diff --git a/test/tint/buffer/uniform/std140/mat4x2/to_fn.wgsl.expected.msl b/test/tint/buffer/uniform/std140/struct/mat4x2/to_fn.wgsl.expected.msl similarity index 100% rename from test/tint/buffer/uniform/std140/mat4x2/to_fn.wgsl.expected.msl rename to test/tint/buffer/uniform/std140/struct/mat4x2/to_fn.wgsl.expected.msl diff --git a/test/tint/buffer/uniform/std140/mat4x2/to_fn.wgsl.expected.spvasm b/test/tint/buffer/uniform/std140/struct/mat4x2/to_fn.wgsl.expected.spvasm similarity index 76% rename from test/tint/buffer/uniform/std140/mat4x2/to_fn.wgsl.expected.spvasm rename to test/tint/buffer/uniform/std140/struct/mat4x2/to_fn.wgsl.expected.spvasm index 9993de9779..06de1ef522 100644 --- a/test/tint/buffer/uniform/std140/mat4x2/to_fn.wgsl.expected.spvasm +++ b/test/tint/buffer/uniform/std140/struct/mat4x2/to_fn.wgsl.expected.spvasm @@ -1,14 +1,14 @@ ; SPIR-V ; Version: 1.3 ; Generator: Google Tint Compiler; 0 -; Bound: 122 +; Bound: 128 ; Schema: 0 OpCapability Shader OpMemoryModel Logical GLSL450 OpEntryPoint GLCompute %f "f" OpExecutionMode %f LocalSize 1 1 1 - OpName %u_block "u_block" - OpMemberName %u_block 0 "inner" + OpName %u_block_std140 "u_block_std140" + OpMemberName %u_block_std140 0 "inner" OpName %S_std140 "S_std140" OpMemberName %S_std140 0 "before" OpMemberName %S_std140 1 "m_0" @@ -38,10 +38,10 @@ OpName %arr "arr" OpName %i "i" OpName %var_for_index "var_for_index" - OpName %load_u_2_m "load_u_2_m" + OpName %load_u_inner_2_m "load_u_inner_2_m" OpName %f "f" - OpDecorate %u_block Block - OpMemberDecorate %u_block 0 Offset 0 + OpDecorate %u_block_std140 Block + OpMemberDecorate %u_block_std140 0 Offset 0 OpMemberDecorate %S_std140 0 Offset 0 OpMemberDecorate %S_std140 1 Offset 8 OpMemberDecorate %S_std140 2 Offset 16 @@ -65,9 +65,9 @@ %uint = OpTypeInt 32 0 %uint_4 = OpConstant %uint 4 %_arr_S_std140_uint_4 = OpTypeArray %S_std140 %uint_4 - %u_block = OpTypeStruct %_arr_S_std140_uint_4 -%_ptr_Uniform_u_block = OpTypePointer Uniform %u_block - %u = OpVariable %_ptr_Uniform_u_block Uniform +%u_block_std140 = OpTypeStruct %_arr_S_std140_uint_4 +%_ptr_Uniform_u_block_std140 = OpTypePointer Uniform %u_block_std140 + %u = OpVariable %_ptr_Uniform_u_block_std140 Uniform %void = OpTypeVoid %mat4v2float = OpTypeMatrix %v2float 4 %S = OpTypeStruct %int %mat4v2float %int @@ -92,11 +92,11 @@ %82 = OpTypeFunction %mat4v2float %uint_0 = OpConstant %uint 0 %uint_2 = OpConstant %uint 2 +%_ptr_Uniform_S_std140 = OpTypePointer Uniform %S_std140 %_ptr_Uniform_v2float = OpTypePointer Uniform %v2float %uint_3 = OpConstant %uint 3 - %98 = OpTypeFunction %void + %105 = OpTypeFunction %void %_ptr_Uniform__arr_S_std140_uint_4 = OpTypePointer Uniform %_arr_S_std140_uint_4 -%_ptr_Uniform_S_std140 = OpTypePointer Uniform %S_std140 %a = OpFunction %void None %11 %a_1 = OpFunctionParameter %_arr_S_uint_4 %18 = OpLabel @@ -172,39 +172,40 @@ %81 = OpLoad %_arr_S_uint_4 %arr OpReturnValue %81 OpFunctionEnd - %load_u_2_m = OpFunction %mat4v2float None %82 +%load_u_inner_2_m = OpFunction %mat4v2float None %82 %84 = OpLabel - %88 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 %uint_2 %uint_1 - %89 = OpLoad %v2float %88 - %90 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 %uint_2 %uint_2 - %91 = OpLoad %v2float %90 - %93 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 %uint_2 %uint_3 - %94 = OpLoad %v2float %93 - %95 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 %uint_2 %uint_4 + %89 = OpAccessChain %_ptr_Uniform_S_std140 %u %uint_0 %uint_2 + %92 = OpAccessChain %_ptr_Uniform_v2float %89 %uint_1 + %93 = OpLoad %v2float %92 + %95 = OpAccessChain %_ptr_Uniform_v2float %89 %uint_2 %96 = OpLoad %v2float %95 - %97 = OpCompositeConstruct %mat4v2float %89 %91 %94 %96 - OpReturnValue %97 + %99 = OpAccessChain %_ptr_Uniform_v2float %89 %uint_3 + %100 = OpLoad %v2float %99 + %102 = OpAccessChain %_ptr_Uniform_v2float %89 %uint_4 + %103 = OpLoad %v2float %102 + %104 = OpCompositeConstruct %mat4v2float %93 %96 %100 %103 + OpReturnValue %104 OpFunctionEnd - %f = OpFunction %void None %98 - %100 = OpLabel - %104 = OpAccessChain %_ptr_Uniform__arr_S_std140_uint_4 %u %uint_0 - %105 = OpLoad %_arr_S_std140_uint_4 %104 - %102 = OpFunctionCall %_arr_S_uint_4 %conv_arr_4_S %105 - %101 = OpFunctionCall %void %a %102 - %109 = OpAccessChain %_ptr_Uniform_S_std140 %u %uint_0 %uint_2 - %110 = OpLoad %S_std140 %109 - %107 = OpFunctionCall %S %conv_S %110 - %106 = OpFunctionCall %void %b %107 - %112 = OpFunctionCall %mat4v2float %load_u_2_m - %111 = OpFunctionCall %void %c %112 - %114 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 %56 %uint_2 - %115 = OpLoad %v2float %114 - %116 = OpVectorShuffle %v2float %115 %115 1 0 - %113 = OpFunctionCall %void %d %116 - %118 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 %56 %uint_2 - %119 = OpLoad %v2float %118 - %120 = OpVectorShuffle %v2float %119 %119 1 0 - %121 = OpCompositeExtract %float %120 0 - %117 = OpFunctionCall %void %e %121 + %f = OpFunction %void None %105 + %107 = OpLabel + %111 = OpAccessChain %_ptr_Uniform__arr_S_std140_uint_4 %u %uint_0 + %112 = OpLoad %_arr_S_std140_uint_4 %111 + %109 = OpFunctionCall %_arr_S_uint_4 %conv_arr_4_S %112 + %108 = OpFunctionCall %void %a %109 + %115 = OpAccessChain %_ptr_Uniform_S_std140 %u %uint_0 %uint_2 + %116 = OpLoad %S_std140 %115 + %114 = OpFunctionCall %S %conv_S %116 + %113 = OpFunctionCall %void %b %114 + %118 = OpFunctionCall %mat4v2float %load_u_inner_2_m + %117 = OpFunctionCall %void %c %118 + %120 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 %56 %uint_2 + %121 = OpLoad %v2float %120 + %122 = OpVectorShuffle %v2float %121 %121 1 0 + %119 = OpFunctionCall %void %d %122 + %124 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 %56 %uint_2 + %125 = OpLoad %v2float %124 + %126 = OpVectorShuffle %v2float %125 %125 1 0 + %127 = OpCompositeExtract %float %126 0 + %123 = OpFunctionCall %void %e %127 OpReturn OpFunctionEnd diff --git a/test/tint/buffer/uniform/std140/mat4x2/to_fn.wgsl.expected.wgsl b/test/tint/buffer/uniform/std140/struct/mat4x2/to_fn.wgsl.expected.wgsl similarity index 100% rename from test/tint/buffer/uniform/std140/mat4x2/to_fn.wgsl.expected.wgsl rename to test/tint/buffer/uniform/std140/struct/mat4x2/to_fn.wgsl.expected.wgsl diff --git a/test/tint/buffer/uniform/std140/mat4x2/to_private.wgsl b/test/tint/buffer/uniform/std140/struct/mat4x2/to_private.wgsl similarity index 100% rename from test/tint/buffer/uniform/std140/mat4x2/to_private.wgsl rename to test/tint/buffer/uniform/std140/struct/mat4x2/to_private.wgsl diff --git a/test/tint/buffer/uniform/std140/mat4x2/to_private.wgsl.expected.dxc.hlsl b/test/tint/buffer/uniform/std140/struct/mat4x2/to_private.wgsl.expected.dxc.hlsl similarity index 100% rename from test/tint/buffer/uniform/std140/mat4x2/to_private.wgsl.expected.dxc.hlsl rename to test/tint/buffer/uniform/std140/struct/mat4x2/to_private.wgsl.expected.dxc.hlsl diff --git a/test/tint/buffer/uniform/std140/mat4x2/to_private.wgsl.expected.fxc.hlsl b/test/tint/buffer/uniform/std140/struct/mat4x2/to_private.wgsl.expected.fxc.hlsl similarity index 100% rename from test/tint/buffer/uniform/std140/mat4x2/to_private.wgsl.expected.fxc.hlsl rename to test/tint/buffer/uniform/std140/struct/mat4x2/to_private.wgsl.expected.fxc.hlsl diff --git a/test/tint/buffer/uniform/std140/struct/mat4x2/to_private.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/struct/mat4x2/to_private.wgsl.expected.glsl new file mode 100644 index 0000000000..658610ec76 --- /dev/null +++ b/test/tint/buffer/uniform/std140/struct/mat4x2/to_private.wgsl.expected.glsl @@ -0,0 +1,56 @@ +#version 310 es + +struct S { + int before; + uint pad; + mat4x2 m; + int after; + uint pad_1; +}; + +struct S_std140 { + int before; + uint pad; + vec2 m_0; + vec2 m_1; + vec2 m_2; + vec2 m_3; + int after; + uint pad_1; +}; + +layout(binding = 0, std140) uniform u_block_std140_ubo { + S_std140 inner[4]; +} u; + +S p[4] = S[4](S(0, 0u, mat4x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), 0, 0u), S(0, 0u, mat4x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), 0, 0u), S(0, 0u, mat4x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), 0, 0u), S(0, 0u, mat4x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), 0, 0u)); +S conv_S(S_std140 val) { + return S(val.before, val.pad, mat4x2(val.m_0, val.m_1, val.m_2, val.m_3), val.after, val.pad_1); +} + +S[4] conv_arr_4_S(S_std140 val[4]) { + S arr[4] = S[4](S(0, 0u, mat4x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), 0, 0u), S(0, 0u, mat4x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), 0, 0u), S(0, 0u, mat4x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), 0, 0u), S(0, 0u, mat4x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), 0, 0u)); + { + for(uint i = 0u; (i < 4u); i = (i + 1u)) { + arr[i] = conv_S(val[i]); + } + } + return arr; +} + +mat4x2 load_u_inner_2_m() { + return mat4x2(u.inner[2u].m_0, u.inner[2u].m_1, u.inner[2u].m_2, u.inner[2u].m_3); +} + +void f() { + p = conv_arr_4_S(u.inner); + p[1] = conv_S(u.inner[2u]); + p[3].m = load_u_inner_2_m(); + p[1].m[0] = u.inner[0u].m_1.yx; +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + f(); + return; +} diff --git a/test/tint/buffer/uniform/std140/mat4x2/to_private.wgsl.expected.msl b/test/tint/buffer/uniform/std140/struct/mat4x2/to_private.wgsl.expected.msl similarity index 100% rename from test/tint/buffer/uniform/std140/mat4x2/to_private.wgsl.expected.msl rename to test/tint/buffer/uniform/std140/struct/mat4x2/to_private.wgsl.expected.msl diff --git a/test/tint/buffer/uniform/std140/mat4x2/to_private.wgsl.expected.spvasm b/test/tint/buffer/uniform/std140/struct/mat4x2/to_private.wgsl.expected.spvasm similarity index 74% rename from test/tint/buffer/uniform/std140/mat4x2/to_private.wgsl.expected.spvasm rename to test/tint/buffer/uniform/std140/struct/mat4x2/to_private.wgsl.expected.spvasm index a5b0ac52bf..ea4bf22d0e 100644 --- a/test/tint/buffer/uniform/std140/mat4x2/to_private.wgsl.expected.spvasm +++ b/test/tint/buffer/uniform/std140/struct/mat4x2/to_private.wgsl.expected.spvasm @@ -1,14 +1,14 @@ ; SPIR-V ; Version: 1.3 ; Generator: Google Tint Compiler; 0 -; Bound: 104 +; Bound: 110 ; Schema: 0 OpCapability Shader OpMemoryModel Logical GLSL450 OpEntryPoint GLCompute %f "f" OpExecutionMode %f LocalSize 1 1 1 - OpName %u_block "u_block" - OpMemberName %u_block 0 "inner" + OpName %u_block_std140 "u_block_std140" + OpMemberName %u_block_std140 0 "inner" OpName %S_std140 "S_std140" OpMemberName %S_std140 0 "before" OpMemberName %S_std140 1 "m_0" @@ -29,10 +29,10 @@ OpName %arr "arr" OpName %i "i" OpName %var_for_index "var_for_index" - OpName %load_u_2_m "load_u_2_m" + OpName %load_u_inner_2_m "load_u_inner_2_m" OpName %f "f" - OpDecorate %u_block Block - OpMemberDecorate %u_block 0 Offset 0 + OpDecorate %u_block_std140 Block + OpMemberDecorate %u_block_std140 0 Offset 0 OpMemberDecorate %S_std140 0 Offset 0 OpMemberDecorate %S_std140 1 Offset 8 OpMemberDecorate %S_std140 2 Offset 16 @@ -56,9 +56,9 @@ %uint = OpTypeInt 32 0 %uint_4 = OpConstant %uint 4 %_arr_S_std140_uint_4 = OpTypeArray %S_std140 %uint_4 - %u_block = OpTypeStruct %_arr_S_std140_uint_4 -%_ptr_Uniform_u_block = OpTypePointer Uniform %u_block - %u = OpVariable %_ptr_Uniform_u_block Uniform +%u_block_std140 = OpTypeStruct %_arr_S_std140_uint_4 +%_ptr_Uniform_u_block_std140 = OpTypePointer Uniform %u_block_std140 + %u = OpVariable %_ptr_Uniform_u_block_std140 Uniform %mat4v2float = OpTypeMatrix %v2float 4 %S = OpTypeStruct %int %mat4v2float %int %_arr_S_uint_4 = OpTypeArray %S %uint_4 @@ -79,17 +79,17 @@ %63 = OpTypeFunction %mat4v2float %uint_0 = OpConstant %uint 0 %uint_2 = OpConstant %uint 2 +%_ptr_Uniform_S_std140 = OpTypePointer Uniform %S_std140 %_ptr_Uniform_v2float = OpTypePointer Uniform %v2float %uint_3 = OpConstant %uint 3 %void = OpTypeVoid - %79 = OpTypeFunction %void + %86 = OpTypeFunction %void %_ptr_Uniform__arr_S_std140_uint_4 = OpTypePointer Uniform %_arr_S_std140_uint_4 %int_1 = OpConstant %int 1 %_ptr_Private_S = OpTypePointer Private %S -%_ptr_Uniform_S_std140 = OpTypePointer Uniform %S_std140 %int_3 = OpConstant %int 3 %_ptr_Private_mat4v2float = OpTypePointer Private %mat4v2float - %98 = OpConstantNull %int + %104 = OpConstantNull %int %_ptr_Private_v2float = OpTypePointer Private %v2float %conv_S = OpFunction %S None %17 %val = OpFunctionParameter %S_std140 @@ -141,37 +141,38 @@ %62 = OpLoad %_arr_S_uint_4 %arr OpReturnValue %62 OpFunctionEnd - %load_u_2_m = OpFunction %mat4v2float None %63 +%load_u_inner_2_m = OpFunction %mat4v2float None %63 %65 = OpLabel - %69 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 %uint_2 %uint_1 - %70 = OpLoad %v2float %69 - %71 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 %uint_2 %uint_2 - %72 = OpLoad %v2float %71 - %74 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 %uint_2 %uint_3 - %75 = OpLoad %v2float %74 - %76 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 %uint_2 %uint_4 + %70 = OpAccessChain %_ptr_Uniform_S_std140 %u %uint_0 %uint_2 + %73 = OpAccessChain %_ptr_Uniform_v2float %70 %uint_1 + %74 = OpLoad %v2float %73 + %76 = OpAccessChain %_ptr_Uniform_v2float %70 %uint_2 %77 = OpLoad %v2float %76 - %78 = OpCompositeConstruct %mat4v2float %70 %72 %75 %77 - OpReturnValue %78 + %80 = OpAccessChain %_ptr_Uniform_v2float %70 %uint_3 + %81 = OpLoad %v2float %80 + %83 = OpAccessChain %_ptr_Uniform_v2float %70 %uint_4 + %84 = OpLoad %v2float %83 + %85 = OpCompositeConstruct %mat4v2float %74 %77 %81 %84 + OpReturnValue %85 OpFunctionEnd - %f = OpFunction %void None %79 - %82 = OpLabel - %85 = OpAccessChain %_ptr_Uniform__arr_S_std140_uint_4 %u %uint_0 - %86 = OpLoad %_arr_S_std140_uint_4 %85 - %83 = OpFunctionCall %_arr_S_uint_4 %conv_arr_4_S %86 - OpStore %p %83 - %89 = OpAccessChain %_ptr_Private_S %p %int_1 - %92 = OpAccessChain %_ptr_Uniform_S_std140 %u %uint_0 %uint_2 - %93 = OpLoad %S_std140 %92 - %90 = OpFunctionCall %S %conv_S %93 - OpStore %89 %90 - %96 = OpAccessChain %_ptr_Private_mat4v2float %p %int_3 %uint_1 - %97 = OpFunctionCall %mat4v2float %load_u_2_m + %f = OpFunction %void None %86 + %89 = OpLabel + %92 = OpAccessChain %_ptr_Uniform__arr_S_std140_uint_4 %u %uint_0 + %93 = OpLoad %_arr_S_std140_uint_4 %92 + %90 = OpFunctionCall %_arr_S_uint_4 %conv_arr_4_S %93 + OpStore %p %90 + %96 = OpAccessChain %_ptr_Private_S %p %int_1 + %98 = OpAccessChain %_ptr_Uniform_S_std140 %u %uint_0 %uint_2 + %99 = OpLoad %S_std140 %98 + %97 = OpFunctionCall %S %conv_S %99 OpStore %96 %97 - %100 = OpAccessChain %_ptr_Private_v2float %p %int_1 %uint_1 %98 - %101 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 %37 %uint_2 - %102 = OpLoad %v2float %101 - %103 = OpVectorShuffle %v2float %102 %102 1 0 - OpStore %100 %103 + %102 = OpAccessChain %_ptr_Private_mat4v2float %p %int_3 %uint_1 + %103 = OpFunctionCall %mat4v2float %load_u_inner_2_m + OpStore %102 %103 + %106 = OpAccessChain %_ptr_Private_v2float %p %int_1 %uint_1 %104 + %107 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 %37 %uint_2 + %108 = OpLoad %v2float %107 + %109 = OpVectorShuffle %v2float %108 %108 1 0 + OpStore %106 %109 OpReturn OpFunctionEnd diff --git a/test/tint/buffer/uniform/std140/mat4x2/to_private.wgsl.expected.wgsl b/test/tint/buffer/uniform/std140/struct/mat4x2/to_private.wgsl.expected.wgsl similarity index 100% rename from test/tint/buffer/uniform/std140/mat4x2/to_private.wgsl.expected.wgsl rename to test/tint/buffer/uniform/std140/struct/mat4x2/to_private.wgsl.expected.wgsl diff --git a/test/tint/buffer/uniform/std140/mat4x2/to_storage.wgsl b/test/tint/buffer/uniform/std140/struct/mat4x2/to_storage.wgsl similarity index 100% rename from test/tint/buffer/uniform/std140/mat4x2/to_storage.wgsl rename to test/tint/buffer/uniform/std140/struct/mat4x2/to_storage.wgsl diff --git a/test/tint/buffer/uniform/std140/mat4x2/to_storage.wgsl.expected.dxc.hlsl b/test/tint/buffer/uniform/std140/struct/mat4x2/to_storage.wgsl.expected.dxc.hlsl similarity index 100% rename from test/tint/buffer/uniform/std140/mat4x2/to_storage.wgsl.expected.dxc.hlsl rename to test/tint/buffer/uniform/std140/struct/mat4x2/to_storage.wgsl.expected.dxc.hlsl diff --git a/test/tint/buffer/uniform/std140/mat4x2/to_storage.wgsl.expected.fxc.hlsl b/test/tint/buffer/uniform/std140/struct/mat4x2/to_storage.wgsl.expected.fxc.hlsl similarity index 100% rename from test/tint/buffer/uniform/std140/mat4x2/to_storage.wgsl.expected.fxc.hlsl rename to test/tint/buffer/uniform/std140/struct/mat4x2/to_storage.wgsl.expected.fxc.hlsl diff --git a/test/tint/buffer/uniform/std140/mat4x2/to_storage.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/struct/mat4x2/to_storage.wgsl.expected.glsl similarity index 77% rename from test/tint/buffer/uniform/std140/mat4x2/to_storage.wgsl.expected.glsl rename to test/tint/buffer/uniform/std140/struct/mat4x2/to_storage.wgsl.expected.glsl index 13e7964244..90098bd23d 100644 --- a/test/tint/buffer/uniform/std140/mat4x2/to_storage.wgsl.expected.glsl +++ b/test/tint/buffer/uniform/std140/struct/mat4x2/to_storage.wgsl.expected.glsl @@ -10,26 +10,25 @@ struct S { struct S_std140 { int before; - uint pad_2; + uint pad; vec2 m_0; vec2 m_1; vec2 m_2; vec2 m_3; int after; - uint pad_3; + uint pad_1; }; -layout(binding = 0, std140) uniform u_block_ubo { +layout(binding = 0, std140) uniform u_block_std140_ubo { S_std140 inner[4]; } u; -layout(binding = 1, std430) buffer s_block_ssbo { +layout(binding = 1, std430) buffer u_block_ssbo { S inner[4]; } s; S conv_S(S_std140 val) { - S tint_symbol = S(val.before, 0u, mat4x2(val.m_0, val.m_1, val.m_2, val.m_3), val.after, 0u); - return tint_symbol; + return S(val.before, val.pad, mat4x2(val.m_0, val.m_1, val.m_2, val.m_3), val.after, val.pad_1); } S[4] conv_arr_4_S(S_std140 val[4]) { @@ -42,14 +41,14 @@ S[4] conv_arr_4_S(S_std140 val[4]) { return arr; } -mat4x2 load_u_2_m() { +mat4x2 load_u_inner_2_m() { return mat4x2(u.inner[2u].m_0, u.inner[2u].m_1, u.inner[2u].m_2, u.inner[2u].m_3); } void f() { s.inner = conv_arr_4_S(u.inner); s.inner[1] = conv_S(u.inner[2u]); - s.inner[3].m = load_u_2_m(); + s.inner[3].m = load_u_inner_2_m(); s.inner[1].m[0] = u.inner[0u].m_1.yx; } diff --git a/test/tint/buffer/uniform/std140/mat4x2/to_storage.wgsl.expected.msl b/test/tint/buffer/uniform/std140/struct/mat4x2/to_storage.wgsl.expected.msl similarity index 100% rename from test/tint/buffer/uniform/std140/mat4x2/to_storage.wgsl.expected.msl rename to test/tint/buffer/uniform/std140/struct/mat4x2/to_storage.wgsl.expected.msl diff --git a/test/tint/buffer/uniform/std140/mat4x2/to_storage.wgsl.expected.spvasm b/test/tint/buffer/uniform/std140/struct/mat4x2/to_storage.wgsl.expected.spvasm similarity index 73% rename from test/tint/buffer/uniform/std140/mat4x2/to_storage.wgsl.expected.spvasm rename to test/tint/buffer/uniform/std140/struct/mat4x2/to_storage.wgsl.expected.spvasm index eec25596a0..5d20562179 100644 --- a/test/tint/buffer/uniform/std140/mat4x2/to_storage.wgsl.expected.spvasm +++ b/test/tint/buffer/uniform/std140/struct/mat4x2/to_storage.wgsl.expected.spvasm @@ -1,14 +1,14 @@ ; SPIR-V ; Version: 1.3 ; Generator: Google Tint Compiler; 0 -; Bound: 107 +; Bound: 113 ; Schema: 0 OpCapability Shader OpMemoryModel Logical GLSL450 OpEntryPoint GLCompute %f "f" OpExecutionMode %f LocalSize 1 1 1 - OpName %u_block "u_block" - OpMemberName %u_block 0 "inner" + OpName %u_block_std140 "u_block_std140" + OpMemberName %u_block_std140 0 "inner" OpName %S_std140 "S_std140" OpMemberName %S_std140 0 "before" OpMemberName %S_std140 1 "m_0" @@ -17,8 +17,8 @@ OpMemberName %S_std140 4 "m_3" OpMemberName %S_std140 5 "after" OpName %u "u" - OpName %s_block "s_block" - OpMemberName %s_block 0 "inner" + OpName %u_block "u_block" + OpMemberName %u_block 0 "inner" OpName %S "S" OpMemberName %S 0 "before" OpMemberName %S 1 "m" @@ -31,10 +31,10 @@ OpName %arr "arr" OpName %i "i" OpName %var_for_index "var_for_index" - OpName %load_u_2_m "load_u_2_m" + OpName %load_u_inner_2_m "load_u_inner_2_m" OpName %f "f" - OpDecorate %u_block Block - OpMemberDecorate %u_block 0 Offset 0 + OpDecorate %u_block_std140 Block + OpMemberDecorate %u_block_std140 0 Offset 0 OpMemberDecorate %S_std140 0 Offset 0 OpMemberDecorate %S_std140 1 Offset 8 OpMemberDecorate %S_std140 2 Offset 16 @@ -45,8 +45,8 @@ OpDecorate %u NonWritable OpDecorate %u DescriptorSet 0 OpDecorate %u Binding 0 - OpDecorate %s_block Block - OpMemberDecorate %s_block 0 Offset 0 + OpDecorate %u_block Block + OpMemberDecorate %u_block 0 Offset 0 OpMemberDecorate %S 0 Offset 0 OpMemberDecorate %S 1 Offset 8 OpMemberDecorate %S 1 ColMajor @@ -62,15 +62,15 @@ %uint = OpTypeInt 32 0 %uint_4 = OpConstant %uint 4 %_arr_S_std140_uint_4 = OpTypeArray %S_std140 %uint_4 - %u_block = OpTypeStruct %_arr_S_std140_uint_4 -%_ptr_Uniform_u_block = OpTypePointer Uniform %u_block - %u = OpVariable %_ptr_Uniform_u_block Uniform +%u_block_std140 = OpTypeStruct %_arr_S_std140_uint_4 +%_ptr_Uniform_u_block_std140 = OpTypePointer Uniform %u_block_std140 + %u = OpVariable %_ptr_Uniform_u_block_std140 Uniform %mat4v2float = OpTypeMatrix %v2float 4 %S = OpTypeStruct %int %mat4v2float %int %_arr_S_uint_4 = OpTypeArray %S %uint_4 - %s_block = OpTypeStruct %_arr_S_uint_4 -%_ptr_StorageBuffer_s_block = OpTypePointer StorageBuffer %s_block - %s = OpVariable %_ptr_StorageBuffer_s_block StorageBuffer + %u_block = OpTypeStruct %_arr_S_uint_4 +%_ptr_StorageBuffer_u_block = OpTypePointer StorageBuffer %u_block + %s = OpVariable %_ptr_StorageBuffer_u_block StorageBuffer %17 = OpTypeFunction %S %S_std140 %29 = OpTypeFunction %_arr_S_uint_4 %_arr_S_std140_uint_4 %_ptr_Function__arr_S_uint_4 = OpTypePointer Function %_arr_S_uint_4 @@ -86,18 +86,18 @@ %64 = OpTypeFunction %mat4v2float %uint_0 = OpConstant %uint 0 %uint_2 = OpConstant %uint 2 +%_ptr_Uniform_S_std140 = OpTypePointer Uniform %S_std140 %_ptr_Uniform_v2float = OpTypePointer Uniform %v2float %uint_3 = OpConstant %uint 3 %void = OpTypeVoid - %80 = OpTypeFunction %void + %87 = OpTypeFunction %void %_ptr_StorageBuffer__arr_S_uint_4 = OpTypePointer StorageBuffer %_arr_S_uint_4 %_ptr_Uniform__arr_S_std140_uint_4 = OpTypePointer Uniform %_arr_S_std140_uint_4 %int_1 = OpConstant %int 1 %_ptr_StorageBuffer_S = OpTypePointer StorageBuffer %S -%_ptr_Uniform_S_std140 = OpTypePointer Uniform %S_std140 %int_3 = OpConstant %int 3 %_ptr_StorageBuffer_mat4v2float = OpTypePointer StorageBuffer %mat4v2float - %101 = OpConstantNull %int + %107 = OpConstantNull %int %_ptr_StorageBuffer_v2float = OpTypePointer StorageBuffer %v2float %conv_S = OpFunction %S None %17 %val = OpFunctionParameter %S_std140 @@ -149,38 +149,39 @@ %63 = OpLoad %_arr_S_uint_4 %arr OpReturnValue %63 OpFunctionEnd - %load_u_2_m = OpFunction %mat4v2float None %64 +%load_u_inner_2_m = OpFunction %mat4v2float None %64 %66 = OpLabel - %70 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 %uint_2 %uint_1 - %71 = OpLoad %v2float %70 - %72 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 %uint_2 %uint_2 - %73 = OpLoad %v2float %72 - %75 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 %uint_2 %uint_3 - %76 = OpLoad %v2float %75 - %77 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 %uint_2 %uint_4 + %71 = OpAccessChain %_ptr_Uniform_S_std140 %u %uint_0 %uint_2 + %74 = OpAccessChain %_ptr_Uniform_v2float %71 %uint_1 + %75 = OpLoad %v2float %74 + %77 = OpAccessChain %_ptr_Uniform_v2float %71 %uint_2 %78 = OpLoad %v2float %77 - %79 = OpCompositeConstruct %mat4v2float %71 %73 %76 %78 - OpReturnValue %79 + %81 = OpAccessChain %_ptr_Uniform_v2float %71 %uint_3 + %82 = OpLoad %v2float %81 + %84 = OpAccessChain %_ptr_Uniform_v2float %71 %uint_4 + %85 = OpLoad %v2float %84 + %86 = OpCompositeConstruct %mat4v2float %75 %78 %82 %85 + OpReturnValue %86 OpFunctionEnd - %f = OpFunction %void None %80 - %83 = OpLabel - %85 = OpAccessChain %_ptr_StorageBuffer__arr_S_uint_4 %s %uint_0 - %88 = OpAccessChain %_ptr_Uniform__arr_S_std140_uint_4 %u %uint_0 - %89 = OpLoad %_arr_S_std140_uint_4 %88 - %86 = OpFunctionCall %_arr_S_uint_4 %conv_arr_4_S %89 - OpStore %85 %86 - %92 = OpAccessChain %_ptr_StorageBuffer_S %s %uint_0 %int_1 - %95 = OpAccessChain %_ptr_Uniform_S_std140 %u %uint_0 %uint_2 - %96 = OpLoad %S_std140 %95 - %93 = OpFunctionCall %S %conv_S %96 + %f = OpFunction %void None %87 + %90 = OpLabel + %92 = OpAccessChain %_ptr_StorageBuffer__arr_S_uint_4 %s %uint_0 + %95 = OpAccessChain %_ptr_Uniform__arr_S_std140_uint_4 %u %uint_0 + %96 = OpLoad %_arr_S_std140_uint_4 %95 + %93 = OpFunctionCall %_arr_S_uint_4 %conv_arr_4_S %96 OpStore %92 %93 - %99 = OpAccessChain %_ptr_StorageBuffer_mat4v2float %s %uint_0 %int_3 %uint_1 - %100 = OpFunctionCall %mat4v2float %load_u_2_m + %99 = OpAccessChain %_ptr_StorageBuffer_S %s %uint_0 %int_1 + %101 = OpAccessChain %_ptr_Uniform_S_std140 %u %uint_0 %uint_2 + %102 = OpLoad %S_std140 %101 + %100 = OpFunctionCall %S %conv_S %102 OpStore %99 %100 - %103 = OpAccessChain %_ptr_StorageBuffer_v2float %s %uint_0 %int_1 %uint_1 %101 - %104 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 %38 %uint_2 - %105 = OpLoad %v2float %104 - %106 = OpVectorShuffle %v2float %105 %105 1 0 - OpStore %103 %106 + %105 = OpAccessChain %_ptr_StorageBuffer_mat4v2float %s %uint_0 %int_3 %uint_1 + %106 = OpFunctionCall %mat4v2float %load_u_inner_2_m + OpStore %105 %106 + %109 = OpAccessChain %_ptr_StorageBuffer_v2float %s %uint_0 %int_1 %uint_1 %107 + %110 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 %38 %uint_2 + %111 = OpLoad %v2float %110 + %112 = OpVectorShuffle %v2float %111 %111 1 0 + OpStore %109 %112 OpReturn OpFunctionEnd diff --git a/test/tint/buffer/uniform/std140/mat4x2/to_storage.wgsl.expected.wgsl b/test/tint/buffer/uniform/std140/struct/mat4x2/to_storage.wgsl.expected.wgsl similarity index 100% rename from test/tint/buffer/uniform/std140/mat4x2/to_storage.wgsl.expected.wgsl rename to test/tint/buffer/uniform/std140/struct/mat4x2/to_storage.wgsl.expected.wgsl diff --git a/test/tint/buffer/uniform/std140/mat4x2/to_workgroup.wgsl b/test/tint/buffer/uniform/std140/struct/mat4x2/to_workgroup.wgsl similarity index 100% rename from test/tint/buffer/uniform/std140/mat4x2/to_workgroup.wgsl rename to test/tint/buffer/uniform/std140/struct/mat4x2/to_workgroup.wgsl diff --git a/test/tint/buffer/uniform/std140/mat4x2/to_workgroup.wgsl.expected.dxc.hlsl b/test/tint/buffer/uniform/std140/struct/mat4x2/to_workgroup.wgsl.expected.dxc.hlsl similarity index 100% rename from test/tint/buffer/uniform/std140/mat4x2/to_workgroup.wgsl.expected.dxc.hlsl rename to test/tint/buffer/uniform/std140/struct/mat4x2/to_workgroup.wgsl.expected.dxc.hlsl diff --git a/test/tint/buffer/uniform/std140/mat4x2/to_workgroup.wgsl.expected.fxc.hlsl b/test/tint/buffer/uniform/std140/struct/mat4x2/to_workgroup.wgsl.expected.fxc.hlsl similarity index 100% rename from test/tint/buffer/uniform/std140/mat4x2/to_workgroup.wgsl.expected.fxc.hlsl rename to test/tint/buffer/uniform/std140/struct/mat4x2/to_workgroup.wgsl.expected.fxc.hlsl diff --git a/test/tint/buffer/uniform/std140/mat4x2/to_workgroup.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/struct/mat4x2/to_workgroup.wgsl.expected.glsl similarity index 56% rename from test/tint/buffer/uniform/std140/mat4x2/to_workgroup.wgsl.expected.glsl rename to test/tint/buffer/uniform/std140/struct/mat4x2/to_workgroup.wgsl.expected.glsl index 1b2f51f3ee..07cabf97cd 100644 --- a/test/tint/buffer/uniform/std140/mat4x2/to_workgroup.wgsl.expected.glsl +++ b/test/tint/buffer/uniform/std140/struct/mat4x2/to_workgroup.wgsl.expected.glsl @@ -2,8 +2,10 @@ struct S { int before; + uint pad; mat4x2 m; int after; + uint pad_1; }; struct S_std140 { @@ -17,18 +19,17 @@ struct S_std140 { uint pad_1; }; -layout(binding = 0, std140) uniform u_block_ubo { +layout(binding = 0, std140) uniform u_block_std140_ubo { S_std140 inner[4]; } u; shared S w[4]; S conv_S(S_std140 val) { - S tint_symbol = S(val.before, mat4x2(val.m_0, val.m_1, val.m_2, val.m_3), val.after); - return tint_symbol; + return S(val.before, val.pad, mat4x2(val.m_0, val.m_1, val.m_2, val.m_3), val.after, val.pad_1); } S[4] conv_arr_4_S(S_std140 val[4]) { - S arr[4] = S[4](S(0, mat4x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), 0), S(0, mat4x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), 0), S(0, mat4x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), 0), S(0, mat4x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), 0)); + S arr[4] = S[4](S(0, 0u, mat4x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), 0, 0u), S(0, 0u, mat4x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), 0, 0u), S(0, 0u, mat4x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), 0, 0u), S(0, 0u, mat4x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), 0, 0u)); { for(uint i = 0u; (i < 4u); i = (i + 1u)) { arr[i] = conv_S(val[i]); @@ -37,7 +38,7 @@ S[4] conv_arr_4_S(S_std140 val[4]) { return arr; } -mat4x2 load_u_2_m() { +mat4x2 load_u_inner_2_m() { return mat4x2(u.inner[2u].m_0, u.inner[2u].m_1, u.inner[2u].m_2, u.inner[2u].m_3); } @@ -45,14 +46,14 @@ void f(uint local_invocation_index) { { for(uint idx = local_invocation_index; (idx < 4u); idx = (idx + 1u)) { uint i = idx; - S tint_symbol_1 = S(0, mat4x2(vec2(0.0f), vec2(0.0f), vec2(0.0f), vec2(0.0f)), 0); - w[i] = tint_symbol_1; + S tint_symbol = S(0, 0u, mat4x2(vec2(0.0f), vec2(0.0f), vec2(0.0f), vec2(0.0f)), 0, 0u); + w[i] = tint_symbol; } } barrier(); w = conv_arr_4_S(u.inner); w[1] = conv_S(u.inner[2u]); - w[3].m = load_u_2_m(); + w[3].m = load_u_inner_2_m(); w[1].m[0] = u.inner[0u].m_1.yx; } diff --git a/test/tint/buffer/uniform/std140/mat4x2/to_workgroup.wgsl.expected.msl b/test/tint/buffer/uniform/std140/struct/mat4x2/to_workgroup.wgsl.expected.msl similarity index 100% rename from test/tint/buffer/uniform/std140/mat4x2/to_workgroup.wgsl.expected.msl rename to test/tint/buffer/uniform/std140/struct/mat4x2/to_workgroup.wgsl.expected.msl diff --git a/test/tint/buffer/uniform/std140/mat4x2/to_workgroup.wgsl.expected.spvasm b/test/tint/buffer/uniform/std140/struct/mat4x2/to_workgroup.wgsl.expected.spvasm similarity index 69% rename from test/tint/buffer/uniform/std140/mat4x2/to_workgroup.wgsl.expected.spvasm rename to test/tint/buffer/uniform/std140/struct/mat4x2/to_workgroup.wgsl.expected.spvasm index ec0684a11b..80ec01c07e 100644 --- a/test/tint/buffer/uniform/std140/mat4x2/to_workgroup.wgsl.expected.spvasm +++ b/test/tint/buffer/uniform/std140/struct/mat4x2/to_workgroup.wgsl.expected.spvasm @@ -1,15 +1,15 @@ ; SPIR-V ; Version: 1.3 ; Generator: Google Tint Compiler; 0 -; Bound: 129 +; Bound: 135 ; Schema: 0 OpCapability Shader OpMemoryModel Logical GLSL450 OpEntryPoint GLCompute %f "f" %local_invocation_index_1 OpExecutionMode %f LocalSize 1 1 1 OpName %local_invocation_index_1 "local_invocation_index_1" - OpName %u_block "u_block" - OpMemberName %u_block 0 "inner" + OpName %u_block_std140 "u_block_std140" + OpMemberName %u_block_std140 0 "inner" OpName %S_std140 "S_std140" OpMemberName %S_std140 0 "before" OpMemberName %S_std140 1 "m_0" @@ -30,14 +30,14 @@ OpName %arr "arr" OpName %i "i" OpName %var_for_index "var_for_index" - OpName %load_u_2_m "load_u_2_m" + OpName %load_u_inner_2_m "load_u_inner_2_m" OpName %f_inner "f_inner" OpName %local_invocation_index "local_invocation_index" OpName %idx "idx" OpName %f "f" OpDecorate %local_invocation_index_1 BuiltIn LocalInvocationIndex - OpDecorate %u_block Block - OpMemberDecorate %u_block 0 Offset 0 + OpDecorate %u_block_std140 Block + OpMemberDecorate %u_block_std140 0 Offset 0 OpMemberDecorate %S_std140 0 Offset 0 OpMemberDecorate %S_std140 1 Offset 8 OpMemberDecorate %S_std140 2 Offset 16 @@ -63,9 +63,9 @@ %S_std140 = OpTypeStruct %int %v2float %v2float %v2float %v2float %int %uint_4 = OpConstant %uint 4 %_arr_S_std140_uint_4 = OpTypeArray %S_std140 %uint_4 - %u_block = OpTypeStruct %_arr_S_std140_uint_4 -%_ptr_Uniform_u_block = OpTypePointer Uniform %u_block - %u = OpVariable %_ptr_Uniform_u_block Uniform +%u_block_std140 = OpTypeStruct %_arr_S_std140_uint_4 +%_ptr_Uniform_u_block_std140 = OpTypePointer Uniform %u_block_std140 + %u = OpVariable %_ptr_Uniform_u_block_std140 Uniform %mat4v2float = OpTypeMatrix %v2float 4 %S = OpTypeStruct %int %mat4v2float %int %_arr_S_uint_4 = OpTypeArray %S %uint_4 @@ -86,21 +86,21 @@ %65 = OpTypeFunction %mat4v2float %uint_0 = OpConstant %uint 0 %uint_2 = OpConstant %uint 2 +%_ptr_Uniform_S_std140 = OpTypePointer Uniform %S_std140 %_ptr_Uniform_v2float = OpTypePointer Uniform %v2float %uint_3 = OpConstant %uint 3 %void = OpTypeVoid - %81 = OpTypeFunction %void %uint + %88 = OpTypeFunction %void %uint %_ptr_Workgroup_S = OpTypePointer Workgroup %S - %99 = OpConstantNull %S + %106 = OpConstantNull %S %uint_264 = OpConstant %uint 264 %_ptr_Uniform__arr_S_std140_uint_4 = OpTypePointer Uniform %_arr_S_std140_uint_4 %int_1 = OpConstant %int 1 -%_ptr_Uniform_S_std140 = OpTypePointer Uniform %S_std140 %int_3 = OpConstant %int 3 %_ptr_Workgroup_mat4v2float = OpTypePointer Workgroup %mat4v2float - %118 = OpConstantNull %int + %124 = OpConstantNull %int %_ptr_Workgroup_v2float = OpTypePointer Workgroup %v2float - %124 = OpTypeFunction %void + %130 = OpTypeFunction %void %conv_S = OpFunction %S None %18 %val = OpFunctionParameter %S_std140 %21 = OpLabel @@ -151,70 +151,71 @@ %64 = OpLoad %_arr_S_uint_4 %arr OpReturnValue %64 OpFunctionEnd - %load_u_2_m = OpFunction %mat4v2float None %65 +%load_u_inner_2_m = OpFunction %mat4v2float None %65 %67 = OpLabel - %71 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 %uint_2 %uint_1 - %72 = OpLoad %v2float %71 - %73 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 %uint_2 %uint_2 - %74 = OpLoad %v2float %73 - %76 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 %uint_2 %uint_3 - %77 = OpLoad %v2float %76 - %78 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 %uint_2 %uint_4 + %72 = OpAccessChain %_ptr_Uniform_S_std140 %u %uint_0 %uint_2 + %75 = OpAccessChain %_ptr_Uniform_v2float %72 %uint_1 + %76 = OpLoad %v2float %75 + %78 = OpAccessChain %_ptr_Uniform_v2float %72 %uint_2 %79 = OpLoad %v2float %78 - %80 = OpCompositeConstruct %mat4v2float %72 %74 %77 %79 - OpReturnValue %80 + %82 = OpAccessChain %_ptr_Uniform_v2float %72 %uint_3 + %83 = OpLoad %v2float %82 + %85 = OpAccessChain %_ptr_Uniform_v2float %72 %uint_4 + %86 = OpLoad %v2float %85 + %87 = OpCompositeConstruct %mat4v2float %76 %79 %83 %86 + OpReturnValue %87 OpFunctionEnd - %f_inner = OpFunction %void None %81 + %f_inner = OpFunction %void None %88 %local_invocation_index = OpFunctionParameter %uint - %85 = OpLabel + %92 = OpLabel %idx = OpVariable %_ptr_Function_uint Function %39 OpStore %idx %local_invocation_index - OpBranch %87 - %87 = OpLabel - OpLoopMerge %88 %89 None - OpBranch %90 - %90 = OpLabel - %92 = OpLoad %uint %idx - %93 = OpULessThan %bool %92 %uint_4 - %91 = OpLogicalNot %bool %93 - OpSelectionMerge %94 None - OpBranchConditional %91 %95 %94 - %95 = OpLabel - OpBranch %88 + OpBranch %94 %94 = OpLabel - %96 = OpLoad %uint %idx - %98 = OpAccessChain %_ptr_Workgroup_S %w %96 - OpStore %98 %99 - OpBranch %89 - %89 = OpLabel - %100 = OpLoad %uint %idx - %101 = OpIAdd %uint %100 %uint_1 - OpStore %idx %101 - OpBranch %87 - %88 = OpLabel + OpLoopMerge %95 %96 None + OpBranch %97 + %97 = OpLabel + %99 = OpLoad %uint %idx + %100 = OpULessThan %bool %99 %uint_4 + %98 = OpLogicalNot %bool %100 + OpSelectionMerge %101 None + OpBranchConditional %98 %102 %101 + %102 = OpLabel + OpBranch %95 + %101 = OpLabel + %103 = OpLoad %uint %idx + %105 = OpAccessChain %_ptr_Workgroup_S %w %103 + OpStore %105 %106 + OpBranch %96 + %96 = OpLabel + %107 = OpLoad %uint %idx + %108 = OpIAdd %uint %107 %uint_1 + OpStore %idx %108 + OpBranch %94 + %95 = OpLabel OpControlBarrier %uint_2 %uint_2 %uint_264 - %106 = OpAccessChain %_ptr_Uniform__arr_S_std140_uint_4 %u %uint_0 - %107 = OpLoad %_arr_S_std140_uint_4 %106 - %104 = OpFunctionCall %_arr_S_uint_4 %conv_arr_4_S %107 - OpStore %w %104 - %109 = OpAccessChain %_ptr_Workgroup_S %w %int_1 - %112 = OpAccessChain %_ptr_Uniform_S_std140 %u %uint_0 %uint_2 - %113 = OpLoad %S_std140 %112 - %110 = OpFunctionCall %S %conv_S %113 - OpStore %109 %110 - %116 = OpAccessChain %_ptr_Workgroup_mat4v2float %w %int_3 %uint_1 - %117 = OpFunctionCall %mat4v2float %load_u_2_m + %113 = OpAccessChain %_ptr_Uniform__arr_S_std140_uint_4 %u %uint_0 + %114 = OpLoad %_arr_S_std140_uint_4 %113 + %111 = OpFunctionCall %_arr_S_uint_4 %conv_arr_4_S %114 + OpStore %w %111 + %116 = OpAccessChain %_ptr_Workgroup_S %w %int_1 + %118 = OpAccessChain %_ptr_Uniform_S_std140 %u %uint_0 %uint_2 + %119 = OpLoad %S_std140 %118 + %117 = OpFunctionCall %S %conv_S %119 OpStore %116 %117 - %120 = OpAccessChain %_ptr_Workgroup_v2float %w %int_1 %uint_1 %118 - %121 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 %39 %uint_2 - %122 = OpLoad %v2float %121 - %123 = OpVectorShuffle %v2float %122 %122 1 0 - OpStore %120 %123 + %122 = OpAccessChain %_ptr_Workgroup_mat4v2float %w %int_3 %uint_1 + %123 = OpFunctionCall %mat4v2float %load_u_inner_2_m + OpStore %122 %123 + %126 = OpAccessChain %_ptr_Workgroup_v2float %w %int_1 %uint_1 %124 + %127 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 %39 %uint_2 + %128 = OpLoad %v2float %127 + %129 = OpVectorShuffle %v2float %128 %128 1 0 + OpStore %126 %129 OpReturn OpFunctionEnd - %f = OpFunction %void None %124 - %126 = OpLabel - %128 = OpLoad %uint %local_invocation_index_1 - %127 = OpFunctionCall %void %f_inner %128 + %f = OpFunction %void None %130 + %132 = OpLabel + %134 = OpLoad %uint %local_invocation_index_1 + %133 = OpFunctionCall %void %f_inner %134 OpReturn OpFunctionEnd diff --git a/test/tint/buffer/uniform/std140/mat4x2/to_workgroup.wgsl.expected.wgsl b/test/tint/buffer/uniform/std140/struct/mat4x2/to_workgroup.wgsl.expected.wgsl similarity index 100% rename from test/tint/buffer/uniform/std140/mat4x2/to_workgroup.wgsl.expected.wgsl rename to test/tint/buffer/uniform/std140/struct/mat4x2/to_workgroup.wgsl.expected.wgsl diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x2/dynamic_index_via_ptr.wgsl b/test/tint/buffer/uniform/std140/unnested/mat2x2/dynamic_index_via_ptr.wgsl new file mode 100644 index 0000000000..494e81e7ac --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat2x2/dynamic_index_via_ptr.wgsl @@ -0,0 +1,13 @@ +@group(0) @binding(0) var m : mat2x2; + +var counter = 0; +fn i() -> i32 { counter++; return counter; } + +@compute @workgroup_size(1) +fn f() { + let p_m = &m; + let p_m_i = &((*p_m)[i()]); + + let l_m : mat2x2 = *p_m; + let l_m_i : vec2 = *p_m_i; +} diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x2/dynamic_index_via_ptr.wgsl.expected.dxc.hlsl b/test/tint/buffer/uniform/std140/unnested/mat2x2/dynamic_index_via_ptr.wgsl.expected.dxc.hlsl new file mode 100644 index 0000000000..4eeea708c4 --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat2x2/dynamic_index_via_ptr.wgsl.expected.dxc.hlsl @@ -0,0 +1,27 @@ +cbuffer cbuffer_m : register(b0, space0) { + uint4 m[1]; +}; +static int counter = 0; + +int i() { + counter = (counter + 1); + return counter; +} + +float2x2 tint_symbol(uint4 buffer[1], uint offset) { + const uint scalar_offset = ((offset + 0u)) / 4; + uint4 ubo_load = buffer[scalar_offset / 4]; + const uint scalar_offset_1 = ((offset + 8u)) / 4; + uint4 ubo_load_1 = buffer[scalar_offset_1 / 4]; + return float2x2(asfloat(((scalar_offset & 2) ? ubo_load.zw : ubo_load.xy)), asfloat(((scalar_offset_1 & 2) ? ubo_load_1.zw : ubo_load_1.xy))); +} + +[numthreads(1, 1, 1)] +void f() { + const int p_m_i_save = i(); + const float2x2 l_m = tint_symbol(m, 0u); + const uint scalar_offset_2 = ((8u * uint(p_m_i_save))) / 4; + uint4 ubo_load_2 = m[scalar_offset_2 / 4]; + const float2 l_m_i = asfloat(((scalar_offset_2 & 2) ? ubo_load_2.zw : ubo_load_2.xy)); + return; +} diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x2/dynamic_index_via_ptr.wgsl.expected.fxc.hlsl b/test/tint/buffer/uniform/std140/unnested/mat2x2/dynamic_index_via_ptr.wgsl.expected.fxc.hlsl new file mode 100644 index 0000000000..4eeea708c4 --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat2x2/dynamic_index_via_ptr.wgsl.expected.fxc.hlsl @@ -0,0 +1,27 @@ +cbuffer cbuffer_m : register(b0, space0) { + uint4 m[1]; +}; +static int counter = 0; + +int i() { + counter = (counter + 1); + return counter; +} + +float2x2 tint_symbol(uint4 buffer[1], uint offset) { + const uint scalar_offset = ((offset + 0u)) / 4; + uint4 ubo_load = buffer[scalar_offset / 4]; + const uint scalar_offset_1 = ((offset + 8u)) / 4; + uint4 ubo_load_1 = buffer[scalar_offset_1 / 4]; + return float2x2(asfloat(((scalar_offset & 2) ? ubo_load.zw : ubo_load.xy)), asfloat(((scalar_offset_1 & 2) ? ubo_load_1.zw : ubo_load_1.xy))); +} + +[numthreads(1, 1, 1)] +void f() { + const int p_m_i_save = i(); + const float2x2 l_m = tint_symbol(m, 0u); + const uint scalar_offset_2 = ((8u * uint(p_m_i_save))) / 4; + uint4 ubo_load_2 = m[scalar_offset_2 / 4]; + const float2 l_m_i = asfloat(((scalar_offset_2 & 2) ? ubo_load_2.zw : ubo_load_2.xy)); + return; +} diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x2/dynamic_index_via_ptr.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/unnested/mat2x2/dynamic_index_via_ptr.wgsl.expected.glsl new file mode 100644 index 0000000000..99bde8ba4e --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat2x2/dynamic_index_via_ptr.wgsl.expected.glsl @@ -0,0 +1,47 @@ +#version 310 es + +layout(binding = 0, std140) uniform m_block_std140_ubo { + vec2 inner_0; + vec2 inner_1; +} m; + +int counter = 0; +int i() { + counter = (counter + 1); + return counter; +} + +mat2 load_m_inner() { + return mat2(m.inner_0, m.inner_1); +} + +vec2 load_m_inner_p0(uint p0) { + switch(p0) { + case 0u: { + return m.inner_0; + break; + } + case 1u: { + return m.inner_1; + break; + } + default: { + return vec2(0.0f); + break; + } + } +} + +void f() { + mat2 p_m = load_m_inner(); + int tint_symbol = i(); + vec2 p_m_i = load_m_inner_p0(uint(tint_symbol)); + mat2 l_m = load_m_inner(); + vec2 l_m_i = load_m_inner_p0(uint(tint_symbol)); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + f(); + return; +} diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x2/dynamic_index_via_ptr.wgsl.expected.msl b/test/tint/buffer/uniform/std140/unnested/mat2x2/dynamic_index_via_ptr.wgsl.expected.msl new file mode 100644 index 0000000000..61e679896e --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat2x2/dynamic_index_via_ptr.wgsl.expected.msl @@ -0,0 +1,17 @@ +#include + +using namespace metal; +int i() { + thread int tint_symbol_1 = 0; + tint_symbol_1 = as_type((as_type(tint_symbol_1) + as_type(1))); + return tint_symbol_1; +} + +kernel void f(const constant float2x2* tint_symbol_2 [[buffer(0)]]) { + int const tint_symbol = i(); + int const p_m_i_save = tint_symbol; + float2x2 const l_m = *(tint_symbol_2); + float2 const l_m_i = (*(tint_symbol_2))[p_m_i_save]; + return; +} + diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x2/dynamic_index_via_ptr.wgsl.expected.spvasm b/test/tint/buffer/uniform/std140/unnested/mat2x2/dynamic_index_via_ptr.wgsl.expected.spvasm new file mode 100644 index 0000000000..a2554c616f --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat2x2/dynamic_index_via_ptr.wgsl.expected.spvasm @@ -0,0 +1,89 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 54 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %f "f" + OpExecutionMode %f LocalSize 1 1 1 + OpName %m_block_std140 "m_block_std140" + OpMemberName %m_block_std140 0 "inner_0" + OpMemberName %m_block_std140 1 "inner_1" + OpName %m "m" + OpName %counter "counter" + OpName %i "i" + OpName %load_m_inner "load_m_inner" + OpName %load_m_inner_p0 "load_m_inner_p0" + OpName %p0 "p0" + OpName %f "f" + OpDecorate %m_block_std140 Block + OpMemberDecorate %m_block_std140 0 Offset 0 + OpMemberDecorate %m_block_std140 1 Offset 8 + OpDecorate %m NonWritable + OpDecorate %m DescriptorSet 0 + OpDecorate %m Binding 0 + %float = OpTypeFloat 32 + %v2float = OpTypeVector %float 2 +%m_block_std140 = OpTypeStruct %v2float %v2float +%_ptr_Uniform_m_block_std140 = OpTypePointer Uniform %m_block_std140 + %m = OpVariable %_ptr_Uniform_m_block_std140 Uniform + %int = OpTypeInt 32 1 + %7 = OpConstantNull %int +%_ptr_Private_int = OpTypePointer Private %int + %counter = OpVariable %_ptr_Private_int Private %7 + %10 = OpTypeFunction %int + %int_1 = OpConstant %int 1 +%mat2v2float = OpTypeMatrix %v2float 2 + %17 = OpTypeFunction %mat2v2float + %uint = OpTypeInt 32 0 + %uint_0 = OpConstant %uint 0 +%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float + %uint_1 = OpConstant %uint 1 + %33 = OpTypeFunction %v2float %uint + %45 = OpConstantNull %v2float + %void = OpTypeVoid + %46 = OpTypeFunction %void + %i = OpFunction %int None %10 + %12 = OpLabel + %13 = OpLoad %int %counter + %15 = OpIAdd %int %13 %int_1 + OpStore %counter %15 + %16 = OpLoad %int %counter + OpReturnValue %16 + OpFunctionEnd +%load_m_inner = OpFunction %mat2v2float None %17 + %20 = OpLabel + %26 = OpAccessChain %_ptr_Uniform_v2float %m %uint_0 + %27 = OpLoad %v2float %26 + %30 = OpAccessChain %_ptr_Uniform_v2float %m %uint_1 + %31 = OpLoad %v2float %30 + %32 = OpCompositeConstruct %mat2v2float %27 %31 + OpReturnValue %32 + OpFunctionEnd +%load_m_inner_p0 = OpFunction %v2float None %33 + %p0 = OpFunctionParameter %uint + %36 = OpLabel + OpSelectionMerge %37 None + OpSwitch %p0 %38 0 %39 1 %40 + %39 = OpLabel + %41 = OpAccessChain %_ptr_Uniform_v2float %m %uint_0 + %42 = OpLoad %v2float %41 + OpReturnValue %42 + %40 = OpLabel + %43 = OpAccessChain %_ptr_Uniform_v2float %m %uint_1 + %44 = OpLoad %v2float %43 + OpReturnValue %44 + %38 = OpLabel + OpReturnValue %45 + %37 = OpLabel + OpReturnValue %45 + OpFunctionEnd + %f = OpFunction %void None %46 + %49 = OpLabel + %50 = OpFunctionCall %int %i + %51 = OpFunctionCall %mat2v2float %load_m_inner + %53 = OpBitcast %uint %50 + %52 = OpFunctionCall %v2float %load_m_inner_p0 %53 + OpReturn + OpFunctionEnd diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x2/dynamic_index_via_ptr.wgsl.expected.wgsl b/test/tint/buffer/uniform/std140/unnested/mat2x2/dynamic_index_via_ptr.wgsl.expected.wgsl new file mode 100644 index 0000000000..82184485cf --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat2x2/dynamic_index_via_ptr.wgsl.expected.wgsl @@ -0,0 +1,16 @@ +@group(0) @binding(0) var m : mat2x2; + +var counter = 0; + +fn i() -> i32 { + counter++; + return counter; +} + +@compute @workgroup_size(1) +fn f() { + let p_m = &(m); + let p_m_i = &((*(p_m))[i()]); + let l_m : mat2x2 = *(p_m); + let l_m_i : vec2 = *(p_m_i); +} diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x2/static_index_via_ptr.wgsl b/test/tint/buffer/uniform/std140/unnested/mat2x2/static_index_via_ptr.wgsl new file mode 100644 index 0000000000..b749a4dc23 --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat2x2/static_index_via_ptr.wgsl @@ -0,0 +1,13 @@ +@group(0) @binding(0) var m : mat2x2; + +var counter = 0; +fn i() -> i32 { counter++; return counter; } + +@compute @workgroup_size(1) +fn f() { + let p_m = &m; + let p_m_1 = &((*p_m)[1]); + + let l_m : mat2x2 = *p_m; + let l_m_1 : vec2 = *p_m_1; +} diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x2/static_index_via_ptr.wgsl.expected.dxc.hlsl b/test/tint/buffer/uniform/std140/unnested/mat2x2/static_index_via_ptr.wgsl.expected.dxc.hlsl new file mode 100644 index 0000000000..1193c5ac31 --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat2x2/static_index_via_ptr.wgsl.expected.dxc.hlsl @@ -0,0 +1,24 @@ +cbuffer cbuffer_m : register(b0, space0) { + uint4 m[1]; +}; +static int counter = 0; + +int i() { + counter = (counter + 1); + return counter; +} + +float2x2 tint_symbol(uint4 buffer[1], uint offset) { + const uint scalar_offset = ((offset + 0u)) / 4; + uint4 ubo_load = buffer[scalar_offset / 4]; + const uint scalar_offset_1 = ((offset + 8u)) / 4; + uint4 ubo_load_1 = buffer[scalar_offset_1 / 4]; + return float2x2(asfloat(((scalar_offset & 2) ? ubo_load.zw : ubo_load.xy)), asfloat(((scalar_offset_1 & 2) ? ubo_load_1.zw : ubo_load_1.xy))); +} + +[numthreads(1, 1, 1)] +void f() { + const float2x2 l_m = tint_symbol(m, 0u); + const float2 l_m_1 = asfloat(m[0].zw); + return; +} diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x2/static_index_via_ptr.wgsl.expected.fxc.hlsl b/test/tint/buffer/uniform/std140/unnested/mat2x2/static_index_via_ptr.wgsl.expected.fxc.hlsl new file mode 100644 index 0000000000..1193c5ac31 --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat2x2/static_index_via_ptr.wgsl.expected.fxc.hlsl @@ -0,0 +1,24 @@ +cbuffer cbuffer_m : register(b0, space0) { + uint4 m[1]; +}; +static int counter = 0; + +int i() { + counter = (counter + 1); + return counter; +} + +float2x2 tint_symbol(uint4 buffer[1], uint offset) { + const uint scalar_offset = ((offset + 0u)) / 4; + uint4 ubo_load = buffer[scalar_offset / 4]; + const uint scalar_offset_1 = ((offset + 8u)) / 4; + uint4 ubo_load_1 = buffer[scalar_offset_1 / 4]; + return float2x2(asfloat(((scalar_offset & 2) ? ubo_load.zw : ubo_load.xy)), asfloat(((scalar_offset_1 & 2) ? ubo_load_1.zw : ubo_load_1.xy))); +} + +[numthreads(1, 1, 1)] +void f() { + const float2x2 l_m = tint_symbol(m, 0u); + const float2 l_m_1 = asfloat(m[0].zw); + return; +} diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x2/static_index_via_ptr.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/unnested/mat2x2/static_index_via_ptr.wgsl.expected.glsl new file mode 100644 index 0000000000..5c2a99ff7d --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat2x2/static_index_via_ptr.wgsl.expected.glsl @@ -0,0 +1,23 @@ +#version 310 es + +layout(binding = 0, std140) uniform m_block_std140_ubo { + vec2 inner_0; + vec2 inner_1; +} m; + +mat2 load_m_inner() { + return mat2(m.inner_0, m.inner_1); +} + +void f() { + mat2 p_m = load_m_inner(); + vec2 p_m_1 = m.inner_1; + mat2 l_m = load_m_inner(); + vec2 l_m_1 = m.inner_1; +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + f(); + return; +} diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x2/static_index_via_ptr.wgsl.expected.msl b/test/tint/buffer/uniform/std140/unnested/mat2x2/static_index_via_ptr.wgsl.expected.msl new file mode 100644 index 0000000000..6b2c36812a --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat2x2/static_index_via_ptr.wgsl.expected.msl @@ -0,0 +1,15 @@ +#include + +using namespace metal; +int i() { + thread int tint_symbol = 0; + tint_symbol = as_type((as_type(tint_symbol) + as_type(1))); + return tint_symbol; +} + +kernel void f(const constant float2x2* tint_symbol_1 [[buffer(0)]]) { + float2x2 const l_m = *(tint_symbol_1); + float2 const l_m_1 = (*(tint_symbol_1))[1]; + return; +} + diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x2/static_index_via_ptr.wgsl.expected.spvasm b/test/tint/buffer/uniform/std140/unnested/mat2x2/static_index_via_ptr.wgsl.expected.spvasm new file mode 100644 index 0000000000..51af3512e8 --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat2x2/static_index_via_ptr.wgsl.expected.spvasm @@ -0,0 +1,66 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 40 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %f "f" + OpExecutionMode %f LocalSize 1 1 1 + OpName %m_block_std140 "m_block_std140" + OpMemberName %m_block_std140 0 "inner_0" + OpMemberName %m_block_std140 1 "inner_1" + OpName %m "m" + OpName %counter "counter" + OpName %i "i" + OpName %load_m_inner "load_m_inner" + OpName %f "f" + OpDecorate %m_block_std140 Block + OpMemberDecorate %m_block_std140 0 Offset 0 + OpMemberDecorate %m_block_std140 1 Offset 8 + OpDecorate %m NonWritable + OpDecorate %m DescriptorSet 0 + OpDecorate %m Binding 0 + %float = OpTypeFloat 32 + %v2float = OpTypeVector %float 2 +%m_block_std140 = OpTypeStruct %v2float %v2float +%_ptr_Uniform_m_block_std140 = OpTypePointer Uniform %m_block_std140 + %m = OpVariable %_ptr_Uniform_m_block_std140 Uniform + %int = OpTypeInt 32 1 + %7 = OpConstantNull %int +%_ptr_Private_int = OpTypePointer Private %int + %counter = OpVariable %_ptr_Private_int Private %7 + %10 = OpTypeFunction %int + %int_1 = OpConstant %int 1 +%mat2v2float = OpTypeMatrix %v2float 2 + %17 = OpTypeFunction %mat2v2float + %uint = OpTypeInt 32 0 + %uint_0 = OpConstant %uint 0 +%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float + %uint_1 = OpConstant %uint 1 + %void = OpTypeVoid + %33 = OpTypeFunction %void + %i = OpFunction %int None %10 + %12 = OpLabel + %13 = OpLoad %int %counter + %15 = OpIAdd %int %13 %int_1 + OpStore %counter %15 + %16 = OpLoad %int %counter + OpReturnValue %16 + OpFunctionEnd +%load_m_inner = OpFunction %mat2v2float None %17 + %20 = OpLabel + %26 = OpAccessChain %_ptr_Uniform_v2float %m %uint_0 + %27 = OpLoad %v2float %26 + %30 = OpAccessChain %_ptr_Uniform_v2float %m %uint_1 + %31 = OpLoad %v2float %30 + %32 = OpCompositeConstruct %mat2v2float %27 %31 + OpReturnValue %32 + OpFunctionEnd + %f = OpFunction %void None %33 + %36 = OpLabel + %37 = OpFunctionCall %mat2v2float %load_m_inner + %38 = OpAccessChain %_ptr_Uniform_v2float %m %uint_1 + %39 = OpLoad %v2float %38 + OpReturn + OpFunctionEnd diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x2/static_index_via_ptr.wgsl.expected.wgsl b/test/tint/buffer/uniform/std140/unnested/mat2x2/static_index_via_ptr.wgsl.expected.wgsl new file mode 100644 index 0000000000..5c46f6afd3 --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat2x2/static_index_via_ptr.wgsl.expected.wgsl @@ -0,0 +1,16 @@ +@group(0) @binding(0) var m : mat2x2; + +var counter = 0; + +fn i() -> i32 { + counter++; + return counter; +} + +@compute @workgroup_size(1) +fn f() { + let p_m = &(m); + let p_m_1 = &((*(p_m))[1]); + let l_m : mat2x2 = *(p_m); + let l_m_1 : vec2 = *(p_m_1); +} diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x2/to_builtin.wgsl b/test/tint/buffer/uniform/std140/unnested/mat2x2/to_builtin.wgsl new file mode 100644 index 0000000000..db062e36d9 --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat2x2/to_builtin.wgsl @@ -0,0 +1,8 @@ +@group(0) @binding(0) var u : mat2x2; + +@compute @workgroup_size(1) +fn f() { + let t = transpose(u); + let l = length(u[1]); + let a = abs(u[0].yx.x); +} diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x2/to_builtin.wgsl.expected.dxc.hlsl b/test/tint/buffer/uniform/std140/unnested/mat2x2/to_builtin.wgsl.expected.dxc.hlsl new file mode 100644 index 0000000000..693985f50f --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat2x2/to_builtin.wgsl.expected.dxc.hlsl @@ -0,0 +1,19 @@ +cbuffer cbuffer_u : register(b0, space0) { + uint4 u[1]; +}; + +float2x2 tint_symbol(uint4 buffer[1], uint offset) { + const uint scalar_offset = ((offset + 0u)) / 4; + uint4 ubo_load = buffer[scalar_offset / 4]; + const uint scalar_offset_1 = ((offset + 8u)) / 4; + uint4 ubo_load_1 = buffer[scalar_offset_1 / 4]; + return float2x2(asfloat(((scalar_offset & 2) ? ubo_load.zw : ubo_load.xy)), asfloat(((scalar_offset_1 & 2) ? ubo_load_1.zw : ubo_load_1.xy))); +} + +[numthreads(1, 1, 1)] +void f() { + const float2x2 t = transpose(tint_symbol(u, 0u)); + const float l = length(asfloat(u[0].zw)); + const float a = abs(asfloat(u[0].xy).yx.x); + return; +} diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x2/to_builtin.wgsl.expected.fxc.hlsl b/test/tint/buffer/uniform/std140/unnested/mat2x2/to_builtin.wgsl.expected.fxc.hlsl new file mode 100644 index 0000000000..693985f50f --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat2x2/to_builtin.wgsl.expected.fxc.hlsl @@ -0,0 +1,19 @@ +cbuffer cbuffer_u : register(b0, space0) { + uint4 u[1]; +}; + +float2x2 tint_symbol(uint4 buffer[1], uint offset) { + const uint scalar_offset = ((offset + 0u)) / 4; + uint4 ubo_load = buffer[scalar_offset / 4]; + const uint scalar_offset_1 = ((offset + 8u)) / 4; + uint4 ubo_load_1 = buffer[scalar_offset_1 / 4]; + return float2x2(asfloat(((scalar_offset & 2) ? ubo_load.zw : ubo_load.xy)), asfloat(((scalar_offset_1 & 2) ? ubo_load_1.zw : ubo_load_1.xy))); +} + +[numthreads(1, 1, 1)] +void f() { + const float2x2 t = transpose(tint_symbol(u, 0u)); + const float l = length(asfloat(u[0].zw)); + const float a = abs(asfloat(u[0].xy).yx.x); + return; +} diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x2/to_builtin.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/unnested/mat2x2/to_builtin.wgsl.expected.glsl new file mode 100644 index 0000000000..734e399d4f --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat2x2/to_builtin.wgsl.expected.glsl @@ -0,0 +1,22 @@ +#version 310 es + +layout(binding = 0, std140) uniform u_block_std140_ubo { + vec2 inner_0; + vec2 inner_1; +} u; + +mat2 load_u_inner() { + return mat2(u.inner_0, u.inner_1); +} + +void f() { + mat2 t = transpose(load_u_inner()); + float l = length(u.inner_1); + float a = abs(u.inner_0.yx[0u]); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + f(); + return; +} diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x2/to_builtin.wgsl.expected.msl b/test/tint/buffer/uniform/std140/unnested/mat2x2/to_builtin.wgsl.expected.msl new file mode 100644 index 0000000000..1a4d22ef9a --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat2x2/to_builtin.wgsl.expected.msl @@ -0,0 +1,10 @@ +#include + +using namespace metal; +kernel void f(const constant float2x2* tint_symbol [[buffer(0)]]) { + float2x2 const t = transpose(*(tint_symbol)); + float const l = length((*(tint_symbol))[1]); + float const a = fabs(float2((*(tint_symbol))[0]).yx[0]); + return; +} + diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x2/to_builtin.wgsl.expected.spvasm b/test/tint/buffer/uniform/std140/unnested/mat2x2/to_builtin.wgsl.expected.spvasm new file mode 100644 index 0000000000..2659b9397f --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat2x2/to_builtin.wgsl.expected.spvasm @@ -0,0 +1,59 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 38 +; Schema: 0 + OpCapability Shader + %29 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %f "f" + OpExecutionMode %f LocalSize 1 1 1 + OpName %u_block_std140 "u_block_std140" + OpMemberName %u_block_std140 0 "inner_0" + OpMemberName %u_block_std140 1 "inner_1" + OpName %u "u" + OpName %load_u_inner "load_u_inner" + OpName %f "f" + OpDecorate %u_block_std140 Block + OpMemberDecorate %u_block_std140 0 Offset 0 + OpMemberDecorate %u_block_std140 1 Offset 8 + OpDecorate %u NonWritable + OpDecorate %u DescriptorSet 0 + OpDecorate %u Binding 0 + %float = OpTypeFloat 32 + %v2float = OpTypeVector %float 2 +%u_block_std140 = OpTypeStruct %v2float %v2float +%_ptr_Uniform_u_block_std140 = OpTypePointer Uniform %u_block_std140 + %u = OpVariable %_ptr_Uniform_u_block_std140 Uniform +%mat2v2float = OpTypeMatrix %v2float 2 + %6 = OpTypeFunction %mat2v2float + %uint = OpTypeInt 32 0 + %uint_0 = OpConstant %uint 0 +%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float + %uint_1 = OpConstant %uint 1 + %void = OpTypeVoid + %22 = OpTypeFunction %void + %36 = OpConstantNull %uint +%load_u_inner = OpFunction %mat2v2float None %6 + %9 = OpLabel + %15 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 + %16 = OpLoad %v2float %15 + %19 = OpAccessChain %_ptr_Uniform_v2float %u %uint_1 + %20 = OpLoad %v2float %19 + %21 = OpCompositeConstruct %mat2v2float %16 %20 + OpReturnValue %21 + OpFunctionEnd + %f = OpFunction %void None %22 + %25 = OpLabel + %27 = OpFunctionCall %mat2v2float %load_u_inner + %26 = OpTranspose %mat2v2float %27 + %30 = OpAccessChain %_ptr_Uniform_v2float %u %uint_1 + %31 = OpLoad %v2float %30 + %28 = OpExtInst %float %29 Length %31 + %33 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 + %34 = OpLoad %v2float %33 + %35 = OpVectorShuffle %v2float %34 %34 1 0 + %37 = OpCompositeExtract %float %35 0 + %32 = OpExtInst %float %29 FAbs %37 + OpReturn + OpFunctionEnd diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x2/to_builtin.wgsl.expected.wgsl b/test/tint/buffer/uniform/std140/unnested/mat2x2/to_builtin.wgsl.expected.wgsl new file mode 100644 index 0000000000..21b2b9c56c --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat2x2/to_builtin.wgsl.expected.wgsl @@ -0,0 +1,8 @@ +@group(0) @binding(0) var u : mat2x2; + +@compute @workgroup_size(1) +fn f() { + let t = transpose(u); + let l = length(u[1]); + let a = abs(u[0].yx.x); +} diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x2/to_fn.wgsl b/test/tint/buffer/uniform/std140/unnested/mat2x2/to_fn.wgsl new file mode 100644 index 0000000000..f8cb4ea207 --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat2x2/to_fn.wgsl @@ -0,0 +1,14 @@ +@group(0) @binding(0) var u : mat2x2; + +fn a(m : mat2x2) {} +fn b(v : vec2) {} +fn c(f : f32) {} + +@compute @workgroup_size(1) +fn f() { + a(u); + b(u[1]); + b(u[1].yx); + c(u[1].x); + c(u[1].yx.x); +} diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x2/to_fn.wgsl.expected.dxc.hlsl b/test/tint/buffer/uniform/std140/unnested/mat2x2/to_fn.wgsl.expected.dxc.hlsl new file mode 100644 index 0000000000..0f4581e3f8 --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat2x2/to_fn.wgsl.expected.dxc.hlsl @@ -0,0 +1,30 @@ +cbuffer cbuffer_u : register(b0, space0) { + uint4 u[1]; +}; + +void a(float2x2 m) { +} + +void b(float2 v) { +} + +void c(float f_1) { +} + +float2x2 tint_symbol(uint4 buffer[1], uint offset) { + const uint scalar_offset = ((offset + 0u)) / 4; + uint4 ubo_load = buffer[scalar_offset / 4]; + const uint scalar_offset_1 = ((offset + 8u)) / 4; + uint4 ubo_load_1 = buffer[scalar_offset_1 / 4]; + return float2x2(asfloat(((scalar_offset & 2) ? ubo_load.zw : ubo_load.xy)), asfloat(((scalar_offset_1 & 2) ? ubo_load_1.zw : ubo_load_1.xy))); +} + +[numthreads(1, 1, 1)] +void f() { + a(tint_symbol(u, 0u)); + b(asfloat(u[0].zw)); + b(asfloat(u[0].zw).yx); + c(asfloat(u[0].z)); + c(asfloat(u[0].zw).yx.x); + return; +} diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x2/to_fn.wgsl.expected.fxc.hlsl b/test/tint/buffer/uniform/std140/unnested/mat2x2/to_fn.wgsl.expected.fxc.hlsl new file mode 100644 index 0000000000..0f4581e3f8 --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat2x2/to_fn.wgsl.expected.fxc.hlsl @@ -0,0 +1,30 @@ +cbuffer cbuffer_u : register(b0, space0) { + uint4 u[1]; +}; + +void a(float2x2 m) { +} + +void b(float2 v) { +} + +void c(float f_1) { +} + +float2x2 tint_symbol(uint4 buffer[1], uint offset) { + const uint scalar_offset = ((offset + 0u)) / 4; + uint4 ubo_load = buffer[scalar_offset / 4]; + const uint scalar_offset_1 = ((offset + 8u)) / 4; + uint4 ubo_load_1 = buffer[scalar_offset_1 / 4]; + return float2x2(asfloat(((scalar_offset & 2) ? ubo_load.zw : ubo_load.xy)), asfloat(((scalar_offset_1 & 2) ? ubo_load_1.zw : ubo_load_1.xy))); +} + +[numthreads(1, 1, 1)] +void f() { + a(tint_symbol(u, 0u)); + b(asfloat(u[0].zw)); + b(asfloat(u[0].zw).yx); + c(asfloat(u[0].z)); + c(asfloat(u[0].zw).yx.x); + return; +} diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x2/to_fn.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/unnested/mat2x2/to_fn.wgsl.expected.glsl new file mode 100644 index 0000000000..161c7abefc --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat2x2/to_fn.wgsl.expected.glsl @@ -0,0 +1,33 @@ +#version 310 es + +layout(binding = 0, std140) uniform u_block_std140_ubo { + vec2 inner_0; + vec2 inner_1; +} u; + +void a(mat2 m) { +} + +void b(vec2 v) { +} + +void c(float f_1) { +} + +mat2 load_u_inner() { + return mat2(u.inner_0, u.inner_1); +} + +void f() { + a(load_u_inner()); + b(u.inner_1); + b(u.inner_1.yx); + c(u.inner_1[0u]); + c(u.inner_1.yx[0u]); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + f(); + return; +} diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x2/to_fn.wgsl.expected.msl b/test/tint/buffer/uniform/std140/unnested/mat2x2/to_fn.wgsl.expected.msl new file mode 100644 index 0000000000..f160d72421 --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat2x2/to_fn.wgsl.expected.msl @@ -0,0 +1,21 @@ +#include + +using namespace metal; +void a(float2x2 m) { +} + +void b(float2 v) { +} + +void c(float f_1) { +} + +kernel void f(const constant float2x2* tint_symbol [[buffer(0)]]) { + a(*(tint_symbol)); + b((*(tint_symbol))[1]); + b(float2((*(tint_symbol))[1]).yx); + c((*(tint_symbol))[1][0]); + c(float2((*(tint_symbol))[1]).yx[0]); + return; +} + diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x2/to_fn.wgsl.expected.spvasm b/test/tint/buffer/uniform/std140/unnested/mat2x2/to_fn.wgsl.expected.spvasm new file mode 100644 index 0000000000..62a260754f --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat2x2/to_fn.wgsl.expected.spvasm @@ -0,0 +1,90 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 57 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %f "f" + OpExecutionMode %f LocalSize 1 1 1 + OpName %u_block_std140 "u_block_std140" + OpMemberName %u_block_std140 0 "inner_0" + OpMemberName %u_block_std140 1 "inner_1" + OpName %u "u" + OpName %a "a" + OpName %m "m" + OpName %b "b" + OpName %v "v" + OpName %c "c" + OpName %f_1 "f_1" + OpName %load_u_inner "load_u_inner" + OpName %f "f" + OpDecorate %u_block_std140 Block + OpMemberDecorate %u_block_std140 0 Offset 0 + OpMemberDecorate %u_block_std140 1 Offset 8 + OpDecorate %u NonWritable + OpDecorate %u DescriptorSet 0 + OpDecorate %u Binding 0 + %float = OpTypeFloat 32 + %v2float = OpTypeVector %float 2 +%u_block_std140 = OpTypeStruct %v2float %v2float +%_ptr_Uniform_u_block_std140 = OpTypePointer Uniform %u_block_std140 + %u = OpVariable %_ptr_Uniform_u_block_std140 Uniform + %void = OpTypeVoid +%mat2v2float = OpTypeMatrix %v2float 2 + %6 = OpTypeFunction %void %mat2v2float + %12 = OpTypeFunction %void %v2float + %16 = OpTypeFunction %void %float + %20 = OpTypeFunction %mat2v2float + %uint = OpTypeInt 32 0 + %uint_0 = OpConstant %uint 0 +%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float + %uint_1 = OpConstant %uint 1 + %35 = OpTypeFunction %void + %48 = OpConstantNull %uint +%_ptr_Uniform_float = OpTypePointer Uniform %float + %a = OpFunction %void None %6 + %m = OpFunctionParameter %mat2v2float + %11 = OpLabel + OpReturn + OpFunctionEnd + %b = OpFunction %void None %12 + %v = OpFunctionParameter %v2float + %15 = OpLabel + OpReturn + OpFunctionEnd + %c = OpFunction %void None %16 + %f_1 = OpFunctionParameter %float + %19 = OpLabel + OpReturn + OpFunctionEnd +%load_u_inner = OpFunction %mat2v2float None %20 + %22 = OpLabel + %28 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 + %29 = OpLoad %v2float %28 + %32 = OpAccessChain %_ptr_Uniform_v2float %u %uint_1 + %33 = OpLoad %v2float %32 + %34 = OpCompositeConstruct %mat2v2float %29 %33 + OpReturnValue %34 + OpFunctionEnd + %f = OpFunction %void None %35 + %37 = OpLabel + %39 = OpFunctionCall %mat2v2float %load_u_inner + %38 = OpFunctionCall %void %a %39 + %41 = OpAccessChain %_ptr_Uniform_v2float %u %uint_1 + %42 = OpLoad %v2float %41 + %40 = OpFunctionCall %void %b %42 + %44 = OpAccessChain %_ptr_Uniform_v2float %u %uint_1 + %45 = OpLoad %v2float %44 + %46 = OpVectorShuffle %v2float %45 %45 1 0 + %43 = OpFunctionCall %void %b %46 + %50 = OpAccessChain %_ptr_Uniform_float %u %uint_1 %48 + %51 = OpLoad %float %50 + %47 = OpFunctionCall %void %c %51 + %53 = OpAccessChain %_ptr_Uniform_v2float %u %uint_1 + %54 = OpLoad %v2float %53 + %55 = OpVectorShuffle %v2float %54 %54 1 0 + %56 = OpCompositeExtract %float %55 0 + %52 = OpFunctionCall %void %c %56 + OpReturn + OpFunctionEnd diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x2/to_fn.wgsl.expected.wgsl b/test/tint/buffer/uniform/std140/unnested/mat2x2/to_fn.wgsl.expected.wgsl new file mode 100644 index 0000000000..d670763e9f --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat2x2/to_fn.wgsl.expected.wgsl @@ -0,0 +1,19 @@ +@group(0) @binding(0) var u : mat2x2; + +fn a(m : mat2x2) { +} + +fn b(v : vec2) { +} + +fn c(f : f32) { +} + +@compute @workgroup_size(1) +fn f() { + a(u); + b(u[1]); + b(u[1].yx); + c(u[1].x); + c(u[1].yx.x); +} diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x2/to_private.wgsl b/test/tint/buffer/uniform/std140/unnested/mat2x2/to_private.wgsl new file mode 100644 index 0000000000..50c4510c2b --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat2x2/to_private.wgsl @@ -0,0 +1,10 @@ +@group(0) @binding(0) var u : mat2x2; +var p : mat2x2; + +@compute @workgroup_size(1) +fn f() { + p = u; + p[1] = u[0]; + p[1] = u[0].yx; + p[0][1] = u[1][0]; +} diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x2/to_private.wgsl.expected.dxc.hlsl b/test/tint/buffer/uniform/std140/unnested/mat2x2/to_private.wgsl.expected.dxc.hlsl new file mode 100644 index 0000000000..daa1db48de --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat2x2/to_private.wgsl.expected.dxc.hlsl @@ -0,0 +1,21 @@ +cbuffer cbuffer_u : register(b0, space0) { + uint4 u[1]; +}; +static float2x2 p = float2x2(0.0f, 0.0f, 0.0f, 0.0f); + +float2x2 tint_symbol(uint4 buffer[1], uint offset) { + const uint scalar_offset = ((offset + 0u)) / 4; + uint4 ubo_load = buffer[scalar_offset / 4]; + const uint scalar_offset_1 = ((offset + 8u)) / 4; + uint4 ubo_load_1 = buffer[scalar_offset_1 / 4]; + return float2x2(asfloat(((scalar_offset & 2) ? ubo_load.zw : ubo_load.xy)), asfloat(((scalar_offset_1 & 2) ? ubo_load_1.zw : ubo_load_1.xy))); +} + +[numthreads(1, 1, 1)] +void f() { + p = tint_symbol(u, 0u); + p[1] = asfloat(u[0].xy); + p[1] = asfloat(u[0].xy).yx; + p[0][1] = asfloat(u[0].z); + return; +} diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x2/to_private.wgsl.expected.fxc.hlsl b/test/tint/buffer/uniform/std140/unnested/mat2x2/to_private.wgsl.expected.fxc.hlsl new file mode 100644 index 0000000000..daa1db48de --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat2x2/to_private.wgsl.expected.fxc.hlsl @@ -0,0 +1,21 @@ +cbuffer cbuffer_u : register(b0, space0) { + uint4 u[1]; +}; +static float2x2 p = float2x2(0.0f, 0.0f, 0.0f, 0.0f); + +float2x2 tint_symbol(uint4 buffer[1], uint offset) { + const uint scalar_offset = ((offset + 0u)) / 4; + uint4 ubo_load = buffer[scalar_offset / 4]; + const uint scalar_offset_1 = ((offset + 8u)) / 4; + uint4 ubo_load_1 = buffer[scalar_offset_1 / 4]; + return float2x2(asfloat(((scalar_offset & 2) ? ubo_load.zw : ubo_load.xy)), asfloat(((scalar_offset_1 & 2) ? ubo_load_1.zw : ubo_load_1.xy))); +} + +[numthreads(1, 1, 1)] +void f() { + p = tint_symbol(u, 0u); + p[1] = asfloat(u[0].xy); + p[1] = asfloat(u[0].xy).yx; + p[0][1] = asfloat(u[0].z); + return; +} diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x2/to_private.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/unnested/mat2x2/to_private.wgsl.expected.glsl new file mode 100644 index 0000000000..cbb8b88142 --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat2x2/to_private.wgsl.expected.glsl @@ -0,0 +1,24 @@ +#version 310 es + +layout(binding = 0, std140) uniform u_block_std140_ubo { + vec2 inner_0; + vec2 inner_1; +} u; + +mat2 p = mat2(0.0f, 0.0f, 0.0f, 0.0f); +mat2 load_u_inner() { + return mat2(u.inner_0, u.inner_1); +} + +void f() { + p = load_u_inner(); + p[1] = u.inner_0; + p[1] = u.inner_0.yx; + p[0][1] = u.inner_1[0u]; +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + f(); + return; +} diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x2/to_private.wgsl.expected.msl b/test/tint/buffer/uniform/std140/unnested/mat2x2/to_private.wgsl.expected.msl new file mode 100644 index 0000000000..76bf1adbcb --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat2x2/to_private.wgsl.expected.msl @@ -0,0 +1,12 @@ +#include + +using namespace metal; +kernel void f(const constant float2x2* tint_symbol_1 [[buffer(0)]]) { + thread float2x2 tint_symbol = float2x2(0.0f); + tint_symbol = *(tint_symbol_1); + tint_symbol[1] = (*(tint_symbol_1))[0]; + tint_symbol[1] = float2((*(tint_symbol_1))[0]).yx; + tint_symbol[0][1] = (*(tint_symbol_1))[1][0]; + return; +} + diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x2/to_private.wgsl.expected.spvasm b/test/tint/buffer/uniform/std140/unnested/mat2x2/to_private.wgsl.expected.spvasm new file mode 100644 index 0000000000..cb61baf9a9 --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat2x2/to_private.wgsl.expected.spvasm @@ -0,0 +1,73 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 47 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %f "f" + OpExecutionMode %f LocalSize 1 1 1 + OpName %u_block_std140 "u_block_std140" + OpMemberName %u_block_std140 0 "inner_0" + OpMemberName %u_block_std140 1 "inner_1" + OpName %u "u" + OpName %p "p" + OpName %load_u_inner "load_u_inner" + OpName %f "f" + OpDecorate %u_block_std140 Block + OpMemberDecorate %u_block_std140 0 Offset 0 + OpMemberDecorate %u_block_std140 1 Offset 8 + OpDecorate %u NonWritable + OpDecorate %u DescriptorSet 0 + OpDecorate %u Binding 0 + %float = OpTypeFloat 32 + %v2float = OpTypeVector %float 2 +%u_block_std140 = OpTypeStruct %v2float %v2float +%_ptr_Uniform_u_block_std140 = OpTypePointer Uniform %u_block_std140 + %u = OpVariable %_ptr_Uniform_u_block_std140 Uniform +%mat2v2float = OpTypeMatrix %v2float 2 +%_ptr_Private_mat2v2float = OpTypePointer Private %mat2v2float + %9 = OpConstantNull %mat2v2float + %p = OpVariable %_ptr_Private_mat2v2float Private %9 + %10 = OpTypeFunction %mat2v2float + %uint = OpTypeInt 32 0 + %uint_0 = OpConstant %uint 0 +%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float + %uint_1 = OpConstant %uint 1 + %void = OpTypeVoid + %25 = OpTypeFunction %void + %int = OpTypeInt 32 1 + %int_1 = OpConstant %int 1 +%_ptr_Private_v2float = OpTypePointer Private %v2float + %40 = OpConstantNull %int +%_ptr_Private_float = OpTypePointer Private %float + %43 = OpConstantNull %uint +%_ptr_Uniform_float = OpTypePointer Uniform %float +%load_u_inner = OpFunction %mat2v2float None %10 + %12 = OpLabel + %18 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 + %19 = OpLoad %v2float %18 + %22 = OpAccessChain %_ptr_Uniform_v2float %u %uint_1 + %23 = OpLoad %v2float %22 + %24 = OpCompositeConstruct %mat2v2float %19 %23 + OpReturnValue %24 + OpFunctionEnd + %f = OpFunction %void None %25 + %28 = OpLabel + %29 = OpFunctionCall %mat2v2float %load_u_inner + OpStore %p %29 + %33 = OpAccessChain %_ptr_Private_v2float %p %int_1 + %34 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 + %35 = OpLoad %v2float %34 + OpStore %33 %35 + %36 = OpAccessChain %_ptr_Private_v2float %p %int_1 + %37 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 + %38 = OpLoad %v2float %37 + %39 = OpVectorShuffle %v2float %38 %38 1 0 + OpStore %36 %39 + %42 = OpAccessChain %_ptr_Private_float %p %40 %int_1 + %45 = OpAccessChain %_ptr_Uniform_float %u %uint_1 %43 + %46 = OpLoad %float %45 + OpStore %42 %46 + OpReturn + OpFunctionEnd diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x2/to_private.wgsl.expected.wgsl b/test/tint/buffer/uniform/std140/unnested/mat2x2/to_private.wgsl.expected.wgsl new file mode 100644 index 0000000000..15e7f582e7 --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat2x2/to_private.wgsl.expected.wgsl @@ -0,0 +1,11 @@ +@group(0) @binding(0) var u : mat2x2; + +var p : mat2x2; + +@compute @workgroup_size(1) +fn f() { + p = u; + p[1] = u[0]; + p[1] = u[0].yx; + p[0][1] = u[1][0]; +} diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x2/to_storage.wgsl b/test/tint/buffer/uniform/std140/unnested/mat2x2/to_storage.wgsl new file mode 100644 index 0000000000..e7b02aef0e --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat2x2/to_storage.wgsl @@ -0,0 +1,10 @@ +@group(0) @binding(0) var u : mat2x2; +@group(0) @binding(1) var s : mat2x2; + +@compute @workgroup_size(1) +fn f() { + s = u; + s[1] = u[0]; + s[1] = u[0].yx; + s[0][1] = u[1][0]; +} diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x2/to_storage.wgsl.expected.dxc.hlsl b/test/tint/buffer/uniform/std140/unnested/mat2x2/to_storage.wgsl.expected.dxc.hlsl new file mode 100644 index 0000000000..9457624d6e --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat2x2/to_storage.wgsl.expected.dxc.hlsl @@ -0,0 +1,26 @@ +cbuffer cbuffer_u : register(b0, space0) { + uint4 u[1]; +}; +RWByteAddressBuffer s : register(u1, space0); + +void tint_symbol(RWByteAddressBuffer buffer, uint offset, float2x2 value) { + buffer.Store2((offset + 0u), asuint(value[0u])); + buffer.Store2((offset + 8u), asuint(value[1u])); +} + +float2x2 tint_symbol_2(uint4 buffer[1], uint offset) { + const uint scalar_offset = ((offset + 0u)) / 4; + uint4 ubo_load = buffer[scalar_offset / 4]; + const uint scalar_offset_1 = ((offset + 8u)) / 4; + uint4 ubo_load_1 = buffer[scalar_offset_1 / 4]; + return float2x2(asfloat(((scalar_offset & 2) ? ubo_load.zw : ubo_load.xy)), asfloat(((scalar_offset_1 & 2) ? ubo_load_1.zw : ubo_load_1.xy))); +} + +[numthreads(1, 1, 1)] +void f() { + tint_symbol(s, 0u, tint_symbol_2(u, 0u)); + s.Store2(8u, asuint(asfloat(u[0].xy))); + s.Store2(8u, asuint(asfloat(u[0].xy).yx)); + s.Store(4u, asuint(asfloat(u[0].z))); + return; +} diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x2/to_storage.wgsl.expected.fxc.hlsl b/test/tint/buffer/uniform/std140/unnested/mat2x2/to_storage.wgsl.expected.fxc.hlsl new file mode 100644 index 0000000000..9457624d6e --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat2x2/to_storage.wgsl.expected.fxc.hlsl @@ -0,0 +1,26 @@ +cbuffer cbuffer_u : register(b0, space0) { + uint4 u[1]; +}; +RWByteAddressBuffer s : register(u1, space0); + +void tint_symbol(RWByteAddressBuffer buffer, uint offset, float2x2 value) { + buffer.Store2((offset + 0u), asuint(value[0u])); + buffer.Store2((offset + 8u), asuint(value[1u])); +} + +float2x2 tint_symbol_2(uint4 buffer[1], uint offset) { + const uint scalar_offset = ((offset + 0u)) / 4; + uint4 ubo_load = buffer[scalar_offset / 4]; + const uint scalar_offset_1 = ((offset + 8u)) / 4; + uint4 ubo_load_1 = buffer[scalar_offset_1 / 4]; + return float2x2(asfloat(((scalar_offset & 2) ? ubo_load.zw : ubo_load.xy)), asfloat(((scalar_offset_1 & 2) ? ubo_load_1.zw : ubo_load_1.xy))); +} + +[numthreads(1, 1, 1)] +void f() { + tint_symbol(s, 0u, tint_symbol_2(u, 0u)); + s.Store2(8u, asuint(asfloat(u[0].xy))); + s.Store2(8u, asuint(asfloat(u[0].xy).yx)); + s.Store(4u, asuint(asfloat(u[0].z))); + return; +} diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x2/to_storage.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/unnested/mat2x2/to_storage.wgsl.expected.glsl new file mode 100644 index 0000000000..c215c511bf --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat2x2/to_storage.wgsl.expected.glsl @@ -0,0 +1,27 @@ +#version 310 es + +layout(binding = 0, std140) uniform u_block_std140_ubo { + vec2 inner_0; + vec2 inner_1; +} u; + +layout(binding = 1, std430) buffer u_block_ssbo { + mat2 inner; +} s; + +mat2 load_u_inner() { + return mat2(u.inner_0, u.inner_1); +} + +void f() { + s.inner = load_u_inner(); + s.inner[1] = u.inner_0; + s.inner[1] = u.inner_0.yx; + s.inner[0][1] = u.inner_1[0u]; +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + f(); + return; +} diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x2/to_storage.wgsl.expected.msl b/test/tint/buffer/uniform/std140/unnested/mat2x2/to_storage.wgsl.expected.msl new file mode 100644 index 0000000000..c265005f50 --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat2x2/to_storage.wgsl.expected.msl @@ -0,0 +1,11 @@ +#include + +using namespace metal; +kernel void f(device float2x2* tint_symbol [[buffer(1)]], const constant float2x2* tint_symbol_1 [[buffer(0)]]) { + *(tint_symbol) = *(tint_symbol_1); + (*(tint_symbol))[1] = (*(tint_symbol_1))[0]; + (*(tint_symbol))[1] = float2((*(tint_symbol_1))[0]).yx; + (*(tint_symbol))[0][1] = (*(tint_symbol_1))[1][0]; + return; +} + diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x2/to_storage.wgsl.expected.spvasm b/test/tint/buffer/uniform/std140/unnested/mat2x2/to_storage.wgsl.expected.spvasm new file mode 100644 index 0000000000..f18c153182 --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat2x2/to_storage.wgsl.expected.spvasm @@ -0,0 +1,83 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 49 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %f "f" + OpExecutionMode %f LocalSize 1 1 1 + OpName %u_block_std140 "u_block_std140" + OpMemberName %u_block_std140 0 "inner_0" + OpMemberName %u_block_std140 1 "inner_1" + OpName %u "u" + OpName %u_block "u_block" + OpMemberName %u_block 0 "inner" + OpName %s "s" + OpName %load_u_inner "load_u_inner" + OpName %f "f" + OpDecorate %u_block_std140 Block + OpMemberDecorate %u_block_std140 0 Offset 0 + OpMemberDecorate %u_block_std140 1 Offset 8 + OpDecorate %u NonWritable + OpDecorate %u DescriptorSet 0 + OpDecorate %u Binding 0 + OpDecorate %u_block Block + OpMemberDecorate %u_block 0 Offset 0 + OpMemberDecorate %u_block 0 ColMajor + OpMemberDecorate %u_block 0 MatrixStride 8 + OpDecorate %s DescriptorSet 0 + OpDecorate %s Binding 1 + %float = OpTypeFloat 32 + %v2float = OpTypeVector %float 2 +%u_block_std140 = OpTypeStruct %v2float %v2float +%_ptr_Uniform_u_block_std140 = OpTypePointer Uniform %u_block_std140 + %u = OpVariable %_ptr_Uniform_u_block_std140 Uniform +%mat2v2float = OpTypeMatrix %v2float 2 + %u_block = OpTypeStruct %mat2v2float +%_ptr_StorageBuffer_u_block = OpTypePointer StorageBuffer %u_block + %s = OpVariable %_ptr_StorageBuffer_u_block StorageBuffer + %10 = OpTypeFunction %mat2v2float + %uint = OpTypeInt 32 0 + %uint_0 = OpConstant %uint 0 +%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float + %uint_1 = OpConstant %uint 1 + %void = OpTypeVoid + %25 = OpTypeFunction %void +%_ptr_StorageBuffer_mat2v2float = OpTypePointer StorageBuffer %mat2v2float + %int = OpTypeInt 32 1 + %int_1 = OpConstant %int 1 +%_ptr_StorageBuffer_v2float = OpTypePointer StorageBuffer %v2float + %42 = OpConstantNull %int +%_ptr_StorageBuffer_float = OpTypePointer StorageBuffer %float + %45 = OpConstantNull %uint +%_ptr_Uniform_float = OpTypePointer Uniform %float +%load_u_inner = OpFunction %mat2v2float None %10 + %12 = OpLabel + %18 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 + %19 = OpLoad %v2float %18 + %22 = OpAccessChain %_ptr_Uniform_v2float %u %uint_1 + %23 = OpLoad %v2float %22 + %24 = OpCompositeConstruct %mat2v2float %19 %23 + OpReturnValue %24 + OpFunctionEnd + %f = OpFunction %void None %25 + %28 = OpLabel + %30 = OpAccessChain %_ptr_StorageBuffer_mat2v2float %s %uint_0 + %31 = OpFunctionCall %mat2v2float %load_u_inner + OpStore %30 %31 + %35 = OpAccessChain %_ptr_StorageBuffer_v2float %s %uint_0 %int_1 + %36 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 + %37 = OpLoad %v2float %36 + OpStore %35 %37 + %38 = OpAccessChain %_ptr_StorageBuffer_v2float %s %uint_0 %int_1 + %39 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 + %40 = OpLoad %v2float %39 + %41 = OpVectorShuffle %v2float %40 %40 1 0 + OpStore %38 %41 + %44 = OpAccessChain %_ptr_StorageBuffer_float %s %uint_0 %42 %int_1 + %47 = OpAccessChain %_ptr_Uniform_float %u %uint_1 %45 + %48 = OpLoad %float %47 + OpStore %44 %48 + OpReturn + OpFunctionEnd diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x2/to_storage.wgsl.expected.wgsl b/test/tint/buffer/uniform/std140/unnested/mat2x2/to_storage.wgsl.expected.wgsl new file mode 100644 index 0000000000..5693f823fa --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat2x2/to_storage.wgsl.expected.wgsl @@ -0,0 +1,11 @@ +@group(0) @binding(0) var u : mat2x2; + +@group(0) @binding(1) var s : mat2x2; + +@compute @workgroup_size(1) +fn f() { + s = u; + s[1] = u[0]; + s[1] = u[0].yx; + s[0][1] = u[1][0]; +} diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x2/to_workgroup.wgsl b/test/tint/buffer/uniform/std140/unnested/mat2x2/to_workgroup.wgsl new file mode 100644 index 0000000000..429e90f03b --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat2x2/to_workgroup.wgsl @@ -0,0 +1,10 @@ +@group(0) @binding(0) var u : mat2x2; +var w : mat2x2; + +@compute @workgroup_size(1) +fn f() { + w = u; + w[1] = u[0]; + w[1] = u[0].yx; + w[0][1] = u[1][0]; +} diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x2/to_workgroup.wgsl.expected.dxc.hlsl b/test/tint/buffer/uniform/std140/unnested/mat2x2/to_workgroup.wgsl.expected.dxc.hlsl new file mode 100644 index 0000000000..fe32b58017 --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat2x2/to_workgroup.wgsl.expected.dxc.hlsl @@ -0,0 +1,33 @@ +cbuffer cbuffer_u : register(b0, space0) { + uint4 u[1]; +}; +groupshared float2x2 w; + +struct tint_symbol_1 { + uint local_invocation_index : SV_GroupIndex; +}; + +float2x2 tint_symbol_2(uint4 buffer[1], uint offset) { + const uint scalar_offset = ((offset + 0u)) / 4; + uint4 ubo_load = buffer[scalar_offset / 4]; + const uint scalar_offset_1 = ((offset + 8u)) / 4; + uint4 ubo_load_1 = buffer[scalar_offset_1 / 4]; + return float2x2(asfloat(((scalar_offset & 2) ? ubo_load.zw : ubo_load.xy)), asfloat(((scalar_offset_1 & 2) ? ubo_load_1.zw : ubo_load_1.xy))); +} + +void f_inner(uint local_invocation_index) { + { + w = float2x2((0.0f).xx, (0.0f).xx); + } + GroupMemoryBarrierWithGroupSync(); + w = tint_symbol_2(u, 0u); + w[1] = asfloat(u[0].xy); + w[1] = asfloat(u[0].xy).yx; + w[0][1] = asfloat(u[0].z); +} + +[numthreads(1, 1, 1)] +void f(tint_symbol_1 tint_symbol) { + f_inner(tint_symbol.local_invocation_index); + return; +} diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x2/to_workgroup.wgsl.expected.fxc.hlsl b/test/tint/buffer/uniform/std140/unnested/mat2x2/to_workgroup.wgsl.expected.fxc.hlsl new file mode 100644 index 0000000000..fe32b58017 --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat2x2/to_workgroup.wgsl.expected.fxc.hlsl @@ -0,0 +1,33 @@ +cbuffer cbuffer_u : register(b0, space0) { + uint4 u[1]; +}; +groupshared float2x2 w; + +struct tint_symbol_1 { + uint local_invocation_index : SV_GroupIndex; +}; + +float2x2 tint_symbol_2(uint4 buffer[1], uint offset) { + const uint scalar_offset = ((offset + 0u)) / 4; + uint4 ubo_load = buffer[scalar_offset / 4]; + const uint scalar_offset_1 = ((offset + 8u)) / 4; + uint4 ubo_load_1 = buffer[scalar_offset_1 / 4]; + return float2x2(asfloat(((scalar_offset & 2) ? ubo_load.zw : ubo_load.xy)), asfloat(((scalar_offset_1 & 2) ? ubo_load_1.zw : ubo_load_1.xy))); +} + +void f_inner(uint local_invocation_index) { + { + w = float2x2((0.0f).xx, (0.0f).xx); + } + GroupMemoryBarrierWithGroupSync(); + w = tint_symbol_2(u, 0u); + w[1] = asfloat(u[0].xy); + w[1] = asfloat(u[0].xy).yx; + w[0][1] = asfloat(u[0].z); +} + +[numthreads(1, 1, 1)] +void f(tint_symbol_1 tint_symbol) { + f_inner(tint_symbol.local_invocation_index); + return; +} diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x2/to_workgroup.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/unnested/mat2x2/to_workgroup.wgsl.expected.glsl new file mode 100644 index 0000000000..f92860e2a4 --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat2x2/to_workgroup.wgsl.expected.glsl @@ -0,0 +1,28 @@ +#version 310 es + +layout(binding = 0, std140) uniform u_block_std140_ubo { + vec2 inner_0; + vec2 inner_1; +} u; + +shared mat2 w; +mat2 load_u_inner() { + return mat2(u.inner_0, u.inner_1); +} + +void f(uint local_invocation_index) { + { + w = mat2(vec2(0.0f), vec2(0.0f)); + } + barrier(); + w = load_u_inner(); + w[1] = u.inner_0; + w[1] = u.inner_0.yx; + w[0][1] = u.inner_1[0u]; +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + f(gl_LocalInvocationIndex); + return; +} diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x2/to_workgroup.wgsl.expected.msl b/test/tint/buffer/uniform/std140/unnested/mat2x2/to_workgroup.wgsl.expected.msl new file mode 100644 index 0000000000..44993bca9a --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat2x2/to_workgroup.wgsl.expected.msl @@ -0,0 +1,24 @@ +#include + +using namespace metal; +struct tint_symbol_5 { + float2x2 w; +}; + +void f_inner(uint local_invocation_index, threadgroup float2x2* const tint_symbol, const constant float2x2* const tint_symbol_1) { + { + *(tint_symbol) = float2x2(float2(0.0f), float2(0.0f)); + } + threadgroup_barrier(mem_flags::mem_threadgroup); + *(tint_symbol) = *(tint_symbol_1); + (*(tint_symbol))[1] = (*(tint_symbol_1))[0]; + (*(tint_symbol))[1] = float2((*(tint_symbol_1))[0]).yx; + (*(tint_symbol))[0][1] = (*(tint_symbol_1))[1][0]; +} + +kernel void f(const constant float2x2* tint_symbol_4 [[buffer(0)]], threadgroup tint_symbol_5* tint_symbol_3 [[threadgroup(0)]], uint local_invocation_index [[thread_index_in_threadgroup]]) { + threadgroup float2x2* const tint_symbol_2 = &((*(tint_symbol_3)).w); + f_inner(local_invocation_index, tint_symbol_2, tint_symbol_4); + return; +} + diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x2/to_workgroup.wgsl.expected.spvasm b/test/tint/buffer/uniform/std140/unnested/mat2x2/to_workgroup.wgsl.expected.spvasm new file mode 100644 index 0000000000..f8352eeb1d --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat2x2/to_workgroup.wgsl.expected.spvasm @@ -0,0 +1,91 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 58 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %f "f" %local_invocation_index_1 + OpExecutionMode %f LocalSize 1 1 1 + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %u_block_std140 "u_block_std140" + OpMemberName %u_block_std140 0 "inner_0" + OpMemberName %u_block_std140 1 "inner_1" + OpName %u "u" + OpName %w "w" + OpName %load_u_inner "load_u_inner" + OpName %f_inner "f_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %f "f" + OpDecorate %local_invocation_index_1 BuiltIn LocalInvocationIndex + OpDecorate %u_block_std140 Block + OpMemberDecorate %u_block_std140 0 Offset 0 + OpMemberDecorate %u_block_std140 1 Offset 8 + OpDecorate %u NonWritable + OpDecorate %u DescriptorSet 0 + OpDecorate %u Binding 0 + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1 = OpVariable %_ptr_Input_uint Input + %float = OpTypeFloat 32 + %v2float = OpTypeVector %float 2 +%u_block_std140 = OpTypeStruct %v2float %v2float +%_ptr_Uniform_u_block_std140 = OpTypePointer Uniform %u_block_std140 + %u = OpVariable %_ptr_Uniform_u_block_std140 Uniform +%mat2v2float = OpTypeMatrix %v2float 2 +%_ptr_Workgroup_mat2v2float = OpTypePointer Workgroup %mat2v2float + %w = OpVariable %_ptr_Workgroup_mat2v2float Workgroup + %12 = OpTypeFunction %mat2v2float + %uint_0 = OpConstant %uint 0 +%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float + %uint_1 = OpConstant %uint 1 + %void = OpTypeVoid + %26 = OpTypeFunction %void %uint + %31 = OpConstantNull %mat2v2float + %uint_2 = OpConstant %uint 2 + %uint_264 = OpConstant %uint 264 + %int = OpTypeInt 32 1 + %int_1 = OpConstant %int 1 +%_ptr_Workgroup_v2float = OpTypePointer Workgroup %v2float + %46 = OpConstantNull %int +%_ptr_Workgroup_float = OpTypePointer Workgroup %float + %49 = OpConstantNull %uint +%_ptr_Uniform_float = OpTypePointer Uniform %float + %53 = OpTypeFunction %void +%load_u_inner = OpFunction %mat2v2float None %12 + %14 = OpLabel + %19 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 + %20 = OpLoad %v2float %19 + %23 = OpAccessChain %_ptr_Uniform_v2float %u %uint_1 + %24 = OpLoad %v2float %23 + %25 = OpCompositeConstruct %mat2v2float %20 %24 + OpReturnValue %25 + OpFunctionEnd + %f_inner = OpFunction %void None %26 +%local_invocation_index = OpFunctionParameter %uint + %30 = OpLabel + OpStore %w %31 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %35 = OpFunctionCall %mat2v2float %load_u_inner + OpStore %w %35 + %39 = OpAccessChain %_ptr_Workgroup_v2float %w %int_1 + %40 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 + %41 = OpLoad %v2float %40 + OpStore %39 %41 + %42 = OpAccessChain %_ptr_Workgroup_v2float %w %int_1 + %43 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 + %44 = OpLoad %v2float %43 + %45 = OpVectorShuffle %v2float %44 %44 1 0 + OpStore %42 %45 + %48 = OpAccessChain %_ptr_Workgroup_float %w %46 %int_1 + %51 = OpAccessChain %_ptr_Uniform_float %u %uint_1 %49 + %52 = OpLoad %float %51 + OpStore %48 %52 + OpReturn + OpFunctionEnd + %f = OpFunction %void None %53 + %55 = OpLabel + %57 = OpLoad %uint %local_invocation_index_1 + %56 = OpFunctionCall %void %f_inner %57 + OpReturn + OpFunctionEnd diff --git a/test/tint/buffer/uniform/std140/unnested/mat2x2/to_workgroup.wgsl.expected.wgsl b/test/tint/buffer/uniform/std140/unnested/mat2x2/to_workgroup.wgsl.expected.wgsl new file mode 100644 index 0000000000..0a4ef03b97 --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat2x2/to_workgroup.wgsl.expected.wgsl @@ -0,0 +1,11 @@ +@group(0) @binding(0) var u : mat2x2; + +var w : mat2x2; + +@compute @workgroup_size(1) +fn f() { + w = u; + w[1] = u[0]; + w[1] = u[0].yx; + w[0][1] = u[1][0]; +} diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x2/dynamic_index_via_ptr.wgsl b/test/tint/buffer/uniform/std140/unnested/mat3x2/dynamic_index_via_ptr.wgsl new file mode 100644 index 0000000000..6fa268cbc1 --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat3x2/dynamic_index_via_ptr.wgsl @@ -0,0 +1,13 @@ +@group(0) @binding(0) var m : mat3x2; + +var counter = 0; +fn i() -> i32 { counter++; return counter; } + +@compute @workgroup_size(1) +fn f() { + let p_m = &m; + let p_m_i = &((*p_m)[i()]); + + let l_m : mat3x2 = *p_m; + let l_m_i : vec2 = *p_m_i; +} diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x2/dynamic_index_via_ptr.wgsl.expected.dxc.hlsl b/test/tint/buffer/uniform/std140/unnested/mat3x2/dynamic_index_via_ptr.wgsl.expected.dxc.hlsl new file mode 100644 index 0000000000..4e7e2c6268 --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat3x2/dynamic_index_via_ptr.wgsl.expected.dxc.hlsl @@ -0,0 +1,29 @@ +cbuffer cbuffer_m : register(b0, space0) { + uint4 m[2]; +}; +static int counter = 0; + +int i() { + counter = (counter + 1); + return counter; +} + +float3x2 tint_symbol(uint4 buffer[2], uint offset) { + const uint scalar_offset = ((offset + 0u)) / 4; + uint4 ubo_load = buffer[scalar_offset / 4]; + const uint scalar_offset_1 = ((offset + 8u)) / 4; + uint4 ubo_load_1 = buffer[scalar_offset_1 / 4]; + const uint scalar_offset_2 = ((offset + 16u)) / 4; + uint4 ubo_load_2 = buffer[scalar_offset_2 / 4]; + return float3x2(asfloat(((scalar_offset & 2) ? ubo_load.zw : ubo_load.xy)), asfloat(((scalar_offset_1 & 2) ? ubo_load_1.zw : ubo_load_1.xy)), asfloat(((scalar_offset_2 & 2) ? ubo_load_2.zw : ubo_load_2.xy))); +} + +[numthreads(1, 1, 1)] +void f() { + const int p_m_i_save = i(); + const float3x2 l_m = tint_symbol(m, 0u); + const uint scalar_offset_3 = ((8u * uint(p_m_i_save))) / 4; + uint4 ubo_load_3 = m[scalar_offset_3 / 4]; + const float2 l_m_i = asfloat(((scalar_offset_3 & 2) ? ubo_load_3.zw : ubo_load_3.xy)); + return; +} diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x2/dynamic_index_via_ptr.wgsl.expected.fxc.hlsl b/test/tint/buffer/uniform/std140/unnested/mat3x2/dynamic_index_via_ptr.wgsl.expected.fxc.hlsl new file mode 100644 index 0000000000..4e7e2c6268 --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat3x2/dynamic_index_via_ptr.wgsl.expected.fxc.hlsl @@ -0,0 +1,29 @@ +cbuffer cbuffer_m : register(b0, space0) { + uint4 m[2]; +}; +static int counter = 0; + +int i() { + counter = (counter + 1); + return counter; +} + +float3x2 tint_symbol(uint4 buffer[2], uint offset) { + const uint scalar_offset = ((offset + 0u)) / 4; + uint4 ubo_load = buffer[scalar_offset / 4]; + const uint scalar_offset_1 = ((offset + 8u)) / 4; + uint4 ubo_load_1 = buffer[scalar_offset_1 / 4]; + const uint scalar_offset_2 = ((offset + 16u)) / 4; + uint4 ubo_load_2 = buffer[scalar_offset_2 / 4]; + return float3x2(asfloat(((scalar_offset & 2) ? ubo_load.zw : ubo_load.xy)), asfloat(((scalar_offset_1 & 2) ? ubo_load_1.zw : ubo_load_1.xy)), asfloat(((scalar_offset_2 & 2) ? ubo_load_2.zw : ubo_load_2.xy))); +} + +[numthreads(1, 1, 1)] +void f() { + const int p_m_i_save = i(); + const float3x2 l_m = tint_symbol(m, 0u); + const uint scalar_offset_3 = ((8u * uint(p_m_i_save))) / 4; + uint4 ubo_load_3 = m[scalar_offset_3 / 4]; + const float2 l_m_i = asfloat(((scalar_offset_3 & 2) ? ubo_load_3.zw : ubo_load_3.xy)); + return; +} diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x2/dynamic_index_via_ptr.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/unnested/mat3x2/dynamic_index_via_ptr.wgsl.expected.glsl new file mode 100644 index 0000000000..4a9523db52 --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat3x2/dynamic_index_via_ptr.wgsl.expected.glsl @@ -0,0 +1,52 @@ +#version 310 es + +layout(binding = 0, std140) uniform m_block_std140_ubo { + vec2 inner_0; + vec2 inner_1; + vec2 inner_2; +} m; + +int counter = 0; +int i() { + counter = (counter + 1); + return counter; +} + +mat3x2 load_m_inner() { + return mat3x2(m.inner_0, m.inner_1, m.inner_2); +} + +vec2 load_m_inner_p0(uint p0) { + switch(p0) { + case 0u: { + return m.inner_0; + break; + } + case 1u: { + return m.inner_1; + break; + } + case 2u: { + return m.inner_2; + break; + } + default: { + return vec2(0.0f); + break; + } + } +} + +void f() { + mat3x2 p_m = load_m_inner(); + int tint_symbol = i(); + vec2 p_m_i = load_m_inner_p0(uint(tint_symbol)); + mat3x2 l_m = load_m_inner(); + vec2 l_m_i = load_m_inner_p0(uint(tint_symbol)); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + f(); + return; +} diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x2/dynamic_index_via_ptr.wgsl.expected.msl b/test/tint/buffer/uniform/std140/unnested/mat3x2/dynamic_index_via_ptr.wgsl.expected.msl new file mode 100644 index 0000000000..ccda76536b --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat3x2/dynamic_index_via_ptr.wgsl.expected.msl @@ -0,0 +1,17 @@ +#include + +using namespace metal; +int i() { + thread int tint_symbol_1 = 0; + tint_symbol_1 = as_type((as_type(tint_symbol_1) + as_type(1))); + return tint_symbol_1; +} + +kernel void f(const constant float3x2* tint_symbol_2 [[buffer(0)]]) { + int const tint_symbol = i(); + int const p_m_i_save = tint_symbol; + float3x2 const l_m = *(tint_symbol_2); + float2 const l_m_i = (*(tint_symbol_2))[p_m_i_save]; + return; +} + diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x2/dynamic_index_via_ptr.wgsl.expected.spvasm b/test/tint/buffer/uniform/std140/unnested/mat3x2/dynamic_index_via_ptr.wgsl.expected.spvasm new file mode 100644 index 0000000000..7f537aba6f --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat3x2/dynamic_index_via_ptr.wgsl.expected.spvasm @@ -0,0 +1,98 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 61 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %f "f" + OpExecutionMode %f LocalSize 1 1 1 + OpName %m_block_std140 "m_block_std140" + OpMemberName %m_block_std140 0 "inner_0" + OpMemberName %m_block_std140 1 "inner_1" + OpMemberName %m_block_std140 2 "inner_2" + OpName %m "m" + OpName %counter "counter" + OpName %i "i" + OpName %load_m_inner "load_m_inner" + OpName %load_m_inner_p0 "load_m_inner_p0" + OpName %p0 "p0" + OpName %f "f" + OpDecorate %m_block_std140 Block + OpMemberDecorate %m_block_std140 0 Offset 0 + OpMemberDecorate %m_block_std140 1 Offset 8 + OpMemberDecorate %m_block_std140 2 Offset 16 + OpDecorate %m NonWritable + OpDecorate %m DescriptorSet 0 + OpDecorate %m Binding 0 + %float = OpTypeFloat 32 + %v2float = OpTypeVector %float 2 +%m_block_std140 = OpTypeStruct %v2float %v2float %v2float +%_ptr_Uniform_m_block_std140 = OpTypePointer Uniform %m_block_std140 + %m = OpVariable %_ptr_Uniform_m_block_std140 Uniform + %int = OpTypeInt 32 1 + %7 = OpConstantNull %int +%_ptr_Private_int = OpTypePointer Private %int + %counter = OpVariable %_ptr_Private_int Private %7 + %10 = OpTypeFunction %int + %int_1 = OpConstant %int 1 +%mat3v2float = OpTypeMatrix %v2float 3 + %17 = OpTypeFunction %mat3v2float + %uint = OpTypeInt 32 0 + %uint_0 = OpConstant %uint 0 +%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float + %uint_1 = OpConstant %uint 1 + %uint_2 = OpConstant %uint 2 + %37 = OpTypeFunction %v2float %uint + %52 = OpConstantNull %v2float + %void = OpTypeVoid + %53 = OpTypeFunction %void + %i = OpFunction %int None %10 + %12 = OpLabel + %13 = OpLoad %int %counter + %15 = OpIAdd %int %13 %int_1 + OpStore %counter %15 + %16 = OpLoad %int %counter + OpReturnValue %16 + OpFunctionEnd +%load_m_inner = OpFunction %mat3v2float None %17 + %20 = OpLabel + %26 = OpAccessChain %_ptr_Uniform_v2float %m %uint_0 + %27 = OpLoad %v2float %26 + %30 = OpAccessChain %_ptr_Uniform_v2float %m %uint_1 + %31 = OpLoad %v2float %30 + %34 = OpAccessChain %_ptr_Uniform_v2float %m %uint_2 + %35 = OpLoad %v2float %34 + %36 = OpCompositeConstruct %mat3v2float %27 %31 %35 + OpReturnValue %36 + OpFunctionEnd +%load_m_inner_p0 = OpFunction %v2float None %37 + %p0 = OpFunctionParameter %uint + %40 = OpLabel + OpSelectionMerge %41 None + OpSwitch %p0 %42 0 %43 1 %44 2 %45 + %43 = OpLabel + %46 = OpAccessChain %_ptr_Uniform_v2float %m %uint_0 + %47 = OpLoad %v2float %46 + OpReturnValue %47 + %44 = OpLabel + %48 = OpAccessChain %_ptr_Uniform_v2float %m %uint_1 + %49 = OpLoad %v2float %48 + OpReturnValue %49 + %45 = OpLabel + %50 = OpAccessChain %_ptr_Uniform_v2float %m %uint_2 + %51 = OpLoad %v2float %50 + OpReturnValue %51 + %42 = OpLabel + OpReturnValue %52 + %41 = OpLabel + OpReturnValue %52 + OpFunctionEnd + %f = OpFunction %void None %53 + %56 = OpLabel + %57 = OpFunctionCall %int %i + %58 = OpFunctionCall %mat3v2float %load_m_inner + %60 = OpBitcast %uint %57 + %59 = OpFunctionCall %v2float %load_m_inner_p0 %60 + OpReturn + OpFunctionEnd diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x2/dynamic_index_via_ptr.wgsl.expected.wgsl b/test/tint/buffer/uniform/std140/unnested/mat3x2/dynamic_index_via_ptr.wgsl.expected.wgsl new file mode 100644 index 0000000000..a81d55425f --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat3x2/dynamic_index_via_ptr.wgsl.expected.wgsl @@ -0,0 +1,16 @@ +@group(0) @binding(0) var m : mat3x2; + +var counter = 0; + +fn i() -> i32 { + counter++; + return counter; +} + +@compute @workgroup_size(1) +fn f() { + let p_m = &(m); + let p_m_i = &((*(p_m))[i()]); + let l_m : mat3x2 = *(p_m); + let l_m_i : vec2 = *(p_m_i); +} diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x2/static_index_via_ptr.wgsl b/test/tint/buffer/uniform/std140/unnested/mat3x2/static_index_via_ptr.wgsl new file mode 100644 index 0000000000..5f3457691f --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat3x2/static_index_via_ptr.wgsl @@ -0,0 +1,13 @@ +@group(0) @binding(0) var m : mat3x2; + +var counter = 0; +fn i() -> i32 { counter++; return counter; } + +@compute @workgroup_size(1) +fn f() { + let p_m = &m; + let p_m_1 = &((*p_m)[1]); + + let l_m : mat3x2 = *p_m; + let l_m_1 : vec2 = *p_m_1; +} diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x2/static_index_via_ptr.wgsl.expected.dxc.hlsl b/test/tint/buffer/uniform/std140/unnested/mat3x2/static_index_via_ptr.wgsl.expected.dxc.hlsl new file mode 100644 index 0000000000..fb5623cebc --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat3x2/static_index_via_ptr.wgsl.expected.dxc.hlsl @@ -0,0 +1,26 @@ +cbuffer cbuffer_m : register(b0, space0) { + uint4 m[2]; +}; +static int counter = 0; + +int i() { + counter = (counter + 1); + return counter; +} + +float3x2 tint_symbol(uint4 buffer[2], uint offset) { + const uint scalar_offset = ((offset + 0u)) / 4; + uint4 ubo_load = buffer[scalar_offset / 4]; + const uint scalar_offset_1 = ((offset + 8u)) / 4; + uint4 ubo_load_1 = buffer[scalar_offset_1 / 4]; + const uint scalar_offset_2 = ((offset + 16u)) / 4; + uint4 ubo_load_2 = buffer[scalar_offset_2 / 4]; + return float3x2(asfloat(((scalar_offset & 2) ? ubo_load.zw : ubo_load.xy)), asfloat(((scalar_offset_1 & 2) ? ubo_load_1.zw : ubo_load_1.xy)), asfloat(((scalar_offset_2 & 2) ? ubo_load_2.zw : ubo_load_2.xy))); +} + +[numthreads(1, 1, 1)] +void f() { + const float3x2 l_m = tint_symbol(m, 0u); + const float2 l_m_1 = asfloat(m[0].zw); + return; +} diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x2/static_index_via_ptr.wgsl.expected.fxc.hlsl b/test/tint/buffer/uniform/std140/unnested/mat3x2/static_index_via_ptr.wgsl.expected.fxc.hlsl new file mode 100644 index 0000000000..fb5623cebc --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat3x2/static_index_via_ptr.wgsl.expected.fxc.hlsl @@ -0,0 +1,26 @@ +cbuffer cbuffer_m : register(b0, space0) { + uint4 m[2]; +}; +static int counter = 0; + +int i() { + counter = (counter + 1); + return counter; +} + +float3x2 tint_symbol(uint4 buffer[2], uint offset) { + const uint scalar_offset = ((offset + 0u)) / 4; + uint4 ubo_load = buffer[scalar_offset / 4]; + const uint scalar_offset_1 = ((offset + 8u)) / 4; + uint4 ubo_load_1 = buffer[scalar_offset_1 / 4]; + const uint scalar_offset_2 = ((offset + 16u)) / 4; + uint4 ubo_load_2 = buffer[scalar_offset_2 / 4]; + return float3x2(asfloat(((scalar_offset & 2) ? ubo_load.zw : ubo_load.xy)), asfloat(((scalar_offset_1 & 2) ? ubo_load_1.zw : ubo_load_1.xy)), asfloat(((scalar_offset_2 & 2) ? ubo_load_2.zw : ubo_load_2.xy))); +} + +[numthreads(1, 1, 1)] +void f() { + const float3x2 l_m = tint_symbol(m, 0u); + const float2 l_m_1 = asfloat(m[0].zw); + return; +} diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x2/static_index_via_ptr.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/unnested/mat3x2/static_index_via_ptr.wgsl.expected.glsl new file mode 100644 index 0000000000..19b51d6316 --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat3x2/static_index_via_ptr.wgsl.expected.glsl @@ -0,0 +1,24 @@ +#version 310 es + +layout(binding = 0, std140) uniform m_block_std140_ubo { + vec2 inner_0; + vec2 inner_1; + vec2 inner_2; +} m; + +mat3x2 load_m_inner() { + return mat3x2(m.inner_0, m.inner_1, m.inner_2); +} + +void f() { + mat3x2 p_m = load_m_inner(); + vec2 p_m_1 = m.inner_1; + mat3x2 l_m = load_m_inner(); + vec2 l_m_1 = m.inner_1; +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + f(); + return; +} diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x2/static_index_via_ptr.wgsl.expected.msl b/test/tint/buffer/uniform/std140/unnested/mat3x2/static_index_via_ptr.wgsl.expected.msl new file mode 100644 index 0000000000..df020b79aa --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat3x2/static_index_via_ptr.wgsl.expected.msl @@ -0,0 +1,15 @@ +#include + +using namespace metal; +int i() { + thread int tint_symbol = 0; + tint_symbol = as_type((as_type(tint_symbol) + as_type(1))); + return tint_symbol; +} + +kernel void f(const constant float3x2* tint_symbol_1 [[buffer(0)]]) { + float3x2 const l_m = *(tint_symbol_1); + float2 const l_m_1 = (*(tint_symbol_1))[1]; + return; +} + diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x2/static_index_via_ptr.wgsl.expected.spvasm b/test/tint/buffer/uniform/std140/unnested/mat3x2/static_index_via_ptr.wgsl.expected.spvasm new file mode 100644 index 0000000000..9635081d05 --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat3x2/static_index_via_ptr.wgsl.expected.spvasm @@ -0,0 +1,71 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 44 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %f "f" + OpExecutionMode %f LocalSize 1 1 1 + OpName %m_block_std140 "m_block_std140" + OpMemberName %m_block_std140 0 "inner_0" + OpMemberName %m_block_std140 1 "inner_1" + OpMemberName %m_block_std140 2 "inner_2" + OpName %m "m" + OpName %counter "counter" + OpName %i "i" + OpName %load_m_inner "load_m_inner" + OpName %f "f" + OpDecorate %m_block_std140 Block + OpMemberDecorate %m_block_std140 0 Offset 0 + OpMemberDecorate %m_block_std140 1 Offset 8 + OpMemberDecorate %m_block_std140 2 Offset 16 + OpDecorate %m NonWritable + OpDecorate %m DescriptorSet 0 + OpDecorate %m Binding 0 + %float = OpTypeFloat 32 + %v2float = OpTypeVector %float 2 +%m_block_std140 = OpTypeStruct %v2float %v2float %v2float +%_ptr_Uniform_m_block_std140 = OpTypePointer Uniform %m_block_std140 + %m = OpVariable %_ptr_Uniform_m_block_std140 Uniform + %int = OpTypeInt 32 1 + %7 = OpConstantNull %int +%_ptr_Private_int = OpTypePointer Private %int + %counter = OpVariable %_ptr_Private_int Private %7 + %10 = OpTypeFunction %int + %int_1 = OpConstant %int 1 +%mat3v2float = OpTypeMatrix %v2float 3 + %17 = OpTypeFunction %mat3v2float + %uint = OpTypeInt 32 0 + %uint_0 = OpConstant %uint 0 +%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float + %uint_1 = OpConstant %uint 1 + %uint_2 = OpConstant %uint 2 + %void = OpTypeVoid + %37 = OpTypeFunction %void + %i = OpFunction %int None %10 + %12 = OpLabel + %13 = OpLoad %int %counter + %15 = OpIAdd %int %13 %int_1 + OpStore %counter %15 + %16 = OpLoad %int %counter + OpReturnValue %16 + OpFunctionEnd +%load_m_inner = OpFunction %mat3v2float None %17 + %20 = OpLabel + %26 = OpAccessChain %_ptr_Uniform_v2float %m %uint_0 + %27 = OpLoad %v2float %26 + %30 = OpAccessChain %_ptr_Uniform_v2float %m %uint_1 + %31 = OpLoad %v2float %30 + %34 = OpAccessChain %_ptr_Uniform_v2float %m %uint_2 + %35 = OpLoad %v2float %34 + %36 = OpCompositeConstruct %mat3v2float %27 %31 %35 + OpReturnValue %36 + OpFunctionEnd + %f = OpFunction %void None %37 + %40 = OpLabel + %41 = OpFunctionCall %mat3v2float %load_m_inner + %42 = OpAccessChain %_ptr_Uniform_v2float %m %uint_1 + %43 = OpLoad %v2float %42 + OpReturn + OpFunctionEnd diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x2/static_index_via_ptr.wgsl.expected.wgsl b/test/tint/buffer/uniform/std140/unnested/mat3x2/static_index_via_ptr.wgsl.expected.wgsl new file mode 100644 index 0000000000..000555e1df --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat3x2/static_index_via_ptr.wgsl.expected.wgsl @@ -0,0 +1,16 @@ +@group(0) @binding(0) var m : mat3x2; + +var counter = 0; + +fn i() -> i32 { + counter++; + return counter; +} + +@compute @workgroup_size(1) +fn f() { + let p_m = &(m); + let p_m_1 = &((*(p_m))[1]); + let l_m : mat3x2 = *(p_m); + let l_m_1 : vec2 = *(p_m_1); +} diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x2/to_builtin.wgsl b/test/tint/buffer/uniform/std140/unnested/mat3x2/to_builtin.wgsl new file mode 100644 index 0000000000..373c03187c --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat3x2/to_builtin.wgsl @@ -0,0 +1,8 @@ +@group(0) @binding(0) var u : mat3x2; + +@compute @workgroup_size(1) +fn f() { + let t = transpose(u); + let l = length(u[1]); + let a = abs(u[0].yx.x); +} diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x2/to_builtin.wgsl.expected.dxc.hlsl b/test/tint/buffer/uniform/std140/unnested/mat3x2/to_builtin.wgsl.expected.dxc.hlsl new file mode 100644 index 0000000000..b94dd862e1 --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat3x2/to_builtin.wgsl.expected.dxc.hlsl @@ -0,0 +1,21 @@ +cbuffer cbuffer_u : register(b0, space0) { + uint4 u[2]; +}; + +float3x2 tint_symbol(uint4 buffer[2], uint offset) { + const uint scalar_offset = ((offset + 0u)) / 4; + uint4 ubo_load = buffer[scalar_offset / 4]; + const uint scalar_offset_1 = ((offset + 8u)) / 4; + uint4 ubo_load_1 = buffer[scalar_offset_1 / 4]; + const uint scalar_offset_2 = ((offset + 16u)) / 4; + uint4 ubo_load_2 = buffer[scalar_offset_2 / 4]; + return float3x2(asfloat(((scalar_offset & 2) ? ubo_load.zw : ubo_load.xy)), asfloat(((scalar_offset_1 & 2) ? ubo_load_1.zw : ubo_load_1.xy)), asfloat(((scalar_offset_2 & 2) ? ubo_load_2.zw : ubo_load_2.xy))); +} + +[numthreads(1, 1, 1)] +void f() { + const float2x3 t = transpose(tint_symbol(u, 0u)); + const float l = length(asfloat(u[0].zw)); + const float a = abs(asfloat(u[0].xy).yx.x); + return; +} diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x2/to_builtin.wgsl.expected.fxc.hlsl b/test/tint/buffer/uniform/std140/unnested/mat3x2/to_builtin.wgsl.expected.fxc.hlsl new file mode 100644 index 0000000000..b94dd862e1 --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat3x2/to_builtin.wgsl.expected.fxc.hlsl @@ -0,0 +1,21 @@ +cbuffer cbuffer_u : register(b0, space0) { + uint4 u[2]; +}; + +float3x2 tint_symbol(uint4 buffer[2], uint offset) { + const uint scalar_offset = ((offset + 0u)) / 4; + uint4 ubo_load = buffer[scalar_offset / 4]; + const uint scalar_offset_1 = ((offset + 8u)) / 4; + uint4 ubo_load_1 = buffer[scalar_offset_1 / 4]; + const uint scalar_offset_2 = ((offset + 16u)) / 4; + uint4 ubo_load_2 = buffer[scalar_offset_2 / 4]; + return float3x2(asfloat(((scalar_offset & 2) ? ubo_load.zw : ubo_load.xy)), asfloat(((scalar_offset_1 & 2) ? ubo_load_1.zw : ubo_load_1.xy)), asfloat(((scalar_offset_2 & 2) ? ubo_load_2.zw : ubo_load_2.xy))); +} + +[numthreads(1, 1, 1)] +void f() { + const float2x3 t = transpose(tint_symbol(u, 0u)); + const float l = length(asfloat(u[0].zw)); + const float a = abs(asfloat(u[0].xy).yx.x); + return; +} diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x2/to_builtin.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/unnested/mat3x2/to_builtin.wgsl.expected.glsl new file mode 100644 index 0000000000..b8b37bae1c --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat3x2/to_builtin.wgsl.expected.glsl @@ -0,0 +1,23 @@ +#version 310 es + +layout(binding = 0, std140) uniform u_block_std140_ubo { + vec2 inner_0; + vec2 inner_1; + vec2 inner_2; +} u; + +mat3x2 load_u_inner() { + return mat3x2(u.inner_0, u.inner_1, u.inner_2); +} + +void f() { + mat2x3 t = transpose(load_u_inner()); + float l = length(u.inner_1); + float a = abs(u.inner_0.yx[0u]); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + f(); + return; +} diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x2/to_builtin.wgsl.expected.msl b/test/tint/buffer/uniform/std140/unnested/mat3x2/to_builtin.wgsl.expected.msl new file mode 100644 index 0000000000..009f12eb1d --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat3x2/to_builtin.wgsl.expected.msl @@ -0,0 +1,10 @@ +#include + +using namespace metal; +kernel void f(const constant float3x2* tint_symbol [[buffer(0)]]) { + float2x3 const t = transpose(*(tint_symbol)); + float const l = length((*(tint_symbol))[1]); + float const a = fabs(float2((*(tint_symbol))[0]).yx[0]); + return; +} + diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x2/to_builtin.wgsl.expected.spvasm b/test/tint/buffer/uniform/std140/unnested/mat3x2/to_builtin.wgsl.expected.spvasm new file mode 100644 index 0000000000..dedf489a2f --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat3x2/to_builtin.wgsl.expected.spvasm @@ -0,0 +1,66 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 44 +; Schema: 0 + OpCapability Shader + %35 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %f "f" + OpExecutionMode %f LocalSize 1 1 1 + OpName %u_block_std140 "u_block_std140" + OpMemberName %u_block_std140 0 "inner_0" + OpMemberName %u_block_std140 1 "inner_1" + OpMemberName %u_block_std140 2 "inner_2" + OpName %u "u" + OpName %load_u_inner "load_u_inner" + OpName %f "f" + OpDecorate %u_block_std140 Block + OpMemberDecorate %u_block_std140 0 Offset 0 + OpMemberDecorate %u_block_std140 1 Offset 8 + OpMemberDecorate %u_block_std140 2 Offset 16 + OpDecorate %u NonWritable + OpDecorate %u DescriptorSet 0 + OpDecorate %u Binding 0 + %float = OpTypeFloat 32 + %v2float = OpTypeVector %float 2 +%u_block_std140 = OpTypeStruct %v2float %v2float %v2float +%_ptr_Uniform_u_block_std140 = OpTypePointer Uniform %u_block_std140 + %u = OpVariable %_ptr_Uniform_u_block_std140 Uniform +%mat3v2float = OpTypeMatrix %v2float 3 + %6 = OpTypeFunction %mat3v2float + %uint = OpTypeInt 32 0 + %uint_0 = OpConstant %uint 0 +%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float + %uint_1 = OpConstant %uint 1 + %uint_2 = OpConstant %uint 2 + %void = OpTypeVoid + %26 = OpTypeFunction %void + %v3float = OpTypeVector %float 3 +%mat2v3float = OpTypeMatrix %v3float 2 + %42 = OpConstantNull %uint +%load_u_inner = OpFunction %mat3v2float None %6 + %9 = OpLabel + %15 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 + %16 = OpLoad %v2float %15 + %19 = OpAccessChain %_ptr_Uniform_v2float %u %uint_1 + %20 = OpLoad %v2float %19 + %23 = OpAccessChain %_ptr_Uniform_v2float %u %uint_2 + %24 = OpLoad %v2float %23 + %25 = OpCompositeConstruct %mat3v2float %16 %20 %24 + OpReturnValue %25 + OpFunctionEnd + %f = OpFunction %void None %26 + %29 = OpLabel + %33 = OpFunctionCall %mat3v2float %load_u_inner + %30 = OpTranspose %mat2v3float %33 + %36 = OpAccessChain %_ptr_Uniform_v2float %u %uint_1 + %37 = OpLoad %v2float %36 + %34 = OpExtInst %float %35 Length %37 + %39 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 + %40 = OpLoad %v2float %39 + %41 = OpVectorShuffle %v2float %40 %40 1 0 + %43 = OpCompositeExtract %float %41 0 + %38 = OpExtInst %float %35 FAbs %43 + OpReturn + OpFunctionEnd diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x2/to_builtin.wgsl.expected.wgsl b/test/tint/buffer/uniform/std140/unnested/mat3x2/to_builtin.wgsl.expected.wgsl new file mode 100644 index 0000000000..185376d823 --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat3x2/to_builtin.wgsl.expected.wgsl @@ -0,0 +1,8 @@ +@group(0) @binding(0) var u : mat3x2; + +@compute @workgroup_size(1) +fn f() { + let t = transpose(u); + let l = length(u[1]); + let a = abs(u[0].yx.x); +} diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x2/to_fn.wgsl b/test/tint/buffer/uniform/std140/unnested/mat3x2/to_fn.wgsl new file mode 100644 index 0000000000..e5391c5685 --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat3x2/to_fn.wgsl @@ -0,0 +1,14 @@ +@group(0) @binding(0) var u : mat3x2; + +fn a(m : mat3x2) {} +fn b(v : vec2) {} +fn c(f : f32) {} + +@compute @workgroup_size(1) +fn f() { + a(u); + b(u[1]); + b(u[1].yx); + c(u[1].x); + c(u[1].yx.x); +} diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x2/to_fn.wgsl.expected.dxc.hlsl b/test/tint/buffer/uniform/std140/unnested/mat3x2/to_fn.wgsl.expected.dxc.hlsl new file mode 100644 index 0000000000..029fe0afb8 --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat3x2/to_fn.wgsl.expected.dxc.hlsl @@ -0,0 +1,32 @@ +cbuffer cbuffer_u : register(b0, space0) { + uint4 u[2]; +}; + +void a(float3x2 m) { +} + +void b(float2 v) { +} + +void c(float f_1) { +} + +float3x2 tint_symbol(uint4 buffer[2], uint offset) { + const uint scalar_offset = ((offset + 0u)) / 4; + uint4 ubo_load = buffer[scalar_offset / 4]; + const uint scalar_offset_1 = ((offset + 8u)) / 4; + uint4 ubo_load_1 = buffer[scalar_offset_1 / 4]; + const uint scalar_offset_2 = ((offset + 16u)) / 4; + uint4 ubo_load_2 = buffer[scalar_offset_2 / 4]; + return float3x2(asfloat(((scalar_offset & 2) ? ubo_load.zw : ubo_load.xy)), asfloat(((scalar_offset_1 & 2) ? ubo_load_1.zw : ubo_load_1.xy)), asfloat(((scalar_offset_2 & 2) ? ubo_load_2.zw : ubo_load_2.xy))); +} + +[numthreads(1, 1, 1)] +void f() { + a(tint_symbol(u, 0u)); + b(asfloat(u[0].zw)); + b(asfloat(u[0].zw).yx); + c(asfloat(u[0].z)); + c(asfloat(u[0].zw).yx.x); + return; +} diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x2/to_fn.wgsl.expected.fxc.hlsl b/test/tint/buffer/uniform/std140/unnested/mat3x2/to_fn.wgsl.expected.fxc.hlsl new file mode 100644 index 0000000000..029fe0afb8 --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat3x2/to_fn.wgsl.expected.fxc.hlsl @@ -0,0 +1,32 @@ +cbuffer cbuffer_u : register(b0, space0) { + uint4 u[2]; +}; + +void a(float3x2 m) { +} + +void b(float2 v) { +} + +void c(float f_1) { +} + +float3x2 tint_symbol(uint4 buffer[2], uint offset) { + const uint scalar_offset = ((offset + 0u)) / 4; + uint4 ubo_load = buffer[scalar_offset / 4]; + const uint scalar_offset_1 = ((offset + 8u)) / 4; + uint4 ubo_load_1 = buffer[scalar_offset_1 / 4]; + const uint scalar_offset_2 = ((offset + 16u)) / 4; + uint4 ubo_load_2 = buffer[scalar_offset_2 / 4]; + return float3x2(asfloat(((scalar_offset & 2) ? ubo_load.zw : ubo_load.xy)), asfloat(((scalar_offset_1 & 2) ? ubo_load_1.zw : ubo_load_1.xy)), asfloat(((scalar_offset_2 & 2) ? ubo_load_2.zw : ubo_load_2.xy))); +} + +[numthreads(1, 1, 1)] +void f() { + a(tint_symbol(u, 0u)); + b(asfloat(u[0].zw)); + b(asfloat(u[0].zw).yx); + c(asfloat(u[0].z)); + c(asfloat(u[0].zw).yx.x); + return; +} diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x2/to_fn.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/unnested/mat3x2/to_fn.wgsl.expected.glsl new file mode 100644 index 0000000000..f3d607d4e5 --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat3x2/to_fn.wgsl.expected.glsl @@ -0,0 +1,34 @@ +#version 310 es + +layout(binding = 0, std140) uniform u_block_std140_ubo { + vec2 inner_0; + vec2 inner_1; + vec2 inner_2; +} u; + +void a(mat3x2 m) { +} + +void b(vec2 v) { +} + +void c(float f_1) { +} + +mat3x2 load_u_inner() { + return mat3x2(u.inner_0, u.inner_1, u.inner_2); +} + +void f() { + a(load_u_inner()); + b(u.inner_1); + b(u.inner_1.yx); + c(u.inner_1[0u]); + c(u.inner_1.yx[0u]); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + f(); + return; +} diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x2/to_fn.wgsl.expected.msl b/test/tint/buffer/uniform/std140/unnested/mat3x2/to_fn.wgsl.expected.msl new file mode 100644 index 0000000000..278a0f455f --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat3x2/to_fn.wgsl.expected.msl @@ -0,0 +1,21 @@ +#include + +using namespace metal; +void a(float3x2 m) { +} + +void b(float2 v) { +} + +void c(float f_1) { +} + +kernel void f(const constant float3x2* tint_symbol [[buffer(0)]]) { + a(*(tint_symbol)); + b((*(tint_symbol))[1]); + b(float2((*(tint_symbol))[1]).yx); + c((*(tint_symbol))[1][0]); + c(float2((*(tint_symbol))[1]).yx[0]); + return; +} + diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x2/to_fn.wgsl.expected.spvasm b/test/tint/buffer/uniform/std140/unnested/mat3x2/to_fn.wgsl.expected.spvasm new file mode 100644 index 0000000000..d602c8d9d0 --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat3x2/to_fn.wgsl.expected.spvasm @@ -0,0 +1,95 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 61 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %f "f" + OpExecutionMode %f LocalSize 1 1 1 + OpName %u_block_std140 "u_block_std140" + OpMemberName %u_block_std140 0 "inner_0" + OpMemberName %u_block_std140 1 "inner_1" + OpMemberName %u_block_std140 2 "inner_2" + OpName %u "u" + OpName %a "a" + OpName %m "m" + OpName %b "b" + OpName %v "v" + OpName %c "c" + OpName %f_1 "f_1" + OpName %load_u_inner "load_u_inner" + OpName %f "f" + OpDecorate %u_block_std140 Block + OpMemberDecorate %u_block_std140 0 Offset 0 + OpMemberDecorate %u_block_std140 1 Offset 8 + OpMemberDecorate %u_block_std140 2 Offset 16 + OpDecorate %u NonWritable + OpDecorate %u DescriptorSet 0 + OpDecorate %u Binding 0 + %float = OpTypeFloat 32 + %v2float = OpTypeVector %float 2 +%u_block_std140 = OpTypeStruct %v2float %v2float %v2float +%_ptr_Uniform_u_block_std140 = OpTypePointer Uniform %u_block_std140 + %u = OpVariable %_ptr_Uniform_u_block_std140 Uniform + %void = OpTypeVoid +%mat3v2float = OpTypeMatrix %v2float 3 + %6 = OpTypeFunction %void %mat3v2float + %12 = OpTypeFunction %void %v2float + %16 = OpTypeFunction %void %float + %20 = OpTypeFunction %mat3v2float + %uint = OpTypeInt 32 0 + %uint_0 = OpConstant %uint 0 +%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float + %uint_1 = OpConstant %uint 1 + %uint_2 = OpConstant %uint 2 + %39 = OpTypeFunction %void + %52 = OpConstantNull %uint +%_ptr_Uniform_float = OpTypePointer Uniform %float + %a = OpFunction %void None %6 + %m = OpFunctionParameter %mat3v2float + %11 = OpLabel + OpReturn + OpFunctionEnd + %b = OpFunction %void None %12 + %v = OpFunctionParameter %v2float + %15 = OpLabel + OpReturn + OpFunctionEnd + %c = OpFunction %void None %16 + %f_1 = OpFunctionParameter %float + %19 = OpLabel + OpReturn + OpFunctionEnd +%load_u_inner = OpFunction %mat3v2float None %20 + %22 = OpLabel + %28 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 + %29 = OpLoad %v2float %28 + %32 = OpAccessChain %_ptr_Uniform_v2float %u %uint_1 + %33 = OpLoad %v2float %32 + %36 = OpAccessChain %_ptr_Uniform_v2float %u %uint_2 + %37 = OpLoad %v2float %36 + %38 = OpCompositeConstruct %mat3v2float %29 %33 %37 + OpReturnValue %38 + OpFunctionEnd + %f = OpFunction %void None %39 + %41 = OpLabel + %43 = OpFunctionCall %mat3v2float %load_u_inner + %42 = OpFunctionCall %void %a %43 + %45 = OpAccessChain %_ptr_Uniform_v2float %u %uint_1 + %46 = OpLoad %v2float %45 + %44 = OpFunctionCall %void %b %46 + %48 = OpAccessChain %_ptr_Uniform_v2float %u %uint_1 + %49 = OpLoad %v2float %48 + %50 = OpVectorShuffle %v2float %49 %49 1 0 + %47 = OpFunctionCall %void %b %50 + %54 = OpAccessChain %_ptr_Uniform_float %u %uint_1 %52 + %55 = OpLoad %float %54 + %51 = OpFunctionCall %void %c %55 + %57 = OpAccessChain %_ptr_Uniform_v2float %u %uint_1 + %58 = OpLoad %v2float %57 + %59 = OpVectorShuffle %v2float %58 %58 1 0 + %60 = OpCompositeExtract %float %59 0 + %56 = OpFunctionCall %void %c %60 + OpReturn + OpFunctionEnd diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x2/to_fn.wgsl.expected.wgsl b/test/tint/buffer/uniform/std140/unnested/mat3x2/to_fn.wgsl.expected.wgsl new file mode 100644 index 0000000000..d5a7a12ad0 --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat3x2/to_fn.wgsl.expected.wgsl @@ -0,0 +1,19 @@ +@group(0) @binding(0) var u : mat3x2; + +fn a(m : mat3x2) { +} + +fn b(v : vec2) { +} + +fn c(f : f32) { +} + +@compute @workgroup_size(1) +fn f() { + a(u); + b(u[1]); + b(u[1].yx); + c(u[1].x); + c(u[1].yx.x); +} diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x2/to_private.wgsl b/test/tint/buffer/uniform/std140/unnested/mat3x2/to_private.wgsl new file mode 100644 index 0000000000..a8872a4aa2 --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat3x2/to_private.wgsl @@ -0,0 +1,10 @@ +@group(0) @binding(0) var u : mat3x2; +var p : mat3x2; + +@compute @workgroup_size(1) +fn f() { + p = u; + p[1] = u[0]; + p[1] = u[0].yx; + p[0][1] = u[1][0]; +} diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x2/to_private.wgsl.expected.dxc.hlsl b/test/tint/buffer/uniform/std140/unnested/mat3x2/to_private.wgsl.expected.dxc.hlsl new file mode 100644 index 0000000000..7915694beb --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat3x2/to_private.wgsl.expected.dxc.hlsl @@ -0,0 +1,23 @@ +cbuffer cbuffer_u : register(b0, space0) { + uint4 u[2]; +}; +static float3x2 p = float3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f); + +float3x2 tint_symbol(uint4 buffer[2], uint offset) { + const uint scalar_offset = ((offset + 0u)) / 4; + uint4 ubo_load = buffer[scalar_offset / 4]; + const uint scalar_offset_1 = ((offset + 8u)) / 4; + uint4 ubo_load_1 = buffer[scalar_offset_1 / 4]; + const uint scalar_offset_2 = ((offset + 16u)) / 4; + uint4 ubo_load_2 = buffer[scalar_offset_2 / 4]; + return float3x2(asfloat(((scalar_offset & 2) ? ubo_load.zw : ubo_load.xy)), asfloat(((scalar_offset_1 & 2) ? ubo_load_1.zw : ubo_load_1.xy)), asfloat(((scalar_offset_2 & 2) ? ubo_load_2.zw : ubo_load_2.xy))); +} + +[numthreads(1, 1, 1)] +void f() { + p = tint_symbol(u, 0u); + p[1] = asfloat(u[0].xy); + p[1] = asfloat(u[0].xy).yx; + p[0][1] = asfloat(u[0].z); + return; +} diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x2/to_private.wgsl.expected.fxc.hlsl b/test/tint/buffer/uniform/std140/unnested/mat3x2/to_private.wgsl.expected.fxc.hlsl new file mode 100644 index 0000000000..7915694beb --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat3x2/to_private.wgsl.expected.fxc.hlsl @@ -0,0 +1,23 @@ +cbuffer cbuffer_u : register(b0, space0) { + uint4 u[2]; +}; +static float3x2 p = float3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f); + +float3x2 tint_symbol(uint4 buffer[2], uint offset) { + const uint scalar_offset = ((offset + 0u)) / 4; + uint4 ubo_load = buffer[scalar_offset / 4]; + const uint scalar_offset_1 = ((offset + 8u)) / 4; + uint4 ubo_load_1 = buffer[scalar_offset_1 / 4]; + const uint scalar_offset_2 = ((offset + 16u)) / 4; + uint4 ubo_load_2 = buffer[scalar_offset_2 / 4]; + return float3x2(asfloat(((scalar_offset & 2) ? ubo_load.zw : ubo_load.xy)), asfloat(((scalar_offset_1 & 2) ? ubo_load_1.zw : ubo_load_1.xy)), asfloat(((scalar_offset_2 & 2) ? ubo_load_2.zw : ubo_load_2.xy))); +} + +[numthreads(1, 1, 1)] +void f() { + p = tint_symbol(u, 0u); + p[1] = asfloat(u[0].xy); + p[1] = asfloat(u[0].xy).yx; + p[0][1] = asfloat(u[0].z); + return; +} diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x2/to_private.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/unnested/mat3x2/to_private.wgsl.expected.glsl new file mode 100644 index 0000000000..053233edd0 --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat3x2/to_private.wgsl.expected.glsl @@ -0,0 +1,25 @@ +#version 310 es + +layout(binding = 0, std140) uniform u_block_std140_ubo { + vec2 inner_0; + vec2 inner_1; + vec2 inner_2; +} u; + +mat3x2 p = mat3x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f); +mat3x2 load_u_inner() { + return mat3x2(u.inner_0, u.inner_1, u.inner_2); +} + +void f() { + p = load_u_inner(); + p[1] = u.inner_0; + p[1] = u.inner_0.yx; + p[0][1] = u.inner_1[0u]; +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + f(); + return; +} diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x2/to_private.wgsl.expected.msl b/test/tint/buffer/uniform/std140/unnested/mat3x2/to_private.wgsl.expected.msl new file mode 100644 index 0000000000..c95e5b0e93 --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat3x2/to_private.wgsl.expected.msl @@ -0,0 +1,12 @@ +#include + +using namespace metal; +kernel void f(const constant float3x2* tint_symbol_1 [[buffer(0)]]) { + thread float3x2 tint_symbol = float3x2(0.0f); + tint_symbol = *(tint_symbol_1); + tint_symbol[1] = (*(tint_symbol_1))[0]; + tint_symbol[1] = float2((*(tint_symbol_1))[0]).yx; + tint_symbol[0][1] = (*(tint_symbol_1))[1][0]; + return; +} + diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x2/to_private.wgsl.expected.spvasm b/test/tint/buffer/uniform/std140/unnested/mat3x2/to_private.wgsl.expected.spvasm new file mode 100644 index 0000000000..577ef4fa58 --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat3x2/to_private.wgsl.expected.spvasm @@ -0,0 +1,78 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 51 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %f "f" + OpExecutionMode %f LocalSize 1 1 1 + OpName %u_block_std140 "u_block_std140" + OpMemberName %u_block_std140 0 "inner_0" + OpMemberName %u_block_std140 1 "inner_1" + OpMemberName %u_block_std140 2 "inner_2" + OpName %u "u" + OpName %p "p" + OpName %load_u_inner "load_u_inner" + OpName %f "f" + OpDecorate %u_block_std140 Block + OpMemberDecorate %u_block_std140 0 Offset 0 + OpMemberDecorate %u_block_std140 1 Offset 8 + OpMemberDecorate %u_block_std140 2 Offset 16 + OpDecorate %u NonWritable + OpDecorate %u DescriptorSet 0 + OpDecorate %u Binding 0 + %float = OpTypeFloat 32 + %v2float = OpTypeVector %float 2 +%u_block_std140 = OpTypeStruct %v2float %v2float %v2float +%_ptr_Uniform_u_block_std140 = OpTypePointer Uniform %u_block_std140 + %u = OpVariable %_ptr_Uniform_u_block_std140 Uniform +%mat3v2float = OpTypeMatrix %v2float 3 +%_ptr_Private_mat3v2float = OpTypePointer Private %mat3v2float + %9 = OpConstantNull %mat3v2float + %p = OpVariable %_ptr_Private_mat3v2float Private %9 + %10 = OpTypeFunction %mat3v2float + %uint = OpTypeInt 32 0 + %uint_0 = OpConstant %uint 0 +%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float + %uint_1 = OpConstant %uint 1 + %uint_2 = OpConstant %uint 2 + %void = OpTypeVoid + %29 = OpTypeFunction %void + %int = OpTypeInt 32 1 + %int_1 = OpConstant %int 1 +%_ptr_Private_v2float = OpTypePointer Private %v2float + %44 = OpConstantNull %int +%_ptr_Private_float = OpTypePointer Private %float + %47 = OpConstantNull %uint +%_ptr_Uniform_float = OpTypePointer Uniform %float +%load_u_inner = OpFunction %mat3v2float None %10 + %12 = OpLabel + %18 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 + %19 = OpLoad %v2float %18 + %22 = OpAccessChain %_ptr_Uniform_v2float %u %uint_1 + %23 = OpLoad %v2float %22 + %26 = OpAccessChain %_ptr_Uniform_v2float %u %uint_2 + %27 = OpLoad %v2float %26 + %28 = OpCompositeConstruct %mat3v2float %19 %23 %27 + OpReturnValue %28 + OpFunctionEnd + %f = OpFunction %void None %29 + %32 = OpLabel + %33 = OpFunctionCall %mat3v2float %load_u_inner + OpStore %p %33 + %37 = OpAccessChain %_ptr_Private_v2float %p %int_1 + %38 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 + %39 = OpLoad %v2float %38 + OpStore %37 %39 + %40 = OpAccessChain %_ptr_Private_v2float %p %int_1 + %41 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 + %42 = OpLoad %v2float %41 + %43 = OpVectorShuffle %v2float %42 %42 1 0 + OpStore %40 %43 + %46 = OpAccessChain %_ptr_Private_float %p %44 %int_1 + %49 = OpAccessChain %_ptr_Uniform_float %u %uint_1 %47 + %50 = OpLoad %float %49 + OpStore %46 %50 + OpReturn + OpFunctionEnd diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x2/to_private.wgsl.expected.wgsl b/test/tint/buffer/uniform/std140/unnested/mat3x2/to_private.wgsl.expected.wgsl new file mode 100644 index 0000000000..8b63b6f45b --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat3x2/to_private.wgsl.expected.wgsl @@ -0,0 +1,11 @@ +@group(0) @binding(0) var u : mat3x2; + +var p : mat3x2; + +@compute @workgroup_size(1) +fn f() { + p = u; + p[1] = u[0]; + p[1] = u[0].yx; + p[0][1] = u[1][0]; +} diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x2/to_storage.wgsl b/test/tint/buffer/uniform/std140/unnested/mat3x2/to_storage.wgsl new file mode 100644 index 0000000000..b36b87dd94 --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat3x2/to_storage.wgsl @@ -0,0 +1,10 @@ +@group(0) @binding(0) var u : mat3x2; +@group(0) @binding(1) var s : mat3x2; + +@compute @workgroup_size(1) +fn f() { + s = u; + s[1] = u[0]; + s[1] = u[0].yx; + s[0][1] = u[1][0]; +} diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x2/to_storage.wgsl.expected.dxc.hlsl b/test/tint/buffer/uniform/std140/unnested/mat3x2/to_storage.wgsl.expected.dxc.hlsl new file mode 100644 index 0000000000..f469a9513e --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat3x2/to_storage.wgsl.expected.dxc.hlsl @@ -0,0 +1,29 @@ +cbuffer cbuffer_u : register(b0, space0) { + uint4 u[2]; +}; +RWByteAddressBuffer s : register(u1, space0); + +void tint_symbol(RWByteAddressBuffer buffer, uint offset, float3x2 value) { + buffer.Store2((offset + 0u), asuint(value[0u])); + buffer.Store2((offset + 8u), asuint(value[1u])); + buffer.Store2((offset + 16u), asuint(value[2u])); +} + +float3x2 tint_symbol_2(uint4 buffer[2], uint offset) { + const uint scalar_offset = ((offset + 0u)) / 4; + uint4 ubo_load = buffer[scalar_offset / 4]; + const uint scalar_offset_1 = ((offset + 8u)) / 4; + uint4 ubo_load_1 = buffer[scalar_offset_1 / 4]; + const uint scalar_offset_2 = ((offset + 16u)) / 4; + uint4 ubo_load_2 = buffer[scalar_offset_2 / 4]; + return float3x2(asfloat(((scalar_offset & 2) ? ubo_load.zw : ubo_load.xy)), asfloat(((scalar_offset_1 & 2) ? ubo_load_1.zw : ubo_load_1.xy)), asfloat(((scalar_offset_2 & 2) ? ubo_load_2.zw : ubo_load_2.xy))); +} + +[numthreads(1, 1, 1)] +void f() { + tint_symbol(s, 0u, tint_symbol_2(u, 0u)); + s.Store2(8u, asuint(asfloat(u[0].xy))); + s.Store2(8u, asuint(asfloat(u[0].xy).yx)); + s.Store(4u, asuint(asfloat(u[0].z))); + return; +} diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x2/to_storage.wgsl.expected.fxc.hlsl b/test/tint/buffer/uniform/std140/unnested/mat3x2/to_storage.wgsl.expected.fxc.hlsl new file mode 100644 index 0000000000..f469a9513e --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat3x2/to_storage.wgsl.expected.fxc.hlsl @@ -0,0 +1,29 @@ +cbuffer cbuffer_u : register(b0, space0) { + uint4 u[2]; +}; +RWByteAddressBuffer s : register(u1, space0); + +void tint_symbol(RWByteAddressBuffer buffer, uint offset, float3x2 value) { + buffer.Store2((offset + 0u), asuint(value[0u])); + buffer.Store2((offset + 8u), asuint(value[1u])); + buffer.Store2((offset + 16u), asuint(value[2u])); +} + +float3x2 tint_symbol_2(uint4 buffer[2], uint offset) { + const uint scalar_offset = ((offset + 0u)) / 4; + uint4 ubo_load = buffer[scalar_offset / 4]; + const uint scalar_offset_1 = ((offset + 8u)) / 4; + uint4 ubo_load_1 = buffer[scalar_offset_1 / 4]; + const uint scalar_offset_2 = ((offset + 16u)) / 4; + uint4 ubo_load_2 = buffer[scalar_offset_2 / 4]; + return float3x2(asfloat(((scalar_offset & 2) ? ubo_load.zw : ubo_load.xy)), asfloat(((scalar_offset_1 & 2) ? ubo_load_1.zw : ubo_load_1.xy)), asfloat(((scalar_offset_2 & 2) ? ubo_load_2.zw : ubo_load_2.xy))); +} + +[numthreads(1, 1, 1)] +void f() { + tint_symbol(s, 0u, tint_symbol_2(u, 0u)); + s.Store2(8u, asuint(asfloat(u[0].xy))); + s.Store2(8u, asuint(asfloat(u[0].xy).yx)); + s.Store(4u, asuint(asfloat(u[0].z))); + return; +} diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x2/to_storage.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/unnested/mat3x2/to_storage.wgsl.expected.glsl new file mode 100644 index 0000000000..036b149cb7 --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat3x2/to_storage.wgsl.expected.glsl @@ -0,0 +1,28 @@ +#version 310 es + +layout(binding = 0, std140) uniform u_block_std140_ubo { + vec2 inner_0; + vec2 inner_1; + vec2 inner_2; +} u; + +layout(binding = 1, std430) buffer u_block_ssbo { + mat3x2 inner; +} s; + +mat3x2 load_u_inner() { + return mat3x2(u.inner_0, u.inner_1, u.inner_2); +} + +void f() { + s.inner = load_u_inner(); + s.inner[1] = u.inner_0; + s.inner[1] = u.inner_0.yx; + s.inner[0][1] = u.inner_1[0u]; +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + f(); + return; +} diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x2/to_storage.wgsl.expected.msl b/test/tint/buffer/uniform/std140/unnested/mat3x2/to_storage.wgsl.expected.msl new file mode 100644 index 0000000000..2d2774663d --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat3x2/to_storage.wgsl.expected.msl @@ -0,0 +1,11 @@ +#include + +using namespace metal; +kernel void f(device float3x2* tint_symbol [[buffer(1)]], const constant float3x2* tint_symbol_1 [[buffer(0)]]) { + *(tint_symbol) = *(tint_symbol_1); + (*(tint_symbol))[1] = (*(tint_symbol_1))[0]; + (*(tint_symbol))[1] = float2((*(tint_symbol_1))[0]).yx; + (*(tint_symbol))[0][1] = (*(tint_symbol_1))[1][0]; + return; +} + diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x2/to_storage.wgsl.expected.spvasm b/test/tint/buffer/uniform/std140/unnested/mat3x2/to_storage.wgsl.expected.spvasm new file mode 100644 index 0000000000..4c1c906204 --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat3x2/to_storage.wgsl.expected.spvasm @@ -0,0 +1,88 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 53 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %f "f" + OpExecutionMode %f LocalSize 1 1 1 + OpName %u_block_std140 "u_block_std140" + OpMemberName %u_block_std140 0 "inner_0" + OpMemberName %u_block_std140 1 "inner_1" + OpMemberName %u_block_std140 2 "inner_2" + OpName %u "u" + OpName %u_block "u_block" + OpMemberName %u_block 0 "inner" + OpName %s "s" + OpName %load_u_inner "load_u_inner" + OpName %f "f" + OpDecorate %u_block_std140 Block + OpMemberDecorate %u_block_std140 0 Offset 0 + OpMemberDecorate %u_block_std140 1 Offset 8 + OpMemberDecorate %u_block_std140 2 Offset 16 + OpDecorate %u NonWritable + OpDecorate %u DescriptorSet 0 + OpDecorate %u Binding 0 + OpDecorate %u_block Block + OpMemberDecorate %u_block 0 Offset 0 + OpMemberDecorate %u_block 0 ColMajor + OpMemberDecorate %u_block 0 MatrixStride 8 + OpDecorate %s DescriptorSet 0 + OpDecorate %s Binding 1 + %float = OpTypeFloat 32 + %v2float = OpTypeVector %float 2 +%u_block_std140 = OpTypeStruct %v2float %v2float %v2float +%_ptr_Uniform_u_block_std140 = OpTypePointer Uniform %u_block_std140 + %u = OpVariable %_ptr_Uniform_u_block_std140 Uniform +%mat3v2float = OpTypeMatrix %v2float 3 + %u_block = OpTypeStruct %mat3v2float +%_ptr_StorageBuffer_u_block = OpTypePointer StorageBuffer %u_block + %s = OpVariable %_ptr_StorageBuffer_u_block StorageBuffer + %10 = OpTypeFunction %mat3v2float + %uint = OpTypeInt 32 0 + %uint_0 = OpConstant %uint 0 +%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float + %uint_1 = OpConstant %uint 1 + %uint_2 = OpConstant %uint 2 + %void = OpTypeVoid + %29 = OpTypeFunction %void +%_ptr_StorageBuffer_mat3v2float = OpTypePointer StorageBuffer %mat3v2float + %int = OpTypeInt 32 1 + %int_1 = OpConstant %int 1 +%_ptr_StorageBuffer_v2float = OpTypePointer StorageBuffer %v2float + %46 = OpConstantNull %int +%_ptr_StorageBuffer_float = OpTypePointer StorageBuffer %float + %49 = OpConstantNull %uint +%_ptr_Uniform_float = OpTypePointer Uniform %float +%load_u_inner = OpFunction %mat3v2float None %10 + %12 = OpLabel + %18 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 + %19 = OpLoad %v2float %18 + %22 = OpAccessChain %_ptr_Uniform_v2float %u %uint_1 + %23 = OpLoad %v2float %22 + %26 = OpAccessChain %_ptr_Uniform_v2float %u %uint_2 + %27 = OpLoad %v2float %26 + %28 = OpCompositeConstruct %mat3v2float %19 %23 %27 + OpReturnValue %28 + OpFunctionEnd + %f = OpFunction %void None %29 + %32 = OpLabel + %34 = OpAccessChain %_ptr_StorageBuffer_mat3v2float %s %uint_0 + %35 = OpFunctionCall %mat3v2float %load_u_inner + OpStore %34 %35 + %39 = OpAccessChain %_ptr_StorageBuffer_v2float %s %uint_0 %int_1 + %40 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 + %41 = OpLoad %v2float %40 + OpStore %39 %41 + %42 = OpAccessChain %_ptr_StorageBuffer_v2float %s %uint_0 %int_1 + %43 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 + %44 = OpLoad %v2float %43 + %45 = OpVectorShuffle %v2float %44 %44 1 0 + OpStore %42 %45 + %48 = OpAccessChain %_ptr_StorageBuffer_float %s %uint_0 %46 %int_1 + %51 = OpAccessChain %_ptr_Uniform_float %u %uint_1 %49 + %52 = OpLoad %float %51 + OpStore %48 %52 + OpReturn + OpFunctionEnd diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x2/to_storage.wgsl.expected.wgsl b/test/tint/buffer/uniform/std140/unnested/mat3x2/to_storage.wgsl.expected.wgsl new file mode 100644 index 0000000000..82580727b1 --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat3x2/to_storage.wgsl.expected.wgsl @@ -0,0 +1,11 @@ +@group(0) @binding(0) var u : mat3x2; + +@group(0) @binding(1) var s : mat3x2; + +@compute @workgroup_size(1) +fn f() { + s = u; + s[1] = u[0]; + s[1] = u[0].yx; + s[0][1] = u[1][0]; +} diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x2/to_workgroup.wgsl b/test/tint/buffer/uniform/std140/unnested/mat3x2/to_workgroup.wgsl new file mode 100644 index 0000000000..53b2d3529c --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat3x2/to_workgroup.wgsl @@ -0,0 +1,10 @@ +@group(0) @binding(0) var u : mat3x2; +var w : mat3x2; + +@compute @workgroup_size(1) +fn f() { + w = u; + w[1] = u[0]; + w[1] = u[0].yx; + w[0][1] = u[1][0]; +} diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x2/to_workgroup.wgsl.expected.dxc.hlsl b/test/tint/buffer/uniform/std140/unnested/mat3x2/to_workgroup.wgsl.expected.dxc.hlsl new file mode 100644 index 0000000000..745a64668b --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat3x2/to_workgroup.wgsl.expected.dxc.hlsl @@ -0,0 +1,35 @@ +cbuffer cbuffer_u : register(b0, space0) { + uint4 u[2]; +}; +groupshared float3x2 w; + +struct tint_symbol_1 { + uint local_invocation_index : SV_GroupIndex; +}; + +float3x2 tint_symbol_2(uint4 buffer[2], uint offset) { + const uint scalar_offset = ((offset + 0u)) / 4; + uint4 ubo_load = buffer[scalar_offset / 4]; + const uint scalar_offset_1 = ((offset + 8u)) / 4; + uint4 ubo_load_1 = buffer[scalar_offset_1 / 4]; + const uint scalar_offset_2 = ((offset + 16u)) / 4; + uint4 ubo_load_2 = buffer[scalar_offset_2 / 4]; + return float3x2(asfloat(((scalar_offset & 2) ? ubo_load.zw : ubo_load.xy)), asfloat(((scalar_offset_1 & 2) ? ubo_load_1.zw : ubo_load_1.xy)), asfloat(((scalar_offset_2 & 2) ? ubo_load_2.zw : ubo_load_2.xy))); +} + +void f_inner(uint local_invocation_index) { + { + w = float3x2((0.0f).xx, (0.0f).xx, (0.0f).xx); + } + GroupMemoryBarrierWithGroupSync(); + w = tint_symbol_2(u, 0u); + w[1] = asfloat(u[0].xy); + w[1] = asfloat(u[0].xy).yx; + w[0][1] = asfloat(u[0].z); +} + +[numthreads(1, 1, 1)] +void f(tint_symbol_1 tint_symbol) { + f_inner(tint_symbol.local_invocation_index); + return; +} diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x2/to_workgroup.wgsl.expected.fxc.hlsl b/test/tint/buffer/uniform/std140/unnested/mat3x2/to_workgroup.wgsl.expected.fxc.hlsl new file mode 100644 index 0000000000..745a64668b --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat3x2/to_workgroup.wgsl.expected.fxc.hlsl @@ -0,0 +1,35 @@ +cbuffer cbuffer_u : register(b0, space0) { + uint4 u[2]; +}; +groupshared float3x2 w; + +struct tint_symbol_1 { + uint local_invocation_index : SV_GroupIndex; +}; + +float3x2 tint_symbol_2(uint4 buffer[2], uint offset) { + const uint scalar_offset = ((offset + 0u)) / 4; + uint4 ubo_load = buffer[scalar_offset / 4]; + const uint scalar_offset_1 = ((offset + 8u)) / 4; + uint4 ubo_load_1 = buffer[scalar_offset_1 / 4]; + const uint scalar_offset_2 = ((offset + 16u)) / 4; + uint4 ubo_load_2 = buffer[scalar_offset_2 / 4]; + return float3x2(asfloat(((scalar_offset & 2) ? ubo_load.zw : ubo_load.xy)), asfloat(((scalar_offset_1 & 2) ? ubo_load_1.zw : ubo_load_1.xy)), asfloat(((scalar_offset_2 & 2) ? ubo_load_2.zw : ubo_load_2.xy))); +} + +void f_inner(uint local_invocation_index) { + { + w = float3x2((0.0f).xx, (0.0f).xx, (0.0f).xx); + } + GroupMemoryBarrierWithGroupSync(); + w = tint_symbol_2(u, 0u); + w[1] = asfloat(u[0].xy); + w[1] = asfloat(u[0].xy).yx; + w[0][1] = asfloat(u[0].z); +} + +[numthreads(1, 1, 1)] +void f(tint_symbol_1 tint_symbol) { + f_inner(tint_symbol.local_invocation_index); + return; +} diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x2/to_workgroup.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/unnested/mat3x2/to_workgroup.wgsl.expected.glsl new file mode 100644 index 0000000000..58b141046d --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat3x2/to_workgroup.wgsl.expected.glsl @@ -0,0 +1,29 @@ +#version 310 es + +layout(binding = 0, std140) uniform u_block_std140_ubo { + vec2 inner_0; + vec2 inner_1; + vec2 inner_2; +} u; + +shared mat3x2 w; +mat3x2 load_u_inner() { + return mat3x2(u.inner_0, u.inner_1, u.inner_2); +} + +void f(uint local_invocation_index) { + { + w = mat3x2(vec2(0.0f), vec2(0.0f), vec2(0.0f)); + } + barrier(); + w = load_u_inner(); + w[1] = u.inner_0; + w[1] = u.inner_0.yx; + w[0][1] = u.inner_1[0u]; +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + f(gl_LocalInvocationIndex); + return; +} diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x2/to_workgroup.wgsl.expected.msl b/test/tint/buffer/uniform/std140/unnested/mat3x2/to_workgroup.wgsl.expected.msl new file mode 100644 index 0000000000..59f976e36f --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat3x2/to_workgroup.wgsl.expected.msl @@ -0,0 +1,24 @@ +#include + +using namespace metal; +struct tint_symbol_5 { + float3x2 w; +}; + +void f_inner(uint local_invocation_index, threadgroup float3x2* const tint_symbol, const constant float3x2* const tint_symbol_1) { + { + *(tint_symbol) = float3x2(float2(0.0f), float2(0.0f), float2(0.0f)); + } + threadgroup_barrier(mem_flags::mem_threadgroup); + *(tint_symbol) = *(tint_symbol_1); + (*(tint_symbol))[1] = (*(tint_symbol_1))[0]; + (*(tint_symbol))[1] = float2((*(tint_symbol_1))[0]).yx; + (*(tint_symbol))[0][1] = (*(tint_symbol_1))[1][0]; +} + +kernel void f(const constant float3x2* tint_symbol_4 [[buffer(0)]], threadgroup tint_symbol_5* tint_symbol_3 [[threadgroup(0)]], uint local_invocation_index [[thread_index_in_threadgroup]]) { + threadgroup float3x2* const tint_symbol_2 = &((*(tint_symbol_3)).w); + f_inner(local_invocation_index, tint_symbol_2, tint_symbol_4); + return; +} + diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x2/to_workgroup.wgsl.expected.spvasm b/test/tint/buffer/uniform/std140/unnested/mat3x2/to_workgroup.wgsl.expected.spvasm new file mode 100644 index 0000000000..998e868677 --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat3x2/to_workgroup.wgsl.expected.spvasm @@ -0,0 +1,95 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 61 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %f "f" %local_invocation_index_1 + OpExecutionMode %f LocalSize 1 1 1 + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %u_block_std140 "u_block_std140" + OpMemberName %u_block_std140 0 "inner_0" + OpMemberName %u_block_std140 1 "inner_1" + OpMemberName %u_block_std140 2 "inner_2" + OpName %u "u" + OpName %w "w" + OpName %load_u_inner "load_u_inner" + OpName %f_inner "f_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %f "f" + OpDecorate %local_invocation_index_1 BuiltIn LocalInvocationIndex + OpDecorate %u_block_std140 Block + OpMemberDecorate %u_block_std140 0 Offset 0 + OpMemberDecorate %u_block_std140 1 Offset 8 + OpMemberDecorate %u_block_std140 2 Offset 16 + OpDecorate %u NonWritable + OpDecorate %u DescriptorSet 0 + OpDecorate %u Binding 0 + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1 = OpVariable %_ptr_Input_uint Input + %float = OpTypeFloat 32 + %v2float = OpTypeVector %float 2 +%u_block_std140 = OpTypeStruct %v2float %v2float %v2float +%_ptr_Uniform_u_block_std140 = OpTypePointer Uniform %u_block_std140 + %u = OpVariable %_ptr_Uniform_u_block_std140 Uniform +%mat3v2float = OpTypeMatrix %v2float 3 +%_ptr_Workgroup_mat3v2float = OpTypePointer Workgroup %mat3v2float + %w = OpVariable %_ptr_Workgroup_mat3v2float Workgroup + %12 = OpTypeFunction %mat3v2float + %uint_0 = OpConstant %uint 0 +%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float + %uint_1 = OpConstant %uint 1 + %uint_2 = OpConstant %uint 2 + %void = OpTypeVoid + %30 = OpTypeFunction %void %uint + %35 = OpConstantNull %mat3v2float + %uint_264 = OpConstant %uint 264 + %int = OpTypeInt 32 1 + %int_1 = OpConstant %int 1 +%_ptr_Workgroup_v2float = OpTypePointer Workgroup %v2float + %49 = OpConstantNull %int +%_ptr_Workgroup_float = OpTypePointer Workgroup %float + %52 = OpConstantNull %uint +%_ptr_Uniform_float = OpTypePointer Uniform %float + %56 = OpTypeFunction %void +%load_u_inner = OpFunction %mat3v2float None %12 + %14 = OpLabel + %19 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 + %20 = OpLoad %v2float %19 + %23 = OpAccessChain %_ptr_Uniform_v2float %u %uint_1 + %24 = OpLoad %v2float %23 + %27 = OpAccessChain %_ptr_Uniform_v2float %u %uint_2 + %28 = OpLoad %v2float %27 + %29 = OpCompositeConstruct %mat3v2float %20 %24 %28 + OpReturnValue %29 + OpFunctionEnd + %f_inner = OpFunction %void None %30 +%local_invocation_index = OpFunctionParameter %uint + %34 = OpLabel + OpStore %w %35 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %38 = OpFunctionCall %mat3v2float %load_u_inner + OpStore %w %38 + %42 = OpAccessChain %_ptr_Workgroup_v2float %w %int_1 + %43 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 + %44 = OpLoad %v2float %43 + OpStore %42 %44 + %45 = OpAccessChain %_ptr_Workgroup_v2float %w %int_1 + %46 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 + %47 = OpLoad %v2float %46 + %48 = OpVectorShuffle %v2float %47 %47 1 0 + OpStore %45 %48 + %51 = OpAccessChain %_ptr_Workgroup_float %w %49 %int_1 + %54 = OpAccessChain %_ptr_Uniform_float %u %uint_1 %52 + %55 = OpLoad %float %54 + OpStore %51 %55 + OpReturn + OpFunctionEnd + %f = OpFunction %void None %56 + %58 = OpLabel + %60 = OpLoad %uint %local_invocation_index_1 + %59 = OpFunctionCall %void %f_inner %60 + OpReturn + OpFunctionEnd diff --git a/test/tint/buffer/uniform/std140/unnested/mat3x2/to_workgroup.wgsl.expected.wgsl b/test/tint/buffer/uniform/std140/unnested/mat3x2/to_workgroup.wgsl.expected.wgsl new file mode 100644 index 0000000000..ef00924b53 --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat3x2/to_workgroup.wgsl.expected.wgsl @@ -0,0 +1,11 @@ +@group(0) @binding(0) var u : mat3x2; + +var w : mat3x2; + +@compute @workgroup_size(1) +fn f() { + w = u; + w[1] = u[0]; + w[1] = u[0].yx; + w[0][1] = u[1][0]; +} diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x2/dynamic_index_via_ptr.wgsl b/test/tint/buffer/uniform/std140/unnested/mat4x2/dynamic_index_via_ptr.wgsl new file mode 100644 index 0000000000..cddfe9ee3e --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat4x2/dynamic_index_via_ptr.wgsl @@ -0,0 +1,13 @@ +@group(0) @binding(0) var m : mat4x2; + +var counter = 0; +fn i() -> i32 { counter++; return counter; } + +@compute @workgroup_size(1) +fn f() { + let p_m = &m; + let p_m_i = &((*p_m)[i()]); + + let l_m : mat4x2 = *p_m; + let l_m_i : vec2 = *p_m_i; +} diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x2/dynamic_index_via_ptr.wgsl.expected.dxc.hlsl b/test/tint/buffer/uniform/std140/unnested/mat4x2/dynamic_index_via_ptr.wgsl.expected.dxc.hlsl new file mode 100644 index 0000000000..1f128d519f --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat4x2/dynamic_index_via_ptr.wgsl.expected.dxc.hlsl @@ -0,0 +1,31 @@ +cbuffer cbuffer_m : register(b0, space0) { + uint4 m[2]; +}; +static int counter = 0; + +int i() { + counter = (counter + 1); + return counter; +} + +float4x2 tint_symbol(uint4 buffer[2], uint offset) { + const uint scalar_offset = ((offset + 0u)) / 4; + uint4 ubo_load = buffer[scalar_offset / 4]; + const uint scalar_offset_1 = ((offset + 8u)) / 4; + uint4 ubo_load_1 = buffer[scalar_offset_1 / 4]; + const uint scalar_offset_2 = ((offset + 16u)) / 4; + uint4 ubo_load_2 = buffer[scalar_offset_2 / 4]; + const uint scalar_offset_3 = ((offset + 24u)) / 4; + uint4 ubo_load_3 = buffer[scalar_offset_3 / 4]; + return float4x2(asfloat(((scalar_offset & 2) ? ubo_load.zw : ubo_load.xy)), asfloat(((scalar_offset_1 & 2) ? ubo_load_1.zw : ubo_load_1.xy)), asfloat(((scalar_offset_2 & 2) ? ubo_load_2.zw : ubo_load_2.xy)), asfloat(((scalar_offset_3 & 2) ? ubo_load_3.zw : ubo_load_3.xy))); +} + +[numthreads(1, 1, 1)] +void f() { + const int p_m_i_save = i(); + const float4x2 l_m = tint_symbol(m, 0u); + const uint scalar_offset_4 = ((8u * uint(p_m_i_save))) / 4; + uint4 ubo_load_4 = m[scalar_offset_4 / 4]; + const float2 l_m_i = asfloat(((scalar_offset_4 & 2) ? ubo_load_4.zw : ubo_load_4.xy)); + return; +} diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x2/dynamic_index_via_ptr.wgsl.expected.fxc.hlsl b/test/tint/buffer/uniform/std140/unnested/mat4x2/dynamic_index_via_ptr.wgsl.expected.fxc.hlsl new file mode 100644 index 0000000000..1f128d519f --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat4x2/dynamic_index_via_ptr.wgsl.expected.fxc.hlsl @@ -0,0 +1,31 @@ +cbuffer cbuffer_m : register(b0, space0) { + uint4 m[2]; +}; +static int counter = 0; + +int i() { + counter = (counter + 1); + return counter; +} + +float4x2 tint_symbol(uint4 buffer[2], uint offset) { + const uint scalar_offset = ((offset + 0u)) / 4; + uint4 ubo_load = buffer[scalar_offset / 4]; + const uint scalar_offset_1 = ((offset + 8u)) / 4; + uint4 ubo_load_1 = buffer[scalar_offset_1 / 4]; + const uint scalar_offset_2 = ((offset + 16u)) / 4; + uint4 ubo_load_2 = buffer[scalar_offset_2 / 4]; + const uint scalar_offset_3 = ((offset + 24u)) / 4; + uint4 ubo_load_3 = buffer[scalar_offset_3 / 4]; + return float4x2(asfloat(((scalar_offset & 2) ? ubo_load.zw : ubo_load.xy)), asfloat(((scalar_offset_1 & 2) ? ubo_load_1.zw : ubo_load_1.xy)), asfloat(((scalar_offset_2 & 2) ? ubo_load_2.zw : ubo_load_2.xy)), asfloat(((scalar_offset_3 & 2) ? ubo_load_3.zw : ubo_load_3.xy))); +} + +[numthreads(1, 1, 1)] +void f() { + const int p_m_i_save = i(); + const float4x2 l_m = tint_symbol(m, 0u); + const uint scalar_offset_4 = ((8u * uint(p_m_i_save))) / 4; + uint4 ubo_load_4 = m[scalar_offset_4 / 4]; + const float2 l_m_i = asfloat(((scalar_offset_4 & 2) ? ubo_load_4.zw : ubo_load_4.xy)); + return; +} diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x2/dynamic_index_via_ptr.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/unnested/mat4x2/dynamic_index_via_ptr.wgsl.expected.glsl new file mode 100644 index 0000000000..3d6190b338 --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat4x2/dynamic_index_via_ptr.wgsl.expected.glsl @@ -0,0 +1,57 @@ +#version 310 es + +layout(binding = 0, std140) uniform m_block_std140_ubo { + vec2 inner_0; + vec2 inner_1; + vec2 inner_2; + vec2 inner_3; +} m; + +int counter = 0; +int i() { + counter = (counter + 1); + return counter; +} + +mat4x2 load_m_inner() { + return mat4x2(m.inner_0, m.inner_1, m.inner_2, m.inner_3); +} + +vec2 load_m_inner_p0(uint p0) { + switch(p0) { + case 0u: { + return m.inner_0; + break; + } + case 1u: { + return m.inner_1; + break; + } + case 2u: { + return m.inner_2; + break; + } + case 3u: { + return m.inner_3; + break; + } + default: { + return vec2(0.0f); + break; + } + } +} + +void f() { + mat4x2 p_m = load_m_inner(); + int tint_symbol = i(); + vec2 p_m_i = load_m_inner_p0(uint(tint_symbol)); + mat4x2 l_m = load_m_inner(); + vec2 l_m_i = load_m_inner_p0(uint(tint_symbol)); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + f(); + return; +} diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x2/dynamic_index_via_ptr.wgsl.expected.msl b/test/tint/buffer/uniform/std140/unnested/mat4x2/dynamic_index_via_ptr.wgsl.expected.msl new file mode 100644 index 0000000000..ba9e110fcc --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat4x2/dynamic_index_via_ptr.wgsl.expected.msl @@ -0,0 +1,17 @@ +#include + +using namespace metal; +int i() { + thread int tint_symbol_1 = 0; + tint_symbol_1 = as_type((as_type(tint_symbol_1) + as_type(1))); + return tint_symbol_1; +} + +kernel void f(const constant float4x2* tint_symbol_2 [[buffer(0)]]) { + int const tint_symbol = i(); + int const p_m_i_save = tint_symbol; + float4x2 const l_m = *(tint_symbol_2); + float2 const l_m_i = (*(tint_symbol_2))[p_m_i_save]; + return; +} + diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x2/dynamic_index_via_ptr.wgsl.expected.spvasm b/test/tint/buffer/uniform/std140/unnested/mat4x2/dynamic_index_via_ptr.wgsl.expected.spvasm new file mode 100644 index 0000000000..3be1b15f1b --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat4x2/dynamic_index_via_ptr.wgsl.expected.spvasm @@ -0,0 +1,107 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 68 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %f "f" + OpExecutionMode %f LocalSize 1 1 1 + OpName %m_block_std140 "m_block_std140" + OpMemberName %m_block_std140 0 "inner_0" + OpMemberName %m_block_std140 1 "inner_1" + OpMemberName %m_block_std140 2 "inner_2" + OpMemberName %m_block_std140 3 "inner_3" + OpName %m "m" + OpName %counter "counter" + OpName %i "i" + OpName %load_m_inner "load_m_inner" + OpName %load_m_inner_p0 "load_m_inner_p0" + OpName %p0 "p0" + OpName %f "f" + OpDecorate %m_block_std140 Block + OpMemberDecorate %m_block_std140 0 Offset 0 + OpMemberDecorate %m_block_std140 1 Offset 8 + OpMemberDecorate %m_block_std140 2 Offset 16 + OpMemberDecorate %m_block_std140 3 Offset 24 + OpDecorate %m NonWritable + OpDecorate %m DescriptorSet 0 + OpDecorate %m Binding 0 + %float = OpTypeFloat 32 + %v2float = OpTypeVector %float 2 +%m_block_std140 = OpTypeStruct %v2float %v2float %v2float %v2float +%_ptr_Uniform_m_block_std140 = OpTypePointer Uniform %m_block_std140 + %m = OpVariable %_ptr_Uniform_m_block_std140 Uniform + %int = OpTypeInt 32 1 + %7 = OpConstantNull %int +%_ptr_Private_int = OpTypePointer Private %int + %counter = OpVariable %_ptr_Private_int Private %7 + %10 = OpTypeFunction %int + %int_1 = OpConstant %int 1 +%mat4v2float = OpTypeMatrix %v2float 4 + %17 = OpTypeFunction %mat4v2float + %uint = OpTypeInt 32 0 + %uint_0 = OpConstant %uint 0 +%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float + %uint_1 = OpConstant %uint 1 + %uint_2 = OpConstant %uint 2 + %uint_3 = OpConstant %uint 3 + %41 = OpTypeFunction %v2float %uint + %59 = OpConstantNull %v2float + %void = OpTypeVoid + %60 = OpTypeFunction %void + %i = OpFunction %int None %10 + %12 = OpLabel + %13 = OpLoad %int %counter + %15 = OpIAdd %int %13 %int_1 + OpStore %counter %15 + %16 = OpLoad %int %counter + OpReturnValue %16 + OpFunctionEnd +%load_m_inner = OpFunction %mat4v2float None %17 + %20 = OpLabel + %26 = OpAccessChain %_ptr_Uniform_v2float %m %uint_0 + %27 = OpLoad %v2float %26 + %30 = OpAccessChain %_ptr_Uniform_v2float %m %uint_1 + %31 = OpLoad %v2float %30 + %34 = OpAccessChain %_ptr_Uniform_v2float %m %uint_2 + %35 = OpLoad %v2float %34 + %38 = OpAccessChain %_ptr_Uniform_v2float %m %uint_3 + %39 = OpLoad %v2float %38 + %40 = OpCompositeConstruct %mat4v2float %27 %31 %35 %39 + OpReturnValue %40 + OpFunctionEnd +%load_m_inner_p0 = OpFunction %v2float None %41 + %p0 = OpFunctionParameter %uint + %44 = OpLabel + OpSelectionMerge %45 None + OpSwitch %p0 %46 0 %47 1 %48 2 %49 3 %50 + %47 = OpLabel + %51 = OpAccessChain %_ptr_Uniform_v2float %m %uint_0 + %52 = OpLoad %v2float %51 + OpReturnValue %52 + %48 = OpLabel + %53 = OpAccessChain %_ptr_Uniform_v2float %m %uint_1 + %54 = OpLoad %v2float %53 + OpReturnValue %54 + %49 = OpLabel + %55 = OpAccessChain %_ptr_Uniform_v2float %m %uint_2 + %56 = OpLoad %v2float %55 + OpReturnValue %56 + %50 = OpLabel + %57 = OpAccessChain %_ptr_Uniform_v2float %m %uint_3 + %58 = OpLoad %v2float %57 + OpReturnValue %58 + %46 = OpLabel + OpReturnValue %59 + %45 = OpLabel + OpReturnValue %59 + OpFunctionEnd + %f = OpFunction %void None %60 + %63 = OpLabel + %64 = OpFunctionCall %int %i + %65 = OpFunctionCall %mat4v2float %load_m_inner + %67 = OpBitcast %uint %64 + %66 = OpFunctionCall %v2float %load_m_inner_p0 %67 + OpReturn + OpFunctionEnd diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x2/dynamic_index_via_ptr.wgsl.expected.wgsl b/test/tint/buffer/uniform/std140/unnested/mat4x2/dynamic_index_via_ptr.wgsl.expected.wgsl new file mode 100644 index 0000000000..bab27ebc05 --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat4x2/dynamic_index_via_ptr.wgsl.expected.wgsl @@ -0,0 +1,16 @@ +@group(0) @binding(0) var m : mat4x2; + +var counter = 0; + +fn i() -> i32 { + counter++; + return counter; +} + +@compute @workgroup_size(1) +fn f() { + let p_m = &(m); + let p_m_i = &((*(p_m))[i()]); + let l_m : mat4x2 = *(p_m); + let l_m_i : vec2 = *(p_m_i); +} diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x2/static_index_via_ptr.wgsl b/test/tint/buffer/uniform/std140/unnested/mat4x2/static_index_via_ptr.wgsl new file mode 100644 index 0000000000..24aa2ead82 --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat4x2/static_index_via_ptr.wgsl @@ -0,0 +1,13 @@ +@group(0) @binding(0) var m : mat4x2; + +var counter = 0; +fn i() -> i32 { counter++; return counter; } + +@compute @workgroup_size(1) +fn f() { + let p_m = &m; + let p_m_1 = &((*p_m)[1]); + + let l_m : mat4x2 = *p_m; + let l_m_1 : vec2 = *p_m_1; +} diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x2/static_index_via_ptr.wgsl.expected.dxc.hlsl b/test/tint/buffer/uniform/std140/unnested/mat4x2/static_index_via_ptr.wgsl.expected.dxc.hlsl new file mode 100644 index 0000000000..db46be59fc --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat4x2/static_index_via_ptr.wgsl.expected.dxc.hlsl @@ -0,0 +1,28 @@ +cbuffer cbuffer_m : register(b0, space0) { + uint4 m[2]; +}; +static int counter = 0; + +int i() { + counter = (counter + 1); + return counter; +} + +float4x2 tint_symbol(uint4 buffer[2], uint offset) { + const uint scalar_offset = ((offset + 0u)) / 4; + uint4 ubo_load = buffer[scalar_offset / 4]; + const uint scalar_offset_1 = ((offset + 8u)) / 4; + uint4 ubo_load_1 = buffer[scalar_offset_1 / 4]; + const uint scalar_offset_2 = ((offset + 16u)) / 4; + uint4 ubo_load_2 = buffer[scalar_offset_2 / 4]; + const uint scalar_offset_3 = ((offset + 24u)) / 4; + uint4 ubo_load_3 = buffer[scalar_offset_3 / 4]; + return float4x2(asfloat(((scalar_offset & 2) ? ubo_load.zw : ubo_load.xy)), asfloat(((scalar_offset_1 & 2) ? ubo_load_1.zw : ubo_load_1.xy)), asfloat(((scalar_offset_2 & 2) ? ubo_load_2.zw : ubo_load_2.xy)), asfloat(((scalar_offset_3 & 2) ? ubo_load_3.zw : ubo_load_3.xy))); +} + +[numthreads(1, 1, 1)] +void f() { + const float4x2 l_m = tint_symbol(m, 0u); + const float2 l_m_1 = asfloat(m[0].zw); + return; +} diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x2/static_index_via_ptr.wgsl.expected.fxc.hlsl b/test/tint/buffer/uniform/std140/unnested/mat4x2/static_index_via_ptr.wgsl.expected.fxc.hlsl new file mode 100644 index 0000000000..db46be59fc --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat4x2/static_index_via_ptr.wgsl.expected.fxc.hlsl @@ -0,0 +1,28 @@ +cbuffer cbuffer_m : register(b0, space0) { + uint4 m[2]; +}; +static int counter = 0; + +int i() { + counter = (counter + 1); + return counter; +} + +float4x2 tint_symbol(uint4 buffer[2], uint offset) { + const uint scalar_offset = ((offset + 0u)) / 4; + uint4 ubo_load = buffer[scalar_offset / 4]; + const uint scalar_offset_1 = ((offset + 8u)) / 4; + uint4 ubo_load_1 = buffer[scalar_offset_1 / 4]; + const uint scalar_offset_2 = ((offset + 16u)) / 4; + uint4 ubo_load_2 = buffer[scalar_offset_2 / 4]; + const uint scalar_offset_3 = ((offset + 24u)) / 4; + uint4 ubo_load_3 = buffer[scalar_offset_3 / 4]; + return float4x2(asfloat(((scalar_offset & 2) ? ubo_load.zw : ubo_load.xy)), asfloat(((scalar_offset_1 & 2) ? ubo_load_1.zw : ubo_load_1.xy)), asfloat(((scalar_offset_2 & 2) ? ubo_load_2.zw : ubo_load_2.xy)), asfloat(((scalar_offset_3 & 2) ? ubo_load_3.zw : ubo_load_3.xy))); +} + +[numthreads(1, 1, 1)] +void f() { + const float4x2 l_m = tint_symbol(m, 0u); + const float2 l_m_1 = asfloat(m[0].zw); + return; +} diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x2/static_index_via_ptr.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/unnested/mat4x2/static_index_via_ptr.wgsl.expected.glsl new file mode 100644 index 0000000000..4b55c69aa3 --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat4x2/static_index_via_ptr.wgsl.expected.glsl @@ -0,0 +1,25 @@ +#version 310 es + +layout(binding = 0, std140) uniform m_block_std140_ubo { + vec2 inner_0; + vec2 inner_1; + vec2 inner_2; + vec2 inner_3; +} m; + +mat4x2 load_m_inner() { + return mat4x2(m.inner_0, m.inner_1, m.inner_2, m.inner_3); +} + +void f() { + mat4x2 p_m = load_m_inner(); + vec2 p_m_1 = m.inner_1; + mat4x2 l_m = load_m_inner(); + vec2 l_m_1 = m.inner_1; +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + f(); + return; +} diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x2/static_index_via_ptr.wgsl.expected.msl b/test/tint/buffer/uniform/std140/unnested/mat4x2/static_index_via_ptr.wgsl.expected.msl new file mode 100644 index 0000000000..7bc891941d --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat4x2/static_index_via_ptr.wgsl.expected.msl @@ -0,0 +1,15 @@ +#include + +using namespace metal; +int i() { + thread int tint_symbol = 0; + tint_symbol = as_type((as_type(tint_symbol) + as_type(1))); + return tint_symbol; +} + +kernel void f(const constant float4x2* tint_symbol_1 [[buffer(0)]]) { + float4x2 const l_m = *(tint_symbol_1); + float2 const l_m_1 = (*(tint_symbol_1))[1]; + return; +} + diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x2/static_index_via_ptr.wgsl.expected.spvasm b/test/tint/buffer/uniform/std140/unnested/mat4x2/static_index_via_ptr.wgsl.expected.spvasm new file mode 100644 index 0000000000..7b65bbb55e --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat4x2/static_index_via_ptr.wgsl.expected.spvasm @@ -0,0 +1,76 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 48 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %f "f" + OpExecutionMode %f LocalSize 1 1 1 + OpName %m_block_std140 "m_block_std140" + OpMemberName %m_block_std140 0 "inner_0" + OpMemberName %m_block_std140 1 "inner_1" + OpMemberName %m_block_std140 2 "inner_2" + OpMemberName %m_block_std140 3 "inner_3" + OpName %m "m" + OpName %counter "counter" + OpName %i "i" + OpName %load_m_inner "load_m_inner" + OpName %f "f" + OpDecorate %m_block_std140 Block + OpMemberDecorate %m_block_std140 0 Offset 0 + OpMemberDecorate %m_block_std140 1 Offset 8 + OpMemberDecorate %m_block_std140 2 Offset 16 + OpMemberDecorate %m_block_std140 3 Offset 24 + OpDecorate %m NonWritable + OpDecorate %m DescriptorSet 0 + OpDecorate %m Binding 0 + %float = OpTypeFloat 32 + %v2float = OpTypeVector %float 2 +%m_block_std140 = OpTypeStruct %v2float %v2float %v2float %v2float +%_ptr_Uniform_m_block_std140 = OpTypePointer Uniform %m_block_std140 + %m = OpVariable %_ptr_Uniform_m_block_std140 Uniform + %int = OpTypeInt 32 1 + %7 = OpConstantNull %int +%_ptr_Private_int = OpTypePointer Private %int + %counter = OpVariable %_ptr_Private_int Private %7 + %10 = OpTypeFunction %int + %int_1 = OpConstant %int 1 +%mat4v2float = OpTypeMatrix %v2float 4 + %17 = OpTypeFunction %mat4v2float + %uint = OpTypeInt 32 0 + %uint_0 = OpConstant %uint 0 +%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float + %uint_1 = OpConstant %uint 1 + %uint_2 = OpConstant %uint 2 + %uint_3 = OpConstant %uint 3 + %void = OpTypeVoid + %41 = OpTypeFunction %void + %i = OpFunction %int None %10 + %12 = OpLabel + %13 = OpLoad %int %counter + %15 = OpIAdd %int %13 %int_1 + OpStore %counter %15 + %16 = OpLoad %int %counter + OpReturnValue %16 + OpFunctionEnd +%load_m_inner = OpFunction %mat4v2float None %17 + %20 = OpLabel + %26 = OpAccessChain %_ptr_Uniform_v2float %m %uint_0 + %27 = OpLoad %v2float %26 + %30 = OpAccessChain %_ptr_Uniform_v2float %m %uint_1 + %31 = OpLoad %v2float %30 + %34 = OpAccessChain %_ptr_Uniform_v2float %m %uint_2 + %35 = OpLoad %v2float %34 + %38 = OpAccessChain %_ptr_Uniform_v2float %m %uint_3 + %39 = OpLoad %v2float %38 + %40 = OpCompositeConstruct %mat4v2float %27 %31 %35 %39 + OpReturnValue %40 + OpFunctionEnd + %f = OpFunction %void None %41 + %44 = OpLabel + %45 = OpFunctionCall %mat4v2float %load_m_inner + %46 = OpAccessChain %_ptr_Uniform_v2float %m %uint_1 + %47 = OpLoad %v2float %46 + OpReturn + OpFunctionEnd diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x2/static_index_via_ptr.wgsl.expected.wgsl b/test/tint/buffer/uniform/std140/unnested/mat4x2/static_index_via_ptr.wgsl.expected.wgsl new file mode 100644 index 0000000000..862956fbdf --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat4x2/static_index_via_ptr.wgsl.expected.wgsl @@ -0,0 +1,16 @@ +@group(0) @binding(0) var m : mat4x2; + +var counter = 0; + +fn i() -> i32 { + counter++; + return counter; +} + +@compute @workgroup_size(1) +fn f() { + let p_m = &(m); + let p_m_1 = &((*(p_m))[1]); + let l_m : mat4x2 = *(p_m); + let l_m_1 : vec2 = *(p_m_1); +} diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x2/to_builtin.wgsl b/test/tint/buffer/uniform/std140/unnested/mat4x2/to_builtin.wgsl new file mode 100644 index 0000000000..4f0d8fc2bf --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat4x2/to_builtin.wgsl @@ -0,0 +1,8 @@ +@group(0) @binding(0) var u : mat4x2; + +@compute @workgroup_size(1) +fn f() { + let t = transpose(u); + let l = length(u[1]); + let a = abs(u[0].yx.x); +} diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x2/to_builtin.wgsl.expected.dxc.hlsl b/test/tint/buffer/uniform/std140/unnested/mat4x2/to_builtin.wgsl.expected.dxc.hlsl new file mode 100644 index 0000000000..051e0934b1 --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat4x2/to_builtin.wgsl.expected.dxc.hlsl @@ -0,0 +1,23 @@ +cbuffer cbuffer_u : register(b0, space0) { + uint4 u[2]; +}; + +float4x2 tint_symbol(uint4 buffer[2], uint offset) { + const uint scalar_offset = ((offset + 0u)) / 4; + uint4 ubo_load = buffer[scalar_offset / 4]; + const uint scalar_offset_1 = ((offset + 8u)) / 4; + uint4 ubo_load_1 = buffer[scalar_offset_1 / 4]; + const uint scalar_offset_2 = ((offset + 16u)) / 4; + uint4 ubo_load_2 = buffer[scalar_offset_2 / 4]; + const uint scalar_offset_3 = ((offset + 24u)) / 4; + uint4 ubo_load_3 = buffer[scalar_offset_3 / 4]; + return float4x2(asfloat(((scalar_offset & 2) ? ubo_load.zw : ubo_load.xy)), asfloat(((scalar_offset_1 & 2) ? ubo_load_1.zw : ubo_load_1.xy)), asfloat(((scalar_offset_2 & 2) ? ubo_load_2.zw : ubo_load_2.xy)), asfloat(((scalar_offset_3 & 2) ? ubo_load_3.zw : ubo_load_3.xy))); +} + +[numthreads(1, 1, 1)] +void f() { + const float2x4 t = transpose(tint_symbol(u, 0u)); + const float l = length(asfloat(u[0].zw)); + const float a = abs(asfloat(u[0].xy).yx.x); + return; +} diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x2/to_builtin.wgsl.expected.fxc.hlsl b/test/tint/buffer/uniform/std140/unnested/mat4x2/to_builtin.wgsl.expected.fxc.hlsl new file mode 100644 index 0000000000..051e0934b1 --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat4x2/to_builtin.wgsl.expected.fxc.hlsl @@ -0,0 +1,23 @@ +cbuffer cbuffer_u : register(b0, space0) { + uint4 u[2]; +}; + +float4x2 tint_symbol(uint4 buffer[2], uint offset) { + const uint scalar_offset = ((offset + 0u)) / 4; + uint4 ubo_load = buffer[scalar_offset / 4]; + const uint scalar_offset_1 = ((offset + 8u)) / 4; + uint4 ubo_load_1 = buffer[scalar_offset_1 / 4]; + const uint scalar_offset_2 = ((offset + 16u)) / 4; + uint4 ubo_load_2 = buffer[scalar_offset_2 / 4]; + const uint scalar_offset_3 = ((offset + 24u)) / 4; + uint4 ubo_load_3 = buffer[scalar_offset_3 / 4]; + return float4x2(asfloat(((scalar_offset & 2) ? ubo_load.zw : ubo_load.xy)), asfloat(((scalar_offset_1 & 2) ? ubo_load_1.zw : ubo_load_1.xy)), asfloat(((scalar_offset_2 & 2) ? ubo_load_2.zw : ubo_load_2.xy)), asfloat(((scalar_offset_3 & 2) ? ubo_load_3.zw : ubo_load_3.xy))); +} + +[numthreads(1, 1, 1)] +void f() { + const float2x4 t = transpose(tint_symbol(u, 0u)); + const float l = length(asfloat(u[0].zw)); + const float a = abs(asfloat(u[0].xy).yx.x); + return; +} diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x2/to_builtin.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/unnested/mat4x2/to_builtin.wgsl.expected.glsl new file mode 100644 index 0000000000..06e62f211e --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat4x2/to_builtin.wgsl.expected.glsl @@ -0,0 +1,24 @@ +#version 310 es + +layout(binding = 0, std140) uniform u_block_std140_ubo { + vec2 inner_0; + vec2 inner_1; + vec2 inner_2; + vec2 inner_3; +} u; + +mat4x2 load_u_inner() { + return mat4x2(u.inner_0, u.inner_1, u.inner_2, u.inner_3); +} + +void f() { + mat2x4 t = transpose(load_u_inner()); + float l = length(u.inner_1); + float a = abs(u.inner_0.yx[0u]); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + f(); + return; +} diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x2/to_builtin.wgsl.expected.msl b/test/tint/buffer/uniform/std140/unnested/mat4x2/to_builtin.wgsl.expected.msl new file mode 100644 index 0000000000..175bd3e8ee --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat4x2/to_builtin.wgsl.expected.msl @@ -0,0 +1,10 @@ +#include + +using namespace metal; +kernel void f(const constant float4x2* tint_symbol [[buffer(0)]]) { + float2x4 const t = transpose(*(tint_symbol)); + float const l = length((*(tint_symbol))[1]); + float const a = fabs(float2((*(tint_symbol))[0]).yx[0]); + return; +} + diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x2/to_builtin.wgsl.expected.spvasm b/test/tint/buffer/uniform/std140/unnested/mat4x2/to_builtin.wgsl.expected.spvasm new file mode 100644 index 0000000000..031760b7be --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat4x2/to_builtin.wgsl.expected.spvasm @@ -0,0 +1,71 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 48 +; Schema: 0 + OpCapability Shader + %39 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %f "f" + OpExecutionMode %f LocalSize 1 1 1 + OpName %u_block_std140 "u_block_std140" + OpMemberName %u_block_std140 0 "inner_0" + OpMemberName %u_block_std140 1 "inner_1" + OpMemberName %u_block_std140 2 "inner_2" + OpMemberName %u_block_std140 3 "inner_3" + OpName %u "u" + OpName %load_u_inner "load_u_inner" + OpName %f "f" + OpDecorate %u_block_std140 Block + OpMemberDecorate %u_block_std140 0 Offset 0 + OpMemberDecorate %u_block_std140 1 Offset 8 + OpMemberDecorate %u_block_std140 2 Offset 16 + OpMemberDecorate %u_block_std140 3 Offset 24 + OpDecorate %u NonWritable + OpDecorate %u DescriptorSet 0 + OpDecorate %u Binding 0 + %float = OpTypeFloat 32 + %v2float = OpTypeVector %float 2 +%u_block_std140 = OpTypeStruct %v2float %v2float %v2float %v2float +%_ptr_Uniform_u_block_std140 = OpTypePointer Uniform %u_block_std140 + %u = OpVariable %_ptr_Uniform_u_block_std140 Uniform +%mat4v2float = OpTypeMatrix %v2float 4 + %6 = OpTypeFunction %mat4v2float + %uint = OpTypeInt 32 0 + %uint_0 = OpConstant %uint 0 +%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float + %uint_1 = OpConstant %uint 1 + %uint_2 = OpConstant %uint 2 + %uint_3 = OpConstant %uint 3 + %void = OpTypeVoid + %30 = OpTypeFunction %void + %v4float = OpTypeVector %float 4 +%mat2v4float = OpTypeMatrix %v4float 2 + %46 = OpConstantNull %uint +%load_u_inner = OpFunction %mat4v2float None %6 + %9 = OpLabel + %15 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 + %16 = OpLoad %v2float %15 + %19 = OpAccessChain %_ptr_Uniform_v2float %u %uint_1 + %20 = OpLoad %v2float %19 + %23 = OpAccessChain %_ptr_Uniform_v2float %u %uint_2 + %24 = OpLoad %v2float %23 + %27 = OpAccessChain %_ptr_Uniform_v2float %u %uint_3 + %28 = OpLoad %v2float %27 + %29 = OpCompositeConstruct %mat4v2float %16 %20 %24 %28 + OpReturnValue %29 + OpFunctionEnd + %f = OpFunction %void None %30 + %33 = OpLabel + %37 = OpFunctionCall %mat4v2float %load_u_inner + %34 = OpTranspose %mat2v4float %37 + %40 = OpAccessChain %_ptr_Uniform_v2float %u %uint_1 + %41 = OpLoad %v2float %40 + %38 = OpExtInst %float %39 Length %41 + %43 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 + %44 = OpLoad %v2float %43 + %45 = OpVectorShuffle %v2float %44 %44 1 0 + %47 = OpCompositeExtract %float %45 0 + %42 = OpExtInst %float %39 FAbs %47 + OpReturn + OpFunctionEnd diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x2/to_builtin.wgsl.expected.wgsl b/test/tint/buffer/uniform/std140/unnested/mat4x2/to_builtin.wgsl.expected.wgsl new file mode 100644 index 0000000000..ac19e9cd7b --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat4x2/to_builtin.wgsl.expected.wgsl @@ -0,0 +1,8 @@ +@group(0) @binding(0) var u : mat4x2; + +@compute @workgroup_size(1) +fn f() { + let t = transpose(u); + let l = length(u[1]); + let a = abs(u[0].yx.x); +} diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x2/to_fn.wgsl b/test/tint/buffer/uniform/std140/unnested/mat4x2/to_fn.wgsl new file mode 100644 index 0000000000..0e099a9c7f --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat4x2/to_fn.wgsl @@ -0,0 +1,14 @@ +@group(0) @binding(0) var u : mat4x2; + +fn a(m : mat4x2) {} +fn b(v : vec2) {} +fn c(f : f32) {} + +@compute @workgroup_size(1) +fn f() { + a(u); + b(u[1]); + b(u[1].yx); + c(u[1].x); + c(u[1].yx.x); +} diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x2/to_fn.wgsl.expected.dxc.hlsl b/test/tint/buffer/uniform/std140/unnested/mat4x2/to_fn.wgsl.expected.dxc.hlsl new file mode 100644 index 0000000000..9629f1dfeb --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat4x2/to_fn.wgsl.expected.dxc.hlsl @@ -0,0 +1,34 @@ +cbuffer cbuffer_u : register(b0, space0) { + uint4 u[2]; +}; + +void a(float4x2 m) { +} + +void b(float2 v) { +} + +void c(float f_1) { +} + +float4x2 tint_symbol(uint4 buffer[2], uint offset) { + const uint scalar_offset = ((offset + 0u)) / 4; + uint4 ubo_load = buffer[scalar_offset / 4]; + const uint scalar_offset_1 = ((offset + 8u)) / 4; + uint4 ubo_load_1 = buffer[scalar_offset_1 / 4]; + const uint scalar_offset_2 = ((offset + 16u)) / 4; + uint4 ubo_load_2 = buffer[scalar_offset_2 / 4]; + const uint scalar_offset_3 = ((offset + 24u)) / 4; + uint4 ubo_load_3 = buffer[scalar_offset_3 / 4]; + return float4x2(asfloat(((scalar_offset & 2) ? ubo_load.zw : ubo_load.xy)), asfloat(((scalar_offset_1 & 2) ? ubo_load_1.zw : ubo_load_1.xy)), asfloat(((scalar_offset_2 & 2) ? ubo_load_2.zw : ubo_load_2.xy)), asfloat(((scalar_offset_3 & 2) ? ubo_load_3.zw : ubo_load_3.xy))); +} + +[numthreads(1, 1, 1)] +void f() { + a(tint_symbol(u, 0u)); + b(asfloat(u[0].zw)); + b(asfloat(u[0].zw).yx); + c(asfloat(u[0].z)); + c(asfloat(u[0].zw).yx.x); + return; +} diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x2/to_fn.wgsl.expected.fxc.hlsl b/test/tint/buffer/uniform/std140/unnested/mat4x2/to_fn.wgsl.expected.fxc.hlsl new file mode 100644 index 0000000000..9629f1dfeb --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat4x2/to_fn.wgsl.expected.fxc.hlsl @@ -0,0 +1,34 @@ +cbuffer cbuffer_u : register(b0, space0) { + uint4 u[2]; +}; + +void a(float4x2 m) { +} + +void b(float2 v) { +} + +void c(float f_1) { +} + +float4x2 tint_symbol(uint4 buffer[2], uint offset) { + const uint scalar_offset = ((offset + 0u)) / 4; + uint4 ubo_load = buffer[scalar_offset / 4]; + const uint scalar_offset_1 = ((offset + 8u)) / 4; + uint4 ubo_load_1 = buffer[scalar_offset_1 / 4]; + const uint scalar_offset_2 = ((offset + 16u)) / 4; + uint4 ubo_load_2 = buffer[scalar_offset_2 / 4]; + const uint scalar_offset_3 = ((offset + 24u)) / 4; + uint4 ubo_load_3 = buffer[scalar_offset_3 / 4]; + return float4x2(asfloat(((scalar_offset & 2) ? ubo_load.zw : ubo_load.xy)), asfloat(((scalar_offset_1 & 2) ? ubo_load_1.zw : ubo_load_1.xy)), asfloat(((scalar_offset_2 & 2) ? ubo_load_2.zw : ubo_load_2.xy)), asfloat(((scalar_offset_3 & 2) ? ubo_load_3.zw : ubo_load_3.xy))); +} + +[numthreads(1, 1, 1)] +void f() { + a(tint_symbol(u, 0u)); + b(asfloat(u[0].zw)); + b(asfloat(u[0].zw).yx); + c(asfloat(u[0].z)); + c(asfloat(u[0].zw).yx.x); + return; +} diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x2/to_fn.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/unnested/mat4x2/to_fn.wgsl.expected.glsl new file mode 100644 index 0000000000..7443601f4c --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat4x2/to_fn.wgsl.expected.glsl @@ -0,0 +1,35 @@ +#version 310 es + +layout(binding = 0, std140) uniform u_block_std140_ubo { + vec2 inner_0; + vec2 inner_1; + vec2 inner_2; + vec2 inner_3; +} u; + +void a(mat4x2 m) { +} + +void b(vec2 v) { +} + +void c(float f_1) { +} + +mat4x2 load_u_inner() { + return mat4x2(u.inner_0, u.inner_1, u.inner_2, u.inner_3); +} + +void f() { + a(load_u_inner()); + b(u.inner_1); + b(u.inner_1.yx); + c(u.inner_1[0u]); + c(u.inner_1.yx[0u]); +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + f(); + return; +} diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x2/to_fn.wgsl.expected.msl b/test/tint/buffer/uniform/std140/unnested/mat4x2/to_fn.wgsl.expected.msl new file mode 100644 index 0000000000..4cec493cab --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat4x2/to_fn.wgsl.expected.msl @@ -0,0 +1,21 @@ +#include + +using namespace metal; +void a(float4x2 m) { +} + +void b(float2 v) { +} + +void c(float f_1) { +} + +kernel void f(const constant float4x2* tint_symbol [[buffer(0)]]) { + a(*(tint_symbol)); + b((*(tint_symbol))[1]); + b(float2((*(tint_symbol))[1]).yx); + c((*(tint_symbol))[1][0]); + c(float2((*(tint_symbol))[1]).yx[0]); + return; +} + diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x2/to_fn.wgsl.expected.spvasm b/test/tint/buffer/uniform/std140/unnested/mat4x2/to_fn.wgsl.expected.spvasm new file mode 100644 index 0000000000..921369d06b --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat4x2/to_fn.wgsl.expected.spvasm @@ -0,0 +1,100 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 65 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %f "f" + OpExecutionMode %f LocalSize 1 1 1 + OpName %u_block_std140 "u_block_std140" + OpMemberName %u_block_std140 0 "inner_0" + OpMemberName %u_block_std140 1 "inner_1" + OpMemberName %u_block_std140 2 "inner_2" + OpMemberName %u_block_std140 3 "inner_3" + OpName %u "u" + OpName %a "a" + OpName %m "m" + OpName %b "b" + OpName %v "v" + OpName %c "c" + OpName %f_1 "f_1" + OpName %load_u_inner "load_u_inner" + OpName %f "f" + OpDecorate %u_block_std140 Block + OpMemberDecorate %u_block_std140 0 Offset 0 + OpMemberDecorate %u_block_std140 1 Offset 8 + OpMemberDecorate %u_block_std140 2 Offset 16 + OpMemberDecorate %u_block_std140 3 Offset 24 + OpDecorate %u NonWritable + OpDecorate %u DescriptorSet 0 + OpDecorate %u Binding 0 + %float = OpTypeFloat 32 + %v2float = OpTypeVector %float 2 +%u_block_std140 = OpTypeStruct %v2float %v2float %v2float %v2float +%_ptr_Uniform_u_block_std140 = OpTypePointer Uniform %u_block_std140 + %u = OpVariable %_ptr_Uniform_u_block_std140 Uniform + %void = OpTypeVoid +%mat4v2float = OpTypeMatrix %v2float 4 + %6 = OpTypeFunction %void %mat4v2float + %12 = OpTypeFunction %void %v2float + %16 = OpTypeFunction %void %float + %20 = OpTypeFunction %mat4v2float + %uint = OpTypeInt 32 0 + %uint_0 = OpConstant %uint 0 +%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float + %uint_1 = OpConstant %uint 1 + %uint_2 = OpConstant %uint 2 + %uint_3 = OpConstant %uint 3 + %43 = OpTypeFunction %void + %56 = OpConstantNull %uint +%_ptr_Uniform_float = OpTypePointer Uniform %float + %a = OpFunction %void None %6 + %m = OpFunctionParameter %mat4v2float + %11 = OpLabel + OpReturn + OpFunctionEnd + %b = OpFunction %void None %12 + %v = OpFunctionParameter %v2float + %15 = OpLabel + OpReturn + OpFunctionEnd + %c = OpFunction %void None %16 + %f_1 = OpFunctionParameter %float + %19 = OpLabel + OpReturn + OpFunctionEnd +%load_u_inner = OpFunction %mat4v2float None %20 + %22 = OpLabel + %28 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 + %29 = OpLoad %v2float %28 + %32 = OpAccessChain %_ptr_Uniform_v2float %u %uint_1 + %33 = OpLoad %v2float %32 + %36 = OpAccessChain %_ptr_Uniform_v2float %u %uint_2 + %37 = OpLoad %v2float %36 + %40 = OpAccessChain %_ptr_Uniform_v2float %u %uint_3 + %41 = OpLoad %v2float %40 + %42 = OpCompositeConstruct %mat4v2float %29 %33 %37 %41 + OpReturnValue %42 + OpFunctionEnd + %f = OpFunction %void None %43 + %45 = OpLabel + %47 = OpFunctionCall %mat4v2float %load_u_inner + %46 = OpFunctionCall %void %a %47 + %49 = OpAccessChain %_ptr_Uniform_v2float %u %uint_1 + %50 = OpLoad %v2float %49 + %48 = OpFunctionCall %void %b %50 + %52 = OpAccessChain %_ptr_Uniform_v2float %u %uint_1 + %53 = OpLoad %v2float %52 + %54 = OpVectorShuffle %v2float %53 %53 1 0 + %51 = OpFunctionCall %void %b %54 + %58 = OpAccessChain %_ptr_Uniform_float %u %uint_1 %56 + %59 = OpLoad %float %58 + %55 = OpFunctionCall %void %c %59 + %61 = OpAccessChain %_ptr_Uniform_v2float %u %uint_1 + %62 = OpLoad %v2float %61 + %63 = OpVectorShuffle %v2float %62 %62 1 0 + %64 = OpCompositeExtract %float %63 0 + %60 = OpFunctionCall %void %c %64 + OpReturn + OpFunctionEnd diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x2/to_fn.wgsl.expected.wgsl b/test/tint/buffer/uniform/std140/unnested/mat4x2/to_fn.wgsl.expected.wgsl new file mode 100644 index 0000000000..2bbc927c7b --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat4x2/to_fn.wgsl.expected.wgsl @@ -0,0 +1,19 @@ +@group(0) @binding(0) var u : mat4x2; + +fn a(m : mat4x2) { +} + +fn b(v : vec2) { +} + +fn c(f : f32) { +} + +@compute @workgroup_size(1) +fn f() { + a(u); + b(u[1]); + b(u[1].yx); + c(u[1].x); + c(u[1].yx.x); +} diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x2/to_private.wgsl b/test/tint/buffer/uniform/std140/unnested/mat4x2/to_private.wgsl new file mode 100644 index 0000000000..49dd6168c2 --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat4x2/to_private.wgsl @@ -0,0 +1,10 @@ +@group(0) @binding(0) var u : mat4x2; +var p : mat4x2; + +@compute @workgroup_size(1) +fn f() { + p = u; + p[1] = u[0]; + p[1] = u[0].yx; + p[0][1] = u[1][0]; +} diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x2/to_private.wgsl.expected.dxc.hlsl b/test/tint/buffer/uniform/std140/unnested/mat4x2/to_private.wgsl.expected.dxc.hlsl new file mode 100644 index 0000000000..15f91ac3e6 --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat4x2/to_private.wgsl.expected.dxc.hlsl @@ -0,0 +1,25 @@ +cbuffer cbuffer_u : register(b0, space0) { + uint4 u[2]; +}; +static float4x2 p = float4x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f); + +float4x2 tint_symbol(uint4 buffer[2], uint offset) { + const uint scalar_offset = ((offset + 0u)) / 4; + uint4 ubo_load = buffer[scalar_offset / 4]; + const uint scalar_offset_1 = ((offset + 8u)) / 4; + uint4 ubo_load_1 = buffer[scalar_offset_1 / 4]; + const uint scalar_offset_2 = ((offset + 16u)) / 4; + uint4 ubo_load_2 = buffer[scalar_offset_2 / 4]; + const uint scalar_offset_3 = ((offset + 24u)) / 4; + uint4 ubo_load_3 = buffer[scalar_offset_3 / 4]; + return float4x2(asfloat(((scalar_offset & 2) ? ubo_load.zw : ubo_load.xy)), asfloat(((scalar_offset_1 & 2) ? ubo_load_1.zw : ubo_load_1.xy)), asfloat(((scalar_offset_2 & 2) ? ubo_load_2.zw : ubo_load_2.xy)), asfloat(((scalar_offset_3 & 2) ? ubo_load_3.zw : ubo_load_3.xy))); +} + +[numthreads(1, 1, 1)] +void f() { + p = tint_symbol(u, 0u); + p[1] = asfloat(u[0].xy); + p[1] = asfloat(u[0].xy).yx; + p[0][1] = asfloat(u[0].z); + return; +} diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x2/to_private.wgsl.expected.fxc.hlsl b/test/tint/buffer/uniform/std140/unnested/mat4x2/to_private.wgsl.expected.fxc.hlsl new file mode 100644 index 0000000000..15f91ac3e6 --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat4x2/to_private.wgsl.expected.fxc.hlsl @@ -0,0 +1,25 @@ +cbuffer cbuffer_u : register(b0, space0) { + uint4 u[2]; +}; +static float4x2 p = float4x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f); + +float4x2 tint_symbol(uint4 buffer[2], uint offset) { + const uint scalar_offset = ((offset + 0u)) / 4; + uint4 ubo_load = buffer[scalar_offset / 4]; + const uint scalar_offset_1 = ((offset + 8u)) / 4; + uint4 ubo_load_1 = buffer[scalar_offset_1 / 4]; + const uint scalar_offset_2 = ((offset + 16u)) / 4; + uint4 ubo_load_2 = buffer[scalar_offset_2 / 4]; + const uint scalar_offset_3 = ((offset + 24u)) / 4; + uint4 ubo_load_3 = buffer[scalar_offset_3 / 4]; + return float4x2(asfloat(((scalar_offset & 2) ? ubo_load.zw : ubo_load.xy)), asfloat(((scalar_offset_1 & 2) ? ubo_load_1.zw : ubo_load_1.xy)), asfloat(((scalar_offset_2 & 2) ? ubo_load_2.zw : ubo_load_2.xy)), asfloat(((scalar_offset_3 & 2) ? ubo_load_3.zw : ubo_load_3.xy))); +} + +[numthreads(1, 1, 1)] +void f() { + p = tint_symbol(u, 0u); + p[1] = asfloat(u[0].xy); + p[1] = asfloat(u[0].xy).yx; + p[0][1] = asfloat(u[0].z); + return; +} diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x2/to_private.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/unnested/mat4x2/to_private.wgsl.expected.glsl new file mode 100644 index 0000000000..434a6b72b2 --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat4x2/to_private.wgsl.expected.glsl @@ -0,0 +1,26 @@ +#version 310 es + +layout(binding = 0, std140) uniform u_block_std140_ubo { + vec2 inner_0; + vec2 inner_1; + vec2 inner_2; + vec2 inner_3; +} u; + +mat4x2 p = mat4x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f); +mat4x2 load_u_inner() { + return mat4x2(u.inner_0, u.inner_1, u.inner_2, u.inner_3); +} + +void f() { + p = load_u_inner(); + p[1] = u.inner_0; + p[1] = u.inner_0.yx; + p[0][1] = u.inner_1[0u]; +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + f(); + return; +} diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x2/to_private.wgsl.expected.msl b/test/tint/buffer/uniform/std140/unnested/mat4x2/to_private.wgsl.expected.msl new file mode 100644 index 0000000000..b2d3c55f70 --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat4x2/to_private.wgsl.expected.msl @@ -0,0 +1,12 @@ +#include + +using namespace metal; +kernel void f(const constant float4x2* tint_symbol_1 [[buffer(0)]]) { + thread float4x2 tint_symbol = float4x2(0.0f); + tint_symbol = *(tint_symbol_1); + tint_symbol[1] = (*(tint_symbol_1))[0]; + tint_symbol[1] = float2((*(tint_symbol_1))[0]).yx; + tint_symbol[0][1] = (*(tint_symbol_1))[1][0]; + return; +} + diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x2/to_private.wgsl.expected.spvasm b/test/tint/buffer/uniform/std140/unnested/mat4x2/to_private.wgsl.expected.spvasm new file mode 100644 index 0000000000..075f83f9d0 --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat4x2/to_private.wgsl.expected.spvasm @@ -0,0 +1,83 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 55 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %f "f" + OpExecutionMode %f LocalSize 1 1 1 + OpName %u_block_std140 "u_block_std140" + OpMemberName %u_block_std140 0 "inner_0" + OpMemberName %u_block_std140 1 "inner_1" + OpMemberName %u_block_std140 2 "inner_2" + OpMemberName %u_block_std140 3 "inner_3" + OpName %u "u" + OpName %p "p" + OpName %load_u_inner "load_u_inner" + OpName %f "f" + OpDecorate %u_block_std140 Block + OpMemberDecorate %u_block_std140 0 Offset 0 + OpMemberDecorate %u_block_std140 1 Offset 8 + OpMemberDecorate %u_block_std140 2 Offset 16 + OpMemberDecorate %u_block_std140 3 Offset 24 + OpDecorate %u NonWritable + OpDecorate %u DescriptorSet 0 + OpDecorate %u Binding 0 + %float = OpTypeFloat 32 + %v2float = OpTypeVector %float 2 +%u_block_std140 = OpTypeStruct %v2float %v2float %v2float %v2float +%_ptr_Uniform_u_block_std140 = OpTypePointer Uniform %u_block_std140 + %u = OpVariable %_ptr_Uniform_u_block_std140 Uniform +%mat4v2float = OpTypeMatrix %v2float 4 +%_ptr_Private_mat4v2float = OpTypePointer Private %mat4v2float + %9 = OpConstantNull %mat4v2float + %p = OpVariable %_ptr_Private_mat4v2float Private %9 + %10 = OpTypeFunction %mat4v2float + %uint = OpTypeInt 32 0 + %uint_0 = OpConstant %uint 0 +%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float + %uint_1 = OpConstant %uint 1 + %uint_2 = OpConstant %uint 2 + %uint_3 = OpConstant %uint 3 + %void = OpTypeVoid + %33 = OpTypeFunction %void + %int = OpTypeInt 32 1 + %int_1 = OpConstant %int 1 +%_ptr_Private_v2float = OpTypePointer Private %v2float + %48 = OpConstantNull %int +%_ptr_Private_float = OpTypePointer Private %float + %51 = OpConstantNull %uint +%_ptr_Uniform_float = OpTypePointer Uniform %float +%load_u_inner = OpFunction %mat4v2float None %10 + %12 = OpLabel + %18 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 + %19 = OpLoad %v2float %18 + %22 = OpAccessChain %_ptr_Uniform_v2float %u %uint_1 + %23 = OpLoad %v2float %22 + %26 = OpAccessChain %_ptr_Uniform_v2float %u %uint_2 + %27 = OpLoad %v2float %26 + %30 = OpAccessChain %_ptr_Uniform_v2float %u %uint_3 + %31 = OpLoad %v2float %30 + %32 = OpCompositeConstruct %mat4v2float %19 %23 %27 %31 + OpReturnValue %32 + OpFunctionEnd + %f = OpFunction %void None %33 + %36 = OpLabel + %37 = OpFunctionCall %mat4v2float %load_u_inner + OpStore %p %37 + %41 = OpAccessChain %_ptr_Private_v2float %p %int_1 + %42 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 + %43 = OpLoad %v2float %42 + OpStore %41 %43 + %44 = OpAccessChain %_ptr_Private_v2float %p %int_1 + %45 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 + %46 = OpLoad %v2float %45 + %47 = OpVectorShuffle %v2float %46 %46 1 0 + OpStore %44 %47 + %50 = OpAccessChain %_ptr_Private_float %p %48 %int_1 + %53 = OpAccessChain %_ptr_Uniform_float %u %uint_1 %51 + %54 = OpLoad %float %53 + OpStore %50 %54 + OpReturn + OpFunctionEnd diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x2/to_private.wgsl.expected.wgsl b/test/tint/buffer/uniform/std140/unnested/mat4x2/to_private.wgsl.expected.wgsl new file mode 100644 index 0000000000..d0a63c8aff --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat4x2/to_private.wgsl.expected.wgsl @@ -0,0 +1,11 @@ +@group(0) @binding(0) var u : mat4x2; + +var p : mat4x2; + +@compute @workgroup_size(1) +fn f() { + p = u; + p[1] = u[0]; + p[1] = u[0].yx; + p[0][1] = u[1][0]; +} diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x2/to_storage.wgsl b/test/tint/buffer/uniform/std140/unnested/mat4x2/to_storage.wgsl new file mode 100644 index 0000000000..333e3dc4e9 --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat4x2/to_storage.wgsl @@ -0,0 +1,10 @@ +@group(0) @binding(0) var u : mat4x2; +@group(0) @binding(1) var s : mat4x2; + +@compute @workgroup_size(1) +fn f() { + s = u; + s[1] = u[0]; + s[1] = u[0].yx; + s[0][1] = u[1][0]; +} diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x2/to_storage.wgsl.expected.dxc.hlsl b/test/tint/buffer/uniform/std140/unnested/mat4x2/to_storage.wgsl.expected.dxc.hlsl new file mode 100644 index 0000000000..466fdc408a --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat4x2/to_storage.wgsl.expected.dxc.hlsl @@ -0,0 +1,32 @@ +cbuffer cbuffer_u : register(b0, space0) { + uint4 u[2]; +}; +RWByteAddressBuffer s : register(u1, space0); + +void tint_symbol(RWByteAddressBuffer buffer, uint offset, float4x2 value) { + buffer.Store2((offset + 0u), asuint(value[0u])); + buffer.Store2((offset + 8u), asuint(value[1u])); + buffer.Store2((offset + 16u), asuint(value[2u])); + buffer.Store2((offset + 24u), asuint(value[3u])); +} + +float4x2 tint_symbol_2(uint4 buffer[2], uint offset) { + const uint scalar_offset = ((offset + 0u)) / 4; + uint4 ubo_load = buffer[scalar_offset / 4]; + const uint scalar_offset_1 = ((offset + 8u)) / 4; + uint4 ubo_load_1 = buffer[scalar_offset_1 / 4]; + const uint scalar_offset_2 = ((offset + 16u)) / 4; + uint4 ubo_load_2 = buffer[scalar_offset_2 / 4]; + const uint scalar_offset_3 = ((offset + 24u)) / 4; + uint4 ubo_load_3 = buffer[scalar_offset_3 / 4]; + return float4x2(asfloat(((scalar_offset & 2) ? ubo_load.zw : ubo_load.xy)), asfloat(((scalar_offset_1 & 2) ? ubo_load_1.zw : ubo_load_1.xy)), asfloat(((scalar_offset_2 & 2) ? ubo_load_2.zw : ubo_load_2.xy)), asfloat(((scalar_offset_3 & 2) ? ubo_load_3.zw : ubo_load_3.xy))); +} + +[numthreads(1, 1, 1)] +void f() { + tint_symbol(s, 0u, tint_symbol_2(u, 0u)); + s.Store2(8u, asuint(asfloat(u[0].xy))); + s.Store2(8u, asuint(asfloat(u[0].xy).yx)); + s.Store(4u, asuint(asfloat(u[0].z))); + return; +} diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x2/to_storage.wgsl.expected.fxc.hlsl b/test/tint/buffer/uniform/std140/unnested/mat4x2/to_storage.wgsl.expected.fxc.hlsl new file mode 100644 index 0000000000..466fdc408a --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat4x2/to_storage.wgsl.expected.fxc.hlsl @@ -0,0 +1,32 @@ +cbuffer cbuffer_u : register(b0, space0) { + uint4 u[2]; +}; +RWByteAddressBuffer s : register(u1, space0); + +void tint_symbol(RWByteAddressBuffer buffer, uint offset, float4x2 value) { + buffer.Store2((offset + 0u), asuint(value[0u])); + buffer.Store2((offset + 8u), asuint(value[1u])); + buffer.Store2((offset + 16u), asuint(value[2u])); + buffer.Store2((offset + 24u), asuint(value[3u])); +} + +float4x2 tint_symbol_2(uint4 buffer[2], uint offset) { + const uint scalar_offset = ((offset + 0u)) / 4; + uint4 ubo_load = buffer[scalar_offset / 4]; + const uint scalar_offset_1 = ((offset + 8u)) / 4; + uint4 ubo_load_1 = buffer[scalar_offset_1 / 4]; + const uint scalar_offset_2 = ((offset + 16u)) / 4; + uint4 ubo_load_2 = buffer[scalar_offset_2 / 4]; + const uint scalar_offset_3 = ((offset + 24u)) / 4; + uint4 ubo_load_3 = buffer[scalar_offset_3 / 4]; + return float4x2(asfloat(((scalar_offset & 2) ? ubo_load.zw : ubo_load.xy)), asfloat(((scalar_offset_1 & 2) ? ubo_load_1.zw : ubo_load_1.xy)), asfloat(((scalar_offset_2 & 2) ? ubo_load_2.zw : ubo_load_2.xy)), asfloat(((scalar_offset_3 & 2) ? ubo_load_3.zw : ubo_load_3.xy))); +} + +[numthreads(1, 1, 1)] +void f() { + tint_symbol(s, 0u, tint_symbol_2(u, 0u)); + s.Store2(8u, asuint(asfloat(u[0].xy))); + s.Store2(8u, asuint(asfloat(u[0].xy).yx)); + s.Store(4u, asuint(asfloat(u[0].z))); + return; +} diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x2/to_storage.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/unnested/mat4x2/to_storage.wgsl.expected.glsl new file mode 100644 index 0000000000..6370442663 --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat4x2/to_storage.wgsl.expected.glsl @@ -0,0 +1,29 @@ +#version 310 es + +layout(binding = 0, std140) uniform u_block_std140_ubo { + vec2 inner_0; + vec2 inner_1; + vec2 inner_2; + vec2 inner_3; +} u; + +layout(binding = 1, std430) buffer u_block_ssbo { + mat4x2 inner; +} s; + +mat4x2 load_u_inner() { + return mat4x2(u.inner_0, u.inner_1, u.inner_2, u.inner_3); +} + +void f() { + s.inner = load_u_inner(); + s.inner[1] = u.inner_0; + s.inner[1] = u.inner_0.yx; + s.inner[0][1] = u.inner_1[0u]; +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + f(); + return; +} diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x2/to_storage.wgsl.expected.msl b/test/tint/buffer/uniform/std140/unnested/mat4x2/to_storage.wgsl.expected.msl new file mode 100644 index 0000000000..fab0f86133 --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat4x2/to_storage.wgsl.expected.msl @@ -0,0 +1,11 @@ +#include + +using namespace metal; +kernel void f(device float4x2* tint_symbol [[buffer(1)]], const constant float4x2* tint_symbol_1 [[buffer(0)]]) { + *(tint_symbol) = *(tint_symbol_1); + (*(tint_symbol))[1] = (*(tint_symbol_1))[0]; + (*(tint_symbol))[1] = float2((*(tint_symbol_1))[0]).yx; + (*(tint_symbol))[0][1] = (*(tint_symbol_1))[1][0]; + return; +} + diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x2/to_storage.wgsl.expected.spvasm b/test/tint/buffer/uniform/std140/unnested/mat4x2/to_storage.wgsl.expected.spvasm new file mode 100644 index 0000000000..bea1c1495c --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat4x2/to_storage.wgsl.expected.spvasm @@ -0,0 +1,93 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 57 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %f "f" + OpExecutionMode %f LocalSize 1 1 1 + OpName %u_block_std140 "u_block_std140" + OpMemberName %u_block_std140 0 "inner_0" + OpMemberName %u_block_std140 1 "inner_1" + OpMemberName %u_block_std140 2 "inner_2" + OpMemberName %u_block_std140 3 "inner_3" + OpName %u "u" + OpName %u_block "u_block" + OpMemberName %u_block 0 "inner" + OpName %s "s" + OpName %load_u_inner "load_u_inner" + OpName %f "f" + OpDecorate %u_block_std140 Block + OpMemberDecorate %u_block_std140 0 Offset 0 + OpMemberDecorate %u_block_std140 1 Offset 8 + OpMemberDecorate %u_block_std140 2 Offset 16 + OpMemberDecorate %u_block_std140 3 Offset 24 + OpDecorate %u NonWritable + OpDecorate %u DescriptorSet 0 + OpDecorate %u Binding 0 + OpDecorate %u_block Block + OpMemberDecorate %u_block 0 Offset 0 + OpMemberDecorate %u_block 0 ColMajor + OpMemberDecorate %u_block 0 MatrixStride 8 + OpDecorate %s DescriptorSet 0 + OpDecorate %s Binding 1 + %float = OpTypeFloat 32 + %v2float = OpTypeVector %float 2 +%u_block_std140 = OpTypeStruct %v2float %v2float %v2float %v2float +%_ptr_Uniform_u_block_std140 = OpTypePointer Uniform %u_block_std140 + %u = OpVariable %_ptr_Uniform_u_block_std140 Uniform +%mat4v2float = OpTypeMatrix %v2float 4 + %u_block = OpTypeStruct %mat4v2float +%_ptr_StorageBuffer_u_block = OpTypePointer StorageBuffer %u_block + %s = OpVariable %_ptr_StorageBuffer_u_block StorageBuffer + %10 = OpTypeFunction %mat4v2float + %uint = OpTypeInt 32 0 + %uint_0 = OpConstant %uint 0 +%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float + %uint_1 = OpConstant %uint 1 + %uint_2 = OpConstant %uint 2 + %uint_3 = OpConstant %uint 3 + %void = OpTypeVoid + %33 = OpTypeFunction %void +%_ptr_StorageBuffer_mat4v2float = OpTypePointer StorageBuffer %mat4v2float + %int = OpTypeInt 32 1 + %int_1 = OpConstant %int 1 +%_ptr_StorageBuffer_v2float = OpTypePointer StorageBuffer %v2float + %50 = OpConstantNull %int +%_ptr_StorageBuffer_float = OpTypePointer StorageBuffer %float + %53 = OpConstantNull %uint +%_ptr_Uniform_float = OpTypePointer Uniform %float +%load_u_inner = OpFunction %mat4v2float None %10 + %12 = OpLabel + %18 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 + %19 = OpLoad %v2float %18 + %22 = OpAccessChain %_ptr_Uniform_v2float %u %uint_1 + %23 = OpLoad %v2float %22 + %26 = OpAccessChain %_ptr_Uniform_v2float %u %uint_2 + %27 = OpLoad %v2float %26 + %30 = OpAccessChain %_ptr_Uniform_v2float %u %uint_3 + %31 = OpLoad %v2float %30 + %32 = OpCompositeConstruct %mat4v2float %19 %23 %27 %31 + OpReturnValue %32 + OpFunctionEnd + %f = OpFunction %void None %33 + %36 = OpLabel + %38 = OpAccessChain %_ptr_StorageBuffer_mat4v2float %s %uint_0 + %39 = OpFunctionCall %mat4v2float %load_u_inner + OpStore %38 %39 + %43 = OpAccessChain %_ptr_StorageBuffer_v2float %s %uint_0 %int_1 + %44 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 + %45 = OpLoad %v2float %44 + OpStore %43 %45 + %46 = OpAccessChain %_ptr_StorageBuffer_v2float %s %uint_0 %int_1 + %47 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 + %48 = OpLoad %v2float %47 + %49 = OpVectorShuffle %v2float %48 %48 1 0 + OpStore %46 %49 + %52 = OpAccessChain %_ptr_StorageBuffer_float %s %uint_0 %50 %int_1 + %55 = OpAccessChain %_ptr_Uniform_float %u %uint_1 %53 + %56 = OpLoad %float %55 + OpStore %52 %56 + OpReturn + OpFunctionEnd diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x2/to_storage.wgsl.expected.wgsl b/test/tint/buffer/uniform/std140/unnested/mat4x2/to_storage.wgsl.expected.wgsl new file mode 100644 index 0000000000..e2489511a0 --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat4x2/to_storage.wgsl.expected.wgsl @@ -0,0 +1,11 @@ +@group(0) @binding(0) var u : mat4x2; + +@group(0) @binding(1) var s : mat4x2; + +@compute @workgroup_size(1) +fn f() { + s = u; + s[1] = u[0]; + s[1] = u[0].yx; + s[0][1] = u[1][0]; +} diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x2/to_workgroup.wgsl b/test/tint/buffer/uniform/std140/unnested/mat4x2/to_workgroup.wgsl new file mode 100644 index 0000000000..2055f76b88 --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat4x2/to_workgroup.wgsl @@ -0,0 +1,10 @@ +@group(0) @binding(0) var u : mat4x2; +var w : mat4x2; + +@compute @workgroup_size(1) +fn f() { + w = u; + w[1] = u[0]; + w[1] = u[0].yx; + w[0][1] = u[1][0]; +} diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x2/to_workgroup.wgsl.expected.dxc.hlsl b/test/tint/buffer/uniform/std140/unnested/mat4x2/to_workgroup.wgsl.expected.dxc.hlsl new file mode 100644 index 0000000000..f665fb4ac0 --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat4x2/to_workgroup.wgsl.expected.dxc.hlsl @@ -0,0 +1,37 @@ +cbuffer cbuffer_u : register(b0, space0) { + uint4 u[2]; +}; +groupshared float4x2 w; + +struct tint_symbol_1 { + uint local_invocation_index : SV_GroupIndex; +}; + +float4x2 tint_symbol_2(uint4 buffer[2], uint offset) { + const uint scalar_offset = ((offset + 0u)) / 4; + uint4 ubo_load = buffer[scalar_offset / 4]; + const uint scalar_offset_1 = ((offset + 8u)) / 4; + uint4 ubo_load_1 = buffer[scalar_offset_1 / 4]; + const uint scalar_offset_2 = ((offset + 16u)) / 4; + uint4 ubo_load_2 = buffer[scalar_offset_2 / 4]; + const uint scalar_offset_3 = ((offset + 24u)) / 4; + uint4 ubo_load_3 = buffer[scalar_offset_3 / 4]; + return float4x2(asfloat(((scalar_offset & 2) ? ubo_load.zw : ubo_load.xy)), asfloat(((scalar_offset_1 & 2) ? ubo_load_1.zw : ubo_load_1.xy)), asfloat(((scalar_offset_2 & 2) ? ubo_load_2.zw : ubo_load_2.xy)), asfloat(((scalar_offset_3 & 2) ? ubo_load_3.zw : ubo_load_3.xy))); +} + +void f_inner(uint local_invocation_index) { + { + w = float4x2((0.0f).xx, (0.0f).xx, (0.0f).xx, (0.0f).xx); + } + GroupMemoryBarrierWithGroupSync(); + w = tint_symbol_2(u, 0u); + w[1] = asfloat(u[0].xy); + w[1] = asfloat(u[0].xy).yx; + w[0][1] = asfloat(u[0].z); +} + +[numthreads(1, 1, 1)] +void f(tint_symbol_1 tint_symbol) { + f_inner(tint_symbol.local_invocation_index); + return; +} diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x2/to_workgroup.wgsl.expected.fxc.hlsl b/test/tint/buffer/uniform/std140/unnested/mat4x2/to_workgroup.wgsl.expected.fxc.hlsl new file mode 100644 index 0000000000..f665fb4ac0 --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat4x2/to_workgroup.wgsl.expected.fxc.hlsl @@ -0,0 +1,37 @@ +cbuffer cbuffer_u : register(b0, space0) { + uint4 u[2]; +}; +groupshared float4x2 w; + +struct tint_symbol_1 { + uint local_invocation_index : SV_GroupIndex; +}; + +float4x2 tint_symbol_2(uint4 buffer[2], uint offset) { + const uint scalar_offset = ((offset + 0u)) / 4; + uint4 ubo_load = buffer[scalar_offset / 4]; + const uint scalar_offset_1 = ((offset + 8u)) / 4; + uint4 ubo_load_1 = buffer[scalar_offset_1 / 4]; + const uint scalar_offset_2 = ((offset + 16u)) / 4; + uint4 ubo_load_2 = buffer[scalar_offset_2 / 4]; + const uint scalar_offset_3 = ((offset + 24u)) / 4; + uint4 ubo_load_3 = buffer[scalar_offset_3 / 4]; + return float4x2(asfloat(((scalar_offset & 2) ? ubo_load.zw : ubo_load.xy)), asfloat(((scalar_offset_1 & 2) ? ubo_load_1.zw : ubo_load_1.xy)), asfloat(((scalar_offset_2 & 2) ? ubo_load_2.zw : ubo_load_2.xy)), asfloat(((scalar_offset_3 & 2) ? ubo_load_3.zw : ubo_load_3.xy))); +} + +void f_inner(uint local_invocation_index) { + { + w = float4x2((0.0f).xx, (0.0f).xx, (0.0f).xx, (0.0f).xx); + } + GroupMemoryBarrierWithGroupSync(); + w = tint_symbol_2(u, 0u); + w[1] = asfloat(u[0].xy); + w[1] = asfloat(u[0].xy).yx; + w[0][1] = asfloat(u[0].z); +} + +[numthreads(1, 1, 1)] +void f(tint_symbol_1 tint_symbol) { + f_inner(tint_symbol.local_invocation_index); + return; +} diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x2/to_workgroup.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/unnested/mat4x2/to_workgroup.wgsl.expected.glsl new file mode 100644 index 0000000000..46f60b32f5 --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat4x2/to_workgroup.wgsl.expected.glsl @@ -0,0 +1,30 @@ +#version 310 es + +layout(binding = 0, std140) uniform u_block_std140_ubo { + vec2 inner_0; + vec2 inner_1; + vec2 inner_2; + vec2 inner_3; +} u; + +shared mat4x2 w; +mat4x2 load_u_inner() { + return mat4x2(u.inner_0, u.inner_1, u.inner_2, u.inner_3); +} + +void f(uint local_invocation_index) { + { + w = mat4x2(vec2(0.0f), vec2(0.0f), vec2(0.0f), vec2(0.0f)); + } + barrier(); + w = load_u_inner(); + w[1] = u.inner_0; + w[1] = u.inner_0.yx; + w[0][1] = u.inner_1[0u]; +} + +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void main() { + f(gl_LocalInvocationIndex); + return; +} diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x2/to_workgroup.wgsl.expected.msl b/test/tint/buffer/uniform/std140/unnested/mat4x2/to_workgroup.wgsl.expected.msl new file mode 100644 index 0000000000..6db4db261d --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat4x2/to_workgroup.wgsl.expected.msl @@ -0,0 +1,24 @@ +#include + +using namespace metal; +struct tint_symbol_5 { + float4x2 w; +}; + +void f_inner(uint local_invocation_index, threadgroup float4x2* const tint_symbol, const constant float4x2* const tint_symbol_1) { + { + *(tint_symbol) = float4x2(float2(0.0f), float2(0.0f), float2(0.0f), float2(0.0f)); + } + threadgroup_barrier(mem_flags::mem_threadgroup); + *(tint_symbol) = *(tint_symbol_1); + (*(tint_symbol))[1] = (*(tint_symbol_1))[0]; + (*(tint_symbol))[1] = float2((*(tint_symbol_1))[0]).yx; + (*(tint_symbol))[0][1] = (*(tint_symbol_1))[1][0]; +} + +kernel void f(const constant float4x2* tint_symbol_4 [[buffer(0)]], threadgroup tint_symbol_5* tint_symbol_3 [[threadgroup(0)]], uint local_invocation_index [[thread_index_in_threadgroup]]) { + threadgroup float4x2* const tint_symbol_2 = &((*(tint_symbol_3)).w); + f_inner(local_invocation_index, tint_symbol_2, tint_symbol_4); + return; +} + diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x2/to_workgroup.wgsl.expected.spvasm b/test/tint/buffer/uniform/std140/unnested/mat4x2/to_workgroup.wgsl.expected.spvasm new file mode 100644 index 0000000000..996a34367d --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat4x2/to_workgroup.wgsl.expected.spvasm @@ -0,0 +1,100 @@ +; SPIR-V +; Version: 1.3 +; Generator: Google Tint Compiler; 0 +; Bound: 65 +; Schema: 0 + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %f "f" %local_invocation_index_1 + OpExecutionMode %f LocalSize 1 1 1 + OpName %local_invocation_index_1 "local_invocation_index_1" + OpName %u_block_std140 "u_block_std140" + OpMemberName %u_block_std140 0 "inner_0" + OpMemberName %u_block_std140 1 "inner_1" + OpMemberName %u_block_std140 2 "inner_2" + OpMemberName %u_block_std140 3 "inner_3" + OpName %u "u" + OpName %w "w" + OpName %load_u_inner "load_u_inner" + OpName %f_inner "f_inner" + OpName %local_invocation_index "local_invocation_index" + OpName %f "f" + OpDecorate %local_invocation_index_1 BuiltIn LocalInvocationIndex + OpDecorate %u_block_std140 Block + OpMemberDecorate %u_block_std140 0 Offset 0 + OpMemberDecorate %u_block_std140 1 Offset 8 + OpMemberDecorate %u_block_std140 2 Offset 16 + OpMemberDecorate %u_block_std140 3 Offset 24 + OpDecorate %u NonWritable + OpDecorate %u DescriptorSet 0 + OpDecorate %u Binding 0 + %uint = OpTypeInt 32 0 +%_ptr_Input_uint = OpTypePointer Input %uint +%local_invocation_index_1 = OpVariable %_ptr_Input_uint Input + %float = OpTypeFloat 32 + %v2float = OpTypeVector %float 2 +%u_block_std140 = OpTypeStruct %v2float %v2float %v2float %v2float +%_ptr_Uniform_u_block_std140 = OpTypePointer Uniform %u_block_std140 + %u = OpVariable %_ptr_Uniform_u_block_std140 Uniform +%mat4v2float = OpTypeMatrix %v2float 4 +%_ptr_Workgroup_mat4v2float = OpTypePointer Workgroup %mat4v2float + %w = OpVariable %_ptr_Workgroup_mat4v2float Workgroup + %12 = OpTypeFunction %mat4v2float + %uint_0 = OpConstant %uint 0 +%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float + %uint_1 = OpConstant %uint 1 + %uint_2 = OpConstant %uint 2 + %uint_3 = OpConstant %uint 3 + %void = OpTypeVoid + %34 = OpTypeFunction %void %uint + %39 = OpConstantNull %mat4v2float + %uint_264 = OpConstant %uint 264 + %int = OpTypeInt 32 1 + %int_1 = OpConstant %int 1 +%_ptr_Workgroup_v2float = OpTypePointer Workgroup %v2float + %53 = OpConstantNull %int +%_ptr_Workgroup_float = OpTypePointer Workgroup %float + %56 = OpConstantNull %uint +%_ptr_Uniform_float = OpTypePointer Uniform %float + %60 = OpTypeFunction %void +%load_u_inner = OpFunction %mat4v2float None %12 + %14 = OpLabel + %19 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 + %20 = OpLoad %v2float %19 + %23 = OpAccessChain %_ptr_Uniform_v2float %u %uint_1 + %24 = OpLoad %v2float %23 + %27 = OpAccessChain %_ptr_Uniform_v2float %u %uint_2 + %28 = OpLoad %v2float %27 + %31 = OpAccessChain %_ptr_Uniform_v2float %u %uint_3 + %32 = OpLoad %v2float %31 + %33 = OpCompositeConstruct %mat4v2float %20 %24 %28 %32 + OpReturnValue %33 + OpFunctionEnd + %f_inner = OpFunction %void None %34 +%local_invocation_index = OpFunctionParameter %uint + %38 = OpLabel + OpStore %w %39 + OpControlBarrier %uint_2 %uint_2 %uint_264 + %42 = OpFunctionCall %mat4v2float %load_u_inner + OpStore %w %42 + %46 = OpAccessChain %_ptr_Workgroup_v2float %w %int_1 + %47 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 + %48 = OpLoad %v2float %47 + OpStore %46 %48 + %49 = OpAccessChain %_ptr_Workgroup_v2float %w %int_1 + %50 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 + %51 = OpLoad %v2float %50 + %52 = OpVectorShuffle %v2float %51 %51 1 0 + OpStore %49 %52 + %55 = OpAccessChain %_ptr_Workgroup_float %w %53 %int_1 + %58 = OpAccessChain %_ptr_Uniform_float %u %uint_1 %56 + %59 = OpLoad %float %58 + OpStore %55 %59 + OpReturn + OpFunctionEnd + %f = OpFunction %void None %60 + %62 = OpLabel + %64 = OpLoad %uint %local_invocation_index_1 + %63 = OpFunctionCall %void %f_inner %64 + OpReturn + OpFunctionEnd diff --git a/test/tint/buffer/uniform/std140/unnested/mat4x2/to_workgroup.wgsl.expected.wgsl b/test/tint/buffer/uniform/std140/unnested/mat4x2/to_workgroup.wgsl.expected.wgsl new file mode 100644 index 0000000000..1579614e0c --- /dev/null +++ b/test/tint/buffer/uniform/std140/unnested/mat4x2/to_workgroup.wgsl.expected.wgsl @@ -0,0 +1,11 @@ +@group(0) @binding(0) var u : mat4x2; + +var w : mat4x2; + +@compute @workgroup_size(1) +fn f() { + w = u; + w[1] = u[0]; + w[1] = u[0].yx; + w[0][1] = u[1][0]; +} diff --git a/test/tint/buffer/uniform/types/mat2x2.wgsl.expected.glsl b/test/tint/buffer/uniform/types/mat2x2.wgsl.expected.glsl index ae3c014f3b..4263f9affb 100644 --- a/test/tint/buffer/uniform/types/mat2x2.wgsl.expected.glsl +++ b/test/tint/buffer/uniform/types/mat2x2.wgsl.expected.glsl @@ -1,11 +1,16 @@ #version 310 es -layout(binding = 0, std140) uniform u_block_ubo { - mat2 inner; +layout(binding = 0, std140) uniform u_block_std140_ubo { + vec2 inner_0; + vec2 inner_1; } u; +mat2 load_u_inner() { + return mat2(u.inner_0, u.inner_1); +} + void tint_symbol() { - mat2 x = u.inner; + mat2 x = load_u_inner(); } layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; diff --git a/test/tint/buffer/uniform/types/mat2x2.wgsl.expected.spvasm b/test/tint/buffer/uniform/types/mat2x2.wgsl.expected.spvasm index dd16f09e53..8194735724 100644 --- a/test/tint/buffer/uniform/types/mat2x2.wgsl.expected.spvasm +++ b/test/tint/buffer/uniform/types/mat2x2.wgsl.expected.spvasm @@ -1,42 +1,48 @@ -SKIP: FAILED - ; SPIR-V ; Version: 1.3 ; Generator: Google Tint Compiler; 0 -; Bound: 16 +; Bound: 27 ; Schema: 0 OpCapability Shader OpMemoryModel Logical GLSL450 OpEntryPoint GLCompute %main "main" OpExecutionMode %main LocalSize 1 1 1 - OpName %u_block "u_block" - OpMemberName %u_block 0 "inner" + OpName %u_block_std140 "u_block_std140" + OpMemberName %u_block_std140 0 "inner_0" + OpMemberName %u_block_std140 1 "inner_1" OpName %u "u" + OpName %load_u_inner "load_u_inner" OpName %main "main" - OpDecorate %u_block Block - OpMemberDecorate %u_block 0 Offset 0 - OpMemberDecorate %u_block 0 ColMajor - OpMemberDecorate %u_block 0 MatrixStride 8 + OpDecorate %u_block_std140 Block + OpMemberDecorate %u_block_std140 0 Offset 0 + OpMemberDecorate %u_block_std140 1 Offset 8 OpDecorate %u NonWritable OpDecorate %u DescriptorSet 0 OpDecorate %u Binding 0 %float = OpTypeFloat 32 %v2float = OpTypeVector %float 2 +%u_block_std140 = OpTypeStruct %v2float %v2float +%_ptr_Uniform_u_block_std140 = OpTypePointer Uniform %u_block_std140 + %u = OpVariable %_ptr_Uniform_u_block_std140 Uniform %mat2v2float = OpTypeMatrix %v2float 2 - %u_block = OpTypeStruct %mat2v2float -%_ptr_Uniform_u_block = OpTypePointer Uniform %u_block - %u = OpVariable %_ptr_Uniform_u_block Uniform - %void = OpTypeVoid - %7 = OpTypeFunction %void + %6 = OpTypeFunction %mat2v2float %uint = OpTypeInt 32 0 %uint_0 = OpConstant %uint 0 -%_ptr_Uniform_mat2v2float = OpTypePointer Uniform %mat2v2float - %main = OpFunction %void None %7 - %10 = OpLabel - %14 = OpAccessChain %_ptr_Uniform_mat2v2float %u %uint_0 - %15 = OpLoad %mat2v2float %14 +%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float + %uint_1 = OpConstant %uint 1 + %void = OpTypeVoid + %22 = OpTypeFunction %void +%load_u_inner = OpFunction %mat2v2float None %6 + %9 = OpLabel + %15 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 + %16 = OpLoad %v2float %15 + %19 = OpAccessChain %_ptr_Uniform_v2float %u %uint_1 + %20 = OpLoad %v2float %19 + %21 = OpCompositeConstruct %mat2v2float %16 %20 + OpReturnValue %21 + OpFunctionEnd + %main = OpFunction %void None %22 + %25 = OpLabel + %26 = OpFunctionCall %mat2v2float %load_u_inner OpReturn OpFunctionEnd -1:1: Structure id 3 decorated as Block for variable in Uniform storage class must follow relaxed uniform buffer layout rules: member 0 is a matrix with stride 8 not satisfying alignment to 16 - %u_block = OpTypeStruct %mat2v2float - diff --git a/test/tint/buffer/uniform/types/mat3x2.wgsl.expected.glsl b/test/tint/buffer/uniform/types/mat3x2.wgsl.expected.glsl index 06a0a60802..85312c9c1d 100644 --- a/test/tint/buffer/uniform/types/mat3x2.wgsl.expected.glsl +++ b/test/tint/buffer/uniform/types/mat3x2.wgsl.expected.glsl @@ -1,11 +1,17 @@ #version 310 es -layout(binding = 0, std140) uniform u_block_ubo { - mat3x2 inner; +layout(binding = 0, std140) uniform u_block_std140_ubo { + vec2 inner_0; + vec2 inner_1; + vec2 inner_2; } u; +mat3x2 load_u_inner() { + return mat3x2(u.inner_0, u.inner_1, u.inner_2); +} + void tint_symbol() { - mat3x2 x = u.inner; + mat3x2 x = load_u_inner(); } layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; diff --git a/test/tint/buffer/uniform/types/mat3x2.wgsl.expected.spvasm b/test/tint/buffer/uniform/types/mat3x2.wgsl.expected.spvasm index efa01c7ab5..98050d5e98 100644 --- a/test/tint/buffer/uniform/types/mat3x2.wgsl.expected.spvasm +++ b/test/tint/buffer/uniform/types/mat3x2.wgsl.expected.spvasm @@ -1,42 +1,53 @@ -SKIP: FAILED - ; SPIR-V ; Version: 1.3 ; Generator: Google Tint Compiler; 0 -; Bound: 16 +; Bound: 31 ; Schema: 0 OpCapability Shader OpMemoryModel Logical GLSL450 OpEntryPoint GLCompute %main "main" OpExecutionMode %main LocalSize 1 1 1 - OpName %u_block "u_block" - OpMemberName %u_block 0 "inner" + OpName %u_block_std140 "u_block_std140" + OpMemberName %u_block_std140 0 "inner_0" + OpMemberName %u_block_std140 1 "inner_1" + OpMemberName %u_block_std140 2 "inner_2" OpName %u "u" + OpName %load_u_inner "load_u_inner" OpName %main "main" - OpDecorate %u_block Block - OpMemberDecorate %u_block 0 Offset 0 - OpMemberDecorate %u_block 0 ColMajor - OpMemberDecorate %u_block 0 MatrixStride 8 + OpDecorate %u_block_std140 Block + OpMemberDecorate %u_block_std140 0 Offset 0 + OpMemberDecorate %u_block_std140 1 Offset 8 + OpMemberDecorate %u_block_std140 2 Offset 16 OpDecorate %u NonWritable OpDecorate %u DescriptorSet 0 OpDecorate %u Binding 0 %float = OpTypeFloat 32 %v2float = OpTypeVector %float 2 +%u_block_std140 = OpTypeStruct %v2float %v2float %v2float +%_ptr_Uniform_u_block_std140 = OpTypePointer Uniform %u_block_std140 + %u = OpVariable %_ptr_Uniform_u_block_std140 Uniform %mat3v2float = OpTypeMatrix %v2float 3 - %u_block = OpTypeStruct %mat3v2float -%_ptr_Uniform_u_block = OpTypePointer Uniform %u_block - %u = OpVariable %_ptr_Uniform_u_block Uniform - %void = OpTypeVoid - %7 = OpTypeFunction %void + %6 = OpTypeFunction %mat3v2float %uint = OpTypeInt 32 0 %uint_0 = OpConstant %uint 0 -%_ptr_Uniform_mat3v2float = OpTypePointer Uniform %mat3v2float - %main = OpFunction %void None %7 - %10 = OpLabel - %14 = OpAccessChain %_ptr_Uniform_mat3v2float %u %uint_0 - %15 = OpLoad %mat3v2float %14 +%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float + %uint_1 = OpConstant %uint 1 + %uint_2 = OpConstant %uint 2 + %void = OpTypeVoid + %26 = OpTypeFunction %void +%load_u_inner = OpFunction %mat3v2float None %6 + %9 = OpLabel + %15 = OpAccessChain %_ptr_Uniform_v2float %u %uint_0 + %16 = OpLoad %v2float %15 + %19 = OpAccessChain %_ptr_Uniform_v2float %u %uint_1 + %20 = OpLoad %v2float %19 + %23 = OpAccessChain %_ptr_Uniform_v2float %u %uint_2 + %24 = OpLoad %v2float %23 + %25 = OpCompositeConstruct %mat3v2float %16 %20 %24 + OpReturnValue %25 + OpFunctionEnd + %main = OpFunction %void None %26 + %29 = OpLabel + %30 = OpFunctionCall %mat3v2float %load_u_inner OpReturn OpFunctionEnd -1:1: Structure id 3 decorated as Block for variable in Uniform storage class must follow relaxed uniform buffer layout rules: member 0 is a matrix with stride 8 not satisfying alignment to 16 - %u_block = OpTypeStruct %mat3v2float - diff --git a/test/tint/bug/tint/403.wgsl.expected.glsl b/test/tint/bug/tint/403.wgsl.expected.glsl index 38d12caca5..76fc2c60e5 100644 --- a/test/tint/bug/tint/403.wgsl.expected.glsl +++ b/test/tint/bug/tint/403.wgsl.expected.glsl @@ -1,13 +1,5 @@ #version 310 es -struct vertexUniformBuffer1 { - mat2 transform1; -}; - -struct vertexUniformBuffer2 { - mat2 transform2; -}; - layout(binding = 0, std140) uniform vertexUniformBuffer1_std140_ubo { vec2 transform1_0; vec2 transform1_1; diff --git a/test/tint/bug/tint/403.wgsl.expected.spvasm b/test/tint/bug/tint/403.wgsl.expected.spvasm index 5e79202e5e..623c850a47 100644 --- a/test/tint/bug/tint/403.wgsl.expected.spvasm +++ b/test/tint/bug/tint/403.wgsl.expected.spvasm @@ -1,7 +1,7 @@ ; SPIR-V ; Version: 1.3 ; Generator: Google Tint Compiler; 0 -; Bound: 76 +; Bound: 82 ; Schema: 0 OpCapability Shader OpMemoryModel Logical GLSL450 @@ -62,66 +62,66 @@ %uint_0 = OpConstant %uint 0 %_ptr_Uniform_v2float = OpTypePointer Uniform %v2float %uint_1 = OpConstant %uint 1 - %38 = OpTypeFunction %v4float %uint + %44 = OpTypeFunction %v4float %uint %uint_3 = OpConstant %uint 3 %_arr_v2float_uint_3 = OpTypeArray %v2float %uint_3 %_ptr_Function__arr_v2float_uint_3 = OpTypePointer Function %_arr_v2float_uint_3 - %46 = OpConstantNull %_arr_v2float_uint_3 + %52 = OpConstantNull %_arr_v2float_uint_3 %float_n1 = OpConstant %float -1 %float_1 = OpConstant %float 1 - %51 = OpConstantComposite %v2float %float_n1 %float_1 - %52 = OpConstantComposite %v2float %float_1 %float_1 - %53 = OpConstantComposite %v2float %float_n1 %float_n1 - %54 = OpConstantComposite %_arr_v2float_uint_3 %51 %52 %53 + %57 = OpConstantComposite %v2float %float_n1 %float_1 + %58 = OpConstantComposite %v2float %float_1 %float_1 + %59 = OpConstantComposite %v2float %float_n1 %float_n1 + %60 = OpConstantComposite %_arr_v2float_uint_3 %57 %58 %59 %_ptr_Function_v2float = OpTypePointer Function %v2float - %58 = OpConstantNull %uint + %64 = OpConstantNull %uint %void = OpTypeVoid - %70 = OpTypeFunction %void + %76 = OpTypeFunction %void %load_x_20_transform1 = OpFunction %mat2v2float None %19 %22 = OpLabel - %25 = OpAccessChain %_ptr_Uniform_v2float %x_20 %uint_0 - %26 = OpLoad %v2float %25 - %28 = OpAccessChain %_ptr_Uniform_v2float %x_20 %uint_1 - %29 = OpLoad %v2float %28 - %30 = OpCompositeConstruct %mat2v2float %26 %29 - OpReturnValue %30 + %27 = OpAccessChain %_ptr_Uniform_v2float %x_20 %uint_0 + %28 = OpLoad %v2float %27 + %31 = OpAccessChain %_ptr_Uniform_v2float %x_20 %uint_1 + %32 = OpLoad %v2float %31 + %33 = OpCompositeConstruct %mat2v2float %28 %32 + OpReturnValue %33 OpFunctionEnd %load_x_26_transform2 = OpFunction %mat2v2float None %19 - %32 = OpLabel - %33 = OpAccessChain %_ptr_Uniform_v2float %x_26 %uint_0 - %34 = OpLoad %v2float %33 - %35 = OpAccessChain %_ptr_Uniform_v2float %x_26 %uint_1 - %36 = OpLoad %v2float %35 - %37 = OpCompositeConstruct %mat2v2float %34 %36 - OpReturnValue %37 + %35 = OpLabel + %38 = OpAccessChain %_ptr_Uniform_v2float %x_26 %uint_0 + %39 = OpLoad %v2float %38 + %41 = OpAccessChain %_ptr_Uniform_v2float %x_26 %uint_1 + %42 = OpLoad %v2float %41 + %43 = OpCompositeConstruct %mat2v2float %39 %42 + OpReturnValue %43 OpFunctionEnd - %main_inner = OpFunction %v4float None %38 + %main_inner = OpFunction %v4float None %44 %gl_VertexIndex = OpFunctionParameter %uint - %41 = OpLabel - %indexable = OpVariable %_ptr_Function__arr_v2float_uint_3 Function %46 - %47 = OpFunctionCall %mat2v2float %load_x_20_transform1 - %48 = OpFunctionCall %mat2v2float %load_x_26_transform2 - OpStore %indexable %54 - %56 = OpAccessChain %_ptr_Function_v2float %indexable %gl_VertexIndex - %57 = OpLoad %v2float %56 - %59 = OpCompositeExtract %v2float %47 0 - %60 = OpCompositeExtract %v2float %48 0 - %61 = OpFAdd %v2float %59 %60 - %62 = OpCompositeExtract %v2float %47 1 - %63 = OpCompositeExtract %v2float %48 1 - %64 = OpFAdd %v2float %62 %63 - %65 = OpCompositeConstruct %mat2v2float %61 %64 - %66 = OpMatrixTimesVector %v2float %65 %57 - %67 = OpCompositeExtract %float %66 0 - %68 = OpCompositeExtract %float %66 1 - %69 = OpCompositeConstruct %v4float %67 %68 %11 %float_1 - OpReturnValue %69 + %47 = OpLabel + %indexable = OpVariable %_ptr_Function__arr_v2float_uint_3 Function %52 + %53 = OpFunctionCall %mat2v2float %load_x_20_transform1 + %54 = OpFunctionCall %mat2v2float %load_x_26_transform2 + OpStore %indexable %60 + %62 = OpAccessChain %_ptr_Function_v2float %indexable %gl_VertexIndex + %63 = OpLoad %v2float %62 + %65 = OpCompositeExtract %v2float %53 0 + %66 = OpCompositeExtract %v2float %54 0 + %67 = OpFAdd %v2float %65 %66 + %68 = OpCompositeExtract %v2float %53 1 + %69 = OpCompositeExtract %v2float %54 1 + %70 = OpFAdd %v2float %68 %69 + %71 = OpCompositeConstruct %mat2v2float %67 %70 + %72 = OpMatrixTimesVector %v2float %71 %63 + %73 = OpCompositeExtract %float %72 0 + %74 = OpCompositeExtract %float %72 1 + %75 = OpCompositeConstruct %v4float %73 %74 %11 %float_1 + OpReturnValue %75 OpFunctionEnd - %main = OpFunction %void None %70 - %73 = OpLabel - %75 = OpLoad %uint %gl_VertexIndex_1 - %74 = OpFunctionCall %v4float %main_inner %75 - OpStore %value %74 + %main = OpFunction %void None %76 + %79 = OpLabel + %81 = OpLoad %uint %gl_VertexIndex_1 + %80 = OpFunctionCall %v4float %main_inner %81 + OpStore %value %80 OpStore %vertex_point_size %float_1 OpReturn OpFunctionEnd diff --git a/test/tint/expressions/binary/mul/mat3x2-vec3/f32.wgsl.expected.glsl b/test/tint/expressions/binary/mul/mat3x2-vec3/f32.wgsl.expected.glsl index 8193622f9c..808bc8fa5e 100644 --- a/test/tint/expressions/binary/mul/mat3x2-vec3/f32.wgsl.expected.glsl +++ b/test/tint/expressions/binary/mul/mat3x2-vec3/f32.wgsl.expected.glsl @@ -1,11 +1,6 @@ #version 310 es precision mediump float; -struct S { - mat3x2 matrix; - vec3 vector; -}; - layout(binding = 0, std140) uniform S_std140_ubo { vec2 matrix_0; vec2 matrix_1; diff --git a/test/tint/expressions/binary/mul/mat3x2-vec3/f32.wgsl.expected.spvasm b/test/tint/expressions/binary/mul/mat3x2-vec3/f32.wgsl.expected.spvasm index 79f9c492c0..574781ee85 100644 --- a/test/tint/expressions/binary/mul/mat3x2-vec3/f32.wgsl.expected.spvasm +++ b/test/tint/expressions/binary/mul/mat3x2-vec3/f32.wgsl.expected.spvasm @@ -1,7 +1,7 @@ ; SPIR-V ; Version: 1.3 ; Generator: Google Tint Compiler; 0 -; Bound: 33 +; Bound: 37 ; Schema: 0 OpCapability Shader OpMemoryModel Logical GLSL450 @@ -37,25 +37,25 @@ %uint_1 = OpConstant %uint 1 %uint_2 = OpConstant %uint 2 %void = OpTypeVoid - %23 = OpTypeFunction %void + %27 = OpTypeFunction %void %uint_3 = OpConstant %uint 3 %_ptr_Uniform_v3float = OpTypePointer Uniform %v3float %load_data_matrix = OpFunction %mat3v2float None %7 %10 = OpLabel - %14 = OpAccessChain %_ptr_Uniform_v2float %data %uint_0 - %15 = OpLoad %v2float %14 - %17 = OpAccessChain %_ptr_Uniform_v2float %data %uint_1 - %18 = OpLoad %v2float %17 - %20 = OpAccessChain %_ptr_Uniform_v2float %data %uint_2 + %16 = OpAccessChain %_ptr_Uniform_v2float %data %uint_0 + %17 = OpLoad %v2float %16 + %20 = OpAccessChain %_ptr_Uniform_v2float %data %uint_1 %21 = OpLoad %v2float %20 - %22 = OpCompositeConstruct %mat3v2float %15 %18 %21 - OpReturnValue %22 + %24 = OpAccessChain %_ptr_Uniform_v2float %data %uint_2 + %25 = OpLoad %v2float %24 + %26 = OpCompositeConstruct %mat3v2float %17 %21 %25 + OpReturnValue %26 OpFunctionEnd - %main = OpFunction %void None %23 - %26 = OpLabel - %27 = OpFunctionCall %mat3v2float %load_data_matrix - %30 = OpAccessChain %_ptr_Uniform_v3float %data %uint_3 - %31 = OpLoad %v3float %30 - %32 = OpMatrixTimesVector %v2float %27 %31 + %main = OpFunction %void None %27 + %30 = OpLabel + %31 = OpFunctionCall %mat3v2float %load_data_matrix + %34 = OpAccessChain %_ptr_Uniform_v3float %data %uint_3 + %35 = OpLoad %v3float %34 + %36 = OpMatrixTimesVector %v2float %31 %35 OpReturn OpFunctionEnd