Skip to content

Commit 5cecea9

Browse files
authored
[Test] add test for different matrix representations in refection (microsoft#5995)
Not all matrix representations could be generated with current dxc, so use IR test here. Fixes microsoft#5696
1 parent 079d6cb commit 5cecea9

6 files changed

+871
-0
lines changed
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
// RUN: %dxc %s -Tlib_6_x -Fo %t
2+
// RUN: %dxa %t -dumpreflection | FileCheck %s
3+
4+
// CHECK: ID3D12ShaderReflectionConstantBuffer:
5+
// CHECK-NEXT: D3D12_SHADER_BUFFER_DESC: Name: s
6+
// CHECK-NEXT: Type: D3D_CT_CBUFFER
7+
// CHECK-NEXT: Size: 288
8+
// CHECK-NEXT: uFlags: 0
9+
// CHECK-NEXT: Num Variables: 1
10+
// CHECK-NEXT: {
11+
// CHECK-NEXT: ID3D12ShaderReflectionVariable:
12+
// CHECK-NEXT: D3D12_SHADER_VARIABLE_DESC: Name: s
13+
// CHECK-NEXT: Size: 276
14+
// CHECK-NEXT: StartOffset: 0
15+
// CHECK-NEXT: uFlags: (D3D_SVF_USED)
16+
// CHECK-NEXT: DefaultValue: <nullptr>
17+
// CHECK-NEXT: ID3D12ShaderReflectionType:
18+
// CHECK-NEXT: D3D12_SHADER_TYPE_DESC: Name: S
19+
// CHECK-NEXT: Class: D3D_SVC_STRUCT
20+
// CHECK-NEXT: Type: D3D_SVT_VOID
21+
// CHECK-NEXT: Elements: 0
22+
// CHECK-NEXT: Rows: 1
23+
// CHECK-NEXT: Columns: 42
24+
// CHECK-NEXT: Members: 6
25+
// CHECK-NEXT: Offset: 0
26+
// CHECK-NEXT: {
27+
// CHECK-NEXT: ID3D12ShaderReflectionType:
28+
// CHECK-NEXT: D3D12_SHADER_TYPE_DESC: Name: int4x3
29+
// CHECK-NEXT: Class: D3D_SVC_MATRIX_ROWS
30+
// CHECK-NEXT: Type: D3D_SVT_INT
31+
// CHECK-NEXT: Elements: 0
32+
// CHECK-NEXT: Rows: 4
33+
// CHECK-NEXT: Columns: 3
34+
// CHECK-NEXT: Members: 0
35+
// CHECK-NEXT: Offset: 0
36+
// CHECK-NEXT: ID3D12ShaderReflectionType:
37+
// CHECK-NEXT: D3D12_SHADER_TYPE_DESC: Name: int1x3
38+
// CHECK-NEXT: Class: D3D_SVC_MATRIX_COLUMNS
39+
// CHECK-NEXT: Type: D3D_SVT_INT
40+
// CHECK-NEXT: Elements: 2
41+
// CHECK-NEXT: Rows: 1
42+
// CHECK-NEXT: Columns: 3
43+
// CHECK-NEXT: Members: 0
44+
// CHECK-NEXT: Offset: 64
45+
// CHECK-NEXT: ID3D12ShaderReflectionType:
46+
// CHECK-NEXT: D3D12_SHADER_TYPE_DESC: Name: int3x1
47+
// CHECK-NEXT: Class: D3D_SVC_MATRIX_COLUMNS
48+
// CHECK-NEXT: Type: D3D_SVT_INT
49+
// CHECK-NEXT: Elements: 0
50+
// CHECK-NEXT: Rows: 3
51+
// CHECK-NEXT: Columns: 1
52+
// CHECK-NEXT: Members: 0
53+
// CHECK-NEXT: Offset: 148
54+
// CHECK-NEXT: ID3D12ShaderReflectionType:
55+
// CHECK-NEXT: D3D12_SHADER_TYPE_DESC: Name: int4x3
56+
// CHECK-NEXT: Class: D3D_SVC_MATRIX_COLUMNS
57+
// CHECK-NEXT: Type: D3D_SVT_INT
58+
// CHECK-NEXT: Elements: 0
59+
// CHECK-NEXT: Rows: 4
60+
// CHECK-NEXT: Columns: 3
61+
// CHECK-NEXT: Members: 0
62+
// CHECK-NEXT: Offset: 160
63+
// CHECK-NEXT: ID3D12ShaderReflectionType:
64+
// CHECK-NEXT: D3D12_SHADER_TYPE_DESC: Name: int1x3
65+
// CHECK-NEXT: Class: D3D_SVC_MATRIX_ROWS
66+
// CHECK-NEXT: Type: D3D_SVT_INT
67+
// CHECK-NEXT: Elements: 2
68+
// CHECK-NEXT: Rows: 1
69+
// CHECK-NEXT: Columns: 3
70+
// CHECK-NEXT: Members: 0
71+
// CHECK-NEXT: Offset: 208
72+
// CHECK-NEXT: ID3D12ShaderReflectionType:
73+
// CHECK-NEXT: D3D12_SHADER_TYPE_DESC: Name: int3x1
74+
// CHECK-NEXT: Class: D3D_SVC_MATRIX_ROWS
75+
// CHECK-NEXT: Type: D3D_SVT_INT
76+
// CHECK-NEXT: Elements: 0
77+
// CHECK-NEXT: Rows: 3
78+
// CHECK-NEXT: Columns: 1
79+
// CHECK-NEXT: Members: 0
80+
// CHECK-NEXT: Offset: 240
81+
// CHECK-NEXT: }
82+
// CHECK-NEXT: CBuffer: s
83+
84+
struct S {
85+
row_major int4x3 m;
86+
int1x3 m1[2];
87+
int3x1 m2;
88+
int4x3 m3;
89+
row_major int1x3 m4[2];
90+
row_major int3x1 m5;
91+
};
92+
93+
ConstantBuffer<S> s;
94+
95+
96+
export
97+
float foo() {
98+
return s.m5[0];
99+
}
Lines changed: 155 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,155 @@
1+
; RUN: %dxa %s -o %t
2+
; RUN: %dxa %t -dumpreflection | FileCheck %s
3+
4+
; CHECK: ID3D12ShaderReflectionConstantBuffer:
5+
; CHECK-NEXT: D3D12_SHADER_BUFFER_DESC: Name: s
6+
; CHECK-NEXT: Type: D3D_CT_CBUFFER
7+
; CHECK-NEXT: Size: 288
8+
; CHECK-NEXT: uFlags: 0
9+
; CHECK-NEXT: Num Variables: 1
10+
; CHECK-NEXT: {
11+
; CHECK-NEXT: ID3D12ShaderReflectionVariable:
12+
; CHECK-NEXT: D3D12_SHADER_VARIABLE_DESC: Name: s
13+
; CHECK-NEXT: Size: 276
14+
; CHECK-NEXT: StartOffset: 0
15+
; CHECK-NEXT: uFlags: (D3D_SVF_USED)
16+
; CHECK-NEXT: DefaultValue: <nullptr>
17+
; CHECK-NEXT: ID3D12ShaderReflectionType:
18+
; CHECK-NEXT: D3D12_SHADER_TYPE_DESC: Name: S
19+
; CHECK-NEXT: Class: D3D_SVC_STRUCT
20+
; CHECK-NEXT: Type: D3D_SVT_VOID
21+
; CHECK-NEXT: Elements: 0
22+
; CHECK-NEXT: Rows: 1
23+
; CHECK-NEXT: Columns: 42
24+
; CHECK-NEXT: Members: 6
25+
; CHECK-NEXT: Offset: 0
26+
; CHECK-NEXT: {
27+
; CHECK-NEXT: ID3D12ShaderReflectionType:
28+
; CHECK-NEXT: D3D12_SHADER_TYPE_DESC: Name: int4x3
29+
; CHECK-NEXT: Class: D3D_SVC_MATRIX_ROWS
30+
; CHECK-NEXT: Type: D3D_SVT_INT
31+
; CHECK-NEXT: Elements: 0
32+
; CHECK-NEXT: Rows: 4
33+
; CHECK-NEXT: Columns: 3
34+
; CHECK-NEXT: Members: 0
35+
; CHECK-NEXT: Offset: 0
36+
; CHECK-NEXT: ID3D12ShaderReflectionType:
37+
; CHECK-NEXT: D3D12_SHADER_TYPE_DESC: Name: int1x3
38+
; CHECK-NEXT: Class: D3D_SVC_MATRIX_COLUMNS
39+
; CHECK-NEXT: Type: D3D_SVT_INT
40+
; CHECK-NEXT: Elements: 2
41+
; CHECK-NEXT: Rows: 1
42+
; CHECK-NEXT: Columns: 3
43+
; CHECK-NEXT: Members: 0
44+
; CHECK-NEXT: Offset: 64
45+
; CHECK-NEXT: ID3D12ShaderReflectionType:
46+
; CHECK-NEXT: D3D12_SHADER_TYPE_DESC: Name: int3x1
47+
; CHECK-NEXT: Class: D3D_SVC_MATRIX_COLUMNS
48+
; CHECK-NEXT: Type: D3D_SVT_INT
49+
; CHECK-NEXT: Elements: 0
50+
; CHECK-NEXT: Rows: 3
51+
; CHECK-NEXT: Columns: 1
52+
; CHECK-NEXT: Members: 0
53+
; CHECK-NEXT: Offset: 148
54+
; CHECK-NEXT: ID3D12ShaderReflectionType:
55+
; CHECK-NEXT: D3D12_SHADER_TYPE_DESC: Name: int4x3
56+
; CHECK-NEXT: Class: D3D_SVC_MATRIX_COLUMNS
57+
; CHECK-NEXT: Type: D3D_SVT_INT
58+
; CHECK-NEXT: Elements: 0
59+
; CHECK-NEXT: Rows: 4
60+
; CHECK-NEXT: Columns: 3
61+
; CHECK-NEXT: Members: 0
62+
; CHECK-NEXT: Offset: 160
63+
; CHECK-NEXT: ID3D12ShaderReflectionType:
64+
; CHECK-NEXT: D3D12_SHADER_TYPE_DESC: Name: int1x3
65+
; CHECK-NEXT: Class: D3D_SVC_MATRIX_ROWS
66+
; CHECK-NEXT: Type: D3D_SVT_INT
67+
; CHECK-NEXT: Elements: 2
68+
; CHECK-NEXT: Rows: 1
69+
; CHECK-NEXT: Columns: 3
70+
; CHECK-NEXT: Members: 0
71+
; CHECK-NEXT: Offset: 208
72+
; CHECK-NEXT: ID3D12ShaderReflectionType:
73+
; CHECK-NEXT: D3D12_SHADER_TYPE_DESC: Name: int3x1
74+
; CHECK-NEXT: Class: D3D_SVC_MATRIX_ROWS
75+
; CHECK-NEXT: Type: D3D_SVT_INT
76+
; CHECK-NEXT: Elements: 0
77+
; CHECK-NEXT: Rows: 3
78+
; CHECK-NEXT: Columns: 1
79+
; CHECK-NEXT: Members: 0
80+
; CHECK-NEXT: Offset: 240
81+
; CHECK-NEXT: }
82+
; CHECK-NEXT: CBuffer: s
83+
84+
85+
target datalayout = "e-m:e-p:32:32-i1:32-i8:32-i16:32-i32:32-i64:64-f16:32-f32:32-f64:64-n8:16:32:64"
86+
target triple = "dxil-ms-dx"
87+
88+
%dx.types.Handle = type { i8* }
89+
%dx.types.ResourceProperties = type { i32, i32 }
90+
%dx.types.CBufRet.i32 = type { i32, i32, i32, i32 }
91+
%s = type { %struct.S }
92+
93+
;struct S {
94+
; row_major int4x3 m;
95+
; int1x3 m1[2];
96+
; int3x1 m2;
97+
; int4x3 m3;
98+
; row_major int1x3 m4[2];
99+
; row_major int3x1 m5;
100+
;};
101+
102+
; Make sure cbuffer reflection is correct with
103+
; Vector as array: [rows x [cols x float]] and
104+
; Vector as array, one row: [cols x float] for m1.
105+
106+
%struct.S = type { [4 x [3 x i32]], [2 x [3 x i32]], [3 x i32], [4 x [3 x i32]], [2 x [3 x i32]], [3 x [1 x i32]] }
107+
108+
@s = external constant %dx.types.Handle
109+
110+
; Function Attrs: nounwind readonly
111+
define float @"\01?foo@@YAMXZ"() #0 {
112+
; force use cb.
113+
%1 = load %dx.types.Handle, %dx.types.Handle* @s, align 4
114+
ret float 1.000000e+00
115+
}
116+
117+
attributes #0 = { nounwind readonly }
118+
119+
!llvm.ident = !{!0}
120+
!dx.version = !{!1}
121+
!dx.valver = !{!2}
122+
!dx.shaderModel = !{!3}
123+
!dx.resources = !{!4}
124+
!dx.typeAnnotations = !{!7, !23}
125+
!dx.entryPoints = !{!28}
126+
127+
!0 = !{!"dxc"}
128+
!1 = !{i32 1, i32 8}
129+
!2 = !{i32 0, i32 0}
130+
!3 = !{!"lib", i32 6, i32 15}
131+
!4 = !{null, null, !5, null}
132+
!5 = !{!6}
133+
!6 = !{i32 0, %s* bitcast (%dx.types.Handle* @s to %s*), !"s", i32 -1, i32 -1, i32 1, i32 276, null}
134+
!7 = !{i32 0, %struct.S undef, !8, %s undef, !21}
135+
!8 = !{i32 276, !9, !11, !13, !15, !17, !19}
136+
!9 = !{i32 6, !"m", i32 2, !10, i32 3, i32 0, i32 7, i32 4}
137+
!10 = !{i32 4, i32 3, i32 1}
138+
!11 = !{i32 6, !"m1", i32 2, !12, i32 3, i32 64, i32 7, i32 4}
139+
!12 = !{i32 1, i32 3, i32 2}
140+
!13 = !{i32 6, !"m2", i32 2, !14, i32 3, i32 148, i32 7, i32 4}
141+
!14 = !{i32 3, i32 1, i32 2}
142+
!15 = !{i32 6, !"m3", i32 2, !16, i32 3, i32 160, i32 7, i32 4}
143+
!16 = !{i32 4, i32 3, i32 2}
144+
!17 = !{i32 6, !"m4", i32 2, !18, i32 3, i32 208, i32 7, i32 4}
145+
!18 = !{i32 1, i32 3, i32 1}
146+
!19 = !{i32 6, !"m5", i32 2, !20, i32 3, i32 240, i32 7, i32 4}
147+
!20 = !{i32 3, i32 1, i32 1}
148+
!21 = !{i32 276, !22}
149+
!22 = !{i32 6, !"s", i32 3, i32 0}
150+
!23 = !{i32 1, float ()* @"\01?foo@@YAMXZ", !24}
151+
!24 = !{!25}
152+
!25 = !{i32 1, !26, !27}
153+
!26 = !{i32 7, i32 9}
154+
!27 = !{}
155+
!28 = !{null, !"", null, !4, null}

0 commit comments

Comments
 (0)