<!-- 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 shaderModule = device.createShaderModule({ code: ` 
        struct e {
            @builtin(position) f: vec4f
        }
        @vertex fn g() -> e {
            var h: e;
            return h;
        }
    `}
    );
    let canvas = document.createElement('canvas');
    let context = canvas.getContext('webgpu');
    context.configure({ device: device, format: 'bgra8unorm', viewFormats: ['bgra8unorm-srgb'] });
    let texture = context.getCurrentTexture();
    let textureView = texture.createView({ format: 'bgra8unorm-srgb' });
    let shaderModule2 = device.createShaderModule({ code: ` 
        struct p {
            @location(0) f0: vec4f
        }
        @fragment fn fragment7() -> p {
            var h: p;
            return h;
        }
    `});
    await device.createRenderPipelineAsync({ layout: pipelineLayout, vertex: { module: shaderModule } });
    let commandEncoder = device.createCommandEncoder();
    let renderPassEncoder = commandEncoder.beginRenderPass({ colorAttachments: [{ view: textureView, loadOp: 'clear', storeOp: 'discard' }] });
    let renderPipeline = await device.createRenderPipelineAsync({
        layout: pipelineLayout,
        fragment: { module: shaderModule2, targets: [{ format: 'bgra8unorm-srgb' }] },
        vertex: { module: shaderModule, buffers: [] }
    });
    let renderBundleEncoder = device.createRenderBundleEncoder({ colorFormats: ['bgra8unorm-srgb'] });
    renderBundleEncoder.setPipeline(renderPipeline);
    let renderBundle = renderBundleEncoder.finish();
    renderPassEncoder.executeBundles([renderBundle]);
    await device.queue.onSubmittedWorkDone();
    debug('Pass')
    globalThis.testRunner?.notifyDone();
}

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

run();
</script>

