UNPKG

playcanvas

Version:

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

104 lines (103 loc) 4.63 kB
var __defProp = Object.defineProperty; var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value); import { SEMANTIC_POSITION, SHADERLANGUAGE_GLSL, SHADERLANGUAGE_WGSL } from "../../platform/graphics/constants.js"; import { RenderPassShaderQuad } from "./render-pass-shader-quad.js"; import { ShaderUtils } from "../shader-lib/shader-utils.js"; import { ShaderChunks } from "../shader-lib/shader-chunks.js"; import glslRadixSortCountPS from "../shader-lib/glsl/chunks/radix-sort/radix-sort-count.js"; import glslRadixSortCountQuad from "../shader-lib/glsl/chunks/radix-sort/radix-sort-count-quad.js"; import wgslRadixSortCountPS from "../shader-lib/wgsl/chunks/radix-sort/radix-sort-count.js"; import wgslRadixSortCountQuad from "../shader-lib/wgsl/chunks/radix-sort/radix-sort-count-quad.js"; class RenderPassRadixSortCount extends RenderPassShaderQuad { /** * @param {GraphicsDevice} device - The graphics device. * @param {boolean} sourceLinear - Whether to read from linear-layout source texture. * @param {number} bitsPerStep - Bits per radix step (usually 4). * @param {number} groupSize - Log2 of group size (usually 4 for 16 elements). * @param {number} currentBit - Current bit offset for this pass. */ constructor(device, sourceLinear, bitsPerStep, groupSize, currentBit) { super(device); /** * Whether this pass reads from linear-layout source texture (first pass). */ __publicField(this, "sourceLinear", false); /** * Bits per radix step (usually 4). */ __publicField(this, "bitsPerStep", 0); /** * Log2 of group size (usually 4 for 16 elements). */ __publicField(this, "groupSize", 0); /** * Current bit offset for this pass. */ __publicField(this, "currentBit", 0); /** * Dynamic params updated per frame. * * @type {{elementCount: number, imageElementsLog2: number}} * @private */ __publicField(this, "_dynamicParams", { elementCount: 0, imageElementsLog2: 0 }); this.sourceLinear = sourceLinear; this.bitsPerStep = bitsPerStep; this.groupSize = groupSize; this.currentBit = currentBit; ShaderChunks.get(device, SHADERLANGUAGE_GLSL).set("radixSortCountPS", glslRadixSortCountPS); ShaderChunks.get(device, SHADERLANGUAGE_GLSL).set("radixSortCountQuad", glslRadixSortCountQuad); ShaderChunks.get(device, SHADERLANGUAGE_WGSL).set("radixSortCountPS", wgslRadixSortCountPS); ShaderChunks.get(device, SHADERLANGUAGE_WGSL).set("radixSortCountQuad", wgslRadixSortCountQuad); const defines = /* @__PURE__ */ new Map(); if (sourceLinear) { defines.set("SOURCE_LINEAR", ""); } const shaderName = sourceLinear ? "RadixSortCountShaderLinear" : "RadixSortCountShader"; this.shader = ShaderUtils.createShader(device, { uniqueName: shaderName, attributes: { aPosition: SEMANTIC_POSITION }, vertexChunk: "quadVS", fragmentChunk: "radixSortCountPS", fragmentDefines: defines, fragmentOutputTypes: "float" }); this.keysTextureId = device.scope.resolve("keysTexture"); this.bitsPerStepId = device.scope.resolve("bitsPerStep"); this.groupSizeId = device.scope.resolve("groupSize"); this.elementCountId = device.scope.resolve("elementCount"); this.imageElementsLog2Id = device.scope.resolve("imageElementsLog2"); this.currentBitId = device.scope.resolve("currentBit"); } /** * Sets the keys texture to read from. * * @param {Texture} keysTexture - The keys texture (R32U). */ setKeysTexture(keysTexture) { this._keysTexture = keysTexture; } /** * Sets dynamic parameters (called each frame). * * @param {number} elementCount - Number of elements to sort. * @param {number} imageElementsLog2 - Log2 of total texture elements. */ setDynamicParams(elementCount, imageElementsLog2) { this._dynamicParams.elementCount = elementCount; this._dynamicParams.imageElementsLog2 = imageElementsLog2; } execute() { this.keysTextureId.setValue(this._keysTexture); this.bitsPerStepId.setValue(this.bitsPerStep); this.groupSizeId.setValue(this.groupSize); this.elementCountId.setValue(this._dynamicParams.elementCount); this.imageElementsLog2Id.setValue(this._dynamicParams.imageElementsLog2); this.currentBitId.setValue(this.currentBit); super.execute(); } } export { RenderPassRadixSortCount };