355286d0d2377849373fa161b2902e24b2366a35
[WebKit-https.git] / LayoutTests / webgpu / whlsl / two-dimensional-array.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 void fill(thread float[10][] array, float[10] value) {
11     for (uint i = 0; i < array.length; i = i + 1) {
12         array[i] = value;
13     }
14 }
15
16 void fill(thread float[] array, float value) {
17     for (uint i = 0; i < array.length; i = i + 1) {
18         array[i] = value;
19     }
20 }
21
22 bool contains(thread float[10][] array, float value) {
23     for (uint i = 0; i < array.length; i = i + 1) {
24         for (uint j = 0; j < array[j].length; j = j + 1) {
25             if (array[i][j] != value)
26                 return false;
27         }
28     }
29     return true;
30 }
31
32 bool contains(thread float[] array, float value) {
33     for (uint i = 0; i < array.length; i = i + 1) {
34         if (array[i] != value)
35             return false;
36     }
37     return true;
38 }
39
40 [numthreads(1, 1, 1)]
41 compute void computeShader(device int[] buffer : register(u0), float3 threadID : SV_DispatchThreadID) {
42     float[10][5] array;
43     if (array.length != 5)
44         return;
45     if (!contains(@array, 0))
46         return;
47
48     for (uint i = 0; i < array.length; i = i + 1) {
49         float[10] value;
50         fill(@value, float(i));
51         array[i] = value;
52     }
53
54     for (uint i = 0; i < array.length; i = i + 1) {
55         float[10] value = array[i];
56         if (!contains(@value, float(i)))
57             return;
58     }
59
60     buffer[0] = 1;
61 }
62 `;
63 async function start(device) {
64     const shaderModule = device.createShaderModule({code: shaderSource, isWHLSL: true});
65     const computeStage = {module: shaderModule, entryPoint: "computeShader"};
66
67     const bindGroupLayoutDescriptor = {bindings: [{binding: 0, visibility: 7, type: "storage-buffer"}]};
68     const bindGroupLayout = device.createBindGroupLayout(bindGroupLayoutDescriptor);
69     const pipelineLayoutDescriptor = {bindGroupLayouts: [bindGroupLayout]};
70     const pipelineLayout = device.createPipelineLayout(pipelineLayoutDescriptor);
71
72     const computePipelineDescriptor = {computeStage, layout: pipelineLayout};
73     const computePipeline = device.createComputePipeline(computePipelineDescriptor);
74
75     const size = Int32Array.BYTES_PER_ELEMENT * 1;
76
77     const bufferDescriptor = {size, usage: GPUBufferUsage.MAP_WRITE | GPUBufferUsage.TRANSFER_SRC};
78     const buffer = device.createBuffer(bufferDescriptor);
79     const bufferArrayBuffer = await buffer.mapWriteAsync();
80     const bufferFloat32Array = new Int32Array(bufferArrayBuffer);
81     bufferFloat32Array[0] = 0;
82     buffer.unmap();
83
84     const resultsBufferDescriptor = {size, usage: GPUBufferUsage.STORAGE | GPUBufferUsage.TRANSFER_DST | GPUBufferUsage.MAP_READ};
85     const resultsBuffer = device.createBuffer(resultsBufferDescriptor);
86
87     const bufferBinding = {buffer: resultsBuffer, size};
88     const bindGroupBinding = {binding: 0, resource: bufferBinding};
89     const bindGroupDescriptor = {layout: bindGroupLayout, bindings: [bindGroupBinding]};
90     const bindGroup = device.createBindGroup(bindGroupDescriptor);
91
92     const commandEncoder = device.createCommandEncoder(); // {}
93     commandEncoder.copyBufferToBuffer(buffer, 0, resultsBuffer, 0, size);
94     const computePassEncoder = commandEncoder.beginComputePass();
95     computePassEncoder.setPipeline(computePipeline);
96     computePassEncoder.setBindGroup(0, bindGroup);
97     computePassEncoder.dispatch(1, 1, 1);
98     computePassEncoder.endPass();
99     const commandBuffer = commandEncoder.finish();
100     device.getQueue().submit([commandBuffer]);
101
102     const resultsArrayBuffer = await resultsBuffer.mapReadAsync();
103     let resultsInt32Array = new Int32Array(resultsArrayBuffer);
104     if (resultsInt32Array[0] === 1)
105         testPassed("");
106     else
107         testFailed("");
108     resultsBuffer.unmap();
109 }
110 window.jsTestIsAsync = true;
111 getBasicDevice().then(function(device) {
112     start(device).then(function() {
113         finishJSTest();
114     }, function() {
115         testFailed("");
116         finishJSTest();
117     });
118 }, function() {
119     testPassed("");
120     finishJSTest();
121 });
122 </script>
123 <script src="../../resources/js-test-post.js"></script>
124 </body>
125 </html>