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