From c27c20f2cf37b7618f412c9a5e8ba28dcc8e5a23 Mon Sep 17 00:00:00 2001 From: Rezmason Date: Wed, 27 Oct 2021 21:08:20 -0700 Subject: [PATCH] Consolidating all the bind groups, because I only have four. Stuff shared between render passes will get isolated somehow, but it might be by binding one buffer to multiple render passes' bind group at zero rather than having more than one bind group. --- js/webgpu_main.js | 40 ++++++++++--------------------------- shaders/rainRenderPass.wgsl | 10 +++++----- webgpu_notes.txt | 2 ++ 3 files changed, 17 insertions(+), 35 deletions(-) diff --git a/js/webgpu_main.js b/js/webgpu_main.js index ad0f6f4..7e8a063 100644 --- a/js/webgpu_main.js +++ b/js/webgpu_main.js @@ -105,7 +105,7 @@ export default async (canvas, config) => { const aspectRatio = canvasSize[0] / canvasSize[1]; const screenSize = aspectRatio > 1 ? [1, aspectRatio] : [1 / aspectRatio, 1]; queue.writeBuffer(cameraBuffer, 0, new Float32Array(screenSize)); - } + }; updateCameraBuffer(); const [rainRenderShader] = await Promise.all(["shaders/rainRenderPass.wgsl"].map(async (path) => (await fetch(path)).text())); @@ -145,7 +145,9 @@ export default async (canvas, config) => { }, }); - const configBindGroup = device.createBindGroup({ + console.log(device.limits); + + const bindGroup = device.createBindGroup({ layout: rainRenderPipeline.getBindGroupLayout(0), entries: [ { @@ -154,46 +156,28 @@ export default async (canvas, config) => { buffer: configBuffer, }, }, - ], - }); - - const msdfBindGroup = device.createBindGroup({ - layout: rainRenderPipeline.getBindGroupLayout(1), - entries: [ { - binding: 0, + binding: 1, resource: { buffer: msdfBuffer, }, }, { - binding: 1, + binding: 2, resource: sampler, }, { - binding: 2, + binding: 3, resource: msdfTexture.createView(), }, - ], - }); - - const timeBindGroup = device.createBindGroup({ - layout: rainRenderPipeline.getBindGroupLayout(2), - entries: [ { - binding: 0, + binding: 4, resource: { buffer: timeBuffer, }, }, - ], - }); - - const cameraBindGroup = device.createBindGroup({ - layout: rainRenderPipeline.getBindGroupLayout(3), - entries: [ { - binding: 0, + binding: 5, resource: { buffer: cameraBuffer, }, @@ -201,16 +185,12 @@ export default async (canvas, config) => { ], }); - const rainRenderPipelineBindGroups = [configBindGroup, msdfBindGroup, timeBindGroup, cameraBindGroup]; - const bundleEncoder = device.createRenderBundleEncoder({ colorFormats: [presentationFormat], }); bundleEncoder.setPipeline(rainRenderPipeline); - rainRenderPipelineBindGroups.forEach((bindGroup, index) => { - bundleEncoder.setBindGroup(index, bindGroup); - }); + bundleEncoder.setBindGroup(0, bindGroup); const numQuads = numColumns * numRows; bundleEncoder.draw(NUM_VERTICES_PER_QUAD * numQuads, 1, 0, 0); const renderBundles = [bundleEncoder.finish()]; diff --git a/shaders/rainRenderPass.wgsl b/shaders/rainRenderPass.wgsl index 04e2d5e..d10a636 100644 --- a/shaders/rainRenderPass.wgsl +++ b/shaders/rainRenderPass.wgsl @@ -11,20 +11,20 @@ let TWO_PI:f32 = 6.28318530718; // No, I'm not using Tau. [[block]] struct MSDFUniforms { numColumns: i32; }; -[[group(1), binding(0)]] var msdfUniforms:MSDFUniforms; -[[group(1), binding(1)]] var msdfSampler: sampler; -[[group(1), binding(2)]] var msdfTexture: texture_2d; +[[group(0), binding(1)]] var msdfUniforms:MSDFUniforms; +[[group(0), binding(2)]] var msdfSampler: sampler; +[[group(0), binding(3)]] var msdfTexture: texture_2d; [[block]] struct TimeUniforms { now: i32; frame: i32; }; -[[group(2), binding(0)]] var timeUniforms:TimeUniforms; +[[group(0), binding(4)]] var timeUniforms:TimeUniforms; [[block]] struct CameraUniforms { screenSize: vec2; }; -[[group(3), binding(0)]] var cameraUniforms:CameraUniforms; +[[group(0), binding(5)]] var cameraUniforms:CameraUniforms; // Vertex shader diff --git a/webgpu_notes.txt b/webgpu_notes.txt index ebe43f7..f03b14e 100644 --- a/webgpu_notes.txt +++ b/webgpu_notes.txt @@ -40,3 +40,5 @@ Textures were never resizable, you simply forgot Bind groups let you bind a bunch of resources at once Render bundles let you reissue commands + +You can only use up to FOUR bind groups on your laptop's device! \ No newline at end of file