vk.layout.sbuffer.std430.hlsl 4.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. // Run: %dxc -T ps_6_0 -E main
  2. struct R { // Alignment Offset Size Next
  3. float2 rf; // 8(vec2) -> 0 + 8(vec2) = 8
  4. }; // 8 8 8
  5. struct S { // Alignment Offset Size Next
  6. R sf1; // 8 -> 0 + 8 = 8
  7. float sf2; // 4 -> 8 + 4 = 12
  8. float3 sf3; // 16(vec4) -> 16 (12 round up to vec4 alignment) + 12(vec3) = 28
  9. float sf4; // 4 -> 28 + 4 = 32
  10. }; // 16(max) 32
  11. struct T { // Alignment Offset Size = Next
  12. int tf1; // 4 -> 0 + 4 = 4
  13. R tf2[3]; // 8 -> 8 + 3 * stride(8) = 32
  14. float3x2 tf3; // 16(vec4) -> 32 (32 round up to vec4 alignment) + 2 * stride(vec4) = 64
  15. S tf4; // 16 -> 64 (64 round up to S alignment) + 32 = 96
  16. float tf5; // 4 -> 96 + 4 = 100
  17. }; // 16(max) 112(100 round up to T max alignment)
  18. struct SBuffer { // Alignment Offset Size Next
  19. bool a; // 4 -> 0 + 4 = 4
  20. uint1 b; // 4 -> 4 + 4 = 8
  21. float3 c; // 16(vec4) -> 16 (8 round up to vec4 alignment) + 3 * 4 = 28
  22. row_major float2x3 d; // 16(vec4) -> 32 (28 round up to vec4 alignment) + 2 * stride(vec4) = 64
  23. column_major float2x3 e; // 16(vec4) -> 64 (64 round up to vec2 alignment) + 3 * stride(vec2) = 88
  24. float2x1 f; // 8(vec2) -> 88 (88 round up to vec2 aligment) + 2 * 4 = 96
  25. row_major float2x3 g[3]; // 16(vec4) -> 96 (96 round up to vec4 alignment) + 3 * 2 * stride(vec4) = 192
  26. column_major float2x2 h[4]; // 16(vec4) -> 192 (192 round up to vec2 alignment) + 4 * 2 * stride(vec2) = 256
  27. T t; // 16 -> 256 (352 round up to T alignment) + 112 = 368
  28. float z; // 4 -> 368
  29. };
  30. StructuredBuffer<SBuffer> MySBuffer;
  31. // CHECK: OpDecorate %_arr_mat2v3float_uint_3 ArrayStride 32
  32. // CHECK: OpDecorate %_arr_mat2v2float_uint_4 ArrayStride 16
  33. // CHECK: OpMemberDecorate %R 0 Offset 0
  34. // CHECK: OpDecorate %_arr_R_uint_3 ArrayStride 8
  35. // CHECK: OpMemberDecorate %S 0 Offset 0
  36. // CHECK-NEXT: OpMemberDecorate %S 1 Offset 8
  37. // CHECK-NEXT: OpMemberDecorate %S 2 Offset 16
  38. // CHECK-NEXT: OpMemberDecorate %S 3 Offset 28
  39. // CHECK: OpMemberDecorate %T 0 Offset 0
  40. // CHECK-NEXT: OpMemberDecorate %T 1 Offset 8
  41. // CHECK-NEXT: OpMemberDecorate %T 2 Offset 32
  42. // CHECK-NEXT: OpMemberDecorate %T 2 MatrixStride 16
  43. // CHECK-NEXT: OpMemberDecorate %T 2 RowMajor
  44. // CHECK-NEXT: OpMemberDecorate %T 3 Offset 64
  45. // CHECK-NEXT: OpMemberDecorate %T 4 Offset 96
  46. // CHECK: OpMemberDecorate %SBuffer 0 Offset 0
  47. // CHECK-NEXT: OpMemberDecorate %SBuffer 1 Offset 4
  48. // CHECK-NEXT: OpMemberDecorate %SBuffer 2 Offset 16
  49. // CHECK-NEXT: OpMemberDecorate %SBuffer 3 Offset 32
  50. // CHECK-NEXT: OpMemberDecorate %SBuffer 3 MatrixStride 16
  51. // CHECK-NEXT: OpMemberDecorate %SBuffer 3 ColMajor
  52. // CHECK-NEXT: OpMemberDecorate %SBuffer 4 Offset 64
  53. // CHECK-NEXT: OpMemberDecorate %SBuffer 4 MatrixStride 8
  54. // CHECK-NEXT: OpMemberDecorate %SBuffer 4 RowMajor
  55. // CHECK-NEXT: OpMemberDecorate %SBuffer 5 Offset 88
  56. // CHECK-NEXT: OpMemberDecorate %SBuffer 6 Offset 96
  57. // CHECK-NEXT: OpMemberDecorate %SBuffer 6 MatrixStride 16
  58. // CHECK-NEXT: OpMemberDecorate %SBuffer 6 ColMajor
  59. // CHECK-NEXT: OpMemberDecorate %SBuffer 7 Offset 192
  60. // CHECK-NEXT: OpMemberDecorate %SBuffer 7 MatrixStride 8
  61. // CHECK-NEXT: OpMemberDecorate %SBuffer 7 RowMajor
  62. // CHECK-NEXT: OpMemberDecorate %SBuffer 8 Offset 256
  63. // CHECK-NEXT: OpMemberDecorate %SBuffer 9 Offset 368
  64. // CHECK: OpDecorate %_runtimearr_SBuffer ArrayStride 384
  65. // CHECK: OpMemberDecorate %type_StructuredBuffer_SBuffer 0 Offset 0
  66. // CHECK-NEXT: OpMemberDecorate %type_StructuredBuffer_SBuffer 0 NonWritable
  67. // CHECK-NEXT: OpDecorate %type_StructuredBuffer_SBuffer BufferBlock
  68. float main() : SV_Target {
  69. return 1.0;
  70. }