@carbonenginejs/runtime-resource 0.10.0 → 0.11.0
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,742 @@
|
|
|
1
|
+
import { HlslReader } from '../../HlslReader.js';
|
|
2
|
+
import { asUint8Array } from '@carbonenginejs/runtime-utils/bytes';
|
|
3
|
+
import { cjsUint32ToFloat32 } from '../../HlslBinaryUtils.js';
|
|
4
|
+
import { HlslRenderStateSetup } from '../../HlslRenderStateSetup.js';
|
|
5
|
+
import { HlslResourceSetDescription } from '../../HlslResourceSetDescription.js';
|
|
6
|
+
import { HlslShaderBytecode } from '../../HlslShaderBytecode.js';
|
|
7
|
+
import { HlslRenderContextEnum, hlslShaderStageName, HlslUsageCodeNames } from '../HlslRenderContextEnum.js';
|
|
8
|
+
import { HlslEffectConstant } from './HlslEffectConstant.js';
|
|
9
|
+
import { HlslEffectLibrary } from './HlslEffectLibrary.js';
|
|
10
|
+
import { HlslEffectParameterAnnotation } from './HlslEffectParameterAnnotation.js';
|
|
11
|
+
import { HlslEffectResource } from './HlslEffectResource.js';
|
|
12
|
+
import { HlslEffectStageInput } from './HlslEffectStageInput.js';
|
|
13
|
+
import { HlslEffectTechnique } from './HlslEffectTechnique.js';
|
|
14
|
+
import { HlslPass } from './HlslPass.js';
|
|
15
|
+
import { HlslSamplerDescription } from './HlslSamplerDescription.js';
|
|
16
|
+
import { HlslSamplerSetup } from './HlslSamplerSetup.js';
|
|
17
|
+
|
|
18
|
+
const DEFAULT_TECHNIQUE = "Main";
|
|
19
|
+
const ANY_TECHNIQUE = "";
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Trinity effect-description body decoded from one compiled permutation record.
|
|
23
|
+
*/
|
|
24
|
+
class HlslEffectDescription {
|
|
25
|
+
/**
|
|
26
|
+
* Creates an empty decoded effect description.
|
|
27
|
+
*/
|
|
28
|
+
constructor() {
|
|
29
|
+
this.techniques = [];
|
|
30
|
+
this.annotations = new Map();
|
|
31
|
+
this.version = 0;
|
|
32
|
+
this.effectName = "";
|
|
33
|
+
this.readError = null;
|
|
34
|
+
this.effectStateManager = null;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Reads a compiled effect body using the shared string table from `HlslEffectRes`.
|
|
39
|
+
*
|
|
40
|
+
* @param {ArrayBuffer|ArrayBufferView|Uint8Array} data Effect body bytes.
|
|
41
|
+
* @param {number} dataSize Valid byte size of the effect body.
|
|
42
|
+
* @param {number} version Carbon effect data version.
|
|
43
|
+
* @param {ArrayBuffer|ArrayBufferView|Uint8Array} stringTable Shared effect string table.
|
|
44
|
+
* @param {number} stringTableSize Valid string-table byte count.
|
|
45
|
+
* @param {string} effectName Source effect name or path.
|
|
46
|
+
* @param {object} [options] Reader options and dependency overrides.
|
|
47
|
+
* @returns {boolean} True when the body was decoded successfully.
|
|
48
|
+
*/
|
|
49
|
+
Read(data, dataSize, version, stringTable, stringTableSize, effectName, options = {}) {
|
|
50
|
+
this.techniques = [];
|
|
51
|
+
this.annotations = new Map();
|
|
52
|
+
this.version = Number(version) || 0;
|
|
53
|
+
this.effectName = effectName || "";
|
|
54
|
+
this.readError = null;
|
|
55
|
+
this.effectStateManager = options.effectStateManager || options.renderContext?.m_esm || null;
|
|
56
|
+
try {
|
|
57
|
+
const bodyBytes = asUint8Array(data).subarray(0, Number(dataSize) || 0);
|
|
58
|
+
const tableBytes = asUint8Array(stringTable).subarray(0, Number(stringTableSize) || 0);
|
|
59
|
+
const stream = new HlslReader(bodyBytes, {
|
|
60
|
+
stringTable: tableBytes,
|
|
61
|
+
stringTableSize: tableBytes.length,
|
|
62
|
+
source: effectName || "HlslEffectDescription"
|
|
63
|
+
});
|
|
64
|
+
const context = createReadContext(options, this.effectStateManager);
|
|
65
|
+
this.effectStateManager = context.effectStateManager;
|
|
66
|
+
let techniqueCount = 1;
|
|
67
|
+
if (version > 6) {
|
|
68
|
+
techniqueCount = stream.readUint8();
|
|
69
|
+
}
|
|
70
|
+
for (let techniqueIndex = 0; techniqueIndex < techniqueCount; techniqueIndex += 1) {
|
|
71
|
+
const technique = new HlslEffectTechnique();
|
|
72
|
+
technique.name = version > 6 ? stream.readString() : DEFAULT_TECHNIQUE;
|
|
73
|
+
technique.shaderTypeMask = 0;
|
|
74
|
+
const passCount = sanityCheck(stream.readUint8(), 64, "pass count");
|
|
75
|
+
for (let passIndex = 0; passIndex < passCount; passIndex += 1) {
|
|
76
|
+
const pass = readPass(stream, version, effectName || "", context);
|
|
77
|
+
technique.passes.push(pass);
|
|
78
|
+
technique.shaderTypeMask |= pass.shaderTypeMask;
|
|
79
|
+
}
|
|
80
|
+
if (version > 13) {
|
|
81
|
+
const libraryCount = stream.readUint8();
|
|
82
|
+
for (let libraryIndex = 0; libraryIndex < libraryCount; libraryIndex += 1) {
|
|
83
|
+
technique.libraries.push(readLibrary(stream, version, context));
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
this.techniques.push(technique);
|
|
87
|
+
}
|
|
88
|
+
const parameterCount = sanityCheck(stream.readUint16(), 256, "parameter annotation count");
|
|
89
|
+
for (let parameterIndex = 0; parameterIndex < parameterCount; parameterIndex += 1) {
|
|
90
|
+
const name = stream.readString();
|
|
91
|
+
if (this.annotations.has(name)) {
|
|
92
|
+
throw new Error(`Duplicate effect parameter annotation group ${name}`);
|
|
93
|
+
}
|
|
94
|
+
this.annotations.set(name, readAnnotations(stream));
|
|
95
|
+
}
|
|
96
|
+
applyHeapViewAnnotations(this, context);
|
|
97
|
+
return true;
|
|
98
|
+
} catch (error) {
|
|
99
|
+
this.readError = error;
|
|
100
|
+
this.techniques = [];
|
|
101
|
+
this.annotations = new Map();
|
|
102
|
+
return false;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Returns a JSON-safe summary of decoded techniques and annotations.
|
|
108
|
+
*
|
|
109
|
+
* @returns {object} Serializable effect-description summary.
|
|
110
|
+
*/
|
|
111
|
+
toJSON() {
|
|
112
|
+
return {
|
|
113
|
+
version: this.version,
|
|
114
|
+
effectName: this.effectName,
|
|
115
|
+
techniques: this.techniques.map(entry => entry.toJSON()),
|
|
116
|
+
annotations: mapAnnotationToJson(this.annotations),
|
|
117
|
+
readError: this.readError ? {
|
|
118
|
+
name: this.readError.name,
|
|
119
|
+
message: this.readError.message,
|
|
120
|
+
details: this.readError.details || null
|
|
121
|
+
} : null
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Builds the shared parser context used while reading one effect body.
|
|
128
|
+
*
|
|
129
|
+
* @param {object} options Reader options from `Read`.
|
|
130
|
+
* @param {object|null} effectStateManager Effect-state registry override.
|
|
131
|
+
* @returns {object} Parser context.
|
|
132
|
+
*/
|
|
133
|
+
function createReadContext(options, effectStateManager) {
|
|
134
|
+
return {
|
|
135
|
+
effectStateManager,
|
|
136
|
+
perFrameVSStartRegister: Number.isInteger(options.perFrameVSStartRegister) ? options.perFrameVSStartRegister : null,
|
|
137
|
+
perFramePSStartRegister: Number.isInteger(options.perFramePSStartRegister) ? options.perFramePSStartRegister : null
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* Reads one technique pass, including shader stages, signatures, resources, and states.
|
|
143
|
+
*
|
|
144
|
+
* @param {HlslReader} stream Binary reader positioned at a pass record.
|
|
145
|
+
* @param {number} version Carbon effect data version.
|
|
146
|
+
* @param {string} effectName Source effect name or path.
|
|
147
|
+
* @param {object} context Shared parser context.
|
|
148
|
+
* @returns {HlslPass} Decoded pass.
|
|
149
|
+
*/
|
|
150
|
+
function readPass(stream, version, effectName, context) {
|
|
151
|
+
const pass = new HlslPass();
|
|
152
|
+
const shaderTypes = [];
|
|
153
|
+
const signatures = [];
|
|
154
|
+
const shaderHandles = [];
|
|
155
|
+
const stageCount = sanityCheck(stream.readUint8(), HlslRenderContextEnum.SHADER_TYPE_COUNT, "stage count");
|
|
156
|
+
for (let stageIndex = 0; stageIndex < stageCount; stageIndex += 1) {
|
|
157
|
+
const stageType = stream.readUint8();
|
|
158
|
+
if (stageType >= HlslRenderContextEnum.SHADER_TYPE_COUNT || pass.stageInputs[stageType]?.m_exists) {
|
|
159
|
+
throw new Error(`Duplicate or invalid shader stage type ${stageType}`);
|
|
160
|
+
}
|
|
161
|
+
const stageInput = pass.stageInputs[stageType] || new HlslEffectStageInput();
|
|
162
|
+
pass.stageInputs[stageType] = stageInput;
|
|
163
|
+
pass.shaderTypeMask |= 1 << stageType;
|
|
164
|
+
stageInput.m_exists = true;
|
|
165
|
+
if (version < 14) {
|
|
166
|
+
readPipelineInputs(stageInput.signature.pipelineInputs, stream, version);
|
|
167
|
+
if (version > 8) {
|
|
168
|
+
readRegisters(stageInput.signature, stream, version, stageType, context);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
const shaderSize = stream.readUint32();
|
|
172
|
+
let shaderBlob;
|
|
173
|
+
if (version < 5) {
|
|
174
|
+
shaderBlob = {
|
|
175
|
+
offset: null,
|
|
176
|
+
bytes: stream.readRaw(shaderSize)
|
|
177
|
+
};
|
|
178
|
+
stream.readRaw(stream.readUint32());
|
|
179
|
+
} else {
|
|
180
|
+
shaderBlob = stream.readTableBlob(shaderSize);
|
|
181
|
+
if (version < 12) {
|
|
182
|
+
stream.readUint32();
|
|
183
|
+
stream.readUint32();
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
if (version >= 3) {
|
|
187
|
+
stageInput.signature.threadGroupSize = {
|
|
188
|
+
x: stream.readUint32(),
|
|
189
|
+
y: stream.readUint32(),
|
|
190
|
+
z: stream.readUint32()
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
if (version >= 14) {
|
|
194
|
+
readPipelineInputs(stageInput.signature.pipelineInputs, stream, version);
|
|
195
|
+
readRegisters(stageInput.signature, stream, version, stageType, context);
|
|
196
|
+
}
|
|
197
|
+
readInput(stageInput, stream, version);
|
|
198
|
+
const bytecode = new HlslShaderBytecode({
|
|
199
|
+
stageType,
|
|
200
|
+
stageName: hlslShaderStageName(stageType),
|
|
201
|
+
bytes: shaderBlob.bytes,
|
|
202
|
+
shaderSize,
|
|
203
|
+
stringTableOffset: shaderBlob.offset,
|
|
204
|
+
effectName
|
|
205
|
+
});
|
|
206
|
+
stageInput.cjsShaderBytecode = bytecode;
|
|
207
|
+
stageInput.m_shader = context.effectStateManager.RegisterShader(stageType, bytecode, stageInput.signature, effectName);
|
|
208
|
+
shaderHandles[stageIndex] = stageInput.m_shader;
|
|
209
|
+
shaderTypes.push(stageType);
|
|
210
|
+
signatures.push(stageInput.signature);
|
|
211
|
+
}
|
|
212
|
+
pass.resourceSetDesc = new HlslResourceSetDescription(shaderTypes, signatures);
|
|
213
|
+
for (let stageType = 0; stageType < HlslRenderContextEnum.SHADER_TYPE_COUNT; stageType += 1) {
|
|
214
|
+
const stageInput = pass.stageInputs[stageType];
|
|
215
|
+
if (!stageInput?.m_exists) continue;
|
|
216
|
+
for (const [registerIndex, sampler] of stageInput.samplers.entries()) {
|
|
217
|
+
pass.resourceSetDesc.SetSampler(stageType, registerIndex, sampler.sampler);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
pass.shaderProgram = context.effectStateManager.RegisterShaderProgram(shaderHandles, stageCount);
|
|
221
|
+
const stateCount = sanityCheck(stream.readUint8(), 64, "render state count");
|
|
222
|
+
const states = new Map();
|
|
223
|
+
for (let stateIndex = 0; stateIndex < stateCount; stateIndex += 1) {
|
|
224
|
+
const state = stream.readUint32();
|
|
225
|
+
const value = stream.readUint32();
|
|
226
|
+
if (states.has(state)) {
|
|
227
|
+
throw new Error(`Duplicate render state ${state}`);
|
|
228
|
+
}
|
|
229
|
+
states.set(state, value);
|
|
230
|
+
}
|
|
231
|
+
pass.cjsRenderStateSetup = new HlslRenderStateSetup(states);
|
|
232
|
+
pass.renderStates = context.effectStateManager.RegisterRenderStateSetup(pass.cjsRenderStateSetup);
|
|
233
|
+
return pass;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
/**
|
|
237
|
+
* Reads one ray-tracing shader library block from v14+ effect data.
|
|
238
|
+
*
|
|
239
|
+
* @param {HlslReader} stream Binary reader positioned at a library record.
|
|
240
|
+
* @param {number} version Carbon effect data version.
|
|
241
|
+
* @param {object} context Shared parser context.
|
|
242
|
+
* @returns {HlslEffectLibrary} Decoded library metadata.
|
|
243
|
+
*/
|
|
244
|
+
function readLibrary(stream, version, context) {
|
|
245
|
+
const library = new HlslEffectLibrary();
|
|
246
|
+
library.payloadSize = stream.readUint32();
|
|
247
|
+
const bytecodeSize = stream.readUint32();
|
|
248
|
+
const bytecodeBlob = stream.readTableBlob(bytecodeSize);
|
|
249
|
+
library.cjsShaderBytecode = new HlslShaderBytecode({
|
|
250
|
+
stageType: HlslRenderContextEnum.COMPUTE_SHADER,
|
|
251
|
+
stageName: "library",
|
|
252
|
+
bytes: bytecodeBlob.bytes,
|
|
253
|
+
shaderSize: bytecodeSize,
|
|
254
|
+
stringTableOffset: bytecodeBlob.offset
|
|
255
|
+
});
|
|
256
|
+
library.libraryHandle = context.effectStateManager.RegisterShaderLibrary(library.cjsShaderBytecode);
|
|
257
|
+
const exportCount = stream.readUint32();
|
|
258
|
+
for (let exportIndex = 0; exportIndex < exportCount; exportIndex += 1) {
|
|
259
|
+
const type = stream.readUint8();
|
|
260
|
+
const name = stream.readString();
|
|
261
|
+
library.exports.push({
|
|
262
|
+
type,
|
|
263
|
+
name
|
|
264
|
+
});
|
|
265
|
+
if (type === 0) library.rayGenName = name;
|
|
266
|
+
if (type === 1) library.missName = name;
|
|
267
|
+
if (type === 2) library.closestHitName = name;
|
|
268
|
+
if (type === 3) library.anyHitName = name;
|
|
269
|
+
if (type === 4) library.intersectionName = name;
|
|
270
|
+
}
|
|
271
|
+
library.hitGroupName = stream.readString();
|
|
272
|
+
const shaderType = HlslRenderContextEnum.COMPUTE_SHADER;
|
|
273
|
+
readRegisters(library.globalInput.signature, stream, version, shaderType, context);
|
|
274
|
+
readInput(library.globalInput, stream, version);
|
|
275
|
+
library.globalResourceSetDesc = new HlslResourceSetDescription([shaderType], [library.globalInput.signature]);
|
|
276
|
+
for (const [registerIndex, sampler] of library.globalInput.samplers.entries()) {
|
|
277
|
+
library.globalResourceSetDesc.SetSampler(shaderType, registerIndex, sampler.sampler);
|
|
278
|
+
}
|
|
279
|
+
readRegisters(library.localInput.signature, stream, version, shaderType, context);
|
|
280
|
+
readInput(library.localInput, stream, version);
|
|
281
|
+
return library;
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
/**
|
|
285
|
+
* Reads constants, resources, samplers, UAVs, and annotations for one shader input.
|
|
286
|
+
*
|
|
287
|
+
* @param {HlslEffectStageInput} input Stage or library input to populate.
|
|
288
|
+
* @param {HlslReader} stream Binary reader positioned at an input record.
|
|
289
|
+
* @param {number} version Carbon effect data version.
|
|
290
|
+
* @param {number} stageType Trinity shader stage enum value.
|
|
291
|
+
* @param {object} context Shared parser context.
|
|
292
|
+
*/
|
|
293
|
+
function readInput(input, stream, version, stageType, context) {
|
|
294
|
+
const constantCount = stream.readUint32();
|
|
295
|
+
input.constants = [];
|
|
296
|
+
for (let constantIndex = 0; constantIndex < constantCount; constantIndex += 1) {
|
|
297
|
+
input.constants.push(readConstant(stream, version));
|
|
298
|
+
}
|
|
299
|
+
const constantValueSize = stream.readUint32();
|
|
300
|
+
input.sourceConstantValueSize = constantValueSize;
|
|
301
|
+
let sourceConstantValues;
|
|
302
|
+
if (version < 5) {
|
|
303
|
+
sourceConstantValues = constantValueSize ? stream.readRaw(constantValueSize) : new Uint8Array(0);
|
|
304
|
+
} else {
|
|
305
|
+
const blob = stream.readTableBlobOptional(constantValueSize);
|
|
306
|
+
sourceConstantValues = blob.bytes;
|
|
307
|
+
}
|
|
308
|
+
input.sourceConstantValues = Uint8Array.from(sourceConstantValues);
|
|
309
|
+
input.m_constantValueSize = Math.min(constantValueSize, HlslEffectStageInput.SHADER_CONSTANTS_MAX);
|
|
310
|
+
input.constantValues = input.sourceConstantValues.slice(0, input.m_constantValueSize);
|
|
311
|
+
const textureCount = sanityCheck(stream.readUint8(), 64, "texture count");
|
|
312
|
+
input.resources = new Map();
|
|
313
|
+
for (let textureIndex = 0; textureIndex < textureCount; textureIndex += 1) {
|
|
314
|
+
const registerIndex = stream.readUint8();
|
|
315
|
+
if (input.resources.has(registerIndex)) {
|
|
316
|
+
throw new Error(`Duplicate resource register ${registerIndex}`);
|
|
317
|
+
}
|
|
318
|
+
input.resources.set(registerIndex, readResource(stream, version));
|
|
319
|
+
}
|
|
320
|
+
const samplerCount = sanityCheck(stream.readUint8(), 64, "sampler count");
|
|
321
|
+
input.samplers = new Map();
|
|
322
|
+
for (let samplerIndex = 0; samplerIndex < samplerCount; samplerIndex += 1) {
|
|
323
|
+
const registerIndex = stream.readUint8();
|
|
324
|
+
const samplerSetup = new HlslSamplerSetup();
|
|
325
|
+
samplerSetup.name = version >= 4 ? stream.readString() : null;
|
|
326
|
+
samplerSetup.sampler = readSampler(stream);
|
|
327
|
+
if (version < 4) {
|
|
328
|
+
stream.readBool();
|
|
329
|
+
}
|
|
330
|
+
if (version > 12) {
|
|
331
|
+
samplerSetup.sampler.isDynamic = stream.readBool();
|
|
332
|
+
if (!samplerSetup.sampler.isDynamic) {
|
|
333
|
+
samplerSetup.name = null;
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
if (input.samplers.has(registerIndex)) {
|
|
337
|
+
throw new Error(`Duplicate sampler register ${registerIndex}`);
|
|
338
|
+
}
|
|
339
|
+
input.samplers.set(registerIndex, samplerSetup);
|
|
340
|
+
}
|
|
341
|
+
if (version >= 3) {
|
|
342
|
+
const uavCount = sanityCheck(stream.readUint8(), 64, "uav count");
|
|
343
|
+
input.uavs = new Map();
|
|
344
|
+
for (let uavIndex = 0; uavIndex < uavCount; uavIndex += 1) {
|
|
345
|
+
const registerIndex = stream.readUint8();
|
|
346
|
+
const resource = new HlslEffectResource();
|
|
347
|
+
resource.isSRGB = false;
|
|
348
|
+
resource.name = stream.readString();
|
|
349
|
+
resource.type = stream.readUint8();
|
|
350
|
+
resource.arrayElements = version >= 13 ? stream.readUint32() : 1;
|
|
351
|
+
resource.isAutoregister = stream.readBool();
|
|
352
|
+
if (input.uavs.has(registerIndex)) {
|
|
353
|
+
throw new Error(`Duplicate UAV register ${registerIndex}`);
|
|
354
|
+
}
|
|
355
|
+
input.uavs.set(registerIndex, resource);
|
|
356
|
+
}
|
|
357
|
+
if (version >= 8) {
|
|
358
|
+
input.annotation = readAnnotations(stream);
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
for (const constant of input.constants) {
|
|
362
|
+
patchSamplerHeapIndexConstant(input, constant);
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
/**
|
|
367
|
+
* Reads a vector of parameter annotations from the effect stream.
|
|
368
|
+
*
|
|
369
|
+
* @param {HlslReader} stream Binary reader positioned at an annotation vector.
|
|
370
|
+
* @returns {HlslEffectParameterAnnotation[]} Decoded annotations.
|
|
371
|
+
*/
|
|
372
|
+
function readAnnotations(stream) {
|
|
373
|
+
const annotations = [];
|
|
374
|
+
const annotationCount = stream.readUint8();
|
|
375
|
+
for (let annotationIndex = 0; annotationIndex < annotationCount; annotationIndex += 1) {
|
|
376
|
+
const annotation = new HlslEffectParameterAnnotation();
|
|
377
|
+
annotation.name = stream.readString();
|
|
378
|
+
annotation.type = stream.readUint8();
|
|
379
|
+
if (annotation.type === HlslEffectParameterAnnotation.Type.STRING) {
|
|
380
|
+
annotation.stringValue = stream.readString();
|
|
381
|
+
} else {
|
|
382
|
+
annotation.rawValue = stream.readUint32();
|
|
383
|
+
annotation.boolValue = annotation.rawValue !== 0;
|
|
384
|
+
annotation.intValue = annotation.rawValue | 0;
|
|
385
|
+
annotation.floatValue = cjsUint32ToFloat32(annotation.rawValue);
|
|
386
|
+
}
|
|
387
|
+
annotations.push(annotation);
|
|
388
|
+
}
|
|
389
|
+
return annotations;
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
/**
|
|
393
|
+
* Reads one constant-buffer metadata record.
|
|
394
|
+
*
|
|
395
|
+
* @param {HlslReader} stream Binary reader positioned at a constant record.
|
|
396
|
+
* @param {number} version Carbon effect data version.
|
|
397
|
+
* @returns {HlslEffectConstant} Decoded constant metadata.
|
|
398
|
+
*/
|
|
399
|
+
function readConstant(stream, version) {
|
|
400
|
+
const constant = new HlslEffectConstant();
|
|
401
|
+
constant.name = stream.readString();
|
|
402
|
+
constant.offset = stream.readUint32();
|
|
403
|
+
constant.size = stream.readUint32();
|
|
404
|
+
if (version < 11) {
|
|
405
|
+
const oldType = stream.readUint8();
|
|
406
|
+
if (oldType === 0) constant.type = HlslEffectConstant.Type.FLOAT;else if (oldType === 1) constant.type = HlslEffectConstant.Type.INT;else if (oldType === 2) constant.type = HlslEffectConstant.Type.BOOL;else constant.type = HlslEffectConstant.Type.OTHER;
|
|
407
|
+
} else {
|
|
408
|
+
constant.type = stream.readUint8();
|
|
409
|
+
}
|
|
410
|
+
constant.dimension = stream.readUint8();
|
|
411
|
+
constant.elements = stream.readUint32();
|
|
412
|
+
constant.isSRGB = stream.readBool();
|
|
413
|
+
constant.isAutoregister = stream.readBool();
|
|
414
|
+
return constant;
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
/**
|
|
418
|
+
* Reads one shader resource metadata record.
|
|
419
|
+
*
|
|
420
|
+
* @param {HlslReader} stream Binary reader positioned at a resource record.
|
|
421
|
+
* @param {number} version Carbon effect data version.
|
|
422
|
+
* @returns {HlslEffectResource} Decoded resource metadata.
|
|
423
|
+
*/
|
|
424
|
+
function readResource(stream, version) {
|
|
425
|
+
const resource = new HlslEffectResource();
|
|
426
|
+
resource.name = stream.readString();
|
|
427
|
+
resource.type = stream.readUint8();
|
|
428
|
+
resource.arrayElements = version >= 13 ? stream.readUint32() : 1;
|
|
429
|
+
resource.isSRGB = stream.readBool();
|
|
430
|
+
resource.isAutoregister = stream.readBool();
|
|
431
|
+
return resource;
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
/**
|
|
435
|
+
* Reads one static or dynamic sampler descriptor.
|
|
436
|
+
*
|
|
437
|
+
* @param {HlslReader} stream Binary reader positioned at a sampler descriptor.
|
|
438
|
+
* @returns {HlslSamplerDescription} Decoded sampler descriptor.
|
|
439
|
+
*/
|
|
440
|
+
function readSampler(stream) {
|
|
441
|
+
const sampler = new HlslSamplerDescription();
|
|
442
|
+
sampler.comparison = stream.readBool();
|
|
443
|
+
sampler.minFilter = stream.readUint8();
|
|
444
|
+
sampler.magFilter = stream.readUint8();
|
|
445
|
+
sampler.mipFilter = stream.readUint8();
|
|
446
|
+
sampler.addressU = stream.readUint8();
|
|
447
|
+
sampler.addressV = stream.readUint8();
|
|
448
|
+
sampler.addressW = stream.readUint8();
|
|
449
|
+
const mipLODBias = readFloat32WithBits(stream);
|
|
450
|
+
sampler.mipLODBias = mipLODBias.value;
|
|
451
|
+
sampler.mipLODBiasRaw = mipLODBias.rawValue;
|
|
452
|
+
sampler.maxAnisotropy = stream.readUint8();
|
|
453
|
+
sampler.comparisonFunc = stream.readUint8();
|
|
454
|
+
const borderColor = Array.from({
|
|
455
|
+
length: 4
|
|
456
|
+
}, () => readFloat32WithBits(stream));
|
|
457
|
+
sampler.borderColor = borderColor.map(entry => entry.value);
|
|
458
|
+
sampler.borderColorRaw = borderColor.map(entry => entry.rawValue);
|
|
459
|
+
const minLOD = readFloat32WithBits(stream);
|
|
460
|
+
sampler.minLOD = minLOD.value;
|
|
461
|
+
sampler.minLODRaw = minLOD.rawValue;
|
|
462
|
+
const maxLOD = readFloat32WithBits(stream);
|
|
463
|
+
sampler.maxLOD = maxLOD.value;
|
|
464
|
+
sampler.maxLODRaw = maxLOD.rawValue;
|
|
465
|
+
return sampler;
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
/**
|
|
469
|
+
* Reads vertex/input-layout signature records for one shader stage.
|
|
470
|
+
*
|
|
471
|
+
* @param {object[]} pipelineInputs Destination pipeline-input array.
|
|
472
|
+
* @param {HlslReader} stream Binary reader positioned at the input list.
|
|
473
|
+
* @param {number} version Carbon effect data version.
|
|
474
|
+
*/
|
|
475
|
+
function readPipelineInputs(pipelineInputs, stream, version) {
|
|
476
|
+
const inputCount = sanityCheck(stream.readUint8(), 64, "pipeline input count");
|
|
477
|
+
pipelineInputs.length = 0;
|
|
478
|
+
for (let inputIndex = 0; inputIndex < inputCount; inputIndex += 1) {
|
|
479
|
+
const usage = stream.readUint8();
|
|
480
|
+
const registerIndex = stream.readUint8();
|
|
481
|
+
const usageIndex = stream.readUint8();
|
|
482
|
+
const usedMask = stream.readUint8();
|
|
483
|
+
const input = {
|
|
484
|
+
usage,
|
|
485
|
+
usageName: HlslUsageCodeNames[usage] || `USAGE_${usage}`,
|
|
486
|
+
registerIndex,
|
|
487
|
+
usageIndex,
|
|
488
|
+
usedMask,
|
|
489
|
+
type: 0,
|
|
490
|
+
dimension: 4
|
|
491
|
+
};
|
|
492
|
+
if (version > 10) {
|
|
493
|
+
input.type = stream.readUint8();
|
|
494
|
+
input.dimension = stream.readUint8();
|
|
495
|
+
} else {
|
|
496
|
+
input.type = usage === 6 ? HlslEffectConstant.Type.UINT : HlslEffectConstant.Type.FLOAT;
|
|
497
|
+
input.dimension = 4;
|
|
498
|
+
}
|
|
499
|
+
pipelineInputs.push(input);
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
/**
|
|
504
|
+
* Reads resource-register signatures and static sampler signatures for one stage.
|
|
505
|
+
*
|
|
506
|
+
* @param {object} signature Stage signature object to populate.
|
|
507
|
+
* @param {HlslReader} stream Binary reader positioned at the register list.
|
|
508
|
+
* @param {number} version Carbon effect data version.
|
|
509
|
+
* @param {number} stageType Trinity shader stage enum value.
|
|
510
|
+
* @param {object} context Shared parser context.
|
|
511
|
+
*/
|
|
512
|
+
function readRegisters(signature, stream, version, stageType, context) {
|
|
513
|
+
let inputCount = stream.readUint8();
|
|
514
|
+
signature.registers = [];
|
|
515
|
+
for (let inputIndex = 0; inputIndex < inputCount; inputIndex += 1) {
|
|
516
|
+
const register = {};
|
|
517
|
+
if (version > 9) {
|
|
518
|
+
register.registerType = stream.readUint8();
|
|
519
|
+
} else {
|
|
520
|
+
register.registerType = mapOldRegisterType(stream.readUint8());
|
|
521
|
+
}
|
|
522
|
+
register.registerIndex = stream.readUint32();
|
|
523
|
+
if (version > 12) {
|
|
524
|
+
register.arrayCount = stream.readUint32();
|
|
525
|
+
register.registerCount = register.arrayCount;
|
|
526
|
+
register.registerSpace = stream.readUint8();
|
|
527
|
+
} else {
|
|
528
|
+
register.arrayCount = 1;
|
|
529
|
+
register.registerCount = 1;
|
|
530
|
+
register.registerSpace = stageType;
|
|
531
|
+
}
|
|
532
|
+
register.dynamic = isRegisterDynamic(register, stageType, context);
|
|
533
|
+
signature.registers.push(register);
|
|
534
|
+
}
|
|
535
|
+
if (version > 12) {
|
|
536
|
+
inputCount = stream.readUint8();
|
|
537
|
+
signature.samplers = [];
|
|
538
|
+
for (let inputIndex = 0; inputIndex < inputCount; inputIndex += 1) {
|
|
539
|
+
signature.samplers.push(readStaticSampler(stream));
|
|
540
|
+
}
|
|
541
|
+
}
|
|
542
|
+
}
|
|
543
|
+
|
|
544
|
+
/**
|
|
545
|
+
* Reads one static sampler signature entry from v13+ effect data.
|
|
546
|
+
*
|
|
547
|
+
* @param {HlslReader} stream Binary reader positioned at a static sampler record.
|
|
548
|
+
* @returns {object} Decoded static sampler entry.
|
|
549
|
+
*/
|
|
550
|
+
function readStaticSampler(stream) {
|
|
551
|
+
const record = {
|
|
552
|
+
registerIndex: stream.readUint32(),
|
|
553
|
+
registerSpace: stream.readUint8(),
|
|
554
|
+
sampler: {
|
|
555
|
+
comparison: stream.readBool(),
|
|
556
|
+
minFilter: stream.readUint8(),
|
|
557
|
+
magFilter: stream.readUint8(),
|
|
558
|
+
mipFilter: stream.readUint8(),
|
|
559
|
+
addressU: stream.readUint8(),
|
|
560
|
+
addressV: stream.readUint8(),
|
|
561
|
+
addressW: stream.readUint8(),
|
|
562
|
+
mipLODBias: 0,
|
|
563
|
+
maxAnisotropy: 0,
|
|
564
|
+
comparisonFunc: 0,
|
|
565
|
+
borderColor: 0,
|
|
566
|
+
minLOD: 0,
|
|
567
|
+
maxLOD: 0
|
|
568
|
+
}
|
|
569
|
+
};
|
|
570
|
+
Object.defineProperties(record.sampler, {
|
|
571
|
+
mipLODBiasRaw: {
|
|
572
|
+
value: 0,
|
|
573
|
+
writable: true
|
|
574
|
+
},
|
|
575
|
+
minLODRaw: {
|
|
576
|
+
value: 0,
|
|
577
|
+
writable: true
|
|
578
|
+
},
|
|
579
|
+
maxLODRaw: {
|
|
580
|
+
value: 0,
|
|
581
|
+
writable: true
|
|
582
|
+
}
|
|
583
|
+
});
|
|
584
|
+
const mipLODBias = readFloat32WithBits(stream);
|
|
585
|
+
record.sampler.mipLODBias = mipLODBias.value;
|
|
586
|
+
record.sampler.mipLODBiasRaw = mipLODBias.rawValue;
|
|
587
|
+
record.sampler.maxAnisotropy = stream.readUint8();
|
|
588
|
+
record.sampler.comparisonFunc = stream.readUint8();
|
|
589
|
+
record.sampler.borderColor = stream.readUint8();
|
|
590
|
+
const minLOD = readFloat32WithBits(stream);
|
|
591
|
+
record.sampler.minLOD = minLOD.value;
|
|
592
|
+
record.sampler.minLODRaw = minLOD.rawValue;
|
|
593
|
+
const maxLOD = readFloat32WithBits(stream);
|
|
594
|
+
record.sampler.maxLOD = maxLOD.value;
|
|
595
|
+
record.sampler.maxLODRaw = maxLOD.rawValue;
|
|
596
|
+
return record;
|
|
597
|
+
}
|
|
598
|
+
|
|
599
|
+
/**
|
|
600
|
+
* Reads one float while preserving its exact serialized IEEE-754 bits.
|
|
601
|
+
*
|
|
602
|
+
* @param {HlslReader} stream Binary reader positioned at a float.
|
|
603
|
+
* @returns {{value:number,rawValue:number}} Decoded value and raw uint32 bits.
|
|
604
|
+
*/
|
|
605
|
+
function readFloat32WithBits(stream) {
|
|
606
|
+
const rawValue = stream.readUint32();
|
|
607
|
+
return {
|
|
608
|
+
value: cjsUint32ToFloat32(rawValue),
|
|
609
|
+
rawValue
|
|
610
|
+
};
|
|
611
|
+
}
|
|
612
|
+
|
|
613
|
+
/**
|
|
614
|
+
* Maps pre-v10 register type ids to Carbon's newer register type values.
|
|
615
|
+
*
|
|
616
|
+
* @param {number} value Legacy register type id.
|
|
617
|
+
* @returns {number} Modern register type value.
|
|
618
|
+
*/
|
|
619
|
+
function mapOldRegisterType(value) {
|
|
620
|
+
if (value === 0) return 0;
|
|
621
|
+
if (value === 1) return 36;
|
|
622
|
+
if (value === 2) return 68;
|
|
623
|
+
if (value === 3) return 1;
|
|
624
|
+
return 36;
|
|
625
|
+
}
|
|
626
|
+
|
|
627
|
+
/**
|
|
628
|
+
* Determines whether a resource register is dynamic for the current stage.
|
|
629
|
+
*
|
|
630
|
+
* @param {object} register Register signature metadata.
|
|
631
|
+
* @param {number} stageType Trinity shader stage enum value.
|
|
632
|
+
* @param {object} context Shared parser context.
|
|
633
|
+
* @returns {boolean} True when the register should be treated as dynamic.
|
|
634
|
+
*/
|
|
635
|
+
function isRegisterDynamic(register, stageType, context) {
|
|
636
|
+
if (register.registerType !== 0) {
|
|
637
|
+
return true;
|
|
638
|
+
}
|
|
639
|
+
if (stageType === HlslRenderContextEnum.VERTEX_SHADER && register.registerIndex === context.perFrameVSStartRegister) {
|
|
640
|
+
return false;
|
|
641
|
+
}
|
|
642
|
+
if (stageType === HlslRenderContextEnum.PIXEL_SHADER && register.registerIndex === context.perFramePSStartRegister) {
|
|
643
|
+
return false;
|
|
644
|
+
}
|
|
645
|
+
return true;
|
|
646
|
+
}
|
|
647
|
+
|
|
648
|
+
/**
|
|
649
|
+
* Ensures sampler heap-index constants have enough backing constant data.
|
|
650
|
+
*
|
|
651
|
+
* @param {HlslEffectStageInput} input Stage input containing samplers and constants.
|
|
652
|
+
* @param {HlslEffectConstant} constant Constant metadata to compare with sampler names.
|
|
653
|
+
*/
|
|
654
|
+
function patchSamplerHeapIndexConstant(input, constant) {
|
|
655
|
+
if (constant.type !== HlslEffectConstant.Type.UINT || constant.dimension !== 1) {
|
|
656
|
+
return;
|
|
657
|
+
}
|
|
658
|
+
for (const sampler of input.samplers.values()) {
|
|
659
|
+
if (sampler.name !== constant.name) continue;
|
|
660
|
+
const neededSize = constant.offset + constant.size;
|
|
661
|
+
if (neededSize > input.m_constantValueSize) {
|
|
662
|
+
const next = new Uint8Array(neededSize);
|
|
663
|
+
next.set(input.constantValues);
|
|
664
|
+
input.constantValues = next;
|
|
665
|
+
input.m_constantValueSize = neededSize;
|
|
666
|
+
}
|
|
667
|
+
break;
|
|
668
|
+
}
|
|
669
|
+
}
|
|
670
|
+
|
|
671
|
+
/**
|
|
672
|
+
* Applies `IsHeapView` parameter annotations to resource-set descriptions.
|
|
673
|
+
*
|
|
674
|
+
* @param {HlslEffectDescription} effectDescription Fully read effect description.
|
|
675
|
+
*/
|
|
676
|
+
function applyHeapViewAnnotations(effectDescription) {
|
|
677
|
+
const isHeapView = name => {
|
|
678
|
+
if (!name) return false;
|
|
679
|
+
const annotations = effectDescription.annotations.get(name) || [];
|
|
680
|
+
return annotations.some(annotation => annotation.name === "IsHeapView" && annotation.type === HlslEffectParameterAnnotation.Type.BOOL && annotation.boolValue);
|
|
681
|
+
};
|
|
682
|
+
for (const technique of effectDescription.techniques) {
|
|
683
|
+
for (const library of technique.libraries) {
|
|
684
|
+
const shaderType = HlslRenderContextEnum.COMPUTE_SHADER;
|
|
685
|
+
for (const [registerIndex, resource] of library.globalInput.resources.entries()) {
|
|
686
|
+
if (isHeapView(resource.name)) library.globalResourceSetDesc?.SetSrvHeapView(shaderType, registerIndex);
|
|
687
|
+
}
|
|
688
|
+
for (const [registerIndex, resource] of library.globalInput.uavs.entries()) {
|
|
689
|
+
if (isHeapView(resource.name)) library.globalResourceSetDesc?.SetUavHeapView(shaderType, registerIndex);
|
|
690
|
+
}
|
|
691
|
+
for (const [registerIndex, sampler] of library.globalInput.samplers.entries()) {
|
|
692
|
+
if (isHeapView(sampler.name)) library.globalResourceSetDesc?.SetSamplerHeapView(shaderType, registerIndex);
|
|
693
|
+
}
|
|
694
|
+
}
|
|
695
|
+
for (const pass of technique.passes) {
|
|
696
|
+
for (let stageType = 0; stageType < pass.stageInputs.length; stageType += 1) {
|
|
697
|
+
const stage = pass.stageInputs[stageType];
|
|
698
|
+
if (!stage?.m_exists) continue;
|
|
699
|
+
for (const [registerIndex, resource] of stage.resources.entries()) {
|
|
700
|
+
if (isHeapView(resource.name)) pass.resourceSetDesc?.SetSrvHeapView(stageType, registerIndex);
|
|
701
|
+
}
|
|
702
|
+
for (const [registerIndex, resource] of stage.uavs.entries()) {
|
|
703
|
+
if (isHeapView(resource.name)) pass.resourceSetDesc?.SetUavHeapView(stageType, registerIndex);
|
|
704
|
+
}
|
|
705
|
+
for (const [registerIndex, sampler] of stage.samplers.entries()) {
|
|
706
|
+
if (isHeapView(sampler.name)) pass.resourceSetDesc?.SetSamplerHeapView(stageType, registerIndex);
|
|
707
|
+
}
|
|
708
|
+
}
|
|
709
|
+
}
|
|
710
|
+
}
|
|
711
|
+
}
|
|
712
|
+
|
|
713
|
+
/**
|
|
714
|
+
* Rejects unexpectedly large counts before allocating or iterating.
|
|
715
|
+
*
|
|
716
|
+
* @param {number} value Count read from the effect stream.
|
|
717
|
+
* @param {number} limit Maximum expected count.
|
|
718
|
+
* @param {string} label Name used in the thrown error.
|
|
719
|
+
* @returns {number} The original value when it is within range.
|
|
720
|
+
*/
|
|
721
|
+
function sanityCheck(value, limit, label) {
|
|
722
|
+
if (value > limit) {
|
|
723
|
+
throw new Error(`Unexpected ${label}: ${value}`);
|
|
724
|
+
}
|
|
725
|
+
return value;
|
|
726
|
+
}
|
|
727
|
+
|
|
728
|
+
/**
|
|
729
|
+
* Serializes a map of parameter names to annotation arrays.
|
|
730
|
+
*
|
|
731
|
+
* @param {Map<string, HlslEffectParameterAnnotation[]>} map Annotation map.
|
|
732
|
+
* @returns {object[]} JSON-safe annotation groups.
|
|
733
|
+
*/
|
|
734
|
+
function mapAnnotationToJson(map) {
|
|
735
|
+
return Array.from(map.entries()).map(([name, annotations]) => ({
|
|
736
|
+
name,
|
|
737
|
+
annotations: annotations.map(entry => entry.toJSON())
|
|
738
|
+
}));
|
|
739
|
+
}
|
|
740
|
+
|
|
741
|
+
export { ANY_TECHNIQUE, DEFAULT_TECHNIQUE, HlslEffectDescription };
|
|
742
|
+
//# sourceMappingURL=HlslEffectDescription.js.map
|