<!-- webkit-test-runner [ enableMetalDebugDevice=true ] -->
<script src="../../../resources/js-test-pre.js"></script>
<script>
async function run() {
    let adapter0 = await navigator.gpu.requestAdapter();
    let device0 = await adapter0.requestDevice();
    let texture = device0.createTexture({
        size: { width: 96, height: 40 },
        format: 'rg8sint',
        usage: GPUTextureUsage.TEXTURE_BINDING,
        viewFormats: [],
    });
    let texture2 = device0.createTexture({
        size: { width: 24, height: 10, },
        format: 'rgba32sint',
        usage: GPUTextureUsage.RENDER_ATTACHMENT,
    });
    let textureView = texture.createView();
    let textureView2 = texture2.createView();
    let bindGroupLayout = device0.createBindGroupLayout({
        entries: [{
            binding: 0,
            visibility: GPUShaderStage.FRAGMENT | GPUShaderStage.VERTEX,
            texture: { sampleType: 'sint' },
        }],
    });
    let pipelineLayout1 = device0.createPipelineLayout({
        bindGroupLayouts: [bindGroupLayout]
    });
    let shaderModule0 = device0.createShaderModule({ code: `
        @vertex fn vertex0() -> @builtin(position) vec4f {
            return vec4f();
        }
        @fragment fn fragment0() -> @location(200) vec4i {
            return vec4i();
        }
    `});
    let pipeline1 = await device0.createRenderPipelineAsync({
        layout: pipelineLayout1,
        fragment: { module: shaderModule0, targets: [{ format: 'rgba32sint' }] },
        vertex: { module: shaderModule0, buffers: [] },
    });
    let bindGroup = device0.createBindGroup({
        layout: bindGroupLayout,
        entries: [{ binding: 0, resource: textureView }],
    });
    let commandEncoder = device0.createCommandEncoder({});
    let renderPassEncoder = commandEncoder.beginRenderPass({
        colorAttachments: [{ view: textureView2, loadOp: 'load', storeOp: 'store' }],
        maxDrawCount: 1,
    });
    let renderBundleEncoder = device0.createRenderBundleEncoder({ colorFormats: ['rgba32sint'] });
    renderBundleEncoder.setPipeline(pipeline1);
    renderBundleEncoder.setBindGroup(0, bindGroup);
    renderBundleEncoder.draw(0);
    renderBundleEncoder.draw(0);
    renderPassEncoder.executeBundles([renderBundleEncoder.finish()]);
    await device0.queue.onSubmittedWorkDone();
    debug('Pass')
    globalThis.testRunner?.notifyDone();
}

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

run();
</script>

