test_buffer_mapping.html (2189B)
1 <!doctype html> 2 <html> 3 <head> 4 <meta charset="utf-8" /> 5 <script src="/tests/SimpleTest/SimpleTest.js"></script> 6 <link rel="stylesheet" href="/tests/SimpleTest/test.css" /> 7 </head> 8 <body> 9 <script> 10 ok( 11 SpecialPowers.getBoolPref("dom.webgpu.enabled"), 12 "Pref should be enabled." 13 ); 14 15 async function testBody() { 16 const adapter = await navigator.gpu.requestAdapter(); 17 const device = await adapter.requestDevice(); 18 19 const bufferRead = device.createBuffer({ 20 size: 4, 21 usage: GPUBufferUsage.MAP_READ | GPUBufferUsage.COPY_DST, 22 }); 23 const bufferWrite = device.createBuffer({ 24 size: 4, 25 usage: GPUBufferUsage.COPY_SRC, 26 mappedAtCreation: true, 27 }); 28 new Float32Array(bufferWrite.getMappedRange()).set([1.0]); 29 bufferWrite.unmap(); 30 31 const encoder = device.createCommandEncoder(); 32 encoder.copyBufferToBuffer(bufferWrite, 0, bufferRead, 0, 4); 33 device.queue.submit([encoder.finish()]); 34 35 await bufferRead.mapAsync(GPUMapMode.READ); 36 37 try { 38 bufferRead.getMappedRange(0, 5); 39 ok(false, "mapped with size outside buffer should throw"); 40 } catch (e) { 41 ok( 42 true, 43 "mapped with size outside buffer should throw OperationError" 44 ); 45 } 46 47 try { 48 bufferRead.getMappedRange(4, 1); 49 ok(false, "mapped with offset outside buffer should throw"); 50 } catch (e) { 51 ok( 52 true, 53 "mapped with offset outside buffer should throw OperationError" 54 ); 55 } 56 57 const data = bufferRead.getMappedRange(); 58 is(data.byteLength, 4, "array should be 4 bytes long"); 59 60 const value = new Float32Array(data)[0]; 61 ok(value == 1.0, "value == 1.0"); 62 63 bufferRead.unmap(); 64 is(data.byteLength, 0, "array should be detached after explicit unmap"); 65 } 66 67 SimpleTest.waitForExplicitFinish(); 68 testBody() 69 .catch(e => ok(false, "Unhandled exception " + e)) 70 .finally(() => SimpleTest.finish()); 71 </script> 72 </body> 73 </html>