yum-mirror/slang

Making it easier to work with shaders

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

James Helferty (NVIDIA)Enable metal tests (#8446)8086adc90

master
4.9 KiB122 linesraw
1//TEST:SIMPLE(filecheck=METAL): -target metal -stage compute -entry computeMain
2//TEST:SIMPLE(filecheck=METALLIB): -target metallib -stage compute -entry computeMain
3//TEST(compute, metal):COMPARE_COMPUTE_EX:-metal -compute -output-using-type
4//TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute -output-using-type
5
6//METALLIB: @computeMain
7
8//TEST_INPUT: RWTexture3D(format=R32Uint, size=15, content=one):name uintTexture3D
9RWTexture3D<uint> uintTexture3D;
10//TEST_INPUT: RWTexture3D(format=R32Sint, size=15, content=one):name intTexture3D
11RWTexture3D<int> intTexture3D;
12
13//TEST_INPUT: ubuffer(data=[0], stride=1, count=184):out,name outBuffer
14RWStructuredBuffer<int> outBuffer;
15
16void test()
17{
18    int valInt = 3;
19    int originalValueInt = 999;
20    int compareValueInt = 1;
21
22    uint valUInt = 3;
23    uint originalValueUInt = 999;
24    int compareValueUInt = 1;
25
26    // Texture3D
27// METAL: .atomic_fetch_add
28// METAL: .atomic_fetch_and
29// METAL: .atomic_fetch_max
30// METAL: .atomic_fetch_min
31// METAL: .atomic_fetch_or
32// METAL: .atomic_fetch_xor
33// METAL: .atomic_fetch_add
34// METAL: .atomic_fetch_and
35// METAL: .atomic_fetch_max
36// METAL: .atomic_fetch_min
37// METAL: .atomic_fetch_or
38// METAL: .atomic_fetch_xor
39// METAL: .atomic_exchange
40// METAL: .atomic_compare_exchange_weak
41// METAL: .atomic_compare_exchange_weak
42
43// METAL: .atomic_fetch_add
44// METAL: .atomic_fetch_and
45// METAL: .atomic_fetch_max
46// METAL: .atomic_fetch_min
47// METAL: .atomic_fetch_or
48// METAL: .atomic_fetch_xor
49// METAL: .atomic_fetch_add
50// METAL: .atomic_fetch_and
51// METAL: .atomic_fetch_max
52// METAL: .atomic_fetch_min
53// METAL: .atomic_fetch_or
54// METAL: .atomic_fetch_xor
55// METAL: .atomic_exchange
56// METAL: .atomic_compare_exchange_weak
57// METAL: .atomic_compare_exchange_weak
58    int o = 0;
59    int i = 0;
60    InterlockedAdd(uintTexture3D[uint3(i++, 0, 0)], valUInt);
61    InterlockedAnd(uintTexture3D[uint3(i++, 0, 0)], valUInt);
62    InterlockedMax(uintTexture3D[uint3(i++, 0, 0)], valUInt);
63    InterlockedMin(uintTexture3D[uint3(i++, 0, 0)], valUInt);
64    InterlockedOr(uintTexture3D[uint3(i++, 0, 0)], valUInt);
65    InterlockedXor(uintTexture3D[uint3(i++, 0, 0)], valUInt);
66    InterlockedAdd(uintTexture3D[uint3(i++, 0, 0)], valUInt, originalValueUInt);
67    outBuffer[o++] = originalValueUInt;
68    InterlockedAnd(uintTexture3D[uint3(i++, 0, 0)], valUInt, originalValueUInt);
69    outBuffer[o++] = originalValueUInt;
70    InterlockedMax(uintTexture3D[uint3(i++, 0, 0)], valUInt, originalValueUInt);
71    outBuffer[o++] = originalValueUInt;
72    InterlockedMin(uintTexture3D[uint3(i++, 0, 0)], valUInt, originalValueUInt);
73    outBuffer[o++] = originalValueUInt;
74    InterlockedOr(uintTexture3D[uint3(i++, 0, 0)], valUInt, originalValueUInt);
75    outBuffer[o++] = originalValueUInt;
76    InterlockedXor(uintTexture3D[uint3(i++, 0, 0)], valUInt, originalValueUInt);
77    outBuffer[o++] = originalValueUInt;
78    InterlockedExchange(uintTexture3D[uint3(i++, 0, 0)], valUInt, originalValueUInt);
79    outBuffer[o++] = originalValueUInt;
80    InterlockedCompareExchange(uintTexture3D[uint3(i++, 0, 0)], valUInt, compareValueUInt, originalValueUInt);
81    outBuffer[o++] = originalValueUInt;
82    InterlockedCompareStore(uintTexture3D[uint3(i++, 0, 0)], valUInt, compareValueUInt);
83
84    i = 0;
85    InterlockedAdd(intTexture3D[uint3(i++, 0, 0)], valInt);
86    InterlockedAnd(intTexture3D[uint3(i++, 0, 0)], valInt);
87    InterlockedMax(intTexture3D[uint3(i++, 0, 0)], valInt);
88    InterlockedMin(intTexture3D[uint3(i++, 0, 0)], valInt);
89    InterlockedOr(intTexture3D[uint3(i++, 0, 0)], valInt);
90    InterlockedXor(intTexture3D[uint3(i++, 0, 0)], valInt);
91    InterlockedAdd(intTexture3D[uint3(i++, 0, 0)], valInt, originalValueInt);
92    outBuffer[o++] = originalValueInt;
93    InterlockedAnd(intTexture3D[uint3(i++, 0, 0)], valInt, originalValueInt);
94    outBuffer[o++] = originalValueInt;
95    InterlockedMax(intTexture3D[uint3(i++, 0, 0)], valInt, originalValueInt);
96    outBuffer[o++] = originalValueInt;
97    InterlockedMin(intTexture3D[uint3(i++, 0, 0)], valInt, originalValueInt);
98    outBuffer[o++] = originalValueInt;
99    InterlockedOr(intTexture3D[uint3(i++, 0, 0)], valInt, originalValueInt);
100    outBuffer[o++] = originalValueInt;
101    InterlockedXor(intTexture3D[uint3(i++, 0, 0)], valInt, originalValueInt);
102    outBuffer[o++] = originalValueInt;
103    InterlockedExchange(intTexture3D[uint3(i++, 0, 0)], valInt, originalValueInt);
104    outBuffer[o++] = originalValueInt;
105    InterlockedCompareExchange(intTexture3D[uint3(i++, 0, 0)], valInt, compareValueInt, originalValueInt);
106    outBuffer[o++] = originalValueInt;
107    InterlockedCompareStore(intTexture3D[uint3(i++, 0, 0)], valInt, compareValueUInt);
108
109
110    // Copy to output
111    int test_count = i;
112    for (i=0; i<test_count; i++) {
113        outBuffer[o + test_count*0 + i] = uintTexture3D[uint3(i, 0, 0)];
114        outBuffer[o + test_count*1 + i] = intTexture3D[uint3(i, 0, 0)];
115    }
116}
117
118[numthreads(1, 1, 1)]
119void computeMain()
120{
121    test();
122}