@carbonenginejs/runtime-resource 0.10.0 → 0.11.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/format/effect/effectPermutationGraph.js +257 -0
- package/dist/format/effect/effectPermutationGraph.js.map +1 -0
- package/dist/format/effect/effectReflectionPackage.js +636 -0
- package/dist/format/effect/effectReflectionPackage.js.map +1 -0
- package/dist/format/effect/sha256.js +114 -0
- package/dist/format/effect/sha256.js.map +1 -0
- package/dist/formats/dxbc/CjsDxbcFormat.js +142 -0
- package/dist/formats/dxbc/CjsDxbcFormat.js.map +1 -0
- package/dist/formats/dxbc/core/DxbcReader.js +266 -0
- package/dist/formats/dxbc/core/DxbcReader.js.map +1 -0
- package/dist/formats/dxbc/core/container.js +169 -0
- package/dist/formats/dxbc/core/container.js.map +1 -0
- package/dist/formats/dxbc/core/decoder.js +789 -0
- package/dist/formats/dxbc/core/decoder.js.map +1 -0
- package/dist/formats/dxbc/core/errors.js +19 -0
- package/dist/formats/dxbc/core/errors.js.map +1 -0
- package/dist/formats/dxbc/core/helpers.js +220 -0
- package/dist/formats/dxbc/core/helpers.js.map +1 -0
- package/dist/formats/dxbc/core/opcodes.js +45 -0
- package/dist/formats/dxbc/core/opcodes.js.map +1 -0
- package/dist/formats/dxbc/core/program.js +91 -0
- package/dist/formats/dxbc/core/program.js.map +1 -0
- package/dist/formats/dxbc/core/signature.js +172 -0
- package/dist/formats/dxbc/core/signature.js.map +1 -0
- package/dist/formats/dxbc/index.js +2 -0
- package/dist/formats/dxbc/index.js.map +1 -0
- package/dist/formats/hlsl/CjsHlslFormat.js +254 -0
- package/dist/formats/hlsl/CjsHlslFormat.js.map +1 -0
- package/dist/formats/hlsl/core/HlslBinaryUtils.js +15 -0
- package/dist/formats/hlsl/core/HlslBinaryUtils.js.map +1 -0
- package/dist/formats/hlsl/core/HlslEffectReadError.js +19 -0
- package/dist/formats/hlsl/core/HlslEffectReadError.js.map +1 -0
- package/dist/formats/hlsl/core/HlslEffectStateManager.js +130 -0
- package/dist/formats/hlsl/core/HlslEffectStateManager.js.map +1 -0
- package/dist/formats/hlsl/core/HlslReader.js +266 -0
- package/dist/formats/hlsl/core/HlslReader.js.map +1 -0
- package/dist/formats/hlsl/core/HlslRenderStateSetup.js +37 -0
- package/dist/formats/hlsl/core/HlslRenderStateSetup.js.map +1 -0
- package/dist/formats/hlsl/core/HlslResourceSetDescription.js +94 -0
- package/dist/formats/hlsl/core/HlslResourceSetDescription.js.map +1 -0
- package/dist/formats/hlsl/core/HlslShaderBytecode.js +44 -0
- package/dist/formats/hlsl/core/HlslShaderBytecode.js.map +1 -0
- package/dist/formats/hlsl/core/analysis.js +51 -0
- package/dist/formats/hlsl/core/analysis.js.map +1 -0
- package/dist/formats/hlsl/core/helpers.js +270 -0
- package/dist/formats/hlsl/core/helpers.js.map +1 -0
- package/dist/formats/hlsl/core/json.js +284 -0
- package/dist/formats/hlsl/core/json.js.map +1 -0
- package/dist/formats/hlsl/core/metadata.js +327 -0
- package/dist/formats/hlsl/core/metadata.js.map +1 -0
- package/dist/formats/hlsl/core/portableReflection.js +848 -0
- package/dist/formats/hlsl/core/portableReflection.js.map +1 -0
- package/dist/formats/hlsl/core/render-states.js +280 -0
- package/dist/formats/hlsl/core/render-states.js.map +1 -0
- package/dist/formats/hlsl/core/tr2/HlslRenderContextEnum.js +43 -0
- package/dist/formats/hlsl/core/tr2/HlslRenderContextEnum.js.map +1 -0
- package/dist/formats/hlsl/core/tr2/resources/HlslEffectRes.js +294 -0
- package/dist/formats/hlsl/core/tr2/resources/HlslEffectRes.js.map +1 -0
- package/dist/formats/hlsl/core/tr2/resources/HlslShaderPermutation.js +33 -0
- package/dist/formats/hlsl/core/tr2/resources/HlslShaderPermutation.js.map +1 -0
- package/dist/formats/hlsl/core/tr2/shader/HlslEffectBindingManifest.js +416 -0
- package/dist/formats/hlsl/core/tr2/shader/HlslEffectBindingManifest.js.map +1 -0
- package/dist/formats/hlsl/core/tr2/shader/HlslEffectConstant.js +40 -0
- package/dist/formats/hlsl/core/tr2/shader/HlslEffectConstant.js.map +1 -0
- package/dist/formats/hlsl/core/tr2/shader/HlslEffectDescription.js +742 -0
- package/dist/formats/hlsl/core/tr2/shader/HlslEffectDescription.js.map +1 -0
- package/dist/formats/hlsl/core/tr2/shader/HlslEffectLibrary.js +52 -0
- package/dist/formats/hlsl/core/tr2/shader/HlslEffectLibrary.js.map +1 -0
- package/dist/formats/hlsl/core/tr2/shader/HlslEffectParameterAnnotation.js +38 -0
- package/dist/formats/hlsl/core/tr2/shader/HlslEffectParameterAnnotation.js.map +1 -0
- package/dist/formats/hlsl/core/tr2/shader/HlslEffectResource.js +50 -0
- package/dist/formats/hlsl/core/tr2/shader/HlslEffectResource.js.map +1 -0
- package/dist/formats/hlsl/core/tr2/shader/HlslEffectStageInput.js +86 -0
- package/dist/formats/hlsl/core/tr2/shader/HlslEffectStageInput.js.map +1 -0
- package/dist/formats/hlsl/core/tr2/shader/HlslEffectTechnique.js +31 -0
- package/dist/formats/hlsl/core/tr2/shader/HlslEffectTechnique.js.map +1 -0
- package/dist/formats/hlsl/core/tr2/shader/HlslPass.js +42 -0
- package/dist/formats/hlsl/core/tr2/shader/HlslPass.js.map +1 -0
- package/dist/formats/hlsl/core/tr2/shader/HlslSamplerDescription.js +55 -0
- package/dist/formats/hlsl/core/tr2/shader/HlslSamplerDescription.js.map +1 -0
- package/dist/formats/hlsl/core/tr2/shader/HlslSamplerSetup.js +29 -0
- package/dist/formats/hlsl/core/tr2/shader/HlslSamplerSetup.js.map +1 -0
- package/dist/formats/hlsl/core/tr2/shader/HlslShader.js +220 -0
- package/dist/formats/hlsl/core/tr2/shader/HlslShader.js.map +1 -0
- package/dist/formats/hlsl/core/tr2/shader/HlslShaderOption.js +30 -0
- package/dist/formats/hlsl/core/tr2/shader/HlslShaderOption.js.map +1 -0
- package/dist/formats/hlsl/index.js +2 -0
- package/dist/formats/hlsl/index.js.map +1 -0
- package/dist/formats/hlsl/portable.js +2 -0
- package/dist/formats/hlsl/portable.js.map +1 -0
- package/dist/formats/index.js +4 -0
- package/dist/formats/index.js.map +1 -1
- package/dist/formats/webgl/CjsWebglFormat.js +221 -0
- package/dist/formats/webgl/CjsWebglFormat.js.map +1 -0
- package/dist/formats/webgl/core/cewg/CewgPackage.js +339 -0
- package/dist/formats/webgl/core/cewg/CewgPackage.js.map +1 -0
- package/dist/formats/webgl/core/cewg/CewgPackageBuilder.js +104 -0
- package/dist/formats/webgl/core/cewg/CewgPackageBuilder.js.map +1 -0
- package/dist/formats/webgl/core/cewg/binary.js +101 -0
- package/dist/formats/webgl/core/cewg/binary.js.map +1 -0
- package/dist/formats/webgl/core/cewgCompleteness.js +81 -0
- package/dist/formats/webgl/core/cewgCompleteness.js.map +1 -0
- package/dist/formats/webgl/core/effectPackage.js +789 -0
- package/dist/formats/webgl/core/effectPackage.js.map +1 -0
- package/dist/formats/webgl/core/effectPackageValidation.js +331 -0
- package/dist/formats/webgl/core/effectPackageValidation.js.map +1 -0
- package/dist/formats/webgl/core/errors.js +27 -0
- package/dist/formats/webgl/core/errors.js.map +1 -0
- package/dist/formats/webgl/core/glsl/DxbcGlslEmitter.js +2678 -0
- package/dist/formats/webgl/core/glsl/DxbcGlslEmitter.js.map +1 -0
- package/dist/formats/webgl/core/glsl/DxbcGlslHelpers.js +89 -0
- package/dist/formats/webgl/core/glsl/DxbcGlslHelpers.js.map +1 -0
- package/dist/formats/webgl/core/glsl/DxbcGlslOperandFormatter.js +428 -0
- package/dist/formats/webgl/core/glsl/DxbcGlslOperandFormatter.js.map +1 -0
- package/dist/formats/webgl/core/helpers.js +306 -0
- package/dist/formats/webgl/core/helpers.js.map +1 -0
- package/dist/formats/webgl/index.js +2 -0
- package/dist/formats/webgl/index.js.map +1 -0
- package/dist/formats/webgpu/CjsWebgpuFormat.js +376 -0
- package/dist/formats/webgpu/CjsWebgpuFormat.js.map +1 -0
- package/dist/formats/webgpu/core/cewgpu/CewgpuPackage.js +415 -0
- package/dist/formats/webgpu/core/cewgpu/CewgpuPackage.js.map +1 -0
- package/dist/formats/webgpu/core/cewgpu/CewgpuPackageBuilder.js +100 -0
- package/dist/formats/webgpu/core/cewgpu/CewgpuPackageBuilder.js.map +1 -0
- package/dist/formats/webgpu/core/cewgpu/binary.js +93 -0
- package/dist/formats/webgpu/core/cewgpu/binary.js.map +1 -0
- package/dist/formats/webgpu/core/cewgpu/tags.js +17 -0
- package/dist/formats/webgpu/core/cewgpu/tags.js.map +1 -0
- package/dist/formats/webgpu/core/effectAnalysis.js +82 -0
- package/dist/formats/webgpu/core/effectAnalysis.js.map +1 -0
- package/dist/formats/webgpu/core/effectBackendBodySet.js +305 -0
- package/dist/formats/webgpu/core/effectBackendBodySet.js.map +1 -0
- package/dist/formats/webgpu/core/effectPackageValidation.js +1078 -0
- package/dist/formats/webgpu/core/effectPackageValidation.js.map +1 -0
- package/dist/formats/webgpu/core/errors.js +20 -0
- package/dist/formats/webgpu/core/errors.js.map +1 -0
- package/dist/formats/webgpu/core/helpers.js +448 -0
- package/dist/formats/webgpu/core/helpers.js.map +1 -0
- package/dist/formats/webgpu/core/ir/analyzeRegisterValues.js +223 -0
- package/dist/formats/webgpu/core/ir/analyzeRegisterValues.js.map +1 -0
- package/dist/formats/webgpu/core/ir/buildControlFlow.js +220 -0
- package/dist/formats/webgpu/core/ir/buildControlFlow.js.map +1 -0
- package/dist/formats/webgpu/core/ir/indexableTemps.js +137 -0
- package/dist/formats/webgpu/core/ir/indexableTemps.js.map +1 -0
- package/dist/formats/webgpu/core/ir/inferValueTypes.js +454 -0
- package/dist/formats/webgpu/core/ir/inferValueTypes.js.map +1 -0
- package/dist/formats/webgpu/core/ir/lowerDxbcToIr.js +494 -0
- package/dist/formats/webgpu/core/ir/lowerDxbcToIr.js.map +1 -0
- package/dist/formats/webgpu/core/ir/resolveRegisterFlow.js +177 -0
- package/dist/formats/webgpu/core/ir/resolveRegisterFlow.js.map +1 -0
- package/dist/formats/webgpu/core/ir/sourceLanes.js +61 -0
- package/dist/formats/webgpu/core/ir/sourceLanes.js.map +1 -0
- package/dist/formats/webgpu/core/packageEffect.js +300 -0
- package/dist/formats/webgpu/core/packageEffect.js.map +1 -0
- package/dist/formats/webgpu/core/packageEffectSelection.js +164 -0
- package/dist/formats/webgpu/core/packageEffectSelection.js.map +1 -0
- package/dist/formats/webgpu/core/packageMetadata.js +8 -0
- package/dist/formats/webgpu/core/packageMetadata.js.map +1 -0
- package/dist/formats/webgpu/core/schema.js +4 -0
- package/dist/formats/webgpu/core/schema.js.map +1 -0
- package/dist/formats/webgpu/core/wgsl/buildResourceTransformPlan.js +275 -0
- package/dist/formats/webgpu/core/wgsl/buildResourceTransformPlan.js.map +1 -0
- package/dist/formats/webgpu/core/wgsl/buildWgslBindingPlan.js +182 -0
- package/dist/formats/webgpu/core/wgsl/buildWgslBindingPlan.js.map +1 -0
- package/dist/formats/webgpu/core/wgsl/buildWgslSet.js +324 -0
- package/dist/formats/webgpu/core/wgsl/buildWgslSet.js.map +1 -0
- package/dist/formats/webgpu/core/wgsl/emitWgsl.js +356 -0
- package/dist/formats/webgpu/core/wgsl/emitWgsl.js.map +1 -0
- package/dist/formats/webgpu/core/wgsl/hoistEscapingValues.js +77 -0
- package/dist/formats/webgpu/core/wgsl/hoistEscapingValues.js.map +1 -0
- package/dist/formats/webgpu/core/wgsl/lowerBindingLayout.js +451 -0
- package/dist/formats/webgpu/core/wgsl/lowerBindingLayout.js.map +1 -0
- package/dist/formats/webgpu/core/wgsl/lowerComputeProgram.js +754 -0
- package/dist/formats/webgpu/core/wgsl/lowerComputeProgram.js.map +1 -0
- package/dist/formats/webgpu/core/wgsl/lowerCreateHistogramsComputeProgram.js +457 -0
- package/dist/formats/webgpu/core/wgsl/lowerCreateHistogramsComputeProgram.js.map +1 -0
- package/dist/formats/webgpu/core/wgsl/lowerFragmentProgram.js +1572 -0
- package/dist/formats/webgpu/core/wgsl/lowerFragmentProgram.js.map +1 -0
- package/dist/formats/webgpu/core/wgsl/lowerMergeHistogramsComputeProgram.js +659 -0
- package/dist/formats/webgpu/core/wgsl/lowerMergeHistogramsComputeProgram.js.map +1 -0
- package/dist/formats/webgpu/core/wgsl/lowerParticleClearComputePrograms.js +734 -0
- package/dist/formats/webgpu/core/wgsl/lowerParticleClearComputePrograms.js.map +1 -0
- package/dist/formats/webgpu/core/wgsl/lowerParticleEmitComputeProgram.js +583 -0
- package/dist/formats/webgpu/core/wgsl/lowerParticleEmitComputeProgram.js.map +1 -0
- package/dist/formats/webgpu/core/wgsl/lowerSkinVerticesComputeProgram.js +621 -0
- package/dist/formats/webgpu/core/wgsl/lowerSkinVerticesComputeProgram.js.map +1 -0
- package/dist/formats/webgpu/core/wgsl/lowerSortComputeProgram.js +824 -0
- package/dist/formats/webgpu/core/wgsl/lowerSortComputeProgram.js.map +1 -0
- package/dist/formats/webgpu/core/wgsl/lowerSortInnerComputeProgram.js +697 -0
- package/dist/formats/webgpu/core/wgsl/lowerSortInnerComputeProgram.js.map +1 -0
- package/dist/formats/webgpu/core/wgsl/lowerSortStepComputeProgram.js +559 -0
- package/dist/formats/webgpu/core/wgsl/lowerSortStepComputeProgram.js.map +1 -0
- package/dist/formats/webgpu/core/wgsl/lowerVertexProgram.js +1328 -0
- package/dist/formats/webgpu/core/wgsl/lowerVertexProgram.js.map +1 -0
- package/dist/formats/webgpu/core/wgsl/particleEmitSemanticDigest.js +110 -0
- package/dist/formats/webgpu/core/wgsl/particleEmitSemanticDigest.js.map +1 -0
- package/dist/formats/webgpu/core/wgsl/precisionControls.js +55 -0
- package/dist/formats/webgpu/core/wgsl/precisionControls.js.map +1 -0
- package/dist/formats/webgpu/core/wgsl/selectionPlans.js +758 -0
- package/dist/formats/webgpu/core/wgsl/selectionPlans.js.map +1 -0
- package/dist/formats/webgpu/core/wgsl/uniformity.js +78 -0
- package/dist/formats/webgpu/core/wgsl/uniformity.js.map +1 -0
- package/dist/formats/webgpu/core/wgsl/validateExactComputeIr.js +196 -0
- package/dist/formats/webgpu/core/wgsl/validateExactComputeIr.js.map +1 -0
- package/dist/formats/webgpu/core/wgsl/validateHandleOperand.js +37 -0
- package/dist/formats/webgpu/core/wgsl/validateHandleOperand.js.map +1 -0
- package/dist/formats/webgpu/index.js +2 -0
- package/dist/formats/webgpu/index.js.map +1 -0
- package/dist/resource/shader/Tr2EffectRes.js +159 -150
- package/dist/resource/shader/Tr2EffectRes.js.map +1 -1
- package/dist/resource/shader/Tr2MaterialArea.js +23 -28
- package/dist/resource/shader/Tr2MaterialArea.js.map +1 -1
- package/dist/resource/shader/Tr2MaterialMesh.js +21 -27
- package/dist/resource/shader/Tr2MaterialMesh.js.map +1 -1
- package/dist/resource/shader/Tr2MaterialRes.js +24 -29
- package/dist/resource/shader/Tr2MaterialRes.js.map +1 -1
- package/dist/resource/shader/Tr2Shader.js +45 -39
- package/dist/resource/shader/Tr2Shader.js.map +1 -1
- package/dist/resource/shader/Tr2ShaderPermutation.js +30 -32
- package/dist/resource/shader/Tr2ShaderPermutation.js.map +1 -1
- package/dist/resource/shader/reflection/Tr2EffectConstant.js +113 -78
- package/dist/resource/shader/reflection/Tr2EffectConstant.js.map +1 -1
- package/dist/resource/shader/reflection/Tr2EffectDefine.js +17 -23
- package/dist/resource/shader/reflection/Tr2EffectDefine.js.map +1 -1
- package/dist/resource/shader/reflection/Tr2EffectDescription.js +23 -29
- package/dist/resource/shader/reflection/Tr2EffectDescription.js.map +1 -1
- package/dist/resource/shader/reflection/Tr2EffectLibrary.js +44 -40
- package/dist/resource/shader/reflection/Tr2EffectLibrary.js.map +1 -1
- package/dist/resource/shader/reflection/Tr2EffectParameterAnnotation.js +82 -86
- package/dist/resource/shader/reflection/Tr2EffectParameterAnnotation.js.map +1 -1
- package/dist/resource/shader/reflection/Tr2EffectResource.js +55 -61
- package/dist/resource/shader/reflection/Tr2EffectResource.js.map +1 -1
- package/dist/resource/shader/reflection/Tr2EffectStageInput.js +49 -45
- package/dist/resource/shader/reflection/Tr2EffectStageInput.js.map +1 -1
- package/dist/resource/shader/reflection/Tr2EffectTechnique.js +25 -30
- package/dist/resource/shader/reflection/Tr2EffectTechnique.js.map +1 -1
- package/dist/resource/shader/reflection/Tr2Pass.js +30 -32
- package/dist/resource/shader/reflection/Tr2Pass.js.map +1 -1
- package/dist/resource/shader/sampler/Tr2SamplerSetup.js +21 -26
- package/dist/resource/shader/sampler/Tr2SamplerSetup.js.map +1 -1
- package/docs/formats/README.md +4 -0
- package/docs/formats/provenance.md +11 -3
- package/docs/reference/classes/formats.md +440 -0
- package/format-notices/dxbc/LICENSE +21 -0
- package/format-notices/dxbc/NOTICE +20 -0
- package/format-notices/hlsl/LICENSE +21 -0
- package/format-notices/hlsl/NOTICE +25 -0
- package/format-notices/webgl/LICENSE +21 -0
- package/format-notices/webgl/NOTICE +35 -0
- package/format-notices/webgpu/LICENSE +21 -0
- package/format-notices/webgpu/NOTICE +31 -0
- package/package.json +6 -1
- package/dist/resource/shader/portableValidation.js +0 -461
- package/dist/resource/shader/portableValidation.js.map +0 -1
|
@@ -0,0 +1,324 @@
|
|
|
1
|
+
import { normalizeResourceTransformPlan } from './buildResourceTransformPlan.js';
|
|
2
|
+
|
|
3
|
+
const WGSL_SET_VERSION = 3;
|
|
4
|
+
const KEY_PATTERN = /^(.*)\.pass([0-9]+)\.(vertex|pixel|compute)$/;
|
|
5
|
+
const KEY_STAGE = Object.freeze({
|
|
6
|
+
vertex: "vertex",
|
|
7
|
+
pixel: "fragment",
|
|
8
|
+
compute: "compute"
|
|
9
|
+
});
|
|
10
|
+
const STAGE_TYPES = Object.freeze({
|
|
11
|
+
vertex: 0,
|
|
12
|
+
pixel: 1,
|
|
13
|
+
compute: 2
|
|
14
|
+
});
|
|
15
|
+
const STAGE_NAME_ORDER = Object.freeze(["vertex", "pixel", "compute"]);
|
|
16
|
+
const VISIBILITY_ORDER = Object.freeze(["vertex", "fragment", "compute"]);
|
|
17
|
+
function clonePlain(value) {
|
|
18
|
+
if (Array.isArray(value)) return value.map(clonePlain);
|
|
19
|
+
if (value && typeof value === "object") {
|
|
20
|
+
return Object.fromEntries(Object.entries(value).map(([key, entry]) => [key, clonePlain(entry)]));
|
|
21
|
+
}
|
|
22
|
+
return value;
|
|
23
|
+
}
|
|
24
|
+
function deepFreeze(value) {
|
|
25
|
+
if (!value || typeof value !== "object" || Object.isFrozen(value)) return value;
|
|
26
|
+
for (const entry of Object.values(value)) deepFreeze(entry);
|
|
27
|
+
return Object.freeze(value);
|
|
28
|
+
}
|
|
29
|
+
function normalizeEntry(entry, index) {
|
|
30
|
+
const shader = entry?.shader;
|
|
31
|
+
if (shader?.format !== "CJS_WGSL_SHADER" || shader.formatVersion !== 1 || typeof shader.code !== "string" || !shader.code || typeof shader.entryPoint !== "string" || !shader.entryPoint || !Array.isArray(shader.sourceMap) || shader.program?.format !== "CJS_TYPED_SHADER") {
|
|
32
|
+
throw new TypeError(`WGSL set entry ${index} requires a CJS_WGSL_SHADER descriptor`);
|
|
33
|
+
}
|
|
34
|
+
const key = typeof entry.key === "string" ? entry.key : "";
|
|
35
|
+
const match = KEY_PATTERN.exec(key);
|
|
36
|
+
if (!match || !match[1]) throw new Error(`WGSL set entry ${index} has malformed key ${key || "<empty>"}`);
|
|
37
|
+
const techniqueName = match[1];
|
|
38
|
+
const passIndex = Number(match[2]);
|
|
39
|
+
const stageName = match[3];
|
|
40
|
+
if (shader.stage !== KEY_STAGE[stageName]) {
|
|
41
|
+
throw new Error(`WGSL set key ${key} does not match shader stage ${shader.stage}`);
|
|
42
|
+
}
|
|
43
|
+
let threadGroupSize = null;
|
|
44
|
+
if (stageName === "compute") {
|
|
45
|
+
threadGroupSize = shader.threadGroupSize;
|
|
46
|
+
if (!Array.isArray(threadGroupSize) || threadGroupSize.length !== 3 || threadGroupSize.some(value => !Number.isSafeInteger(value) || value < 1)) {
|
|
47
|
+
throw new Error(`WGSL compute shader ${key} requires a positive three-dimensional threadGroupSize`);
|
|
48
|
+
}
|
|
49
|
+
} else if (shader.threadGroupSize !== undefined && shader.threadGroupSize !== null) {
|
|
50
|
+
throw new Error(`WGSL render shader ${key} cannot declare threadGroupSize`);
|
|
51
|
+
}
|
|
52
|
+
return {
|
|
53
|
+
shader,
|
|
54
|
+
stage: shader.stage,
|
|
55
|
+
techniqueName,
|
|
56
|
+
passIndex,
|
|
57
|
+
stageName,
|
|
58
|
+
stageType: STAGE_TYPES[stageName],
|
|
59
|
+
...(threadGroupSize ? {
|
|
60
|
+
threadGroupSize: clonePlain(threadGroupSize)
|
|
61
|
+
} : {}),
|
|
62
|
+
key
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
function portableBinding(binding, visibility) {
|
|
66
|
+
if (!Number.isInteger(binding.group) || binding.group < 0 || !Number.isInteger(binding.binding) || binding.binding < 0 || !Number.isInteger(binding.registerSpace) || binding.registerSpace < 0 || !Number.isInteger(binding.registerIndex) || binding.registerIndex < 0 || typeof binding.resourceKind !== "string" || !binding.resourceKind || typeof binding.generatedSymbol !== "string" || !binding.generatedSymbol || typeof binding.type !== "string" || !binding.type) {
|
|
67
|
+
throw new Error(`WGSL binding ${binding.id || binding.generatedSymbol || "unknown"} has an invalid portable identity`);
|
|
68
|
+
}
|
|
69
|
+
const identity = `${binding.resourceKind}:${binding.registerSpace}:${binding.registerIndex}`;
|
|
70
|
+
if (binding.scopeIdentity !== undefined && (typeof binding.scopeIdentity !== "string" || !binding.scopeIdentity)) {
|
|
71
|
+
throw new Error(`WGSL binding ${binding.generatedSymbol} has invalid scope identity ${binding.scopeIdentity || "<empty>"}`);
|
|
72
|
+
}
|
|
73
|
+
const scopeIdentity = binding.scopeIdentity === undefined ? `${identity}@${visibility}` : binding.scopeIdentity;
|
|
74
|
+
if (binding.identity !== undefined && binding.identity !== identity) {
|
|
75
|
+
throw new Error(`WGSL binding ${binding.generatedSymbol} has inconsistent D3D identity ${binding.identity}`);
|
|
76
|
+
}
|
|
77
|
+
const hasTransform = binding.transformId !== undefined || binding.arrayLayerCount !== undefined;
|
|
78
|
+
if (hasTransform && (binding.resourceKind !== "sampled-resource" || typeof binding.transformId !== "string" || !binding.transformId || !Number.isInteger(binding.arrayLayerCount) || binding.arrayLayerCount < 2 || binding.type !== "texture_2d_array<f32>" || binding.texture?.viewDimension !== "2d-array")) {
|
|
79
|
+
throw new Error(`WGSL binding ${binding.generatedSymbol} has invalid resource transform metadata`);
|
|
80
|
+
}
|
|
81
|
+
if (scopeIdentity !== identity && scopeIdentity !== `${identity}@${visibility}`) {
|
|
82
|
+
throw new Error(`WGSL binding ${binding.generatedSymbol} has invalid scope identity ${scopeIdentity}`);
|
|
83
|
+
}
|
|
84
|
+
const descriptorKeys = ["buffer", "texture", "sampler"].filter(key => binding[key]);
|
|
85
|
+
const expectedDescriptors = {
|
|
86
|
+
"uniform-buffer": ["buffer"],
|
|
87
|
+
"sampled-resource": ["buffer", "texture"],
|
|
88
|
+
"storage-resource": ["buffer"],
|
|
89
|
+
sampler: ["sampler"]
|
|
90
|
+
}[binding.resourceKind];
|
|
91
|
+
if (!expectedDescriptors || descriptorKeys.length !== 1 || !expectedDescriptors.includes(descriptorKeys[0])) {
|
|
92
|
+
throw new Error(`WGSL binding ${binding.generatedSymbol} has an invalid ${binding.resourceKind} layout descriptor`);
|
|
93
|
+
}
|
|
94
|
+
return {
|
|
95
|
+
identity,
|
|
96
|
+
scopeIdentity,
|
|
97
|
+
resourceKind: binding.resourceKind,
|
|
98
|
+
generatedSymbol: binding.generatedSymbol,
|
|
99
|
+
registerSpace: binding.registerSpace,
|
|
100
|
+
registerIndex: binding.registerIndex,
|
|
101
|
+
group: binding.group,
|
|
102
|
+
binding: binding.binding,
|
|
103
|
+
visibility: [visibility],
|
|
104
|
+
type: binding.type,
|
|
105
|
+
...(hasTransform ? {
|
|
106
|
+
transformId: binding.transformId,
|
|
107
|
+
arrayLayerCount: binding.arrayLayerCount
|
|
108
|
+
} : {}),
|
|
109
|
+
...(Number.isInteger(binding.structureStride) ? {
|
|
110
|
+
structureStride: binding.structureStride
|
|
111
|
+
} : {}),
|
|
112
|
+
...(binding.buffer ? {
|
|
113
|
+
buffer: clonePlain(binding.buffer)
|
|
114
|
+
} : {}),
|
|
115
|
+
...(binding.texture ? {
|
|
116
|
+
texture: clonePlain(binding.texture)
|
|
117
|
+
} : {}),
|
|
118
|
+
...(binding.sampler ? {
|
|
119
|
+
sampler: clonePlain(binding.sampler)
|
|
120
|
+
} : {})
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
function bindingIdentity(binding) {
|
|
124
|
+
return binding.scopeIdentity || `${binding.resourceKind}:${binding.registerSpace}:${binding.registerIndex}`;
|
|
125
|
+
}
|
|
126
|
+
function bindingFingerprint(binding) {
|
|
127
|
+
return JSON.stringify({
|
|
128
|
+
resourceKind: binding.resourceKind,
|
|
129
|
+
identity: binding.identity,
|
|
130
|
+
scopeIdentity: binding.scopeIdentity,
|
|
131
|
+
generatedSymbol: binding.generatedSymbol,
|
|
132
|
+
registerSpace: binding.registerSpace,
|
|
133
|
+
registerIndex: binding.registerIndex,
|
|
134
|
+
group: binding.group,
|
|
135
|
+
binding: binding.binding,
|
|
136
|
+
type: binding.type,
|
|
137
|
+
transformId: binding.transformId ?? null,
|
|
138
|
+
arrayLayerCount: binding.arrayLayerCount ?? null,
|
|
139
|
+
structureStride: binding.structureStride ?? null,
|
|
140
|
+
buffer: binding.buffer || null,
|
|
141
|
+
texture: binding.texture || null,
|
|
142
|
+
sampler: binding.sampler || null
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
function buildLayouts(entries) {
|
|
146
|
+
const passes = new Map();
|
|
147
|
+
for (const entry of entries) {
|
|
148
|
+
const passKey = `${entry.techniqueName}.pass${entry.passIndex}`;
|
|
149
|
+
if (!passes.has(passKey)) {
|
|
150
|
+
passes.set(passKey, {
|
|
151
|
+
identities: new Map(),
|
|
152
|
+
baseScopes: new Map(),
|
|
153
|
+
slots: new Map()
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
const pass = passes.get(passKey);
|
|
157
|
+
const symbols = new Map();
|
|
158
|
+
const d3dIdentities = new Set();
|
|
159
|
+
for (const source of entry.shader.program.bindings || []) {
|
|
160
|
+
const binding = portableBinding(source, entry.stage);
|
|
161
|
+
const identity = bindingIdentity(binding);
|
|
162
|
+
if (d3dIdentities.has(binding.identity)) {
|
|
163
|
+
throw new Error(`WGSL shader ${entry.key} contains duplicate D3D identity ${binding.identity}`);
|
|
164
|
+
}
|
|
165
|
+
d3dIdentities.add(binding.identity);
|
|
166
|
+
if (!pass.baseScopes.has(binding.identity)) pass.baseScopes.set(binding.identity, new Set());
|
|
167
|
+
const baseScopes = pass.baseScopes.get(binding.identity);
|
|
168
|
+
if (identity === binding.identity && Array.from(baseScopes).some(scope => scope !== binding.identity) || identity !== binding.identity && baseScopes.has(binding.identity)) {
|
|
169
|
+
throw new Error(`WGSL set ${passKey} mixes shared and stage-scoped forms for ${binding.identity}`);
|
|
170
|
+
}
|
|
171
|
+
baseScopes.add(identity);
|
|
172
|
+
if (symbols.has(binding.generatedSymbol)) {
|
|
173
|
+
throw new Error(`WGSL shader ${entry.key} contains duplicate generated symbol ${binding.generatedSymbol}`);
|
|
174
|
+
}
|
|
175
|
+
symbols.set(binding.generatedSymbol, identity);
|
|
176
|
+
const slot = `${binding.group}:${binding.binding}`;
|
|
177
|
+
const existingSlot = pass.slots.get(slot);
|
|
178
|
+
if (existingSlot && existingSlot !== identity) {
|
|
179
|
+
throw new Error(`WGSL set ${passKey} assigns ${slot} to both ${existingSlot} and ${identity}`);
|
|
180
|
+
}
|
|
181
|
+
pass.slots.set(slot, identity);
|
|
182
|
+
const existing = pass.identities.get(identity);
|
|
183
|
+
if (!existing) {
|
|
184
|
+
pass.identities.set(identity, binding);
|
|
185
|
+
continue;
|
|
186
|
+
}
|
|
187
|
+
if (bindingFingerprint(existing) !== bindingFingerprint(binding)) {
|
|
188
|
+
throw new Error(`WGSL set ${passKey} has conflicting layouts for ${identity}`);
|
|
189
|
+
}
|
|
190
|
+
existing.visibility = Array.from(new Set([...existing.visibility, ...binding.visibility])).sort((left, right) => VISIBILITY_ORDER.indexOf(left) - VISIBILITY_ORDER.indexOf(right));
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
return Array.from(passes, ([key, pass]) => {
|
|
194
|
+
for (const [identity, scopes] of pass.baseScopes) {
|
|
195
|
+
if (scopes.has(identity) && pass.identities.get(identity)?.visibility.length < 2) {
|
|
196
|
+
throw new Error(`WGSL set ${key} shared identity ${identity} does not cover multiple stages`);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
const groups = new Map();
|
|
200
|
+
for (const binding of pass.identities.values()) {
|
|
201
|
+
if (!groups.has(binding.group)) groups.set(binding.group, []);
|
|
202
|
+
groups.get(binding.group).push(binding);
|
|
203
|
+
}
|
|
204
|
+
return {
|
|
205
|
+
key,
|
|
206
|
+
techniqueName: key.slice(0, key.lastIndexOf(".pass")),
|
|
207
|
+
passIndex: Number(/\.pass([0-9]+)$/.exec(key)?.[1]),
|
|
208
|
+
bindGroups: Array.from(groups, ([group, bindings]) => ({
|
|
209
|
+
group,
|
|
210
|
+
bindings: bindings.sort((left, right) => left.binding - right.binding)
|
|
211
|
+
})).sort((left, right) => left.group - right.group)
|
|
212
|
+
};
|
|
213
|
+
}).sort((left, right) => left.techniqueName.localeCompare(right.techniqueName) || left.passIndex - right.passIndex);
|
|
214
|
+
}
|
|
215
|
+
function validatePassTopologies(entries) {
|
|
216
|
+
const stagesByPass = new Map();
|
|
217
|
+
for (const entry of entries) {
|
|
218
|
+
const passKey = `${entry.techniqueName}.pass${entry.passIndex}`;
|
|
219
|
+
if (!stagesByPass.has(passKey)) stagesByPass.set(passKey, []);
|
|
220
|
+
stagesByPass.get(passKey).push(entry.stageName);
|
|
221
|
+
}
|
|
222
|
+
for (const [passKey, stages] of stagesByPass) {
|
|
223
|
+
if (stages.includes("compute") && (stages.length !== 1 || stages[0] !== "compute")) {
|
|
224
|
+
throw new Error(`WGSL set ${passKey} cannot mix compute and render shader stages`);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
function buildResourceTransforms(entries, layouts) {
|
|
229
|
+
const raw = entries.flatMap(entry => entry.shader.program.resourceTransforms || []);
|
|
230
|
+
const transformedBindings = layouts.flatMap(layout => layout.bindGroups.flatMap(group => group.bindings.filter(binding => binding.transformId).map(binding => ({
|
|
231
|
+
layoutKey: layout.key,
|
|
232
|
+
binding
|
|
233
|
+
}))));
|
|
234
|
+
if (!raw.length) {
|
|
235
|
+
if (transformedBindings.length) {
|
|
236
|
+
throw new Error("WGSL set has transformed bindings without resource recipes");
|
|
237
|
+
}
|
|
238
|
+
return [];
|
|
239
|
+
}
|
|
240
|
+
const plan = normalizeResourceTransformPlan({
|
|
241
|
+
format: "CJS_WGSL_RESOURCE_TRANSFORM_PLAN",
|
|
242
|
+
formatVersion: 1,
|
|
243
|
+
resourceTransforms: raw
|
|
244
|
+
});
|
|
245
|
+
const ids = new Set(plan.resourceTransforms.map(transform => transform.id));
|
|
246
|
+
for (const {
|
|
247
|
+
binding
|
|
248
|
+
} of transformedBindings) {
|
|
249
|
+
if (!ids.has(binding.transformId)) {
|
|
250
|
+
throw new Error(`WGSL binding ${binding.generatedSymbol} references missing transform ${binding.transformId}`);
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
for (const transform of plan.resourceTransforms) {
|
|
254
|
+
const stageKey = `${transform.layoutKey}.pixel`;
|
|
255
|
+
if (!entries.some(entry => entry.key === stageKey)) {
|
|
256
|
+
throw new Error(`WGSL resource transform ${transform.id} has no fragment shader ${stageKey}`);
|
|
257
|
+
}
|
|
258
|
+
const links = transformedBindings.filter(({
|
|
259
|
+
layoutKey,
|
|
260
|
+
binding
|
|
261
|
+
}) => layoutKey === transform.layoutKey && binding.transformId === transform.id);
|
|
262
|
+
if (links.length !== 1) {
|
|
263
|
+
throw new Error(`WGSL resource transform ${transform.id} must link exactly one physical binding`);
|
|
264
|
+
}
|
|
265
|
+
const binding = links[0].binding;
|
|
266
|
+
if (binding.identity !== transform.output.identity || binding.scopeIdentity !== transform.output.scopeIdentity || binding.texture?.viewDimension !== transform.output.viewDimension || binding.arrayLayerCount !== transform.output.layerCount) {
|
|
267
|
+
throw new Error(`WGSL resource transform ${transform.id} does not match its physical binding`);
|
|
268
|
+
}
|
|
269
|
+
const transformLayout = layouts.find(layout => layout.key === transform.layoutKey);
|
|
270
|
+
const physicalScopes = new Set((transformLayout?.bindGroups || []).flatMap(group => group.bindings.map(entry => entry.scopeIdentity)));
|
|
271
|
+
for (const input of transform.inputs.slice(1)) {
|
|
272
|
+
if (physicalScopes.has(input.scopeIdentity)) {
|
|
273
|
+
throw new Error(`WGSL resource transform ${transform.id} retains removed input ${input.scopeIdentity}`);
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
return plan.resourceTransforms;
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
/**
|
|
281
|
+
* Builds the portable JSON document stored in a CEWGPU `WGSL` chunk.
|
|
282
|
+
* Existing numeric bindings are validated and never reassigned.
|
|
283
|
+
*
|
|
284
|
+
* @param {Array<object>} input Wrapped emitted shader descriptors.
|
|
285
|
+
* @returns {object} Frozen CJS_WGSL_SET document.
|
|
286
|
+
*/
|
|
287
|
+
function buildWgslSet(input) {
|
|
288
|
+
if (!Array.isArray(input) || !input.length) throw new TypeError("BuildWgslSet expects a non-empty shader entry array");
|
|
289
|
+
const entries = input.map(normalizeEntry);
|
|
290
|
+
const keys = new Set();
|
|
291
|
+
const shaders = entries.map(entry => {
|
|
292
|
+
if (keys.has(entry.key)) throw new Error(`WGSL set contains duplicate shader key ${entry.key}`);
|
|
293
|
+
keys.add(entry.key);
|
|
294
|
+
return {
|
|
295
|
+
key: entry.key,
|
|
296
|
+
techniqueName: entry.techniqueName,
|
|
297
|
+
passIndex: entry.passIndex,
|
|
298
|
+
stageName: entry.stageName,
|
|
299
|
+
stage: entry.stage,
|
|
300
|
+
stageType: entry.stageType,
|
|
301
|
+
entryPoint: entry.shader.entryPoint,
|
|
302
|
+
code: entry.shader.code,
|
|
303
|
+
sourceMap: clonePlain(entry.shader.sourceMap || []),
|
|
304
|
+
...(entry.threadGroupSize ? {
|
|
305
|
+
threadGroupSize: clonePlain(entry.threadGroupSize)
|
|
306
|
+
} : {})
|
|
307
|
+
};
|
|
308
|
+
}).sort((left, right) => left.techniqueName.localeCompare(right.techniqueName) || left.passIndex - right.passIndex || STAGE_NAME_ORDER.indexOf(left.stageName) - STAGE_NAME_ORDER.indexOf(right.stageName));
|
|
309
|
+
validatePassTopologies(entries);
|
|
310
|
+
const layouts = buildLayouts(entries);
|
|
311
|
+
const resourceTransforms = buildResourceTransforms(entries, layouts);
|
|
312
|
+
return deepFreeze({
|
|
313
|
+
format: "CJS_WGSL_SET",
|
|
314
|
+
formatVersion: WGSL_SET_VERSION,
|
|
315
|
+
shaders,
|
|
316
|
+
layouts,
|
|
317
|
+
...(resourceTransforms.length ? {
|
|
318
|
+
resourceTransforms
|
|
319
|
+
} : {})
|
|
320
|
+
});
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
export { WGSL_SET_VERSION, buildWgslSet };
|
|
324
|
+
//# sourceMappingURL=buildWgslSet.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buildWgslSet.js","sources":["../../../../../../src/formats/webgpu/core/wgsl/buildWgslSet.js"],"sourcesContent":["import { normalizeResourceTransformPlan } from \"./buildResourceTransformPlan.js\";\n\nexport const WGSL_SET_VERSION = 3;\n\nconst KEY_PATTERN = /^(.*)\\.pass([0-9]+)\\.(vertex|pixel|compute)$/;\nconst KEY_STAGE = Object.freeze({ vertex: \"vertex\", pixel: \"fragment\", compute: \"compute\" });\nconst STAGE_TYPES = Object.freeze({ vertex: 0, pixel: 1, compute: 2 });\nconst STAGE_NAME_ORDER = Object.freeze([ \"vertex\", \"pixel\", \"compute\" ]);\n\nconst VISIBILITY_ORDER = Object.freeze([ \"vertex\", \"fragment\", \"compute\" ]);\n\nfunction clonePlain(value)\n{\n if (Array.isArray(value)) return value.map(clonePlain);\n if (value && typeof value === \"object\")\n {\n return Object.fromEntries(Object.entries(value).map(([ key, entry ]) => [ key, clonePlain(entry) ]));\n }\n return value;\n}\n\nfunction deepFreeze(value)\n{\n if (!value || typeof value !== \"object\" || Object.isFrozen(value)) return value;\n for (const entry of Object.values(value)) deepFreeze(entry);\n return Object.freeze(value);\n}\n\nfunction normalizeEntry(entry, index)\n{\n const shader = entry?.shader;\n if (shader?.format !== \"CJS_WGSL_SHADER\" || shader.formatVersion !== 1\n || typeof shader.code !== \"string\" || !shader.code\n || typeof shader.entryPoint !== \"string\" || !shader.entryPoint\n || !Array.isArray(shader.sourceMap)\n || shader.program?.format !== \"CJS_TYPED_SHADER\")\n {\n throw new TypeError(`WGSL set entry ${index} requires a CJS_WGSL_SHADER descriptor`);\n }\n const key = typeof entry.key === \"string\" ? entry.key : \"\";\n const match = KEY_PATTERN.exec(key);\n if (!match || !match[1]) throw new Error(`WGSL set entry ${index} has malformed key ${key || \"<empty>\"}`);\n const techniqueName = match[1];\n const passIndex = Number(match[2]);\n const stageName = match[3];\n if (shader.stage !== KEY_STAGE[stageName])\n {\n throw new Error(`WGSL set key ${key} does not match shader stage ${shader.stage}`);\n }\n let threadGroupSize = null;\n if (stageName === \"compute\")\n {\n threadGroupSize = shader.threadGroupSize;\n if (!Array.isArray(threadGroupSize) || threadGroupSize.length !== 3\n || threadGroupSize.some((value) => !Number.isSafeInteger(value) || value < 1))\n {\n throw new Error(`WGSL compute shader ${key} requires a positive three-dimensional threadGroupSize`);\n }\n }\n else if (shader.threadGroupSize !== undefined && shader.threadGroupSize !== null)\n {\n throw new Error(`WGSL render shader ${key} cannot declare threadGroupSize`);\n }\n return {\n shader,\n stage: shader.stage,\n techniqueName,\n passIndex,\n stageName,\n stageType: STAGE_TYPES[stageName],\n ...(threadGroupSize ? { threadGroupSize: clonePlain(threadGroupSize) } : {}),\n key\n };\n}\n\nfunction portableBinding(binding, visibility)\n{\n if (!Number.isInteger(binding.group) || binding.group < 0\n || !Number.isInteger(binding.binding) || binding.binding < 0\n || !Number.isInteger(binding.registerSpace) || binding.registerSpace < 0\n || !Number.isInteger(binding.registerIndex) || binding.registerIndex < 0\n || typeof binding.resourceKind !== \"string\" || !binding.resourceKind\n || typeof binding.generatedSymbol !== \"string\" || !binding.generatedSymbol\n || typeof binding.type !== \"string\" || !binding.type)\n {\n throw new Error(`WGSL binding ${binding.id || binding.generatedSymbol || \"unknown\"} has an invalid portable identity`);\n }\n const identity = `${binding.resourceKind}:${binding.registerSpace}:${binding.registerIndex}`;\n if (binding.scopeIdentity !== undefined\n && (typeof binding.scopeIdentity !== \"string\" || !binding.scopeIdentity))\n {\n throw new Error(`WGSL binding ${binding.generatedSymbol} has invalid scope identity ${binding.scopeIdentity || \"<empty>\"}`);\n }\n const scopeIdentity = binding.scopeIdentity === undefined\n ? `${identity}@${visibility}`\n : binding.scopeIdentity;\n if (binding.identity !== undefined && binding.identity !== identity)\n {\n throw new Error(`WGSL binding ${binding.generatedSymbol} has inconsistent D3D identity ${binding.identity}`);\n }\n const hasTransform = binding.transformId !== undefined\n || binding.arrayLayerCount !== undefined;\n if (hasTransform\n && (binding.resourceKind !== \"sampled-resource\"\n || typeof binding.transformId !== \"string\" || !binding.transformId\n || !Number.isInteger(binding.arrayLayerCount) || binding.arrayLayerCount < 2\n || binding.type !== \"texture_2d_array<f32>\"\n || binding.texture?.viewDimension !== \"2d-array\"))\n {\n throw new Error(`WGSL binding ${binding.generatedSymbol} has invalid resource transform metadata`);\n }\n if (scopeIdentity !== identity && scopeIdentity !== `${identity}@${visibility}`)\n {\n throw new Error(`WGSL binding ${binding.generatedSymbol} has invalid scope identity ${scopeIdentity}`);\n }\n const descriptorKeys = [ \"buffer\", \"texture\", \"sampler\" ].filter((key) => binding[key]);\n const expectedDescriptors = {\n \"uniform-buffer\": [ \"buffer\" ],\n \"sampled-resource\": [ \"buffer\", \"texture\" ],\n \"storage-resource\": [ \"buffer\" ],\n sampler: [ \"sampler\" ]\n }[binding.resourceKind];\n if (!expectedDescriptors || descriptorKeys.length !== 1 || !expectedDescriptors.includes(descriptorKeys[0]))\n {\n throw new Error(`WGSL binding ${binding.generatedSymbol} has an invalid ${binding.resourceKind} layout descriptor`);\n }\n return {\n identity,\n scopeIdentity,\n resourceKind: binding.resourceKind,\n generatedSymbol: binding.generatedSymbol,\n registerSpace: binding.registerSpace,\n registerIndex: binding.registerIndex,\n group: binding.group,\n binding: binding.binding,\n visibility: [ visibility ],\n type: binding.type,\n ...(hasTransform\n ? {\n transformId: binding.transformId,\n arrayLayerCount: binding.arrayLayerCount\n }\n : {}),\n ...(Number.isInteger(binding.structureStride) ? { structureStride: binding.structureStride } : {}),\n ...(binding.buffer ? { buffer: clonePlain(binding.buffer) } : {}),\n ...(binding.texture ? { texture: clonePlain(binding.texture) } : {}),\n ...(binding.sampler ? { sampler: clonePlain(binding.sampler) } : {})\n };\n}\n\nfunction bindingIdentity(binding)\n{\n return binding.scopeIdentity || `${binding.resourceKind}:${binding.registerSpace}:${binding.registerIndex}`;\n}\n\nfunction bindingFingerprint(binding)\n{\n return JSON.stringify({\n resourceKind: binding.resourceKind,\n identity: binding.identity,\n scopeIdentity: binding.scopeIdentity,\n generatedSymbol: binding.generatedSymbol,\n registerSpace: binding.registerSpace,\n registerIndex: binding.registerIndex,\n group: binding.group,\n binding: binding.binding,\n type: binding.type,\n transformId: binding.transformId ?? null,\n arrayLayerCount: binding.arrayLayerCount ?? null,\n structureStride: binding.structureStride ?? null,\n buffer: binding.buffer || null,\n texture: binding.texture || null,\n sampler: binding.sampler || null\n });\n}\n\nfunction buildLayouts(entries)\n{\n const passes = new Map();\n for (const entry of entries)\n {\n const passKey = `${entry.techniqueName}.pass${entry.passIndex}`;\n if (!passes.has(passKey))\n {\n passes.set(passKey, { identities: new Map(), baseScopes: new Map(), slots: new Map() });\n }\n const pass = passes.get(passKey);\n const symbols = new Map();\n const d3dIdentities = new Set();\n for (const source of entry.shader.program.bindings || [])\n {\n const binding = portableBinding(source, entry.stage);\n const identity = bindingIdentity(binding);\n if (d3dIdentities.has(binding.identity))\n {\n throw new Error(`WGSL shader ${entry.key} contains duplicate D3D identity ${binding.identity}`);\n }\n d3dIdentities.add(binding.identity);\n if (!pass.baseScopes.has(binding.identity)) pass.baseScopes.set(binding.identity, new Set());\n const baseScopes = pass.baseScopes.get(binding.identity);\n if ((identity === binding.identity && Array.from(baseScopes).some((scope) => scope !== binding.identity))\n || (identity !== binding.identity && baseScopes.has(binding.identity)))\n {\n throw new Error(`WGSL set ${passKey} mixes shared and stage-scoped forms for ${binding.identity}`);\n }\n baseScopes.add(identity);\n if (symbols.has(binding.generatedSymbol))\n {\n throw new Error(`WGSL shader ${entry.key} contains duplicate generated symbol ${binding.generatedSymbol}`);\n }\n symbols.set(binding.generatedSymbol, identity);\n const slot = `${binding.group}:${binding.binding}`;\n const existingSlot = pass.slots.get(slot);\n if (existingSlot && existingSlot !== identity)\n {\n throw new Error(`WGSL set ${passKey} assigns ${slot} to both ${existingSlot} and ${identity}`);\n }\n pass.slots.set(slot, identity);\n const existing = pass.identities.get(identity);\n if (!existing)\n {\n pass.identities.set(identity, binding);\n continue;\n }\n if (bindingFingerprint(existing) !== bindingFingerprint(binding))\n {\n throw new Error(`WGSL set ${passKey} has conflicting layouts for ${identity}`);\n }\n existing.visibility = Array.from(new Set([ ...existing.visibility, ...binding.visibility ]))\n .sort((left, right) => VISIBILITY_ORDER.indexOf(left) - VISIBILITY_ORDER.indexOf(right));\n }\n }\n return Array.from(passes, ([ key, pass ]) =>\n {\n for (const [ identity, scopes ] of pass.baseScopes)\n {\n if (scopes.has(identity) && pass.identities.get(identity)?.visibility.length < 2)\n {\n throw new Error(`WGSL set ${key} shared identity ${identity} does not cover multiple stages`);\n }\n }\n const groups = new Map();\n for (const binding of pass.identities.values())\n {\n if (!groups.has(binding.group)) groups.set(binding.group, []);\n groups.get(binding.group).push(binding);\n }\n return {\n key,\n techniqueName: key.slice(0, key.lastIndexOf(\".pass\")),\n passIndex: Number(/\\.pass([0-9]+)$/.exec(key)?.[1]),\n bindGroups: Array.from(groups, ([ group, bindings ]) => ({\n group,\n bindings: bindings.sort((left, right) => left.binding - right.binding)\n })).sort((left, right) => left.group - right.group)\n };\n }).sort((left, right) =>\n left.techniqueName.localeCompare(right.techniqueName)\n || left.passIndex - right.passIndex);\n}\n\nfunction validatePassTopologies(entries)\n{\n const stagesByPass = new Map();\n for (const entry of entries)\n {\n const passKey = `${entry.techniqueName}.pass${entry.passIndex}`;\n if (!stagesByPass.has(passKey)) stagesByPass.set(passKey, []);\n stagesByPass.get(passKey).push(entry.stageName);\n }\n for (const [ passKey, stages ] of stagesByPass)\n {\n if (stages.includes(\"compute\") && (stages.length !== 1 || stages[0] !== \"compute\"))\n {\n throw new Error(`WGSL set ${passKey} cannot mix compute and render shader stages`);\n }\n }\n}\n\nfunction buildResourceTransforms(entries, layouts)\n{\n const raw = entries.flatMap((entry) => entry.shader.program.resourceTransforms || []);\n const transformedBindings = layouts.flatMap((layout) =>\n layout.bindGroups.flatMap((group) =>\n group.bindings.filter((binding) => binding.transformId)\n .map((binding) => ({ layoutKey: layout.key, binding }))));\n if (!raw.length)\n {\n if (transformedBindings.length)\n {\n throw new Error(\"WGSL set has transformed bindings without resource recipes\");\n }\n return [];\n }\n const plan = normalizeResourceTransformPlan({\n format: \"CJS_WGSL_RESOURCE_TRANSFORM_PLAN\",\n formatVersion: 1,\n resourceTransforms: raw\n });\n const ids = new Set(plan.resourceTransforms.map((transform) => transform.id));\n for (const { binding } of transformedBindings)\n {\n if (!ids.has(binding.transformId))\n {\n throw new Error(`WGSL binding ${binding.generatedSymbol} references missing transform ${binding.transformId}`);\n }\n }\n for (const transform of plan.resourceTransforms)\n {\n const stageKey = `${transform.layoutKey}.pixel`;\n if (!entries.some((entry) => entry.key === stageKey))\n {\n throw new Error(`WGSL resource transform ${transform.id} has no fragment shader ${stageKey}`);\n }\n const links = transformedBindings.filter(({ layoutKey, binding }) =>\n layoutKey === transform.layoutKey\n && binding.transformId === transform.id);\n if (links.length !== 1)\n {\n throw new Error(`WGSL resource transform ${transform.id} must link exactly one physical binding`);\n }\n const binding = links[0].binding;\n if (binding.identity !== transform.output.identity\n || binding.scopeIdentity !== transform.output.scopeIdentity\n || binding.texture?.viewDimension !== transform.output.viewDimension\n || binding.arrayLayerCount !== transform.output.layerCount)\n {\n throw new Error(`WGSL resource transform ${transform.id} does not match its physical binding`);\n }\n const transformLayout = layouts.find((layout) =>\n layout.key === transform.layoutKey);\n const physicalScopes = new Set((transformLayout?.bindGroups || []).flatMap((group) =>\n group.bindings.map((entry) => entry.scopeIdentity)));\n for (const input of transform.inputs.slice(1))\n {\n if (physicalScopes.has(input.scopeIdentity))\n {\n throw new Error(`WGSL resource transform ${transform.id} retains removed input ${input.scopeIdentity}`);\n }\n }\n }\n return plan.resourceTransforms;\n}\n\n/**\n * Builds the portable JSON document stored in a CEWGPU `WGSL` chunk.\n * Existing numeric bindings are validated and never reassigned.\n *\n * @param {Array<object>} input Wrapped emitted shader descriptors.\n * @returns {object} Frozen CJS_WGSL_SET document.\n */\nexport function buildWgslSet(input)\n{\n if (!Array.isArray(input) || !input.length) throw new TypeError(\"BuildWgslSet expects a non-empty shader entry array\");\n const entries = input.map(normalizeEntry);\n const keys = new Set();\n const shaders = entries.map((entry) =>\n {\n if (keys.has(entry.key)) throw new Error(`WGSL set contains duplicate shader key ${entry.key}`);\n keys.add(entry.key);\n return {\n key: entry.key,\n techniqueName: entry.techniqueName,\n passIndex: entry.passIndex,\n stageName: entry.stageName,\n stage: entry.stage,\n stageType: entry.stageType,\n entryPoint: entry.shader.entryPoint,\n code: entry.shader.code,\n sourceMap: clonePlain(entry.shader.sourceMap || []),\n ...(entry.threadGroupSize ? { threadGroupSize: clonePlain(entry.threadGroupSize) } : {})\n };\n }).sort((left, right) =>\n left.techniqueName.localeCompare(right.techniqueName)\n || left.passIndex - right.passIndex\n || STAGE_NAME_ORDER.indexOf(left.stageName) - STAGE_NAME_ORDER.indexOf(right.stageName));\n validatePassTopologies(entries);\n const layouts = buildLayouts(entries);\n const resourceTransforms = buildResourceTransforms(entries, layouts);\n return deepFreeze({\n format: \"CJS_WGSL_SET\",\n formatVersion: WGSL_SET_VERSION,\n shaders,\n layouts,\n ...(resourceTransforms.length ? { resourceTransforms } : {})\n });\n}\n"],"names":["WGSL_SET_VERSION","KEY_PATTERN","KEY_STAGE","Object","freeze","vertex","pixel","compute","STAGE_TYPES","STAGE_NAME_ORDER","VISIBILITY_ORDER","clonePlain","value","Array","isArray","map","fromEntries","entries","key","entry","deepFreeze","isFrozen","values","normalizeEntry","index","shader","format","formatVersion","code","entryPoint","sourceMap","program","TypeError","match","exec","Error","techniqueName","passIndex","Number","stageName","stage","threadGroupSize","length","some","isSafeInteger","undefined","stageType","portableBinding","binding","visibility","isInteger","group","registerSpace","registerIndex","resourceKind","generatedSymbol","type","id","identity","scopeIdentity","hasTransform","transformId","arrayLayerCount","texture","viewDimension","descriptorKeys","filter","expectedDescriptors","sampler","includes","structureStride","buffer","bindingIdentity","bindingFingerprint","JSON","stringify","buildLayouts","passes","Map","passKey","has","set","identities","baseScopes","slots","pass","get","symbols","d3dIdentities","Set","source","bindings","add","from","scope","slot","existingSlot","existing","sort","left","right","indexOf","scopes","groups","push","slice","lastIndexOf","bindGroups","localeCompare","validatePassTopologies","stagesByPass","stages","buildResourceTransforms","layouts","raw","flatMap","resourceTransforms","transformedBindings","layout","layoutKey","plan","normalizeResourceTransformPlan","ids","transform","stageKey","links","output","layerCount","transformLayout","find","physicalScopes","input","inputs","buildWgslSet","keys","shaders"],"mappings":"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"}
|