/**
 * 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';
