<!DOCTYPE html>
<meta charset="utf-8">
<title>WebGPU Hello Triangles</title>
<meta name="assert" content="WebGPU correctly renders a green canvas.">
<link rel="match" href="viewport-scissor-rect-triangle-strip-expected.html">
<p>Pass if square canvas below is a 4 by 4 blue/green checkerboard.</p>
<canvas width="400" height="400"></canvas>
<script src="js/webgpu-functions.js"></script>
<script>
if (window.testRunner)
    testRunner.waitUntilDone();

const shaderCode = `
vertex float4 vertex_main(uint vid : SV_VertexID) : SV_Position
{
    float4 v;
    switch (vid) {
    case 0:
        v = float4(-1, 1, 0, 1);
        break;
    case 1:
        v = float4(-1, -1, 0, 1);
        break;
    case 2:
        v = float4(1, 1, 0, 1);
        break;
    default:
        v = float4(1, -1, 0, 1);
        break;
    }
    return v;
}

fragment float4 fragment_main() : SV_Target 0
{
    return float4(0.0, 1.0, 0.0, 1.0);
}
`;

const canvas = document.querySelector("canvas");

async function test(device) {
    const canvas = document.querySelector("canvas");
    const swapChain = createBasicSwapChain(canvas, device);
    // FIXME: Replace with non-MSL shaders.
    const shaderModule = device.createShaderModule({ code: shaderCode });
    const pipeline = createBasicPipeline(shaderModule, device);
    const commandEncoder = device.createCommandEncoder();
    const blueAttachment = {
        attachment: swapChain.getCurrentTexture().createDefaultView(),
        loadOp: "clear",
        storeOp: "store",
        clearColor: { r: 0, g: 0, b: 1, a: 1 }
    };
    const passEncoder = commandEncoder.beginRenderPass({ colorAttachments: [blueAttachment] });
    passEncoder.setPipeline(pipeline);

    function drawViewport(x, y) {
        passEncoder.setViewport(x, y, 100, 100, 0, 1);
        passEncoder.draw(4, 1, 0, 0);
    }

    function drawScissorRect(x, y) {
        passEncoder.setScissorRect(x, y, 100, 100);
        passEncoder.draw(4, 1, 0, 0);
    }

    passEncoder.setScissorRect(0, 0, 200, 400);
    drawViewport(100, 0);
    drawViewport(0, 100);
    drawViewport(100, 200);
    drawViewport(0, 300);

    // Draw outside of scissor rect should not appear.
    drawViewport(200, 100);

    passEncoder.setViewport(200, 0, 200, 400, 0, 1);
    drawScissorRect(300, 0);
    drawScissorRect(200, 100);
    drawScissorRect(300, 200);
    drawScissorRect(200, 300);

    // Draw outside of viewport should not appear.
    drawScissorRect(0, 0);

    passEncoder.endPass();
    const queue = device.getQueue();

    queue.submit([commandEncoder.finish()]);
}

getBasicDevice().then(function(device) {
    test(device).then(function() {
        if (window.testRunner)
            testRunner.notifyDone();
    }, function() {
        if (window.testRunner)
            testRunner.notifyDone();
    });
}, function() {
    drawGreenAndBlueCheckerboardInSoftware(canvas);
    if (window.testRunner)
        testRunner.notifyDone();
});
</script>
