<!-- webkit-test-runner [ enableMetalDebugDevice=true ] -->
<script src="../../../resources/js-test-pre.js"></script>
<script>
async function run() {
    let adapter = await navigator.gpu.requestAdapter();
    let device = await adapter.requestDevice();
    let pipelineLayout = device.createPipelineLayout({ bindGroupLayouts: [] });
    let texture = device.createTexture({ size: { width: 80 }, dimension: '3d', format: 'r8unorm', usage: GPUTextureUsage.RENDER_ATTACHMENT });
    let texture2 = device.createTexture({ size: { width: 80 }, format: 'rgba32uint', usage: GPUTextureUsage.RENDER_ATTACHMENT });
    let buffer = device.createBuffer({ size: 215, usage: GPUBufferUsage.INDIRECT });
    let shaderModule = device.createShaderModule({ code: ` 
        struct f {
            @location(0) h: vec4u,
            @location(1) g: f32,
        }
        @vertex fn j() -> @builtin(position) vec4f {
            return vec4f();
        }
        @fragment fn l() -> f {
            var k: f;
            return k;
        }
    `});
    let renderPipeline = await device.createRenderPipelineAsync({
        layout: pipelineLayout,
        fragment: { module: shaderModule, targets: [{ format: 'rgba32uint' }, { format: 'r8unorm' }] },
        vertex: { module: shaderModule }
    });
    let renderBundleEncoder = device.createRenderBundleEncoder({colorFormats: [ 'rgba32uint', 'r8unorm' ]});
    renderBundleEncoder.setPipeline(renderPipeline);
    renderBundleEncoder.drawIndirect(buffer, 4);
    renderBundleEncoder.draw(9, 7, 4_294_967_295);
    let renderPassEncoder = device.createCommandEncoder().beginRenderPass({
        colorAttachments: [
            { view: texture2.createView(), loadOp: 'load', storeOp: 'discard' },
            { view: texture.createView(), depthSlice: 0, loadOp: 'load', storeOp: 'store' },
        ]
    });
    renderPassEncoder.executeBundles([renderBundleEncoder.finish()])
    await device.queue.onSubmittedWorkDone();
    debug('Pass')
    globalThis.testRunner?.notifyDone();
}

globalThis.testRunner?.dumpAsText();
globalThis.testRunner?.waitUntilDone();

run();
</script>

