| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 |
- // Run: %dxc -T vs_6_0 -E main
- // TODO: collect consecutive OpAccessChains into one
- struct S {
- float f[4]; // nested array
- float g[4]; // nested array
- };
- // CHECK-LABLE: %src_main
- float main(float val: A, uint index: B) : C {
- float r;
- S var[8][16]; // struct element
- float4 vecvar[4]; // vector element
- float2x3 matvar[4]; // matrix element
- // CHECK: [[val:%\d+]] = OpLoad %float %val
- // CHECK-NEXT: [[idx:%\d+]] = OpLoad %uint %index
- // CHECK-NEXT: [[ptr0:%\d+]] = OpAccessChain %_ptr_Function_float %var [[idx]] %int_1 %int_0 %int_2
- // CHECK-NEXT: OpStore [[ptr0]] [[val]]
- var[index][1].f[2] = val;
- // CHECK-NEXT: [[idx0:%\d+]] = OpLoad %uint %index
- // CHECK-NEXT: [[idx1:%\d+]] = OpLoad %uint %index
- // CHECK: [[ptr0:%\d+]] = OpAccessChain %_ptr_Function_float %var %int_0 [[idx0]] %int_1 [[idx1]]
- // CHECK-NEXT: [[load:%\d+]] = OpLoad %float [[ptr0]]
- // CHECK-NEXT: OpStore %r [[load]]
- r = var[0][index].g[index];
- // CHECK: [[val:%\d+]] = OpLoad %float %val
- // CHECK-NEXT: [[vec2:%\d+]] = OpCompositeConstruct %v2float [[val]] [[val]]
- // CHECK-NEXT: [[ptr0:%\d+]] = OpAccessChain %_ptr_Function_v4float %vecvar %int_3
- // CHECK-NEXT: [[vec4:%\d+]] = OpLoad %v4float [[ptr0]]
- // CHECK-NEXT: [[res:%\d+]] = OpVectorShuffle %v4float [[vec4]] [[vec2]] 0 1 5 4
- // CHECK-NEXT: OpStore [[ptr0]] [[res]]
- vecvar[3].ab = val;
- // CHECK-NEXT: [[ptr2:%\d+]] = OpAccessChain %_ptr_Function_float %vecvar %int_2 %uint_1
- // CHECK-NEXT: [[load:%\d+]] = OpLoad %float [[ptr2]]
- // CHECK-NEXT: OpStore %r [[load]]
- r = vecvar[2][1];
- // CHECK: [[val:%\d+]] = OpLoad %float %val
- // CHECK-NEXT: [[vec2:%\d+]] = OpCompositeConstruct %v2float [[val]] [[val]]
- // CHECK-NEXT: [[ptr0:%\d+]] = OpAccessChain %_ptr_Function_mat2v3float %matvar %int_2
- // CHECK-NEXT: [[val0:%\d+]] = OpCompositeExtract %float [[vec2]] 0
- // CHECK-NEXT: [[ptr1:%\d+]] = OpAccessChain %_ptr_Function_float [[ptr0]] %int_0 %int_1
- // CHECK-NEXT: OpStore [[ptr1]] [[val0]]
- // CHECK-NEXT: [[val1:%\d+]] = OpCompositeExtract %float [[vec2]] 1
- // CHECK-NEXT: [[ptr2:%\d+]] = OpAccessChain %_ptr_Function_float [[ptr0]] %int_1 %int_2
- // CHECK-NEXT: OpStore [[ptr2]] [[val1]]
- matvar[2]._12_23 = val;
- // CHECK-NEXT: [[ptr4:%\d+]] = OpAccessChain %_ptr_Function_float %matvar %int_0 %uint_1 %uint_2
- // CHECK-NEXT: [[load:%\d+]] = OpLoad %float [[ptr4]]
- // CHECK-NEXT: OpStore %r [[load]]
- r = matvar[0][1][2];
- return r;
- }
|