yum-mirror/slang

Making it easier to work with shaders

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

Simon Kallweitupdate slang-rhi (#6587)ae1a5e408

master
7.0 KiB148 linesraw
1//TEST:SIMPLE(filecheck=WGSL): -stage fragment -entry fragMain -target wgsl
2
3// In WGSL, `textureSample` and other variants work only for f32 type.
4// But textureLoad works for i32, u32 and f32.
5
6//TEST_INPUT: ubuffer(data=[0], stride=4):out,name outputBuffer
7RWStructuredBuffer<int> outputBuffer;
8
9// f32 types
10
11//TEST_INPUT: RWTexture1D(format=RG32Float, size=4, content = zero):name w1D_f32v2
12//TEST_INPUT: RWTexture2D(format=RG32Float, size=4, content = zero):name w2D_f32v2
13//TEST_INPUT: RWTexture3D(format=RG32Float, size=4, content = zero):name w3D_f32v2
14//TEST_INPUT: RWTexture2D(format=RG32Float, size=4, content = zero, arrayLength=2):name w2DArray_f32v2
15// WGSL: var w1D_f32v2{{[^:]*}}: texture_storage_1d<rg32float, read_write>
16[format("rg32f")] RWTexture1D<float2>      w1D_f32v2;
17[format("rg32f")] RWTexture2D<float2>      w2D_f32v2;
18[format("rg32f")] RWTexture3D<float2>      w3D_f32v2;
19[format("rg32f")] RWTexture2DArray<float2> w2DArray_f32v2;
20
21//TEST_INPUT: RWTexture1D(format=RGBA8Unorm, size=4, content = zero):name w1D_f32v4
22//TEST_INPUT: RWTexture2D(format=RGBA8Unorm, size=4, content = zero):name w2D_f32v4
23//TEST_INPUT: RWTexture3D(format=RGBA8Unorm, size=4, content = zero):name w3D_f32v4
24//TEST_INPUT: RWTexture2D(format=RGBA8Unorm, size=4, content = zero, arrayLength=2):name w2DArray_f32v4
25// WGSL: var w1D_f32v4{{[^:]*}}: texture_storage_1d<rgba8unorm, read_write>
26[format("rgba8")] RWTexture1D<float4>      w1D_f32v4;
27[format("rgba8")] RWTexture2D<float4>      w2D_f32v4;
28[format("rgba8")] RWTexture3D<float4>      w3D_f32v4;
29[format("rgba8")] RWTexture2DArray<float4> w2DArray_f32v4;
30
31//TEST_INPUT: RWTexture1D(format=BGRA8Unorm, size=4, content = zero):name w1D_f32_bgra_v4
32//TEST_INPUT: RWTexture2D(format=BGRA8Unorm, size=4, content = zero):name w2D_f32_bgra_v4
33//TEST_INPUT: RWTexture3D(format=BGRA8Unorm, size=4, content = zero):name w3D_f32_bgra_v4
34//TEST_INPUT: RWTexture2D(format=BGRA8Unorm, size=4, content = zero, arrayLength=2):name w2DArray_f32_bgra_v4
35// WGSL: var w1D_f32_bgra_v4{{[^:]*}}: texture_storage_1d<bgra8unorm, read_write>
36[format("bgra8")] RWTexture1D<float4>      w1D_f32_bgra_v4;
37[format("bgra8")] RWTexture2D<float4>      w2D_f32_bgra_v4;
38[format("bgra8")] RWTexture3D<float4>      w3D_f32_bgra_v4;
39[format("bgra8")] RWTexture2DArray<float4> w2DArray_f32_bgra_v4;
40
41// i32 types
42
43//TEST_INPUT: RWTexture1D(format=RG32Sint, size=4, content = zero):name w1D_i32v2
44//TEST_INPUT: RWTexture2D(format=RG32Sint, size=4, content = zero):name w2D_i32v2
45//TEST_INPUT: RWTexture3D(format=RG32Sint, size=4, content = zero):name w3D_i32v2
46//TEST_INPUT: RWTexture2D(format=RG32Sint, size=4, content = zero, arrayLength=2):name w2DArray_i32v2
47// WGSL: var w1D_i32v2{{[^:]*}}: texture_storage_1d<rg32sint, read_write>
48[format("rg32i")] RWTexture1D<int2>      w1D_i32v2;
49[format("rg32i")] RWTexture2D<int2>      w2D_i32v2;
50[format("rg32i")] RWTexture3D<int2>      w3D_i32v2;
51[format("rg32i")] RWTexture2DArray<int2> w2DArray_i32v2;
52
53//TEST_INPUT: RWTexture1D(format=RGBA32Sint, size=4, content = zero):name w1D_i32v4
54//TEST_INPUT: RWTexture2D(format=RGBA32Sint, size=4, content = zero):name w2D_i32v4
55//TEST_INPUT: RWTexture3D(format=RGBA32Sint, size=4, content = zero):name w3D_i32v4
56//TEST_INPUT: RWTexture2D(format=RGBA32Sint, size=4, content = zero, arrayLength=2):name w2DArray_i32v4
57// WGSL: var w1D_i32v4{{[^:]*}}: texture_storage_1d<rgba32sint, read_write>
58[format("rgba32i")] RWTexture1D<int4>      w1D_i32v4;
59[format("rgba32i")] RWTexture2D<int4>      w2D_i32v4;
60[format("rgba32i")] RWTexture3D<int4>      w3D_i32v4;
61[format("rgba32i")] RWTexture2DArray<int4> w2DArray_i32v4;
62
63// u32 types
64
65//TEST_INPUT: RWTexture1D(format=RG32Uint, size=4, content = zero):name w1D_u32v2
66//TEST_INPUT: RWTexture2D(format=RG32Uint, size=4, content = zero):name w2D_u32v2
67//TEST_INPUT: RWTexture3D(format=RG32Uint, size=4, content = zero):name w3D_u32v2
68//TEST_INPUT: RWTexture2D(format=RG32Uint, size=4, content = zero, arrayLength=2):name w2DArray_u32v2
69// WGSL: var w1D_u32v2{{[^:]*}}: texture_storage_1d<rg32uint, read_write>
70[format("rg32ui")] RWTexture1D<uint2>      w1D_u32v2;
71[format("rg32ui")] RWTexture2D<uint2>      w2D_u32v2;
72[format("rg32ui")] RWTexture3D<uint2>      w3D_u32v2;
73[format("rg32ui")] RWTexture2DArray<uint2> w2DArray_u32v2;
74
75//TEST_INPUT: RWTexture1D(format=RGBA16Uint, size=4, content = zero):name w1D_u32v4
76//TEST_INPUT: RWTexture2D(format=RGBA16Uint, size=4, content = zero):name w2D_u32v4
77//TEST_INPUT: RWTexture3D(format=RGBA16Uint, size=4, content = zero):name w3D_u32v4
78//TEST_INPUT: RWTexture2D(format=RGBA16Uint, size=4, content = zero, arrayLength=2):name w2DArray_u32v4
79// WGSL: var w1D_u32v4{{[^:]*}}: texture_storage_1d<rgba16uint, read_write>
80[format("rgba16ui")] RWTexture1D<uint4>      w1D_u32v4;
81[format("rgba16ui")] RWTexture2D<uint4>      w2D_u32v4;
82[format("rgba16ui")] RWTexture3D<uint4>      w3D_u32v4;
83[format("rgba16ui")] RWTexture2DArray<uint4> w2DArray_u32v4;
84
85
86__generic<T, let sampleIndex:int, let format:int>
87[ForceInline] // Workaround for a WGSL requirement that `texture_storage_Xd` must always be a global variable
88bool TEST_textureStorage_StoreLoad(
89    RWTexture1D<T, sampleIndex, format> w1D,
90    RWTexture2D<T, sampleIndex, format> w2D,
91    RWTexture3D<T, sampleIndex, format> w3D,
92    RWTexture2DArray<T, sampleIndex, format> w2DArray)
93    where T:ITexelElement, IArithmetic
94{
95    typealias Tvn = T;
96
97    // ===================
98    // o[i] = v;
99    // https://www.w3.org/TR/WGSL/#texturestore
100    // ===================
101
102    // TODO: store before load
103    // WGSL: textureStore({{\(*}}w1D
104    w1D[0] = Tvn(T.Element(1));
105
106    // WGSL: textureStore({{\(*}}w2D
107    w2D[0] = Tvn(T.Element(1));
108
109    // WGSL: textureStore({{\(*}}w3D
110    w3D[0] = Tvn(T.Element(1));
111
112    // WGSL: textureStore({{\(*}}w2DArray
113    w2DArray[0] = Tvn(T.Element(1));
114
115    return true
116        // ===================
117        // T Load()
118        // https://www.w3.org/TR/WGSL/#textureload
119        // ===================
120
121        // WGSL: textureLoad({{\(*}}w1D
122        && all(Tvn(T.Element(0)) == w1D.Load(0))
123
124        // WGSL: textureLoad({{\(*}}w2D
125        && all(Tvn(T.Element(0)) == w2D.Load(int2(0, 0)))
126
127        // WGSL: textureLoad({{\(*}}w3D
128        && all(Tvn(T.Element(0)) == w3D.Load(int3(0, 0, 0)))
129
130        // WGSL: textureLoad({{\(*}}w2DArray
131        && all(Tvn(T.Element(0)) == w2DArray.Load(int3(0, 0, 0)))
132        ;
133}
134
135void fragMain()
136{
137    bool result = true
138        && TEST_textureStorage_StoreLoad<float2>(w1D_f32v2, w2D_f32v2, w3D_f32v2, w2DArray_f32v2)
139        && TEST_textureStorage_StoreLoad<float4>(w1D_f32v4, w2D_f32v4, w3D_f32v4, w2DArray_f32v4)
140        && TEST_textureStorage_StoreLoad<float4>(w1D_f32_bgra_v4, w2D_f32_bgra_v4, w3D_f32_bgra_v4, w2DArray_f32_bgra_v4)
141        && TEST_textureStorage_StoreLoad<int32_t2>(w1D_i32v2, w2D_i32v2, w3D_i32v2, w2DArray_i32v2)
142        && TEST_textureStorage_StoreLoad<int32_t4>(w1D_i32v4, w2D_i32v4, w3D_i32v4, w2DArray_i32v4)
143        && TEST_textureStorage_StoreLoad<uint32_t2>(w1D_u32v2, w2D_u32v2, w3D_u32v2, w2DArray_u32v2)
144        && TEST_textureStorage_StoreLoad<uint32_t4>(w1D_u32v4, w2D_u32v4, w3D_u32v4, w2DArray_u32v4)
145        ;
146
147    outputBuffer[0] = int(result);
148}