import shaderCode from "./compute.wgsl?raw"
const adapter = await navigator.gpu.requestAdapter()
throw new Error("WebGPU cannot be initialized - Adapter not found")
const device = await adapter.requestDevice()
throw new Error("WebGPU cannot be initialized - Device has been lost")
const shaderModule = device.createShaderModule({ code: shaderCode })
const data = new Float32Array([0.0])
const buffer = device.createBuffer({
usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST
device.queue.writeBuffer(buffer, 0, data)
const bindgroupLayout = device.createBindGroupLayout({
visibility: GPUShaderStage.COMPUTE,
const bindgroup = device.createBindGroup({
const computePipelineLayout = device.createPipelineLayout({
bindGroupLayouts: [bindgroupLayout]
const computePipeline = device.createComputePipeline({
layout: computePipelineLayout,
const commandEncoder = device.createCommandEncoder()
const computePass = commandEncoder.beginComputePass()
computePass.setPipeline(computePipeline)
computePass.setBindGroup(0, bindgroup)
computePass.dispatchWorkgroups(1)
const stagingBuffer = device.createBuffer({
usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ
commandEncoder.copyBufferToBuffer(buffer, 0, stagingBuffer, 0, data.byteLength)
device.queue.submit([commandEncoder.finish()])
// Map and read the buffer
await stagingBuffer.mapAsync(GPUMapMode.READ)
const arrayBuffer = stagingBuffer.getMappedRange()
const result = new Float32Array(arrayBuffer)
const $output = document.getElementById("output")!
$output.textContent = `Result: ${result[0]}`