UNPKG

playcanvas

Version:

Open-source WebGL/WebGPU 3D engine for the web

128 lines (127 loc) 3.99 kB
/** * 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';