| <!-- webkit-test-runner [ enableMetalShaderValidation=true ] --> |
| <script src="../../../resources/js-test-pre.js"></script> |
| <script> |
| async function run() { |
| let adapter = await navigator.gpu.requestAdapter() |
| let device = await adapter.requestDevice({ requiredLimits: { maxVertexBufferArrayStride: 3100 } }); |
| let pipelineLayout = device.createPipelineLayout({ bindGroupLayouts: [] }); |
| let texture = device.createTexture({ size: [], format: 'rgba16float', usage: GPUTextureUsage.RENDER_ATTACHMENT }); |
| let textureView = texture.createView(); |
| let shaderModule = device.createShaderModule({ code: ` |
| struct f { |
| @location(7) g: vec3<f16> |
| } |
| struct h { |
| @location(0) i: vec4<f32> |
| } |
| @fragment fn j() -> h { |
| return h(); |
| } |
| struct k { |
| @location(0) @builtin(position) l: vec4<f32> |
| } |
| @vertex fn m() -> k { |
| return k(); |
| } |
| `}); |
| let buffer = device.createBuffer({ size: 32, usage: GPUBufferUsage.INDIRECT }); |
| let pipeline = device.createRenderPipeline({ |
| layout: pipelineLayout, |
| fragment: { module: shaderModule, targets: [{ format: 'rgba16float' }] }, |
| vertex: { module: shaderModule, buffers: [, { arrayStride: 3100, attributes: [{ format: 'unorm8x4', offset: 8, shaderLocation: 9 }] }] }, |
| }) |
| let renderBundleEncoder = device.createRenderBundleEncoder({colorFormats: [ 'rgba16float' ]}) |
| buffer.destroy() |
| let buffer2 = device.createBuffer({ size: 0, usage: GPUBufferUsage.INDEX }); |
| let buffer3 = device.createBuffer({ size: 12, usage: GPUBufferUsage.VERTEX }); |
| renderBundleEncoder.setIndexBuffer(buffer2, 'uint32'); |
| renderBundleEncoder.setVertexBuffer(1, buffer3); |
| renderBundleEncoder.setPipeline(pipeline); |
| renderBundleEncoder.drawIndexedIndirect(buffer, 8); |
| let commandEncoder = device.createCommandEncoder(); |
| let renderPassEncoder = commandEncoder.beginRenderPass({ colorAttachments: [{ view: textureView, loadOp: 'load', storeOp: 'discard' }] }); |
| let renderBundle = renderBundleEncoder.finish(); |
| renderPassEncoder.executeBundles([renderBundle]); |
| await device.queue.onSubmittedWorkDone(); |
| debug('Pass') |
| globalThis.testRunner?.notifyDone(); |
| } |
| |
| globalThis.testRunner?.dumpAsText(); |
| globalThis.testRunner?.waitUntilDone(); |
| |
| run(); |
| </script> |
| |