123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190 |
- import type { UniformBuffer } from "../Materials/uniformBuffer";
- import type { Scene } from "../scene";
- import type { Nullable } from "../types";
- import type { ComputeEffect, IComputeShaderPath } from "./computeEffect";
- import type { ComputeBindingMapping } from "../Engines/Extensions/engine.computeShader";
- import type { BaseTexture } from "../Materials/Textures/baseTexture";
- import type { StorageBuffer } from "../Buffers/storageBuffer";
- import { TextureSampler } from "../Materials/Textures/textureSampler";
- import type { DataBuffer } from "../Buffers/dataBuffer.js";
- import type { ExternalTexture } from "../Materials/Textures/externalTexture.js";
- import type { VideoTexture } from "../Materials/Textures/videoTexture.js";
- import { WebGPUPerfCounter } from "../Engines/WebGPU/webgpuPerfCounter.js";
- import type { AbstractEngine } from "../Engines/abstractEngine.js";
- /**
- * Defines the options associated with the creation of a compute shader.
- */
- export interface IComputeShaderOptions {
- /**
- * list of bindings mapping (key is property name, value is binding location)
- * Must be provided because browsers don't support reflection for wgsl shaders yet (so there's no way to query the binding/group from a variable name)
- * TODO: remove this when browsers support reflection for wgsl shaders
- */
- bindingsMapping: ComputeBindingMapping;
- /**
- * The list of defines used in the shader
- */
- defines?: string[];
- /**
- * The name of the entry point in the shader source (default: "main")
- */
- entryPoint?: string;
- /**
- * If provided, will be called with the shader code so that this code can be updated before it is compiled by the GPU
- */
- processFinalCode?: Nullable<(code: string) => string>;
- }
- /**
- * The ComputeShader object lets you execute a compute shader on your GPU (if supported by the engine)
- */
- export declare class ComputeShader {
- private _engine;
- private _shaderPath;
- private _options;
- private _effect;
- private _cachedDefines;
- private _bindings;
- private _samplers;
- private _context;
- private _contextIsDirty;
- /**
- * Gets the unique id of the compute shader
- */
- readonly uniqueId: number;
- /**
- * The name of the shader
- */
- name: string;
- /**
- * The options used to create the shader
- */
- get options(): IComputeShaderOptions;
- /**
- * The shaderPath used to create the shader
- */
- get shaderPath(): string | IComputeShaderPath;
- /**
- * When set to true, dispatch won't call isReady anymore and won't check if the underlying GPU resources should be (re)created because of a change in the inputs (texture, uniform buffer, etc.)
- * If you know that your inputs did not change since last time dispatch was called and that isReady() returns true, set this flag to true to improve performance
- */
- fastMode: boolean;
- /**
- * Callback triggered when the shader is compiled
- */
- onCompiled: Nullable<(effect: ComputeEffect) => void>;
- /**
- * Callback triggered when an error occurs
- */
- onError: Nullable<(effect: ComputeEffect, errors: string) => void>;
- /**
- * Gets the GPU time spent running the compute shader for the last frame rendered (in nanoseconds).
- * You have to enable the "timestamp-query" extension in the engine constructor options and set engine.enableGPUTimingMeasurements = true.
- */
- readonly gpuTimeInFrame?: WebGPUPerfCounter;
- /**
- * Instantiates a new compute shader.
- * @param name Defines the name of the compute shader in the scene
- * @param engine Defines the engine the compute shader belongs to
- * @param shaderPath Defines the route to the shader code in one of three ways:
- * * object: \{ compute: "custom" \}, used with ShaderStore.ShadersStoreWGSL["customComputeShader"]
- * * object: \{ computeElement: "HTMLElementId" \}, used with shader code in script tags
- * * object: \{ computeSource: "compute shader code string" \}, where the string contains the shader code
- * * string: try first to find the code in ShaderStore.ShadersStoreWGSL[shaderPath + "ComputeShader"]. If not, assumes it is a file with name shaderPath.compute.fx in index.html folder.
- * @param options Define the options used to create the shader
- */
- constructor(name: string, engine: AbstractEngine, shaderPath: IComputeShaderPath | string, options?: Partial<IComputeShaderOptions>);
- /**
- * Gets the current class name of the material e.g. "ComputeShader"
- * Mainly use in serialization.
- * @returns the class name
- */
- getClassName(): string;
- /**
- * Binds a texture to the shader
- * @param name Binding name of the texture
- * @param texture Texture to bind
- * @param bindSampler Bind the sampler corresponding to the texture (default: true). The sampler will be bound just before the binding index of the texture
- */
- setTexture(name: string, texture: BaseTexture, bindSampler?: boolean): void;
- /**
- * Binds a storage texture to the shader
- * @param name Binding name of the texture
- * @param texture Texture to bind
- */
- setStorageTexture(name: string, texture: BaseTexture): void;
- /**
- * Binds an external texture to the shader
- * @param name Binding name of the texture
- * @param texture Texture to bind
- */
- setExternalTexture(name: string, texture: ExternalTexture): void;
- /**
- * Binds a video texture to the shader (by binding the external texture attached to this video)
- * @param name Binding name of the texture
- * @param texture Texture to bind
- * @returns true if the video texture was successfully bound, else false. false will be returned if the current engine does not support external textures
- */
- setVideoTexture(name: string, texture: VideoTexture): boolean;
- /**
- * Binds a uniform buffer to the shader
- * @param name Binding name of the buffer
- * @param buffer Buffer to bind
- */
- setUniformBuffer(name: string, buffer: UniformBuffer | DataBuffer): void;
- /**
- * Binds a storage buffer to the shader
- * @param name Binding name of the buffer
- * @param buffer Buffer to bind
- */
- setStorageBuffer(name: string, buffer: StorageBuffer | DataBuffer): void;
- /**
- * Binds a texture sampler to the shader
- * @param name Binding name of the sampler
- * @param sampler Sampler to bind
- */
- setTextureSampler(name: string, sampler: TextureSampler): void;
- /**
- * Specifies that the compute shader is ready to be executed (the compute effect and all the resources are ready)
- * @returns true if the compute shader is ready to be executed
- */
- isReady(): boolean;
- /**
- * Dispatches (executes) the compute shader
- * @param x Number of workgroups to execute on the X dimension
- * @param y Number of workgroups to execute on the Y dimension (default: 1)
- * @param z Number of workgroups to execute on the Z dimension (default: 1)
- * @returns True if the dispatch could be done, else false (meaning either the compute effect or at least one of the bound resources was not ready)
- */
- dispatch(x: number, y?: number, z?: number): boolean;
- /**
- * Dispatches (executes) the compute shader.
- * @param buffer Buffer containing the number of workgroups to execute on the X, Y and Z dimensions
- * @param offset Offset in the buffer where the workgroup counts are stored (default: 0)
- * @returns True if the dispatch could be done, else false (meaning either the compute effect or at least one of the bound resources was not ready)
- */
- dispatchIndirect(buffer: StorageBuffer | DataBuffer, offset?: number): boolean;
- private _checkContext;
- /**
- * Waits for the compute shader to be ready and executes it
- * @param x Number of workgroups to execute on the X dimension
- * @param y Number of workgroups to execute on the Y dimension (default: 1)
- * @param z Number of workgroups to execute on the Z dimension (default: 1)
- * @param delay Delay between the retries while the shader is not ready (in milliseconds - 10 by default)
- * @returns A promise that is resolved once the shader has been sent to the GPU. Note that it does not mean that the shader execution itself is finished!
- */
- dispatchWhenReady(x: number, y?: number, z?: number, delay?: number): Promise<void>;
- /**
- * Serializes this compute shader in a JSON representation
- * @returns the serialized compute shader object
- */
- serialize(): any;
- /**
- * Creates a compute shader from parsed compute shader data
- * @param source defines the JSON representation of the compute shader
- * @param scene defines the hosting scene
- * @param rootUrl defines the root URL to use to load textures and relative dependencies
- * @returns a new compute shader
- */
- static Parse(source: any, scene: Scene, rootUrl: string): ComputeShader;
- protected static _BufferIsDataBuffer(buffer: UniformBuffer | StorageBuffer | DataBuffer): buffer is DataBuffer;
- }
|