Web Inspector: REGRESSION (r238602): Elements: deleting the last child of a collapsed...
[WebKit-https.git] / LayoutTests / webgpu / map-read-buffers.html
1 <!DOCTYPE html><!-- webkit-test-runner [ experimental:WebGPUEnabled=true ] -->
2 <meta charset=utf-8>
3 <title>Tests for setSubData and mapReadAsync on a GPUBuffer.</title>
4 <body>
5 <script src="../resources/testharness.js"></script>
6 <script src="../resources/testharnessreport.js"></script>
7 <script src="js/webgpu-functions.js"></script>
8 <script>
9 async function runTests() {
10     const device =  await getBasicDevice();
11
12     // Basic mapReadAsync functionality
13     promise_test(async () => {
14         const buffer = device.createBuffer({ size: 16, usage: GPUBufferUsage.TRANSFER_DST | GPUBufferUsage.MAP_READ });
15         assert_true(buffer instanceof WebGPUBuffer, "createBuffer returned a WebGPUBuffer");
16
17         let array = new Float32Array([1, 2, 3, 4]);
18         buffer.setSubData(0, array.buffer);
19
20         let arrayBuffer = await buffer.mapReadAsync();
21         assert_true(arrayBuffer instanceof ArrayBuffer, "first mapReadAsync resolved successfully");
22
23         const readArray = new Float32Array(arrayBuffer);
24         assert_equals(readArray[3], 4, "successfully map-read value set by setSubData");
25
26         buffer.unmap();
27
28         buffer.setSubData(4 * 3, array.slice(0, 1).buffer);
29         let arrayBuffer1 = await buffer.mapReadAsync();
30         const readArray1 = new Float32Array(arrayBuffer1);
31         assert_equals(readArray[3], 1, "successfully setSubData with an offset");
32
33         buffer.unmap();
34
35         const promise = buffer.mapReadAsync(); // This will eventually reject due to buffer.destroy()
36
37         buffer.destroy();
38
39         await promise.then(() => {
40             assert_unreached("Buffer was destroyed!");
41         }, () => {});
42
43     }, "setSubData, mapReadAsync, unmap, and destroy on a GPUBuffer.");
44
45     /* Basic validation */
46     // FIXME: Test invalid combinations of GPUBufferUsage after implementing error handling.
47
48     promise_test(async () => {
49         const buffer = device.createBuffer({ size: 16, usage: GPUBufferUsage.MAP_WRITE });
50
51         await buffer.mapReadAsync().then(() => {
52             assert_unreached("Buffer was not created with MAP_READ!");
53         }, () => {});
54     }, "Reject a map read on a buffer not created with MAP_READ usage.");
55
56     /* Extended unmap/destroy and promise settling testing */
57
58     promise_test(async () => {
59         const buffer = device.createBuffer({ size: 16, usage: GPUBufferUsage.MAP_READ });
60
61         buffer.mapReadAsync().then(() => {
62             buffer.unmap();
63         }, () => { 
64             assert_unreached(); 
65         });
66
67         await buffer.mapReadAsync().then(() => {
68             assert_unreached("Map operation was invalid!"); // buffer was still in mapped state during promise creation
69         }, () => {});
70     }, "Reject a map read on a mapped GPUBuffer.");
71
72     promise_test(async () => {
73         const buffer = device.createBuffer({ size: 16, usage: GPUBufferUsage.MAP_READ });
74
75         const promise = buffer.mapReadAsync();
76         buffer.unmap();
77
78         await promise.then(() => {
79             assert_unreached("Buffer was unmapped!"); // buffer was unmapped, which rejects pending promises
80         },() => {});
81     }, "Reject a pending map read if GPUBuffer is unmapped.");
82 }
83
84 runTests();
85 </script>
86 </body>