Skip to content

Commit 78e736c

Browse files
committed
add load/str tests
1 parent 9eed041 commit 78e736c

File tree

2 files changed

+444
-0
lines changed

2 files changed

+444
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,231 @@
1+
// RUN: %dxc -DARR -DTYPE=float -DNUM=4 -DIX=SIx -T vs_6_6 %s | FileCheck %s
2+
// RUN: %dxc -DARR -DTYPE=bool -DNUM=4 -DIX=SIx -T vs_6_6 %s | FileCheck %s
3+
// RUN: %dxc -DARR -DTYPE=uint64_t -DNUM=2 -DIX=SIx -T vs_6_6 %s | FileCheck %s
4+
// RUN: %dxc -DARR -DTYPE=double -DNUM=2 -DIX=SIx -T vs_6_6 %s | FileCheck %s
5+
6+
// RUN: %dxc -DMAT -DTYPE=float -DNUM=2 -DIX=SIx -T vs_6_6 %s | FileCheck %s
7+
// RUN: %dxc -DMAT -DTYPE=uint64_t -DNUM=2 -DIX=SIx -T vs_6_6 %s | FileCheck %s
8+
// RUN: %dxc -DMAT -DTYPE=double -DNUM=2 -DIX=SIx -T vs_6_6 %s | FileCheck %s
9+
// RUN: %dxc -DMAT -DTYPE=float -DNUM=3 -DIX=SIx -T vs_6_6 %s | FileCheck %s --check-prefixes=CHECK,MAT
10+
// RUN: %dxc -DMAT -DTYPE=bool -DNUM=3 -DIX=SIx -T vs_6_6 %s | FileCheck %s --check-prefixes=CHECK,MAT
11+
// RUN: %dxc -DMAT -DTYPE=uint64_t -DNUM=3 -DIX=SIx -T vs_6_6 %s | FileCheck %s --check-prefixes=CHECK,MAT
12+
// RUN: %dxc -DMAT -DTYPE=double -DNUM=3 -DIX=SIx -T vs_6_6 %s | FileCheck %s --check-prefixes=CHECK,MAT
13+
14+
// RUN: %dxc -DTYPE=float -DNUM=4 -DIX=SIx -T vs_6_6 %s | FileCheck %s
15+
// RUN: %dxc -DTYPE=bool -DNUM=4 -DIX=SIx -T vs_6_6 %s | FileCheck %s
16+
// RUN: %dxc -DTYPE=uint64_t -DNUM=2 -DIX=SIx -T vs_6_6 %s | FileCheck %s
17+
// RUN: %dxc -DTYPE=double -DNUM=2 -DIX=SIx -T vs_6_6 %s | FileCheck %s
18+
19+
// RUN: %dxc -DOFF -DTYPE=float -DNUM=4 -DIX=SIx -T vs_6_6 %s | FileCheck %s --check-prefixes=CHECK,OFF
20+
// RUN: %dxc -DOFF -DTYPE=bool -DNUM=4 -DIX=SIx -T vs_6_6 %s | FileCheck %s --check-prefixes=CHECK,OFF
21+
// RUN: %dxc -DOFF -DTYPE=uint64_t -DNUM=2 -DIX=SIx -T vs_6_6 %s | FileCheck %s --check-prefixes=CHECK,OFF
22+
// RUN: %dxc -DOFF -DTYPE=double -DNUM=2 -DIX=SIx -T vs_6_6 %s | FileCheck %s --check-prefixes=CHECK,OFF
23+
24+
// RUN: %dxc -DARR -DTYPE=float -DNUM=4 -DIX=VIx -T vs_6_6 %s | FileCheck %s --check-prefixes=CHECK,VIX
25+
// RUN: %dxc -DARR -DTYPE=bool -DNUM=4 -DIX=VIx -T vs_6_6 %s | FileCheck %s --check-prefixes=CHECK,VIX
26+
// RUN: %dxc -DARR -DTYPE=uint64_t -DNUM=2 -DIX=VIx -T vs_6_6 %s | FileCheck %s --check-prefixes=CHECK,VIX
27+
// RUN: %dxc -DARR -DTYPE=double -DNUM=2 -DIX=VIx -T vs_6_6 %s | FileCheck %s --check-prefixes=CHECK,VIX
28+
29+
// RUN: %dxc -DTYPE=float -DNUM=4 -DIX=VIx -T vs_6_6 %s | FileCheck %s --check-prefixes=CHECK,VIX
30+
// RUN: %dxc -DTYPE=bool -DNUM=4 -DIX=VIx -T vs_6_6 %s | FileCheck %s --check-prefixes=CHECK,VIX
31+
// RUN: %dxc -DTYPE=uint64_t -DNUM=2 -DIX=VIx -T vs_6_6 %s | FileCheck %s --check-prefixes=CHECK,VIX
32+
// RUN: %dxc -DTYPE=double -DNUM=2 -DIX=VIx -T vs_6_6 %s | FileCheck %s --check-prefixes=CHECK,VIX
33+
34+
///////////////////////////////////////////////////////////////////////
35+
// Test codegen for various load and store operations and conversions
36+
// for different aggregate buffer types and indices.
37+
///////////////////////////////////////////////////////////////////////
38+
39+
40+
41+
// CHECK: %dx.types.ResRet.[[TY:[a-z][0-9][0-9]]] = type { [[TYPE:[a-z0-9]*]],
42+
43+
#if defined(ARR)
44+
#define TYNAME(T,N) T[N]
45+
#define DECL(T,N,V) T V[N]
46+
#elif defined(MAT)
47+
#define TYNAME(T,N) matrix< T, N, N >
48+
#define DECL(T,N,V) matrix< T, N, N > V
49+
#elif defined(OFF)
50+
#define TYNAME(T,N) OffVector< T, N >
51+
#define DECL(T,N,V) OffVector< T, N > V
52+
#else
53+
#define TYNAME(T,N) Vector< T, N >
54+
#define DECL(T,N,V) Vector< T, N > V
55+
#endif
56+
57+
template<typename T, int N>
58+
struct Vector {
59+
vector<T, N> v;
60+
Vector operator+(Vector vec) {
61+
Vector ret;
62+
ret.v = v + vec.v;
63+
return ret;
64+
}
65+
};
66+
67+
template<typename T, int N>
68+
struct OffVector {
69+
float4 pad1;
70+
double pad2;
71+
vector<T, N> v;
72+
OffVector operator+(OffVector vec) {
73+
OffVector ret;
74+
ret.pad1 = 0.0;
75+
ret.pad2 = 0.0;
76+
ret.v = v + vec.v;
77+
return ret;
78+
}
79+
};
80+
81+
ByteAddressBuffer RoByBuf : register(t1);
82+
RWByteAddressBuffer RwByBuf : register(u1);
83+
84+
StructuredBuffer< TYNAME(TYPE,NUM) > RoStBuf : register(t2);
85+
RWStructuredBuffer< TYNAME(TYPE,NUM) > RwStBuf : register(u2);
86+
87+
ConsumeStructuredBuffer< TYNAME(TYPE,NUM) > CnStBuf : register(u4);
88+
AppendStructuredBuffer< TYNAME(TYPE,NUM) > ApStBuf : register(u5);
89+
90+
TYPE Add(TYPE f1[NUM], TYPE f2[NUM])[NUM] {
91+
TYPE ret[NUM];
92+
for (int i = 0; i < NUM; i++)
93+
ret[i] = f1[i] + f2[i];
94+
return ret;
95+
}
96+
97+
template<typename T>
98+
T Add(T v1, T v2) { return v1 + v2; }
99+
100+
TYPE Add(TYPE f1[NUM], TYPE f2[NUM], TYPE f3[NUM], TYPE f4[NUM])[NUM] {
101+
TYPE ret[NUM];
102+
for (int i = 0; i < NUM; i++)
103+
ret[i] = f1[i] + f2[i] + f3[i] + f4[i];
104+
return ret;
105+
}
106+
107+
template<typename T>
108+
T Add(T v1, T v2, T v3, T v4) { return v1 + v2 + v3 + v4; }
109+
110+
void main(uint SIx[2] : SIX, uint1 VIx[2] : VIX) {
111+
// ByteAddressBuffer Tests
112+
113+
// CHECK-DAG: [[HDLROBY:%.*]] = call %dx.types.Handle @dx.op.createHandleFromBinding(i32 217, %dx.types.ResBind { i32 1, i32 1, i32 0, i8 0 }, i32 1, i1 false)
114+
// CHECK-DAG: [[HDLRWBY:%.*]] = call %dx.types.Handle @dx.op.createHandleFromBinding(i32 217, %dx.types.ResBind { i32 1, i32 1, i32 0, i8 1 }, i32 1, i1 false)
115+
116+
// CHECK-DAG: [[HDLROST:%.*]] = call %dx.types.Handle @dx.op.createHandleFromBinding(i32 217, %dx.types.ResBind { i32 2, i32 2, i32 0, i8 0 }, i32 2, i1 false)
117+
// CHECK-DAG: [[HDLRWST:%.*]] = call %dx.types.Handle @dx.op.createHandleFromBinding(i32 217, %dx.types.ResBind { i32 2, i32 2, i32 0, i8 1 }, i32 2, i1 false)
118+
119+
// CHECK-DAG: [[HDLCON:%.*]] = call %dx.types.Handle @dx.op.createHandleFromBinding(i32 217, %dx.types.ResBind { i32 4, i32 4, i32 0, i8 1 }, i32 4, i1 false)
120+
// CHECK-DAG: [[HDLAPP:%.*]] = call %dx.types.Handle @dx.op.createHandleFromBinding(i32 217, %dx.types.ResBind { i32 5, i32 5, i32 0, i8 1 }, i32 5, i1 false)
121+
122+
// CHECK-DAG: [[IX0:%.*]] = call i32 @dx.op.loadInput.i32(i32 4, i32 {{[0-9]*}}, i32 [[BOFF:0]]
123+
// CHECK-DAG: [[RIX0:%.*]] = call i32 @dx.op.loadInput.i32(i32 4, i32 {{[0-9]*}}, i32 [[BOFF]]
124+
125+
126+
// CHECK: [[ANHDLRWBY:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[HDLRWBY]]
127+
// OFF: [[RIX0:%.*]] = add i32 [[IX0]], [[BOFF:[0-9]+]]
128+
// CHECK: call %dx.types.ResRet.[[TY]] @dx.op.rawBufferLoad.[[TY]](i32 139, %dx.types.Handle [[ANHDLRWBY]], i32 [[RIX0]]
129+
// MAT: [[IX0p4:%.*]] = add i32 [[RIX0]], [[p4:[0-9]+]]
130+
// MAT: call %dx.types.ResRet.[[TY]] @dx.op.rawBufferLoad.[[TY]](i32 139, %dx.types.Handle [[ANHDLRWBY]], i32 [[IX0p4]]
131+
// MAT: [[IX0p8:%.*]] = add i32 [[RIX0]], [[p8:[0-9]+]]
132+
// MAT: call %dx.types.ResRet.[[TY]] @dx.op.rawBufferLoad.[[TY]](i32 139, %dx.types.Handle [[ANHDLRWBY]], i32 [[IX0p8]]
133+
// I1: icmp ne i32
134+
// I1: icmp ne i32
135+
// I1: icmp ne i32
136+
// I1: icmp ne i32
137+
DECL(TYPE,NUM,babElt1) = RwByBuf.Load< TYNAME(TYPE,NUM) >(IX[0]);
138+
139+
// CHECK: [[ANHDLROBY:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[HDLROBY]]
140+
// CHECK: call %dx.types.ResRet.[[TY]] @dx.op.rawBufferLoad.[[TY]](i32 139, %dx.types.Handle [[ANHDLROBY]], i32 [[RIX0]]
141+
// MAT: call %dx.types.ResRet.[[TY]] @dx.op.rawBufferLoad.[[TY]](i32 139, %dx.types.Handle [[ANHDLROBY]], i32 [[IX0p4]]
142+
// MAT: call %dx.types.ResRet.[[TY]] @dx.op.rawBufferLoad.[[TY]](i32 139, %dx.types.Handle [[ANHDLROBY]], i32 [[IX0p8]]
143+
// I1: icmp ne i32 %{{.*}}, 0
144+
// I1: icmp ne i32 %{{.*}}, 0
145+
// I1: icmp ne i32 %{{.*}}, 0
146+
// I1: icmp ne i32 %{{.*}}, 0
147+
DECL(TYPE,NUM,babElt2) = RoByBuf.Load< TYNAME(TYPE,NUM) >(IX[0]);
148+
149+
// I1: zext i1 %{{.*}} to i32
150+
// I1: zext i1 %{{.*}} to i32
151+
// I1: zext i1 %{{.*}} to i32
152+
// I1: zext i1 %{{.*}} to i32
153+
// OFF: call void @dx.op.rawBufferStore.f32(i32 140, %dx.types.Handle [[ANHDLRWBY]], i32 {{%.*}}, i32 undef, float 0.0
154+
// OFF: call void @dx.op.rawBufferStore.f64(i32 140, %dx.types.Handle [[ANHDLRWBY]], i32 {{%.*}}, i32 undef, double 0.0
155+
// CHECK: call void @dx.op.rawBufferStore.[[TY]](i32 140, %dx.types.Handle [[ANHDLRWBY]], i32 [[RIX0]]
156+
// MAT: call void @dx.op.rawBufferStore.[[TY]](i32 140, %dx.types.Handle [[ANHDLRWBY]], i32 [[IX0p4]]
157+
// MAT: call void @dx.op.rawBufferStore.[[TY]](i32 140, %dx.types.Handle [[ANHDLRWBY]], i32 [[IX0p8]]
158+
RwByBuf.Store< TYNAME(TYPE,NUM) >(IX[0], Add(babElt1, babElt2));
159+
160+
// StructuredBuffer Tests
161+
// CHECK: [[ANHDLRWST:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[HDLRWST]]
162+
// CHECK: call %dx.types.ResRet.[[TY]] @dx.op.rawBufferLoad.[[TY]](i32 139, %dx.types.Handle [[ANHDLRWST]], i32 [[IX0]], i32 [[BOFF]]
163+
// I1: icmp ne i32 %{{.*}}, 0
164+
// I1: icmp ne i32 %{{.*}}, 0
165+
// I1: icmp ne i32 %{{.*}}, 0
166+
// I1: icmp ne i32 %{{.*}}, 0
167+
DECL(TYPE,NUM,stbElt1) = RwStBuf.Load(IX[0]);
168+
// CHECK: [[IX1:%.*]] = call i32 @dx.op.loadInput.i32(i32 4,
169+
// CHECK: call %dx.types.ResRet.[[TY]] @dx.op.rawBufferLoad.[[TY]](i32 139, %dx.types.Handle [[ANHDLRWST]], i32 [[IX1]], i32 [[BOFF]]
170+
// I1: icmp ne i32 %{{.*}}, 0
171+
// I1: icmp ne i32 %{{.*}}, 0
172+
// I1: icmp ne i32 %{{.*}}, 0
173+
// I1: icmp ne i32 %{{.*}}, 0
174+
DECL(TYPE,NUM,stbElt2) = RwStBuf[IX[1]];
175+
176+
// CHECK: [[ANHDLROST:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[HDLROST]]
177+
// CHECK: call %dx.types.ResRet.[[TY]] @dx.op.rawBufferLoad.[[TY]](i32 139, %dx.types.Handle [[ANHDLROST]], i32 [[IX0]], i32 [[BOFF]]
178+
// MAT: call %dx.types.ResRet.[[TY]] @dx.op.rawBufferLoad.[[TY]](i32 139, %dx.types.Handle [[ANHDLROST]], i32 [[IX0]], i32 [[p4]]
179+
// MAT: call %dx.types.ResRet.[[TY]] @dx.op.rawBufferLoad.[[TY]](i32 139, %dx.types.Handle [[ANHDLROST]], i32 [[IX0]], i32 [[p8]]
180+
// I1: icmp ne i32 %{{.*}}, 0
181+
// I1: icmp ne i32 %{{.*}}, 0
182+
// I1: icmp ne i32 %{{.*}}, 0
183+
// I1: icmp ne i32 %{{.*}}, 0
184+
DECL(TYPE,NUM,stbElt3) = RoStBuf.Load(IX[0]);
185+
// CHECK: call %dx.types.ResRet.[[TY]] @dx.op.rawBufferLoad.[[TY]](i32 139, %dx.types.Handle [[ANHDLROST]], i32 [[IX1]], i32 [[BOFF]]
186+
// MAT: call %dx.types.ResRet.[[TY]] @dx.op.rawBufferLoad.[[TY]](i32 139, %dx.types.Handle [[ANHDLROST]], i32 [[IX1]], i32 [[p4]]
187+
// MAT: call %dx.types.ResRet.[[TY]] @dx.op.rawBufferLoad.[[TY]](i32 139, %dx.types.Handle [[ANHDLROST]], i32 [[IX1]], i32 [[p8]]
188+
// I1: icmp ne i32 %{{.*}}, 0
189+
// I1: icmp ne i32 %{{.*}}, 0
190+
// I1: icmp ne i32 %{{.*}}, 0
191+
// I1: icmp ne i32 %{{.*}}, 0
192+
DECL(TYPE,NUM,stbElt4) = RoStBuf[IX[1]];
193+
194+
// I1: zext i1 %{{.*}} to i32
195+
// I1: zext i1 %{{.*}} to i32
196+
// I1: zext i1 %{{.*}} to i32
197+
// I1: zext i1 %{{.*}} to i32
198+
// OFF: call void @dx.op.rawBufferStore.f32(i32 140, %dx.types.Handle [[ANHDLRWST]], i32 [[IX0]], i32 0, float 0.0
199+
// OFF: call void @dx.op.rawBufferStore.f64(i32 140, %dx.types.Handle [[ANHDLRWST]], i32 [[IX0]], i32 16, double 0.0
200+
// CHECK: call void @dx.op.rawBufferStore.[[TY]](i32 140, %dx.types.Handle [[ANHDLRWST]], i32 [[IX0]], i32 [[BOFF]]
201+
// MAT: call void @dx.op.rawBufferStore.[[TY]](i32 140, %dx.types.Handle [[ANHDLRWST]], i32 [[IX0]], i32 [[p4]]
202+
// MAT: call void @dx.op.rawBufferStore.[[TY]](i32 140, %dx.types.Handle [[ANHDLRWST]], i32 [[IX0]], i32 [[p8]]
203+
RwStBuf[IX[0]] = Add(stbElt1, stbElt2, stbElt3, stbElt4);
204+
205+
// {Append/Consume}StructuredBuffer Tests
206+
// CHECK: [[ANHDLCON:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[HDLCON]]
207+
// CHECK: [[CONIX:%.*]] = call i32 @dx.op.bufferUpdateCounter(i32 70, %dx.types.Handle [[ANHDLCON]], i8 -1)
208+
// OFF: call %dx.types.ResRet.f32 @dx.op.rawBufferLoad.f32(i32 139, %dx.types.Handle [[ANHDLCON]], i32 [[CONIX]], i32
209+
// OFF: call %dx.types.ResRet.f64 @dx.op.rawBufferLoad.f64(i32 139, %dx.types.Handle [[ANHDLCON]], i32 [[CONIX]], i32 16
210+
// CHECK: call %dx.types.ResRet.[[TY]] @dx.op.rawBufferLoad.[[TY]](i32 139, %dx.types.Handle [[ANHDLCON]], i32 [[CONIX]], i32 [[BOFF]]
211+
// MAT: call %dx.types.ResRet.[[TY]] @dx.op.rawBufferLoad.[[TY]](i32 139, %dx.types.Handle [[ANHDLCON]], i32 [[CONIX]], i32 [[p4]]
212+
// MAT: call %dx.types.ResRet.[[TY]] @dx.op.rawBufferLoad.[[TY]](i32 139, %dx.types.Handle [[ANHDLCON]], i32 [[CONIX]], i32 [[p8]]
213+
// I1: icmp ne i32 %{{.*}}, 0
214+
// I1: icmp ne i32 %{{.*}}, 0
215+
// I1: icmp ne i32 %{{.*}}, 0
216+
// I1: icmp ne i32 %{{.*}}, 0
217+
DECL(TYPE,NUM,cnElt) = CnStBuf.Consume();
218+
219+
// CHECK: [[ANHDLAPP:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[HDLAPP]]
220+
// CHECK: [[APPIX:%.*]] = call i32 @dx.op.bufferUpdateCounter(i32 70, %dx.types.Handle [[ANHDLAPP]], i8 1)
221+
// I1: zext i1 %{{.*}} to i32
222+
// I1: zext i1 %{{.*}} to i32
223+
// I1: zext i1 %{{.*}} to i32
224+
// I1: zext i1 %{{.*}} to i32
225+
// OFF: call void @dx.op.rawBufferStore.f32(i32 140, %dx.types.Handle [[ANHDLAPP]], i32 [[APPIX]], i32 0
226+
// OFF: call void @dx.op.rawBufferStore.f64(i32 140, %dx.types.Handle [[ANHDLAPP]], i32 [[APPIX]], i32 16
227+
// CHECK: call void @dx.op.rawBufferStore.[[TY]](i32 140, %dx.types.Handle [[ANHDLAPP]], i32 [[APPIX]], i32 [[BOFF]]
228+
// MAT: call void @dx.op.rawBufferStore.[[TY]](i32 140, %dx.types.Handle [[ANHDLAPP]], i32 [[APPIX]], i32 [[p4]]
229+
// MAT: call void @dx.op.rawBufferStore.[[TY]](i32 140, %dx.types.Handle [[ANHDLAPP]], i32 [[APPIX]], i32 [[p8]]
230+
ApStBuf.Append(cnElt);
231+
}

0 commit comments

Comments
 (0)