<!DOCTYPE html>
<meta charset=utf-8>
<title>Get the GPUDevice and ask for the GPUQueue</title>
<body>
<script src="../resources/testharness.js"></script>
<script src="../resources/testharnessreport.js"></script>
<script src="js/webgpu-functions.js"></script>
<script>
const shaders = `
#include <metal_stdlib>
    
using namespace metal;

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

vertex Vertex vertex_main()
{
    return Vertex { float4(0, 0, 0, 1) };
}

fragment float4 fragment_main(Vertex vertexIn [[stage_in]])
{
    return vertexIn.position;
}
`

promise_test(() => {
    return getBasicDevice().then(function(device) {
        const canvas = document.createElement("canvas");
        const swapChain = createBasicSwapChain(canvas, device);
        const shaderModule = device.createShaderModule({ code: shaders });
        const pipeline = createBasicPipeline(shaderModule, device);

        const commandEncoder = device.createCommandEncoder();
        assert_true(commandEncoder instanceof GPUCommandEncoder, "createCommandEncoder returned a GPUCommandEncoder");

        const encoder = beginBasicRenderPass(swapChain, commandEncoder);
        assert_true(encoder instanceof GPURenderPassEncoder, "beginRenderPass() returned a GPURenderPassEncoder");

        encoder.setPipeline(pipeline);
        encoder.endPass();
    }, function() {
    });
}, "GPURenderPassEncoder created and successfully ended");

</script>
</body>
