| <!-- webkit-test-runner [ enableMetalShaderValidation=true ] --> |
| <style> |
| :root { background: #102030e0; color: #99ddbbcc; font-size: 15px; } |
| </style> |
| <script src="../../../resources/js-test-pre.js"></script> |
| <script id="shared"> |
| const log = console.debug; |
| |
| </script> |
| <script> |
| globalThis.testRunner?.waitUntilDone(); |
| |
| async function window0() { |
| let adapter0 = await navigator.gpu.requestAdapter({}); |
| let promise0 = adapter0.requestDevice({ |
| defaultQueue: {}, |
| requiredFeatures: [ |
| 'depth32float-stencil8', |
| 'texture-compression-etc2', |
| 'texture-compression-astc', |
| 'indirect-first-instance', |
| 'shader-f16', |
| 'rg11b10ufloat-renderable', |
| 'bgra8unorm-storage', |
| 'float32-blendable', |
| 'float16-renderable', |
| 'float32-renderable', |
| ], |
| requiredLimits: { |
| maxDynamicUniformBuffersPerPipelineLayout: 8, |
| maxStorageBufferBindingSize: 166585208, |
| maxUniformBufferBindingSize: 45952403, |
| }, |
| }); |
| let adapter1 = await navigator.gpu.requestAdapter({}); |
| let device0 = await adapter1.requestDevice({ |
| requiredFeatures: [ |
| 'depth-clip-control', |
| 'texture-compression-etc2', |
| 'texture-compression-astc', |
| 'indirect-first-instance', |
| 'shader-f16', |
| 'rg11b10ufloat-renderable', |
| 'bgra8unorm-storage', |
| 'float32-blendable', |
| 'float16-renderable', |
| 'timestamp-query', |
| ], |
| requiredLimits: { |
| maxBindingsPerBindGroup: 1000, |
| maxColorAttachmentBytesPerSample: 32, |
| maxInterStageShaderVariables: 16, |
| maxStorageBufferBindingSize: 161632061, |
| maxUniformBufferBindingSize: 41379376, |
| }, |
| }); |
| // START |
| c = device0.createTexture({ |
| size : [], |
| format : 'rg11b10ufloat', |
| usage : GPUTextureUsage.RENDER_ATTACHMENT |
| }) |
| d = c.createView() |
| e = device0.createBuffer( |
| {size : 44, usage : GPUBufferUsage.INDIRECT | GPUBufferUsage.VERTEX}) |
| f = device0.createBuffer({size : 60, usage : GPUBufferUsage.INDEX}) |
| h = device0.createBuffer({size : 2, usage : GPUBufferUsage.INDEX}) |
| i = device0.createPipelineLayout({bindGroupLayouts : []}) |
| j = device0.createRenderBundleEncoder({colorFormats : [ 'rg11b10ufloat' ]}) |
| k = device0.createBuffer({size : 47, usage : GPUBufferUsage.VERTEX}) |
| try { |
| j.setIndexBuffer(f, 'uint32') |
| } catch { |
| } |
| l = device0.createCommandEncoder() |
| m = device0.createShaderModule({ |
| code : ` |
| struct n { |
| @location(0) o: vec4f} |
| struct p { |
| @builtin(position) position: vec4f} |
| @vertex fn q() -> p { |
| var out: p; |
| return out; |
| } |
| @fragment fn s() -> n { |
| var out: n; |
| return out; |
| } |
| ` |
| }) |
| aa = device0.createBuffer({size : 6, usage : GPUBufferUsage.VERTEX}) |
| try { |
| j.setVertexBuffer(0, k) |
| } catch { |
| } |
| t = device0.createRenderBundleEncoder({colorFormats : [ 'rg11b10ufloat' ]}) |
| try { |
| t.setVertexBuffer(0, aa) |
| } catch { |
| } |
| ab = device0.createRenderPipeline({ |
| layout : 'auto', |
| fragment : {module : m, targets : [ {format : 'rg11b10ufloat'} ]}, |
| vertex : { |
| module : m, |
| buffers : [ { |
| arrayStride : 24, |
| attributes : [ {format : 'uint32x4', offset : 8, shaderLocation : 7} ] |
| } ] |
| } |
| }) |
| u = await device0.createRenderPipelineAsync({ |
| layout : i, |
| fragment : {module : m, targets : [ {format : 'rg11b10ufloat'} ]}, |
| vertex : {module : m} |
| }) |
| try { |
| t.setIndexBuffer(h, 'uint16') |
| } catch { |
| } |
| try { |
| j.setPipeline(ab) |
| } catch { |
| } |
| v = l.beginRenderPass( |
| {colorAttachments : [ {view : d, loadOp : 'clear', storeOp : 'store'} ]}) |
| try { |
| j.drawIndexedIndirect(e, 0) |
| } catch { |
| } |
| x = j.finish() |
| y = device0.createBuffer({size : 443, usage : GPUBufferUsage.INDIRECT}) |
| try { |
| t.setPipeline(u) |
| } catch { |
| } |
| try { |
| t.drawIndexedIndirect(y, 4) |
| } catch { |
| } |
| z = t.finish() |
| try { |
| v.setVertexBuffer(0, e) |
| } catch { |
| } |
| try { |
| v.setPipeline(ab) |
| } catch { |
| } |
| try { |
| v.draw(0) |
| } catch { |
| } |
| try { |
| v.executeBundles([ z, x ]) |
| } catch { |
| } |
| try { |
| v.end() |
| } catch { |
| } |
| ac = l.finish() |
| try { |
| device0.queue.submit([ ac ]) |
| } catch { |
| } |
| // END |
| await device0.queue.onSubmittedWorkDone(); |
| } |
| |
| onload = async () => { |
| try { |
| let sharedScript = document.querySelector('#shared').textContent; |
| |
| let workers = [ |
| |
| ]; |
| let promises = [ window0() ]; |
| debug('promises created'); |
| let results = await Promise.allSettled(promises); |
| for (let result of results) { |
| if (result.status === 'rejected') { throw result.reason; } |
| } |
| debug('Pass'); |
| } catch (e) { |
| log('error'); |
| log(e); |
| log(e[Symbol.toStringTag]); |
| log(e.stack); |
| if (e instanceof GPUPipelineError) { |
| log(`${e} - ${e.reason}`); |
| |
| } else if (e instanceof DOMException) { |
| if (e.name === 'OperationError') { |
| log(e.message); |
| |
| } else if (e.name === 'InvalidStateError') { |
| } else { |
| log(e); |
| |
| } |
| } else if (e instanceof GPUValidationError) { |
| |
| } else if (e instanceof GPUOutOfMemoryError) { |
| |
| } else if (e instanceof TypeError) { |
| log(e); |
| |
| } else { |
| log('unexpected error type'); |
| log(e); |
| |
| } |
| } |
| globalThis.testRunner?.dumpAsText(); |
| globalThis.testRunner?.notifyDone(); |
| }; |
| </script> |