<!-- 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 videoFrame = new VideoFrame(new ArrayBuffer(16), { codedWidth: 2, codedHeight: 2, format: 'RGBX', timestamp: 0 });
    let externalTexture =
        device.importExternalTexture({
            source: videoFrame,
        });
    let shaderModule1 = device.createShaderModule({ code: `
        @group(0) @binding(0) var<storage> buffer: array<i32, 14>;
        @group(0) @binding(2) var texture: texture_external;
        @vertex fn vertex2() -> @builtin(position) vec4f {
            return vec4f();
            _ = buffer;
            _ = texture;
        }
    `});
    let shaderModule2 = device.createShaderModule({ code: `
        @group(0) @binding(0) var<storage> buffer: array<array<f16, 28>>;
        struct FragmentOutput4 {
            @location(0) f0: vec4f
        }
        @fragment fn fragment4() -> FragmentOutput4 {
            var out: FragmentOutput4;
            out.f0 *= vec4f(f32(buffer[0][0]));
            return out;
        }
    `});
    let pipeline = device.createRenderPipeline({
        layout: 'auto',
        fragment: { module: shaderModule2, targets: [{ format: 'rgba8unorm', writeMask: GPUColorWrite.ALL }] },
        vertex: { module: shaderModule1, entryPoint: 'vertex2', buffers: [] }
    });
    let bindGroupLayout = pipeline.getBindGroupLayout(0);
    let buffer = device.createBuffer({ size: 56, usage: GPUBufferUsage.STORAGE });
    device.createBindGroup({
        layout: bindGroupLayout,
        entries: [
            { binding: 2, resource: externalTexture },
            { binding: 0, resource: { buffer: buffer, offset: 0, size: 56 } }
        ]
    })
    await device.queue.onSubmittedWorkDone();
    debug('Pass')
    globalThis.testRunner?.notifyDone();
}

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

run();
</script>

