<!DOCTYPE html>
<html>
<head>
<script src="../../js/webgpu-functions.js"></script>
</head>
<body>
<canvas id="canvas" width="400" height="400"></canvas>
<script>
const vertexShaderSource = `
struct Foo {
    float x;
}
vertex float4 vertexShader(float4 position : attribute(0)) : SV_Position {
    return position;
}`;

const fragmentShaderSource = `
struct Foo {
    float x;
}
fragment float4 fragmentShader(float4 position : SV_Position) : SV_Target 0 {
    Foo f;
    f.x = 1;
    return float4(f.x, 1, 1, 1);
}
`;

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

async function start(device) {
    const vertexShaderModule = device.createShaderModule({code: vertexShaderSource});
    const fragmentShaderModule = device.createShaderModule({code: fragmentShaderSource});
    const vertexStage = {module: vertexShaderModule, entryPoint: "vertexShader"};
    const fragmentStage = {module: fragmentShaderModule, entryPoint: "fragmentShader"};
    const primitiveTopology = "triangle-strip";
    const rasterizationState = {frontFace: "cw", cullMode: "none"};
    const alphaBlend = {};
    const colorBlend = {};
    const colorStates = [{format: "rgba8unorm", alphaBlend, colorBlend, writeMask: 15}]; // GPUColorWrite.ALL
    const depthStencilState = null;
    
    const attribute = {shaderLocation: 0, format: "float4"};
    const input = {stride: 16, attributeSet: [attribute]};
    const inputs = [input];
    const vertexInput = {vertexBuffers: inputs};

    const pipelineLayoutDescriptor = {bindGroupLayouts: []};
    const pipelineLayout = device.createPipelineLayout(pipelineLayoutDescriptor);

    const renderPipelineDescriptor = {vertexStage, fragmentStage, primitiveTopology, rasterizationState, colorStates, depthStencilState, vertexInput, sampleCount: 1, layout: pipelineLayout};
    const renderPipeline = device.createRenderPipeline(renderPipelineDescriptor);

    const vertexBufferDescriptor = {size: Float32Array.BYTES_PER_ELEMENT * 4 * 4, usage: GPUBufferUsage.VERTEX | GPUBufferUsage.MAP_WRITE};
    const vertexBuffer = device.createBuffer(vertexBufferDescriptor);
    const vertexBufferArrayBuffer = await vertexBuffer.mapWriteAsync();
    const vertexBufferFloat32Array = new Float32Array(vertexBufferArrayBuffer);
    vertexBufferFloat32Array[0] = -0.5;
    vertexBufferFloat32Array[1] = -0.5;
    vertexBufferFloat32Array[2] = 1.0;
    vertexBufferFloat32Array[3] = 1;
    vertexBufferFloat32Array[4] = -0.5;
    vertexBufferFloat32Array[5] = 0.5;
    vertexBufferFloat32Array[6] = 1.0;
    vertexBufferFloat32Array[7] = 1;
    vertexBufferFloat32Array[8] = 0.5;
    vertexBufferFloat32Array[9] = -0.5;
    vertexBufferFloat32Array[10] = 1.0;
    vertexBufferFloat32Array[11] = 1;
    vertexBufferFloat32Array[12] = 0.5;
    vertexBufferFloat32Array[13] = 0.5;
    vertexBufferFloat32Array[14] = 1.0;
    vertexBufferFloat32Array[15] = 1;
    vertexBuffer.unmap();

    const context = canvas.getContext("gpu");
    const swapChainDescriptor = {device, format: "bgra8unorm"};
    const swapChain = context.configureSwapChain(swapChainDescriptor);
    const outputTexture = swapChain.getCurrentTexture();
    const outputTextureView = outputTexture.createDefaultView();

    const commandEncoder = device.createCommandEncoder(); // {}
    const red = {r: 0, g: 0, b: 1, a: 1};
    const colorAttachments = [{attachment: outputTextureView, resolveTarget: null, loadOp: "clear", storeOp: "store", clearColor: red}];
    const depthStencilAttachment = null;
    const renderPassDescriptor = {colorAttachments, depthStencilAttachment};
    const renderPassEncoder = commandEncoder.beginRenderPass(renderPassDescriptor);
    renderPassEncoder.setPipeline(renderPipeline);
    renderPassEncoder.setVertexBuffers(0, [vertexBuffer], [0]);
    renderPassEncoder.draw(4, 1, 0, 0);
    renderPassEncoder.endPass();
    const commandBuffer = commandEncoder.finish();
    device.getQueue().submit([commandBuffer]);
}
if (window.testRunner)
    testRunner.waitUntilDone();
getBasicDevice().then(function(device) {
    start(device).then(function() {
        if (window.testRunner)
            testRunner.notifyDone();
    }, function() {
        if (window.testRunner)
            testRunner.notifyDone();
    });
}, function() {
    drawWhiteSquareOnBlueBackgroundInSoftware(canvas);
    if (window.testRunner)
        testRunner.notifyDone();
});
</script>
</body>
</html>
