GPUComputePassEncoder: метод setBindGroup()
Ограниченная доступность
Эта функция не является базовой, так как она не работает в некоторых из наиболее широко используемых браузеров.
Экспериментально: Это экспериментальная технология
Перед использованием в производстве внимательно изучите таблицу совместимости браузеров.
Безопасный контекст: Эта функция доступна только в безопасных контекстах (HTTPS) в некоторых или во всех поддерживающих браузерах.
Примечание: Эта функция доступна в Web Workers.
Метод setBindGroup() интерфейса GPUComputePassEncoder устанавливает GPUBindGroup для использования в последующих командах вычислений для заданного индекса.
Синтаксис
setBindGroup(index, bindGroup)
setBindGroup(index, bindGroup, dynamicOffsets)
setBindGroup(index, bindGroup, dynamicOffsets, dynamicOffsetsStart,
dynamicOffsetsLength)
Параметры
index-
Индекс, в котором будет установлен bind group. Он соответствует значению индекса
nсоответствующего@group(n)атрибута в коде шейдера (GPUShaderModule), используемом в связанной обработке. bindGroup-
GPUBindGroupдля использования в последующих командах вычислений, илиnull, в этом случае любой ранее установленный bind group в данном слоте будет сброшен. dynamicOffsetsНеобязательно-
Значение, определяющее смещение в байтах для каждой записи в
bindGroupпри установкеhasDynamicOffset: true(т.е. в описателе вызоваGPUDevice.createBindGroupLayout(), создавшего объектGPUBindGroupLayout, на котором основанbindGroup). Это значение может быть:- Массив чисел, определяющих различные смещения.
Uint32Array, содержащий числа, определяющие смещения.
Если для dynamicOffsets указано значение Uint32Array, оба следующих параметра также требуются:
dynamicOffsetsStart-
Число, определяющее смещение в элементах массива в
dynamicOffsetsData, где начинаются данные динамического смещения. dynamicOffsetsLength-
Число, определяющее количество значений динамического смещения для чтения из
dynamicOffsetsData.
Возвращаемое значение
None (Undefined).
Исключения
Для вызовов setBindGroup(), использующих значение Uint32Array для dynamicOffsets, вызов выбросит исключение RangeError DOMException, если:
-
dynamicOffsetsStartменьше 0. -
dynamicOffsetsStart+dynamicOffsetsLengthбольше, чемdynamicOffsets.length.
Проверка
При вызове dispatchWorkgroups() должны быть соблюдены следующие критерии, иначе генерируется GPUValidationError, и GPUComputePassEncoder становится недействительным:
-
indexменьше или равно пределуmaxBindGroupsлимита устройстваGPUDevice. -
dynamicOffsets.lengthсовпадает с количеством записей вbindGroupс установленнымhasDynamicOffset: true. - Для записей
bindGroup, где boundbufferимеет значение"uniform"(см.GPUDevice.createBindGroupLayout()), каждое число вdynamicOffsetsкратно пределуminUniformBufferOffsetAlignmentлимита устройстваGPUDevice. - Для записей
bindGroup, где boundbufferимеет значение"storage"или"read-only-storage"(см.GPUDevice.createBindGroupLayout()), каждое число вdynamicOffsetsкратно пределуminStorageBufferOffsetAlignmentлимита устройстваGPUDevice. - Для каждой записи
bindGroup, boundbufferплюс соответствующая запись в макете плюс соответствующее динамическое смещение, указанное вdynamicOffsets, меньше или равноsizeboundbuffer.
Примеры
Установка bind group
В нашем демо вычислений несколько команд записываются с помощью GPUCommandEncoder. Большинство этих команд исходят от GPUComputePassEncoder, созданного с помощью beginComputePass(). Вызов setBindGroup() здесь в самом простом виде, просто указывая индекс и bind group.
const BUFFER_SIZE = 1000; // ... // Create GPUCommandEncoder to encode commands to issue to the GPU const commandEncoder = device.createCommandEncoder(); // Initiate render pass const passEncoder = commandEncoder.beginComputePass(); // Issue commands passEncoder.setPipeline(computePipeline); passEncoder.setBindGroup(0, bindGroup); passEncoder.dispatchWorkgroups(Math.ceil(BUFFER_SIZE / 64)); // End the render pass passEncoder.end(); // Copy output buffer to staging buffer commandEncoder.copyBufferToBuffer( output, 0, // Source offset stagingBuffer, 0, // Destination offset BUFFER_SIZE, ); // End frame by passing array of command buffers to command queue for execution device.queue.submit([commandEncoder.finish()]); // ...
Сброс bind group
// Set bind group in slot 0 passEncoder.setBindGroup(0, bindGroup); // Later, unset bind group in slot 0 passEncoder.setBindGroup(0, null);
Спецификации
| Спецификация |
|---|
| WebGPU # programmable-passes-bind-groups |
Совместимость браузеров
| Рабочие столы | Мобильные устройства | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox для Android | Opera Android | Safari на IOS | Samsung Internet | WebView Android | |
setBindGroup |
113В настоящее время поддерживается только на ChromeOS, macOS и Windows. |
113В настоящее время поддерживается только на ChromeOS, macOS и Windows. |
превьюВ настоящее время поддерживается только на Linux и Windows. |
99В настоящее время поддерживается только на ChromeOS, macOS и Windows. |
превью | 121 | Нет | 81 | Нет | 25.0 | 121 |
unset_bind_group |
117В настоящее время поддерживается только на ChromeOS, macOS и Windows. |
117В настоящее время поддерживается только на ChromeOS, macOS и Windows. |
Нет | 103В настоящее время поддерживается только на ChromeOS, macOS и Windows. |
Нет | 121 | Нет | 81 | Нет | 25.0 | 121 |
См. также
- API WebGPU
© 2005–2024 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/API/GPUComputePassEncoder/setBindGroup