<!DOCTYPE html>
<html>
<script src="js/webgpu-functions.js"></script>
<script src="../resources/testharness.js"></script>
<script src="../resources/testharnessreport.js"></script>
<script>
const shaderCode = `
#include <metal_stdlib>
    
using namespace metal;

struct Vertex
{
    float4 position [[position]];
};

vertex Vertex vertex_main(uint vid [[vertex_id]])
{
    Vertex v;
    switch (vid) {
    case 0:
        v.position = float4(-1, 1, 0, 1);
        break;
    case 1:
        v.position = float4(-1, -1, 0, 1);
        break;
    case 2:
        v.position = float4(1, 1, 0, 1);
        break;
    default:
        v.position = float4(1, -1, 0, 1);
    }
    return v;
}

fragment float4 fragment_main(Vertex vertexIn [[stage_in]])
{
    return float4(0.0, 1.0, 0.0, 1.0);
}
`

promise_test(async () => {
    const device = await getBasicDevice();
    const shaderModule = device.createShaderModule({ code: shaderCode });

    const layoutBinding = { binding: 0, visibility: GPUShaderStageBit.VERTEX, type: "storage-buffer" };
    const bindGroupLayout = device.createBindGroupLayout({ bindings: [layoutBinding] });
    const pipelineLayout = device.createPipelineLayout({ bindGroupLayouts: [bindGroupLayout] });

    const pipeline = createBasicPipeline(shaderModule, device, null, pipelineLayout);
    assert_true(pipeline instanceof GPURenderPipeline, "Successfully created GPURenderPipeline");
}, "Create basic GPURenderPipeline");
</script>
</html>