1 async function getBasicDevice() {
2 const adapter = await navigator.gpu.requestAdapter({ powerPreference: "low-power" });
3 const device = await adapter.requestDevice();
7 function createBasicSwapChain(canvas, device) {
8 const context = canvas.getContext("gpu");
9 return context.configureSwapChain({ device: device, format: "bgra8unorm" });
12 function createBasicDepthStateDescriptor() {
14 depthWriteEnabled: true,
19 function createBasicDepthTexture(canvas, device) {
22 height: canvas.height,
26 return device.createTexture({
28 format: "depth32float-stencil8",
29 usage: GPUTextureUsage.OUTPUT_ATTACHMENT
33 function createBasicPipeline(shaderModule, device, colorStates, pipelineLayout, inputStateDescriptor, depthStateDescriptor, primitiveTopology = "triangle-strip") {
34 const vertexStageDescriptor = {
36 entryPoint: "vertex_main"
39 const fragmentStageDescriptor = {
41 entryPoint: "fragment_main"
52 if (!inputStateDescriptor)
53 inputStateDescriptor = { attributes: [], inputs: [] };
55 const pipelineDescriptor = {
56 vertexStage: vertexStageDescriptor,
57 fragmentStage: fragmentStageDescriptor,
58 primitiveTopology: primitiveTopology,
59 colorStates: colorStates,
60 inputState: inputStateDescriptor
64 pipelineDescriptor.layout = pipelineLayout;
66 if (depthStateDescriptor)
67 pipelineDescriptor.depthStencilState = depthStateDescriptor;
69 return device.createRenderPipeline(pipelineDescriptor);
72 function beginBasicRenderPass(swapChain, commandEncoder) {
73 const basicAttachment = {
74 attachment: swapChain.getCurrentTexture().createDefaultView(),
77 clearColor: { r: 1.0, g: 0, b: 0, a: 1.0 }
80 // FIXME: Flesh out the rest of WebGPURenderPassDescriptor.
81 return commandEncoder.beginRenderPass({ colorAttachments : [basicAttachment] });
84 function encodeBasicCommands(renderPassEncoder, renderPipeline, vertexBuffer) {
86 renderPassEncoder.setVertexBuffers(0, [vertexBuffer], [0]);
87 renderPassEncoder.setPipeline(renderPipeline);
88 renderPassEncoder.draw(4, 1, 0, 0);
89 renderPassEncoder.endPass();