yum-mirror/slang

Making it easier to work with shaders

git clone https://git.yummers.dev/yum-mirror/slang

Sami Kiminki (NVIDIA)8503 wgsl depth texture (#8645)5c672cef1

master
15.2 KiB427 linesraw
1//DISABLE_TEST(compute):COMPARE_COMPUTE_EX:-cpu -compute -shaderobj -output-using-type
2//TEST(compute):COMPARE_COMPUTE_EX(filecheck-buffer=DX11):-slang -compute -dx11 -shaderobj -output-using-type -render-feature hardware-device
3//TEST(compute):COMPARE_COMPUTE_EX(filecheck-buffer=DX12):-slang -compute -dx12 -shaderobj -output-using-type
4//TEST(compute):COMPARE_COMPUTE_EX(filecheck-buffer=DX12CS6):-slang -compute -dx12 -profile cs_6_0 -shaderobj -output-using-type -xslang -DCS60
5//TEST(compute, vulkan):COMPARE_COMPUTE_EX(filecheck-buffer=VK):-vk -emit-spirv-directly -compute -shaderobj -output-using-type -render-feature hardware-device -xslang -DVK
6//DISABLE_TEST(compute):COMPARE_COMPUTE_EX:-cuda -compute -shaderobj -output-using-type
7
8//TEST_INPUT: Texture1D(size=4, format=D32Float, content = one):name t1D
9Texture1D<float> t1D;
10//TEST_INPUT: Texture2D(size=4, format=D32Float, content = one):name t2D
11Texture2D<float> t2D;
12//TEST_INPUT: Texture3D(size=4, format=D32Float, content = one):name t3D
13Texture3D<float> t3D;
14//TEST_INPUT: TextureCube(size=4, format=D32Float, content = one):name tCube
15TextureCube<float> tCube;
16
17//TEST_INPUT: Texture1D(size=4, format=D32Float, content = one, arrayLength=2):name t1DArray
18Texture1DArray<float> t1DArray;
19//TEST_INPUT: Texture2D(size=4, format=D32Float, content = one, arrayLength=2):name t2DArray
20Texture2DArray<float> t2DArray;
21//TEST_INPUT: TextureCube(size=4, format=D32Float, content = one, arrayLength=2):name tCubeArray
22TextureCubeArray<float> tCubeArray;
23
24//TEST_INPUT: Texture2D(size=4, content = one):name t2D_RGBA
25Texture2D<float> t2D_RGBA;
26//TEST_INPUT: Texture2D(size=4, content = one, arrayLength=2):name t2DArray_RGBA
27Texture2DArray<float> t2DArray_RGBA;
28//TEST_INPUT: TextureCube(size=4, content = one):name tCube_RGBA
29TextureCube<float> tCube_RGBA;
30//TEST_INPUT: TextureCube(size=4, content = one, arrayLength=2):name tCubeArray_RGBA
31TextureCubeArray<float> tCubeArray_RGBA;
32
33//TEST_INPUT: Texture1D(size=4, format=D32Float, content = one):name d1D
34DepthTexture1D d1D;
35//TEST_INPUT: Texture2D(size=4, format=D32Float, content = one):name d2D
36DepthTexture2D d2D;
37//TEST_INPUT: Texture3D(size=4, format=D32Float, content = one):name d3D
38DepthTexture3D d3D;
39//TEST_INPUT: TextureCube(size=4, format=D32Float, content = one):name dCube
40DepthTextureCube dCube;
41
42//TEST_INPUT: Texture1D(size=4, format=D32Float, content = one, arrayLength=2):name d1DArray
43DepthTexture1DArray d1DArray;
44//TEST_INPUT: Texture2D(size=4, format=D32Float, content = one, arrayLength=2):name d2DArray
45DepthTexture2DArray d2DArray;
46//TEST_INPUT: TextureCube(size=4, format=D32Float, content = one, arrayLength=2):name dCubeArray
47DepthTextureCubeArray dCubeArray;
48
49//TEST_INPUT: Sampler:name samplerState
50SamplerState samplerState;
51//TEST_INPUT: Sampler(depthCompare):name shadowSampler
52SamplerComparisonState shadowSampler;
53
54
55//TEST_INPUT: ubuffer(data=[0 0 0 0], stride=4):out,name outputBuffer
56RWStructuredBuffer<float> outputBuffer;
57
58// note: the RGBA texture types are not parameterized, since the depth
59// texture element is always 'float'
60float testOperations<let isShadow : int>(
61    int idx,
62     _Texture<float, __Shape1D,   0, 0, 0, 0, isShadow, 0, 0> x1D,
63     _Texture<float, __Shape2D,   0, 0, 0, 0, isShadow, 0, 0> x2D,
64     _Texture<float, __Shape3D,   0, 0, 0, 0, isShadow, 0, 0> x3D,
65     _Texture<float, __ShapeCube, 0, 0, 0, 0, isShadow, 0, 0> xCube,
66     _Texture<float, __Shape1D,   1, 0, 0, 0, isShadow, 0, 0> x1DArray,
67     _Texture<float, __Shape2D,   1, 0, 0, 0, isShadow, 0, 0> x2DArray,
68     _Texture<float, __ShapeCube, 1, 0, 0, 0, isShadow, 0, 0> xCubeArray
69)
70{
71    float u = idx * (1.0f / 4);
72
73    float val = 0.0f;
74
75    uint width = 0, height = 0, depth = 0;
76    float fwidth = 0.0f, fheight = 0.0f, fdepth = 0.0f;
77    uint numLevels = 0, elements = 0;
78    float fnumLevels = 0.0f, felements = 0.0f;
79
80    float clamp = 0.0f;
81    float bias = 0.0f;
82
83    uint status;
84
85    /*
86        <Template Type> Object.SampleLevel()
87    */
88    val += x1D.SampleLevel(samplerState, u, 0);
89    val += x2D.SampleLevel(samplerState, float2(u, u), 0);
90    val += x3D.SampleLevel(samplerState, float3(u, u, u), 0);
91    val += xCube.SampleLevel(samplerState, normalize(float3(u, 1 - u, u)), 0);
92
93    val += x1DArray.SampleLevel(samplerState, float2(u, 0), 0);
94    val += x2DArray.SampleLevel(samplerState, float3(u, u, 0), 0);
95    val += xCubeArray.SampleLevel(samplerState, float4(u, u, u, 0), 0);
96
97    // Offset variant
98    //  NOTE: The "cpu" profile does not like these, so it's disabled for now
99    val += x1D.SampleLevel(samplerState, u, 0, 1);
100    val += x2D.SampleLevel(samplerState, float2(u, u), 0, int2(1, 1));
101    val += x3D.SampleLevel(samplerState, float3(u, u, u), 0, int3(1, 1, 1));
102
103    val += x1DArray.SampleLevel(samplerState, float2(u, 0), 0, 1);
104    val += x2DArray.SampleLevel(samplerState, float3(u, u, 0), 0, int2(1, 1));
105
106    // Status variant
107#if !defined(VK)
108    val += x1D.SampleLevel(samplerState, u, 0, 1, status);
109    val += x2D.SampleLevel(samplerState, float2(u, u), 0, int2(1, 1), status);
110    val += x3D.SampleLevel(samplerState, float3(u, u, u), 0, int3(1, 1, 1), status);
111
112    val += x1DArray.SampleLevel(samplerState, float2(u, 0), 0, 1, status);
113    val += x2DArray.SampleLevel(samplerState, float3(u, u, 0), 0, int2(1, 1), status);
114#endif
115
116    /*
117        float Object.SampleCmpLevelZero()
118    */
119    // NOTE: These are having issues with vulkan (glsl)
120    // SampleCmpLevelZero() requires format with VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_DEPTH_COMPARISON_BIT.
121    val += x1D.SampleCmpLevelZero(shadowSampler, u, 0);
122    val += x2D.SampleCmpLevelZero(shadowSampler, float2(u, u), 0);
123    val += x1DArray.SampleCmpLevelZero(shadowSampler, float2(u, u), 0);
124    val += xCube.SampleCmpLevelZero(shadowSampler, normalize(float3(u, 1 - u, u)), 0);
125    val += x2DArray.SampleCmpLevelZero(shadowSampler, normalize(float3(u, 1 - u, u)), 0);
126    val += xCubeArray.SampleCmpLevelZero(shadowSampler, normalize(float4(u, 1-u, u, u)), 0);
127
128    // Offset variant
129    val += x1D.SampleCmpLevelZero(shadowSampler, u, 0, 0);
130    val += x2D.SampleCmpLevelZero(shadowSampler, float2(u, u), 0, int2(0, 0));
131    // TextureCube does not have an offset version of this
132
133    // Status variant
134    #if !defined(VK)
135
136    val += x1D.SampleCmpLevelZero(shadowSampler, u, 0, 0, status);
137    val += x2D.SampleCmpLevelZero(shadowSampler, float2(u, u), 0, int2(0, 0), status);
138
139    val += x1DArray.SampleCmpLevelZero(shadowSampler, float2(u, u), 0, 0, status);
140    val += x2DArray.SampleCmpLevelZero(shadowSampler, normalize(float3(u, 1 - u, u)), 0, int2(0, 0), status);
141#endif
142
143    /*
144        float Object.SampleCmpLevel().
145        These require SM 6.7 for dx12 but functional compute tests currently do not run with the cs_6_7,
146        hence only enable these for vk.
147    */
148#if defined(VK)
149    float level = 1.0;
150    val += x1D.SampleCmpLevel(shadowSampler, u, 0, level);
151    val += x2D.SampleCmpLevel(shadowSampler, float2(u, u), 0, level);
152    val += x1DArray.SampleCmpLevel(shadowSampler, float2(u, u), 0, level);
153    val += xCube.SampleCmpLevel(shadowSampler, normalize(float3(u, 1 - u, u)), 0, level);
154    val += x2DArray.SampleCmpLevel(shadowSampler, normalize(float3(u, 1 - u, u)), 0, level);
155    val += xCubeArray.SampleCmpLevel(shadowSampler, normalize(float4(u, 1-u, u, u)), 0, level);
156
157    // Offset variant
158    val += x1D.SampleCmpLevel(shadowSampler, u, 0, level, 0);
159    val += x2D.SampleCmpLevel(shadowSampler, float2(u, u), 0, level, int2(0, 0));
160#endif
161
162    /*
163        void Object.GetDimensions()
164    */
165    x1D.GetDimensions(width);
166    val += width;
167
168    x1D.GetDimensions(fwidth);
169    val += fwidth;
170
171    x1D.GetDimensions(0, width, numLevels);
172    val += width;
173    val += numLevels;
174
175    x1D.GetDimensions(0, fwidth, fnumLevels);
176    val += fwidth;
177    val += fnumLevels;
178
179    x2D.GetDimensions(width, height);
180    val += width;
181    val += height;
182
183    x2D.GetDimensions(fwidth, fheight);
184    val += fwidth;
185    val += fheight;
186
187    x2D.GetDimensions(0, width, height, numLevels);
188    val += width;
189    val += height;
190    val += numLevels;
191
192    x2D.GetDimensions(0, fwidth, fheight, fnumLevels);
193    val += fwidth;
194    val += fheight;
195    val += fnumLevels;
196
197    x3D.GetDimensions(width, height, depth);
198    val += width;
199    val += height;
200    val += depth;
201
202    x3D.GetDimensions(fwidth, fheight, fdepth);
203    val += fwidth;
204    val += fheight;
205    val += fdepth;
206
207    x3D.GetDimensions(0, width, height, depth, numLevels);
208    val += width;
209    val += height;
210    val += depth;
211    val += numLevels;
212
213    x3D.GetDimensions(0, fwidth, fheight, fdepth, fnumLevels);
214    val += fwidth;
215    val += fheight;
216    val += fdepth;
217    val += fnumLevels;
218
219    xCube.GetDimensions(width, height);
220    val += width;
221    val += height;
222
223    xCube.GetDimensions(fwidth, fheight);
224    val += fwidth;
225    val += fheight;
226
227    xCube.GetDimensions(0, width, height, numLevels);
228    val += width;
229    val += height;
230    val += numLevels;
231
232    xCube.GetDimensions(0, fwidth, fheight, fnumLevels);
233    val += fwidth;
234    val += fheight;
235    val += fnumLevels;
236
237    x1DArray.GetDimensions(width, elements);
238    val += width;
239    val += elements;
240
241    x1DArray.GetDimensions(fwidth, felements);
242    val += fwidth;
243    val += felements;
244
245    x1DArray.GetDimensions(0, width, elements, numLevels);
246    val += width;
247    val += elements;
248    val += numLevels;
249
250    x1DArray.GetDimensions(0, fwidth, felements, fnumLevels);
251    val += fwidth;
252    val += felements;
253    val += fnumLevels;
254
255    x2DArray.GetDimensions(width, height, elements);
256    val += width;
257    val += height;
258    val += elements;
259
260    x2DArray.GetDimensions(fwidth, fheight, felements);
261    val += fwidth;
262    val += fheight;
263    val += felements;
264
265    x2DArray.GetDimensions(0, width, height, elements, numLevels);
266    val += width;
267    val += height;
268    val += elements;
269    val += numLevels;
270
271    x2DArray.GetDimensions(0, fwidth, fheight, felements, fnumLevels);
272    val += fwidth;
273    val += fheight;
274    val += felements;
275    val += fnumLevels;
276
277    xCubeArray.GetDimensions(width, height, elements);
278    val += width;
279    val += height;
280    val += elements;
281
282    // fxc 47.0: (95): error X4598:  The array element count of GetDimensions on TextureCubeArray objects is unavailable on cs_5_0
283#if defined(CS60) || defined(VK)
284    xCubeArray.GetDimensions(fwidth, fheight, felements);
285    val += fwidth;
286    val += fheight;
287    val += felements;
288#endif
289
290    xCubeArray.GetDimensions(0, width, height, elements, numLevels);
291    val += width;
292    val += height;
293    val += elements;
294    val += numLevels;
295
296#if defined(CS60) || defined(VK)
297    xCubeArray.GetDimensions(0, fwidth, fheight, felements, fnumLevels);
298    val += fwidth;
299    val += fheight;
300    val += felements;
301    val += fnumLevels;
302#endif
303
304    /*
305        <Template Type>4 Object.Gather()
306    */
307    float4 f4 = t2D_RGBA.Gather(samplerState, float2(u, u));
308    val += f4.x;  val += f4.y;  val += f4.z;  val += f4.w;
309
310    f4 = tCube_RGBA.Gather(samplerState, normalize(float3(u, 1 - u, u)));
311    val += f4.x;  val += f4.y;  val += f4.z;  val += f4.w;
312
313    f4 = t2DArray_RGBA.Gather(samplerState, float3(u, u, 0));
314    val += f4.x;  val += f4.y;  val += f4.z;  val += f4.w;
315
316    f4 = tCubeArray_RGBA.Gather(samplerState, float4(normalize(float3(u, 1 - u, u)), 0));
317    val += f4.x;  val += f4.y;  val += f4.z;  val += f4.w;
318
319    // Offset variant
320    f4 = t2D_RGBA.Gather(samplerState, float2(u, u), int2(0, 0));
321    val += f4.x;  val += f4.y;  val += f4.z;  val += f4.w;
322
323    f4 = t2DArray_RGBA.Gather(samplerState, float3(u, u, 0), int2(0, 0));
324    val += f4.x;  val += f4.y;  val += f4.z;  val += f4.w;
325
326    // Object.GatherGreen()
327    f4 = t2D_RGBA.GatherGreen(samplerState, float2(u, u), int2(1, 2));
328    val += f4.x;  val += f4.y;  val += f4.z;  val += f4.w;
329
330    f4 = t2D_RGBA.GatherGreen(samplerState, float2(u, u), int2(1, 2), int2(3, 4), int2(5, 6), int2(7, 8));
331    val += f4.x;  val += f4.y;  val += f4.z;  val += f4.w;
332
333    f4 = tCubeArray_RGBA.GatherGreen(samplerState, float4(1.5, 1.5, 1.5, 1.5));
334    val += f4.x;  val += f4.y;  val += f4.z;  val += f4.w;
335
336    // status variant
337#if !defined(VK)
338    f4 = t2D_RGBA.GatherGreen(samplerState, float2(u, u), int2(1, 2), status);
339    val += f4.x;  val += f4.y;  val += f4.z;  val += f4.w;
340
341    f4 = t2D_RGBA.GatherGreen(samplerState, float2(u, u), int2(1, 2), int2(3, 4), int2(5, 6), int2(7, 8), status);
342    val += f4.x;  val += f4.y;  val += f4.z;  val += f4.w;
343
344    f4 = tCubeArray_RGBA.GatherGreen(samplerState, float4(1.5, 1.5, 1.5, 1.5), status);
345    val += f4.x;  val += f4.y;  val += f4.z;  val += f4.w;
346#endif
347
348    /*
349        ret Object.Load()
350    */
351    val += x1D.Load(int2(0, 0));
352    val += x2D.Load(int3(0, 0, 0));
353    val += x3D.Load(int4(0, 0, 0, 0));
354
355    val += x1DArray.Load(int3(0, 0, 0));
356    val += x2DArray.Load(int4(0, 0, 0, 0));
357
358    // Offset variant
359    val += x1D.Load(int2(0, 0), 0);
360    val += x2D.Load(int3(0, 0, 0), int2(0,0));
361    val += x3D.Load(int4(0, 0, 0, 0), int3(0, 0, 0));
362
363    val += x1DArray.Load(int3(0, 0, 0), 0);
364    val += x2DArray.Load(int4(0, 0, 0, 0), int2(0, 0));
365
366    /*
367        <Template Type> Object.SampleGrad()
368    */
369    float _ddx = 0.0f, _ddy = 0.0f;
370
371    val += x1D.SampleGrad(samplerState, 0.0f, _ddx, _ddy);
372    val += x2D.SampleGrad(samplerState, float2(u, u), float2(_ddx, _ddx), float2(_ddy, _ddy));
373    val += x3D.SampleGrad(samplerState, float3(u, u, u), float3(_ddx, _ddx, _ddx), float3(_ddy, _ddy, _ddy));
374    val += xCube.SampleGrad(samplerState, normalize(float3(u, 1 - u, u)), float3(_ddx, _ddx, _ddx), float3(_ddy, _ddy, _ddy));
375
376    val += x1DArray.SampleGrad(samplerState, float2(0.0f, 0.0f), _ddx, _ddy);
377    val += x2DArray.SampleGrad(samplerState, float3(u, u, 0.0f), float2(_ddx, _ddx), float2(_ddy, _ddy));
378
379    // Offset variant
380    val += x1D.SampleGrad(samplerState, 0.0f, _ddx, _ddy, 0);
381    val += x2D.SampleGrad(samplerState, float2(u, u), float2(_ddx, _ddx), float2(_ddy, _ddy), int2(0, 0));
382    val += x3D.SampleGrad(samplerState, float3(u, u, u), float3(_ddx, _ddx, _ddx), float3(_ddy, _ddy, _ddy), int3(0, 0, 0));
383
384    val += x1DArray.SampleGrad(samplerState, float2(0.0f, 0.0f), _ddx, _ddy, 0);
385    val += x2DArray.SampleGrad(samplerState, float3(u, u, 0.0f), float2(_ddx, _ddx), float2(_ddy, _ddy), int2(0, 0));
386
387    // Status variant
388#if !defined(VK)
389    val += x1D.SampleGrad(samplerState, 0.0f, _ddx, _ddy, 0, clamp,  status);
390    val += x2D.SampleGrad(samplerState, float2(u, u), float2(_ddx, _ddx), float2(_ddy, _ddy), int2(0, 0), clamp, status);
391    val += x3D.SampleGrad(samplerState, float3(u, u, u), float3(_ddx, _ddx, _ddx), float3(_ddy, _ddy, _ddy), int3(0, 0, 0), clamp, status);
392
393    val += x1DArray.SampleGrad(samplerState, float2(0.0f, 0.0f), _ddx, _ddy, 0, clamp, status);
394    val += x2DArray.SampleGrad(samplerState, float3(u, u, 0.0f), float2(_ddx, _ddx), float2(_ddy, _ddy), int2(0, 0), clamp, status);
395#endif
396
397    return val;
398}
399
400[numthreads(4, 1, 1)]
401void computeMain(int3 dispatchThreadID: SV_DispatchThreadID)
402{
403    int idx = dispatchThreadID.x;
404    float val = 0.0f;
405
406    val += testOperations<0>(idx, t1D, t2D, t3D, tCube, t1DArray, t2DArray, tCubeArray);
407    val += testOperations<1>(idx, d1D, d2D, d3D, dCube, d1DArray, d2DArray, dCubeArray);
408
409    outputBuffer[idx] = val;
410}
411
412// DX11: 708
413// DX11: 708
414// DX11: 708
415// DX11: 708
416// DX12: 708
417// DX12: 708
418// DX12: 708
419// DX12: 708
420// DX12CS6: 754
421// DX12CS6: 754
422// DX12CS6: 754
423// DX12CS6: 754
424// VK: 718
425// VK: 718
426// VK: 718
427// VK: 718