<!-- 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 buffer = device.createBuffer({ size: 73494, usage: GPUBufferUsage.INDEX });
    let pipelineLayout = device.createPipelineLayout({ bindGroupLayouts: [] });
    buffer.destroy()
    let shaderModule = device.createShaderModule({ code: `
        struct S7 {
            @location(9) f0: vec4<i32>
        }
        struct FragmentOutput0 {
            @location(2) f0: vec4<f32>,
            @location(4) f1: vec2<u32>,
            @location(1) f2: vec4<u32>,
            @location(3) f3: vec4<i32>,
            @location(0) f4: vec4<f32>
        }
        @fragment fn fragment0() -> FragmentOutput0 {
            return FragmentOutput0();
        }
        struct VertexOutput0 {
            @location(0) f80: vec2<f32>,
            @location(12) f81: vec4<i32>,
            @location(3) f82: vec3<f32>,
            @location(1) f83: vec4<f32>,
            @location(15) f84: vec3<i32>,
            @location(9) f85: vec4<i32>,
            @builtin(position) f86: vec4<f32>
        }
        @vertex fn vertex0() -> VertexOutput0 {
            return VertexOutput0();
        }
    `});
    let pipeline = device.createRenderPipeline({
        layout: pipelineLayout,
        fragment: {
            module: shaderModule,
            targets: [
                { format: 'bgra8unorm-srgb' },
                { format: 'rg16uint' },
                { format: 'rgb10a2unorm', blend: { color: {}, alpha: {} } },
                { format: 'r32sint'},
                { format: 'r32uint', writeMask: GPUColorWrite.ALPHA | GPUColorWrite.RED }
            ]
        },
        vertex: {
            module: shaderModule,
            buffers: []
        }
    });
    let renderBundleEncoder = device.createRenderBundleEncoder({ colorFormats: ['bgra8unorm-srgb', 'rg16uint', 'rgb10a2unorm', 'r32sint', 'r32uint'] });
    renderBundleEncoder.setIndexBuffer(buffer, 'uint16', 41950);
    renderBundleEncoder.setVertexBuffer(2, undefined, 130);
    renderBundleEncoder.setPipeline(pipeline);
    renderBundleEncoder.drawIndexed(1833);
    renderBundleEncoder.finish();
    await device.queue.onSubmittedWorkDone();
    debug('Pass')
    globalThis.testRunner?.notifyDone();
}

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

run();
</script>

