playcanvas
Version:
Open-source WebGL/WebGPU 3D engine for the web
104 lines (103 loc) • 4.63 kB
JavaScript
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
};