Skip to content

library_webgpu.js: the setBindGroup shim can be simplified. #20280

@floooh

Description

@floooh

The current setBindGroup shims in library_webgpu.js create an adhoc JS array object when called with dynamicOffsetCount > 0:

https://github.com/emscripten-core/emscripten/blob/0be5b609412d5b07f8157528df8e5088dae84858/src/library_webgpu.js#L2126C3-L2138

  wgpuRenderPassEncoderSetBindGroup: (passId, groupIndex, groupId, dynamicOffsetCount, dynamicOffsetsPtr) => {
    var pass = WebGPU.mgrRenderPassEncoder.get(passId);
    var group = WebGPU.mgrBindGroup.get(groupId);
    if (dynamicOffsetCount == 0) {
      pass["setBindGroup"](groupIndex, group);
    } else {
      var offsets = [];
      for (var i = 0; i < dynamicOffsetCount; i++, dynamicOffsetsPtr += 4) {
        offsets.push({{{ gpu.makeGetU32('dynamicOffsetsPtr', 0) }}});
      }
      pass["setBindGroup"](groupIndex, group, offsets);
    }
  },

By using a different setBindGroup overload, this can be simplified to:

  wgpuRenderPassEncoderSetBindGroup: (passId, groupIndex, groupId, dynamicOffsetCount, dynamicOffsetsPtr) => {
    var pass = WebGPU.mgrRenderPassEncoder.get(passId);
    var group = WebGPU.mgrBindGroup.get(groupId);
    if (dynamicOffsetCount == 0) {
      pass["setBindGroup"](groupIndex, group);
    } else {
      pass["setBindGroup"](groupIndex, group, HEAPU32, dynamicOffsetsPtr>>2, dynamicOffsetCount);
    }
  },

Tested on an M1 Mac on Chrome - I'm actually not sure if the previous code is just a leftover before this separate overload function existed, or whether this is because of compatibility with non-Chrome browsers - maybe their WebGPU implementation hasn't caught up yet).

Also, the same fix should be applied to the other setBindGroup variants:

  • wgpuRenderBundleEncoderSetBindGroup
  • wgpuComputePassEncoderSetBindGroup

(cc: @kainino0x)

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions