GPUComputePassEncoder: метод dispatchWorkgroupsIndirect()
Ограниченная доступность
Эта функция не относится к Baseline, так как она не работает во всех наиболее широко используемых браузерах.
Экспериментально: Это экспериментальная технология
Перед использованием в производстве внимательно проверьте таблицу совместимости браузеров .
Безопасный контекст: Эта функция доступна только в безопасных контекстах (HTTPS) в некоторых или во всех поддерживающих браузерах.
Примечание: Эта функция доступна в Web Workers.
Метод dispatchWorkgroupsIndirect() интерфейса GPUComputePassEncoder отправляет сетку рабочих групп, определяемых параметрами GPUBuffer, для выполнения работы, выполняемой текущим GPUComputePipeline (т.е. установленным с помощью GPUComputePassEncoder.setPipeline()).
Синтаксис
dispatchWorkgroupsIndirect(indirectBuffer, indirectOffset)
Параметры
indirectBuffer-
GPUBuffer, содержащий значения X, Y и Z размеров сетки рабочих групп для отправки. Буфер должен содержать плотный блок из трёх 32-битных беззнаковых целых значений, представляющих размеры (12 байт в общей сложности), в том же порядке, что и аргументы дляGPUComputePassEncoder.dispatchWorkgroups(). Например:const uint32 = new Uint32Array(3); uint32[0] = 25; // The X value uint32[1] = 1; // The Y value uint32[2] = 1; // The Z value // Write values into a GPUBuffer device.queue.writeBuffer(buffer, 0, uint32, 0, uint32.length);
indirectOffset-
Смещение в байтах в
indirectBuffer, где начинаются данные размеров.
Примечание: Значения размеров X, Y и Z, передаваемые в GPUComputePassEncoder.dispatchWorkgroups() и dispatchWorkgroupsIndirect(), представляют количество рабочих групп для отправки для каждого измерения, а не количество вызовов шейдера для выполнения в каждом измерении. Это соответствует поведению современных родных API графических процессоров, но отличается от поведения OpenCL. Это означает, что если GPUShaderModule определяет точку входа с @workgroup_size(4, 4), и работа отправляется в неё с вызовом dispatchWorkgroupsIndirect(indirectBuffer); с indirectBuffer, определяющим размеры X и Y как 8 и 8, точка входа будет вызвана 1024 раза в общей сложности — отправка 4x4 рабочей группы 8 раз по осям X и Y. 4 * 4 * 8 * 8 = 1024.
Возвращаемое значение
Ничего (Undefined).
Проверка
При вызове dispatchWorkgroupsIndirect() должны быть выполнены следующие условия, в противном случае генерируется GPUValidationError, и GPUComputePassEncoder становится недопустимым:
-
indirectBufferсодержит флагGPUBufferUsage.INDIRECT. -
indirectOffsetплюс общий размер, задаваемый размерамиX,YиZ, меньше или равен размеруindirectBuffer. -
indirectOffsetкратно 4.
Примеры
// Set global buffer size
const BUFFER_SIZE = 1000;
// Compute shader; note workgroup size of 64
const shader = `
@group(0) @binding(0)
var<storage, read_write> output: array<f32>;
@compute @workgroup_size(64)
...
`;
// ...
// 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);
const uint32 = new Uint32Array(3);
// Note workgroupCountX is set based on the global buffer size and the shader workgroup count.
uint32[0] = Math.ceil(BUFFER_SIZE / 64);
uint32[1] = 1;
uint32[2] = 1;
const workgroupDimensions = device.createBuffer({
size: 12,
usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.INDIRECT,
});
device.queue.writeBuffer(workgroupDimensions, 0, uint32, 0, uint32.length);
passEncoder.dispatchWorkgroupsIndirect(workgroupDimensions, 0);
// 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()]);
// ...
Спецификации
Совместимость с браузерами
| Рабочие столы | Мобильные устройства | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox для Android | Opera Android | Safari на iOS | Samsung Internet | WebView Android | |
dispatchWorkgroupsIndirect |
113В настоящее время поддерживается только на ChromeOS, macOS и Windows. |
113В настоящее время поддерживается только на ChromeOS, macOS и Windows. |
превьюВ настоящее время поддерживается только на Linux и Windows. |
99В настоящее время поддерживается только на 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/dispatchWorkgroupsIndirect