playcanvas
Version:
Open-source WebGL/WebGPU 3D engine for the web
128 lines (127 loc) • 3.99 kB
TypeScript
/**
* Helper class for recursive parallel prefix sum (scan) operations.
* Uses Blelloch algorithm with up-sweep and down-sweep phases.
*
* @ignore
*/
export class PrefixSumKernel {
/**
* Creates a new PrefixSumKernel instance.
* Call resize() to initialize passes with the desired count.
*
* @param {GraphicsDevice} device - The graphics device.
*/
constructor(device: GraphicsDevice);
/**
* The graphics device.
*
* @type {GraphicsDevice}
*/
device: GraphicsDevice;
/**
* List of pipeline passes (scan + add_block for each level).
*
* @type {Array<{scanCompute: Compute, addBlockCompute: Compute|null, blockSumBuffer: StorageBuffer, dispatchX: number, dispatchY: number, count: number, allocatedCount: number}>}
*/
passes: Array<{
scanCompute: Compute;
addBlockCompute: Compute | null;
blockSumBuffer: StorageBuffer;
dispatchX: number;
dispatchY: number;
count: number;
allocatedCount: number;
}>;
/**
* Uniform buffer format (shared across all passes).
*
* @type {UniformBufferFormat|null}
*/
_uniformBufferFormat: UniformBufferFormat | null;
/**
* Bind group format (shared across all passes).
*
* @type {BindGroupFormat|null}
*/
_bindGroupFormat: BindGroupFormat | null;
/**
* Scan shader (shared, element count is a uniform).
*
* @type {Shader|null}
*/
_scanShader: Shader | null;
/**
* Add block shader (shared, element count is a uniform).
*
* @type {Shader|null}
*/
_addBlockShader: Shader | null;
/**
* Destroys the kernel and releases resources.
*/
destroy(): void;
/**
* Creates bind group format and shaders (called once in constructor).
*
* @private
*/
private _createFormatsAndShaders;
/**
* Recursively creates passes for the prefix sum.
*
* @param {StorageBuffer} dataBuffer - Buffer containing data to scan.
* @param {number} count - Number of elements.
* @private
*/
private createPassesRecursive;
/**
* Creates a shader for prefix sum operations.
*
* @param {string} name - Shader name.
* @param {string} entryPoint - Entry point function name.
* @returns {Shader} The created shader.
* @private
*/
private _createShader;
/**
* Find optimal dispatch dimensions to minimize unused workgroups.
*
* @param {number} workgroupCount - Total workgroups needed.
* @returns {{x: number, y: number}} Dispatch dimensions.
* @private
*/
private findOptimalDispatchSize;
/**
* Resizes the kernel for a new element count. Grows capacity internally if needed.
*
* @param {StorageBuffer} dataBuffer - The buffer to perform prefix sum on.
* @param {number} count - New element count.
*/
resize(dataBuffer: StorageBuffer, count: number): void;
/**
* Destroys passes but keeps shaders and formats.
*
* @ignore
*/
destroyPasses(): void;
/**
* Counts how many recursive passes are needed for a given element count.
*
* @param {number} count - Element count.
* @returns {number} Number of passes needed.
* @private
*/
private _countPassesNeeded;
/**
* Dispatches all prefix sum passes.
*
* @param {GraphicsDevice} device - The graphics device.
*/
dispatch(device: GraphicsDevice): void;
}
import type { GraphicsDevice } from '../../platform/graphics/graphics-device.js';
import { Compute } from '../../platform/graphics/compute.js';
import { StorageBuffer } from '../../platform/graphics/storage-buffer.js';
import { UniformBufferFormat } from '../../platform/graphics/uniform-buffer-format.js';
import { BindGroupFormat } from '../../platform/graphics/bind-group-format.js';
import { Shader } from '../../platform/graphics/shader.js';