Add a runtime-disabled dialog element skeleton
[WebKit-https.git] / LayoutTests / webgpu / whlsl-make-array-reference.html
1 <!DOCTYPE html>
2 <html>
3 <head>
4 <script src="../resources/js-test-pre.js"></script>
5 <script src="js/webgpu-functions.js"></script>
6 </head>
7 <body>
8 <script>
9 const shaderSource = `
10 bool test1() {
11     int value = 42;
12     thread int[] array = @value;
13     if (array.length != 1)
14         return false;
15     if (array[0] != 42)
16         return false;
17     if (array[120213] != 0)
18         return false;
19
20     array[0] = 1337;
21     if (value != 1337)
22         return false;
23
24     return true;
25 }
26
27 bool test2() {
28     int value = 42;
29     thread int* ptr = &value;
30     if (*ptr != 42)
31         return false;
32
33     thread int[] array = @ptr;
34     if (array.length != 1)
35         return false;
36     if (array[0] != 42)
37         return false;
38     if (array[12374217] != 0)
39         return false;
40     
41     *ptr = 666;
42     if (*ptr != 666)
43         return false;
44     if (value != 666)
45         return false;
46     if (array.length != 1)
47         return false;
48     if (array[0] != 666)
49         return false;
50
51     array[0] = 4242;
52     if (*ptr != 4242)
53         return false;
54     if (value != 4242)
55         return false;
56     if (array[0] != 4242)
57         return false;
58     if (array.length != 1)
59         return false;
60
61     return true;
62 }
63
64 bool test3() {
65     int[42] x;
66     thread int[42]* arrayPtr = &x;
67     if (arrayPtr->length != 42)
68         return false;
69
70     x[41] = 666;
71     if ((*arrayPtr)[41] != 666)
72         return false;
73     if ((*arrayPtr)[0] != 0)
74         return false;
75
76     thread int[] array = @x;
77     if (array.length != 42)
78         return false;
79
80     array[0] = 1337;
81     if (x[0] != 1337)
82         return false;
83     if ((*arrayPtr)[0] != 1337)
84         return false;
85
86     return true;
87 }
88
89 bool test4() {
90     thread int* ptr = null;
91
92     thread int[] array = @ptr;
93     if (array.length != 0)
94         return false;
95
96     if (array[0] != 0)
97         return false;
98
99     if (array[100000] != 0)
100         return false;
101
102     return true;
103 }
104
105 [numthreads(1, 1, 1)]
106 compute void computeShader(device int[] buffer : register(u0), float3 threadID : SV_DispatchThreadID) {
107     if (!test1())
108         return;
109
110     if (!test2())
111         return;
112
113     if (!test3())
114         return;
115
116     if (!test4())
117         return;
118
119     buffer[0] = 1;
120 }
121 `;
122 async function start(device) {
123     const shaderModule = device.createShaderModule({code: shaderSource, isWHLSL: true});
124     const computeStage = {module: shaderModule, entryPoint: "computeShader"};
125
126     const bindGroupLayoutDescriptor = {bindings: [{binding: 0, visibility: 7, type: "storage-buffer"}]};
127     const bindGroupLayout = device.createBindGroupLayout(bindGroupLayoutDescriptor);
128     const pipelineLayoutDescriptor = {bindGroupLayouts: [bindGroupLayout]};
129     const pipelineLayout = device.createPipelineLayout(pipelineLayoutDescriptor);
130
131     const computePipelineDescriptor = {computeStage, layout: pipelineLayout};
132     const computePipeline = device.createComputePipeline(computePipelineDescriptor);
133
134     const size = Int32Array.BYTES_PER_ELEMENT * 1;
135
136     const bufferDescriptor = {size, usage: GPUBufferUsage.MAP_WRITE | GPUBufferUsage.TRANSFER_SRC};
137     const buffer = device.createBuffer(bufferDescriptor);
138     const bufferArrayBuffer = await buffer.mapWriteAsync();
139     const bufferFloat32Array = new Int32Array(bufferArrayBuffer);
140     bufferFloat32Array[0] = 0;
141     buffer.unmap();
142
143     const resultsBufferDescriptor = {size, usage: GPUBufferUsage.STORAGE | GPUBufferUsage.TRANSFER_DST | GPUBufferUsage.MAP_READ};
144     const resultsBuffer = device.createBuffer(resultsBufferDescriptor);
145
146     const bufferBinding = {buffer: resultsBuffer, size};
147     const bindGroupBinding = {binding: 0, resource: bufferBinding};
148     const bindGroupDescriptor = {layout: bindGroupLayout, bindings: [bindGroupBinding]};
149     const bindGroup = device.createBindGroup(bindGroupDescriptor);
150
151     const commandEncoder = device.createCommandEncoder(); // {}
152     commandEncoder.copyBufferToBuffer(buffer, 0, resultsBuffer, 0, size);
153     const computePassEncoder = commandEncoder.beginComputePass();
154     computePassEncoder.setPipeline(computePipeline);
155     computePassEncoder.setBindGroup(0, bindGroup);
156     computePassEncoder.dispatch(1, 1, 1);
157     computePassEncoder.endPass();
158     const commandBuffer = commandEncoder.finish();
159     device.getQueue().submit([commandBuffer]);
160
161     const resultsArrayBuffer = await resultsBuffer.mapReadAsync();
162     let resultsInt32Array = new Int32Array(resultsArrayBuffer);
163     if (resultsInt32Array[0] === 1)
164         testPassed("");
165     else
166         testFailed("");
167     resultsBuffer.unmap();
168 }
169 window.jsTestIsAsync = true;
170 getBasicDevice().then(function(device) {
171     start(device).then(function() {
172         finishJSTest();
173     }, function() {
174         testFailed("");
175         finishJSTest();
176     });
177 }, function() {
178     testPassed("");
179     finishJSTest();
180 });
181 </script>
182 <script src="../resources/js-test-post.js"></script>
183 </body>
184 </html>