<!DOCTYPE html>
<html>

<head>
  <title>
    Test CPU performance of the GPURenderPassEncoder.draw binding
  </title>
  <script src="../resources/runner.js"></script>
  <script src="./resources/webgpu-perf-utils.js"></script>
</head>

<body>
  <canvas id="canvas" width=400 height=400></canvas>
  <script>
    (async () => {
      const adapter = navigator.gpu && await navigator.gpu.requestAdapter();
      if (!adapter) {
        return skipTest('WebGPU not supported');
      }

      const device = await adapter.requestDevice();
      const canvas = document.getElementById('canvas');
      const context = canvas.getContext('gpupresent');
      const swapChainFormat = await context.getSwapChainPreferredFormat(device);

      const swapChain = context.configureSwapChain({
        device,
        format: swapChainFormat,
      });

      const pipeline = device.createRenderPipeline({
        vertexStage: {
          module: device.createShaderModule({
            code: `
              const pos : array<vec2<f32>, 3> = array<vec2<f32>, 3>(
                  vec2<f32>(0.0, 0.5),
                  vec2<f32>(-0.5, -0.5),
                  vec2<f32>(0.5, -0.5));

              [[builtin(position)]] var<out> Position : vec4<f32>;
              [[builtin(vertex_index)]] var<in> VertexIndex : u32;
              [[stage(vertex)]] fn main() -> void {
                Position = vec4<f32>(pos[VertexIndex], 0.0, 1.0);
              }`
          }),
          entryPoint: 'main',
        },
        fragmentStage: {
          module: device.createShaderModule({
            code: `
              [[location(0)]] var<out> outColor : vec4<f32>;
              [[stage(fragment)]] fn main() -> void {
                outColor = vec4<f32>(0.0, 1.0, 0.0, 1.0);
              }`
          }),
          entryPoint: 'main',
        },
        primitiveTopology: 'triangle-list',
        colorStates: [{
          format: swapChainFormat,
        }],
      });

      const renderPassDescriptor = {
        colorAttachments: [{
            attachment: undefined,
            loadValue: { r: 0.0, g: 0.0, b: 0.0, a: 1.0 },
        }],
      };

      const iterations = 10000;
      PerfTestRunner.measureInnerRAFTime({
        description: `CPU time for ${iterations} calls to GPURenderPassEncoder.draw`,
        warmUpCount: 10,
        run() {
          const commandEncoder = device.createCommandEncoder();
          renderPassDescriptor.colorAttachments[0].attachment = swapChain.getCurrentTexture().createView();

          const passEncoder = commandEncoder.beginRenderPass(renderPassDescriptor);
          passEncoder.setPipeline(pipeline);
          for (let i = 0; i < iterations; ++i) {
            passEncoder.draw(3, 1, 0, 0);
          }
          passEncoder.endPass();

          device.defaultQueue.submit([commandEncoder.finish()]);
        }
      });
    })();
  </script>
</body>

</html>
