<script src="../../../resources/js-test-pre.js"></script>
<script>
async function run() {
    let adapter = await navigator.gpu.requestAdapter();
    let device = await adapter.requestDevice();
    let texture = device.createTexture({ size: [4], format: 'stencil8', usage: GPUTextureUsage.RENDER_ATTACHMENT });
    pipelineLayout = device.createPipelineLayout({ bindGroupLayouts: [] });
    shaderModule = device.createShaderModule({ code: `
        struct f {
            @location(0) g: vec4<u32>
        }
        @fragment fn h() -> f {
            return f();
        }
        struct i {
            @builtin(position) j: vec4<f32>
        }
        @vertex fn k() -> i {
            return i();
        }
    `});
    let textureView1 = texture.createView();
    let renderBundleEncoder = device.createRenderBundleEncoder({ colorFormats: [], depthStencilFormat: 'stencil8' });
    let renderPipeline = await device.createRenderPipelineAsync({
        layout: pipelineLayout,
        fragment: {
            module: shaderModule,
            targets: [{ format: 'rg16uint' }]
        },
        depthStencil: { format: 'stencil8' },
        vertex: { module: shaderModule }
    });
    renderBundleEncoder.setPipeline(renderPipeline);
    let commandEncoder1 = device.createCommandEncoder();
    let commandEncoder2 = device.createCommandEncoder();
    let renderPassEncoder1 = commandEncoder1.beginRenderPass({
        colorAttachments: [],
        depthStencilAttachment: { view: textureView1, stencilLoadOp: 'load', stencilStoreOp: 'store' }
    });
    let renderPassEncoder2 = commandEncoder2.beginRenderPass({
        colorAttachments: [],
        depthStencilAttachment: { view: textureView1, stencilLoadOp: 'load', stencilStoreOp: 'store' }
    });
    let renderBundle = renderBundleEncoder.finish();
    renderPassEncoder1.executeBundles([renderBundle]);
    renderPassEncoder2.executeBundles([renderBundle]);
    await device.queue.onSubmittedWorkDone();
    debug('Pass')
    globalThis.testRunner?.notifyDone();
}
globalThis.testRunner?.dumpAsText();
globalThis.testRunner?.waitUntilDone();

run();
</script>

