vk.layout.sbuffer.nested.std430.hlsl 4.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. // Run: %dxc -T ps_6_0 -E main
  2. // Deep nested array of matrices
  3. // Depp nested majorness
  4. struct R { // Alignment Offset Size Next
  5. row_major float2x3 rf1[3]; // 16(vec4) -> 0 + 3(array) * stride(2 * 16(vec4)) = 96
  6. column_major float2x3 rf2[4]; // 8(vec2) -> 96 + 4(array) * stride(3 * 8(vec2)) = 192
  7. float2x3 rf3[2]; // 8(vec2) -> 192 + 2(array) * stride(3 * 8(vec2)) = 240
  8. int rf4; // 4 -> 240 + 4 = 244
  9. }; // 16(max) 256 (244 round up to R alignment)
  10. // Array of scalars, vectors, matrices, and structs
  11. struct S { // Alignment Offset Size Next
  12. float3 sf1[3]; // 16(vec4) -> 0 + 3(array) * 16(vec4) = 48
  13. float sf2[3]; // 4 -> 48 + 3(array) * 4 = 60
  14. R sf3[4]; // 16 -> 64 + 4(array) * stride(256) = 1088
  15. row_major float3x2 sf4[2]; // 8(vec2) -> 1088 + 2(array) * stride(3 * 8(vec2)) = 1136
  16. column_major float3x2 sf5[3]; // 16(vec4) -> 1136 + 3(array) * stride(2 * 16(vec4)) = 1232
  17. float3x2 sf6[4]; // 16(vec4) -> 1232 + 4(array) * stride(2 * 16(vec4)) = 1360
  18. float sf7; // 4 -> 1360 + 4 = 1364
  19. }; // 16(max) 1376 (1364 round up to S alignment)
  20. struct T { // Alignment Offset Size Next
  21. R tf1[2]; // 16 -> 0 + 2(array) * 256 = 512
  22. S tf2[3]; // 16 -> 512 + 3(array) * 1376 = 4640
  23. uint tf3; // 4 -> 4640 + 4 = 4644
  24. }; // 16(max) 4656 (4640 round up to T alignment)
  25. struct SBuffer { // Alignment Offset Size Next
  26. T t[2]; // 16 -> 0 + 2(array) * 4656 = 9312
  27. bool z; // 4 -> 9312
  28. };
  29. RWStructuredBuffer<SBuffer> MySBuffer;
  30. // CHECK: OpDecorate %_arr_mat2v3float_uint_3 ArrayStride 32
  31. // CHECK: OpDecorate %_arr_mat2v3float_uint_4 ArrayStride 24
  32. // CHECK: OpDecorate %_arr_mat2v3float_uint_2 ArrayStride 24
  33. // CHECK: OpMemberDecorate %R 0 Offset 0
  34. // CHECK-NEXT: OpMemberDecorate %R 0 MatrixStride 16
  35. // CHECK-NEXT: OpMemberDecorate %R 0 ColMajor
  36. // CHECK-NEXT: OpMemberDecorate %R 1 Offset 96
  37. // CHECK-NEXT: OpMemberDecorate %R 1 MatrixStride 8
  38. // CHECK-NEXT: OpMemberDecorate %R 1 RowMajor
  39. // CHECK-NEXT: OpMemberDecorate %R 2 Offset 192
  40. // CHECK-NEXT: OpMemberDecorate %R 2 MatrixStride 8
  41. // CHECK-NEXT: OpMemberDecorate %R 2 RowMajor
  42. // CHECK-NEXT: OpMemberDecorate %R 3 Offset 240
  43. // CHECK: OpDecorate %_arr_R_uint_2 ArrayStride 256
  44. // CHECK: OpDecorate %_arr_v3float_uint_3 ArrayStride 16
  45. // CHECK: OpDecorate %_arr_float_uint_3 ArrayStride 4
  46. // CHECK: OpDecorate %_arr_R_uint_4 ArrayStride 256
  47. // CHECK: OpDecorate %_arr_mat3v2float_uint_2 ArrayStride 24
  48. // CHECK: OpDecorate %_arr_mat3v2float_uint_3 ArrayStride 32
  49. // CHECK: OpDecorate %_arr_mat3v2float_uint_4 ArrayStride 32
  50. // CHECK: OpMemberDecorate %S 0 Offset 0
  51. // CHECK-NEXT: OpMemberDecorate %S 1 Offset 48
  52. // CHECK-NEXT: OpMemberDecorate %S 2 Offset 64
  53. // CHECK-NEXT: OpMemberDecorate %S 3 Offset 1088
  54. // CHECK-NEXT: OpMemberDecorate %S 3 MatrixStride 8
  55. // CHECK-NEXT: OpMemberDecorate %S 3 ColMajor
  56. // CHECK-NEXT: OpMemberDecorate %S 4 Offset 1136
  57. // CHECK-NEXT: OpMemberDecorate %S 4 MatrixStride 16
  58. // CHECK-NEXT: OpMemberDecorate %S 4 RowMajor
  59. // CHECK-NEXT: OpMemberDecorate %S 5 Offset 1232
  60. // CHECK-NEXT: OpMemberDecorate %S 5 MatrixStride 16
  61. // CHECK-NEXT: OpMemberDecorate %S 5 RowMajor
  62. // CHECK-NEXT: OpMemberDecorate %S 6 Offset 1360
  63. // CHECK: OpDecorate %_arr_S_uint_3 ArrayStride 1376
  64. // CHECK: OpMemberDecorate %T 0 Offset 0
  65. // CHECK-NEXT: OpMemberDecorate %T 1 Offset 512
  66. // CHECK-NEXT: OpMemberDecorate %T 2 Offset 4640
  67. // CHECK: OpDecorate %_arr_T_uint_2 ArrayStride 4656
  68. // CHECK-NEXT: OpMemberDecorate %SBuffer 0 Offset 0
  69. // CHECK-NEXT: OpMemberDecorate %SBuffer 1 Offset 9312
  70. // CHECK: OpDecorate %_runtimearr_SBuffer ArrayStride 9328
  71. // CHECK: OpMemberDecorate %type_RWStructuredBuffer_SBuffer 0 Offset 0
  72. // CHECK-NEXT: OpDecorate %type_RWStructuredBuffer_SBuffer BufferBlock
  73. float4 main() : SV_Target {
  74. return 1.0;
  75. }