| <script type="text/javascript"> |
| |
| function reportProgress(msg) { |
| if (window.domAutomationController) { |
| window.domAutomationController.send(msg); |
| } |
| console.log(msg); |
| } |
| |
| // These must be "var" rather than "let" for the Telemetry harness to |
| // see them. |
| var gotDevice; |
| var deviceLost; |
| var proceed; |
| |
| const later = (delay) => |
| new Promise(resolve => setTimeout(resolve, delay)); |
| |
| async function init() { |
| reportProgress('LOADED'); |
| |
| // This bakes in knowledge that GpuDataManagerImplPrivate blocks |
| // WebGPU from fetching an adapter after two device losses on the |
| // same domain. |
| |
| for (idx = 0; idx < 2; ++idx) { |
| proceed = false; |
| const adapter = await navigator.gpu.requestAdapter(); |
| if (!adapter) { |
| reportProgress('FAILED'); |
| console.log('TEST FAILED - Could not get a GPUAdapter on iteration ' + idx); |
| return null; |
| } |
| |
| console.log('Iteration ' + idx + ': got adapter'); |
| |
| let device; |
| try { |
| device = await adapter.requestDevice(); |
| gotDevice = true; |
| deviceLost = false; |
| } catch { |
| reportProgress('FAILED'); |
| console.log('TEST FAILED - Could not get a GPUDevice on iteration ' + idx); |
| return null; |
| } |
| |
| console.log('Iteration ' + idx + ': got device'); |
| |
| // The test runner forces the GPU process to crash. The second time, |
| // this should result in the domain being blocked. |
| console.log('Iteration ' + idx + ': Waiting for GPU crash to cause device loss'); |
| const lost = await device.lost; |
| if (lost.reason !== undefined) { |
| console.log('TEST FAILED - Expected undefined device lost reason'); |
| reportProgress('FAILED'); |
| return; |
| } |
| gotDevice = false; |
| deviceLost = true; |
| |
| console.log('Iteration ' + idx + ': lost device'); |
| |
| try { |
| // First check that the previously acquired adapter can't get another device. |
| // This should throw an exception. |
| await adapter.requestDevice(); |
| reportProgress('FAILED'); |
| console.log('TEST FAILED - WebGPU device request should have failed on ' + |
| 'stale GPUAdapter'); |
| } catch { |
| console.log('Iteration ' + idx + ': Device request failed as expected'); |
| } |
| |
| // The second time, also check that we can't get another adapter. |
| if (idx == 1) { |
| const newAdapter = await navigator.gpu.requestAdapter(); |
| if (newAdapter !== null) { |
| reportProgress('FAILED'); |
| console.log( |
| 'TEST FAILED - WebGPU adapter request should have been blocked'); |
| } else { |
| console.log('Adapter request failed as expected'); |
| reportProgress('SUCCESS'); |
| } |
| } |
| |
| // The harness will tell us when to proceed to the second iteration. |
| while (!proceed) { |
| await later(100); |
| } |
| } |
| } |
| |
| init(); |
| </script> |