@carbonenginejs/runtime-resource 0.13.0 → 0.14.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/LICENSE +21 -21
- package/NOTICE +32 -32
- package/README.md +129 -129
- package/dist/CjsMotherLode.js +1271 -1271
- package/dist/CjsResMan.js +3858 -3858
- package/dist/CjsResManFetchProvider.js +94 -94
- package/dist/CjsResManWorkQueue.js +301 -301
- package/dist/_virtual/_rollupPluginBabelHelpers.js +150 -150
- package/dist/format/CjsBlueReader.js +358 -358
- package/dist/format/CjsByteReader.js +310 -310
- package/dist/format/CjsByteWriter.js +242 -242
- package/dist/format/CjsFormat.js +223 -223
- package/dist/format/CjsFormatError.js +41 -41
- package/dist/format/CjsReader.js +22 -22
- package/dist/format/CjsResourceProbe.js +279 -279
- package/dist/format/CjsStringTable.js +268 -268
- package/dist/format/carbonEffect/CjsCarbonEffectReader.js +265 -265
- package/dist/format/carbonEffect/CjsCarbonEffectWriter.js +373 -373
- package/dist/format/carbonEffect/buildCarbonEffectContainer.js +182 -182
- package/dist/format/carbonEffect/carbonEffectBackendBlock.js +321 -321
- package/dist/format/carbonEffect/carbonEffectRecords.js +1147 -1147
- package/dist/format/carbonEffect/carbonEffectResourceTransform.js +197 -197
- package/dist/format/compareUtf8.js +36 -36
- package/dist/format/effect/effectBodyInventory.js +146 -146
- package/dist/format/effect/effectPermutationGraph.js +257 -257
- package/dist/format/effect/sha256.js +114 -114
- package/dist/format/index.js +11 -11
- package/dist/format/payloadContract.js +193 -193
- package/dist/formats/black/CjsBlackFormat.js +310 -310
- package/dist/formats/black/core/CjsBlackBinaryReader.js +260 -260
- package/dist/formats/black/core/CjsBlackPropertyReaders.js +448 -448
- package/dist/formats/black/core/CjsBlackReader.js +764 -764
- package/dist/formats/black/core/CjsBlackSchemaRegistry.js +540 -540
- package/dist/formats/black/core/black-schema-v1-2026-07-23.json.js +4 -4
- package/dist/formats/black/core/blackConstants.js +7 -7
- package/dist/formats/black/core/blackDefinitions.js +10 -10
- package/dist/formats/black/core/blackEnums.js +6 -6
- package/dist/formats/black/core/blackSchema.js +3 -3
- package/dist/formats/black/core/blackVersion.js +22 -22
- package/dist/formats/black/core/helpers.js +199 -199
- package/dist/formats/black/core/schema.js +4 -4
- package/dist/formats/black/index.js +2 -2
- package/dist/formats/bnk/CjsBnkFormat.js +175 -175
- package/dist/formats/bnk/core/busNodes.js +252 -252
- package/dist/formats/bnk/core/effectNodes.js +147 -147
- package/dist/formats/bnk/core/eventAction.js +416 -416
- package/dist/formats/bnk/core/globalSettings.js +215 -215
- package/dist/formats/bnk/core/graph.js +137 -137
- package/dist/formats/bnk/core/helpers.js +512 -512
- package/dist/formats/bnk/core/musicNodes.js +540 -540
- package/dist/formats/bnk/core/nodeBase.js +553 -553
- package/dist/formats/bnk/core/sfxNodes.js +632 -632
- package/dist/formats/bnk/core/soundbanksInfo.js +209 -209
- package/dist/formats/bnk/index.js +2 -2
- package/dist/formats/cmf/CjsCmfFormat.js +497 -497
- package/dist/formats/cmf/core/binary.js +194 -194
- package/dist/formats/cmf/core/buffers.js +237 -237
- package/dist/formats/cmf/core/constants.js +47 -47
- package/dist/formats/cmf/core/gr2Anim.js +453 -453
- package/dist/formats/cmf/core/helpers.js +318 -318
- package/dist/formats/cmf/core/pack.js +276 -276
- package/dist/formats/cmf/core/schema.js +374 -374
- package/dist/formats/cmf/core/shared.js +277 -277
- package/dist/formats/cmf/core/writer.js +571 -571
- package/dist/formats/cmf/index.js +2 -2
- package/dist/formats/dds/CjsDdsFormat.js +200 -200
- package/dist/formats/dds/core/bc6h.js +298 -298
- package/dist/formats/dds/core/bc7.js +272 -272
- package/dist/formats/dds/core/helpers.js +901 -862
- package/dist/formats/dds/core/helpers.js.map +1 -1
- package/dist/formats/dds/index.js +2 -2
- package/dist/formats/dxbc/CjsDxbcFormat.js +187 -142
- package/dist/formats/dxbc/CjsDxbcFormat.js.map +1 -1
- package/dist/formats/dxbc/core/DxbcReader.js +266 -266
- package/dist/formats/dxbc/core/container.js +169 -169
- package/dist/formats/dxbc/core/decoder.js +789 -789
- package/dist/formats/dxbc/core/disassemble.js +240 -0
- package/dist/formats/dxbc/core/disassemble.js.map +1 -0
- package/dist/formats/dxbc/core/errors.js +19 -19
- package/dist/formats/dxbc/core/helpers.js +220 -220
- package/dist/formats/dxbc/core/opcodes.js +45 -45
- package/dist/formats/dxbc/core/program.js +91 -91
- package/dist/formats/dxbc/core/signature.js +172 -172
- package/dist/formats/dxbc/index.js +2 -2
- package/dist/formats/fbx/CjsFbxFormat.js +266 -266
- package/dist/formats/fbx/core/helpers.js +3932 -3932
- package/dist/formats/fbx/index.js +2 -2
- package/dist/formats/flac/CjsFlacFormat.js +142 -142
- package/dist/formats/flac/core/helpers.js +315 -315
- package/dist/formats/flac/index.js +2 -2
- package/dist/formats/gif/CjsGifFormat.js +141 -141
- package/dist/formats/gif/core/helpers.js +380 -380
- package/dist/formats/gif/index.js +2 -2
- package/dist/formats/gltf/CjsGltfFormat.js +252 -290
- package/dist/formats/gltf/CjsGltfFormat.js.map +1 -1
- package/dist/formats/gltf/core/helpers.js +287 -307
- package/dist/formats/gltf/core/helpers.js.map +1 -1
- package/dist/formats/gltf/core/json.js +79 -79
- package/dist/formats/gltf/core/parser.js +679 -679
- package/dist/formats/gltf/core/targets.js +173 -173
- package/dist/formats/gltf/index.js +2 -2
- package/dist/formats/gr2/CjsGr2Format.js +289 -289
- package/dist/formats/gr2/core/bitknit2.js +282 -282
- package/dist/formats/gr2/core/curves.js +1047 -1047
- package/dist/formats/gr2/core/gsf.js +72 -72
- package/dist/formats/gr2/core/helpers.js +352 -352
- package/dist/formats/gr2/core/json.js +622 -622
- package/dist/formats/gr2/core/oodle1.js +388 -388
- package/dist/formats/gr2/core/tangents.js +48 -48
- package/dist/formats/gr2/core/targets.js +361 -361
- package/dist/formats/gr2/index.js +2 -2
- package/dist/formats/hlsl/CjsHlslFormat.js +233 -254
- package/dist/formats/hlsl/CjsHlslFormat.js.map +1 -1
- package/dist/formats/hlsl/core/HlslBinaryUtils.js +15 -15
- package/dist/formats/hlsl/core/HlslEffectReadError.js +19 -19
- package/dist/formats/hlsl/core/HlslEffectStateManager.js +130 -130
- package/dist/formats/hlsl/core/HlslRenderStateSetup.js +37 -37
- package/dist/formats/hlsl/core/HlslResourceSetDescription.js +94 -94
- package/dist/formats/hlsl/core/HlslShaderBytecode.js +44 -44
- package/dist/formats/hlsl/core/analysis.js +51 -51
- package/dist/formats/hlsl/core/carbonDescriptionToRuntime.js +850 -850
- package/dist/formats/hlsl/core/detailMapFamily.js +128 -128
- package/dist/formats/hlsl/core/helpers.js +270 -270
- package/dist/formats/hlsl/core/json.js +284 -284
- package/dist/formats/hlsl/core/localLightFamily.js +133 -133
- package/dist/formats/hlsl/core/metadata.js +327 -327
- package/dist/formats/hlsl/core/render-states.js +280 -280
- package/dist/formats/hlsl/core/tr2/HlslRenderContextEnum.js +43 -43
- package/dist/formats/hlsl/core/tr2/resources/HlslEffectRes.js +320 -320
- package/dist/formats/hlsl/core/tr2/resources/HlslShaderPermutation.js +33 -33
- package/dist/formats/hlsl/core/tr2/shader/HlslEffectBindingManifest.js +423 -416
- package/dist/formats/hlsl/core/tr2/shader/HlslEffectBindingManifest.js.map +1 -1
- package/dist/formats/hlsl/core/tr2/shader/HlslEffectConstant.js +40 -40
- package/dist/formats/hlsl/core/tr2/shader/HlslEffectDescription.js +62 -62
- package/dist/formats/hlsl/core/tr2/shader/HlslEffectLibrary.js +52 -52
- package/dist/formats/hlsl/core/tr2/shader/HlslEffectParameterAnnotation.js +38 -38
- package/dist/formats/hlsl/core/tr2/shader/HlslEffectResource.js +50 -50
- package/dist/formats/hlsl/core/tr2/shader/HlslEffectStageInput.js +86 -86
- package/dist/formats/hlsl/core/tr2/shader/HlslEffectTechnique.js +31 -31
- package/dist/formats/hlsl/core/tr2/shader/HlslPass.js +42 -42
- package/dist/formats/hlsl/core/tr2/shader/HlslSamplerDescription.js +55 -55
- package/dist/formats/hlsl/core/tr2/shader/HlslSamplerSetup.js +29 -29
- package/dist/formats/hlsl/core/tr2/shader/HlslShader.js +220 -220
- package/dist/formats/hlsl/core/tr2/shader/HlslShaderOption.js +30 -30
- package/dist/formats/hlsl/index.js +3 -3
- package/dist/formats/index.js +33 -33
- package/dist/formats/jpeg/CjsJpegFormat.js +212 -212
- package/dist/formats/jpeg/core/helpers.js +402 -402
- package/dist/formats/jpeg/core/jpeg.js +480 -480
- package/dist/formats/jpeg/index.js +2 -2
- package/dist/formats/mp3/CjsMp3Format.js +197 -197
- package/dist/formats/mp3/core/helpers.js +375 -375
- package/dist/formats/mp3/index.js +2 -2
- package/dist/formats/mp4/CjsMp4Format.js +197 -197
- package/dist/formats/mp4/core/helpers.js +484 -484
- package/dist/formats/mp4/index.js +2 -2
- package/dist/formats/obj/CjsObjFormat.js +232 -253
- package/dist/formats/obj/CjsObjFormat.js.map +1 -1
- package/dist/formats/obj/core/helpers.js +553 -573
- package/dist/formats/obj/core/helpers.js.map +1 -1
- package/dist/formats/obj/core/json.js +64 -64
- package/dist/formats/obj/core/parser.js +321 -321
- package/dist/formats/obj/index.js +2 -2
- package/dist/formats/ogg/CjsOggFormat.js +143 -143
- package/dist/formats/ogg/core/helpers.js +410 -410
- package/dist/formats/ogg/core/imdct.js +178 -178
- package/dist/formats/ogg/core/vorbis.js +1017 -1017
- package/dist/formats/ogg/index.js +2 -2
- package/dist/formats/pickle/CjsPickleFormat.js +214 -214
- package/dist/formats/pickle/core/CjsPickleProtocol0Reader.js +551 -551
- package/dist/formats/pickle/index.js +2 -2
- package/dist/formats/png/CjsPngFormat.js +201 -201
- package/dist/formats/png/core/helpers.js +635 -635
- package/dist/formats/png/index.js +2 -2
- package/dist/formats/red/CjsRedFormat.js +263 -263
- package/dist/formats/red/core/CjsRedReader.js +246 -246
- package/dist/formats/red/core/blackDefinitions.js +3 -3
- package/dist/formats/red/core/helpers.js +158 -158
- package/dist/formats/red/core/redGraph.js +71 -71
- package/dist/formats/red/core/schema.js +4 -4
- package/dist/formats/red/index.js +2 -2
- package/dist/formats/stl/CjsStlFormat.js +320 -365
- package/dist/formats/stl/CjsStlFormat.js.map +1 -1
- package/dist/formats/stl/core/helpers.js +241 -261
- package/dist/formats/stl/core/helpers.js.map +1 -1
- package/dist/formats/stl/core/json.js +51 -51
- package/dist/formats/stl/core/stl.js +642 -642
- package/dist/formats/stl/core/targets.js +173 -173
- package/dist/formats/stl/index.js +2 -2
- package/dist/formats/tga/CjsTgaFormat.js +197 -197
- package/dist/formats/tga/core/helpers.js +493 -493
- package/dist/formats/tga/index.js +2 -2
- package/dist/formats/wav/CjsWavFormat.js +198 -198
- package/dist/formats/wav/core/helpers.js +365 -365
- package/dist/formats/wav/index.js +2 -2
- package/dist/formats/webgl/CjsWebglFormat.js +199 -199
- package/dist/formats/webgl/core/buildGlslEffectContainer.js +70 -70
- package/dist/formats/webgl/core/effectPackage.js +900 -900
- package/dist/formats/webgl/core/errors.js +27 -27
- package/dist/formats/webgl/core/glsl/DxbcGlslEmitter.js +2820 -2820
- package/dist/formats/webgl/core/glsl/DxbcGlslHelpers.js +89 -89
- package/dist/formats/webgl/core/glsl/DxbcGlslOperandFormatter.js +486 -486
- package/dist/formats/webgl/core/glsl/packedLightFixups.js +98 -98
- package/dist/formats/webgl/core/glslBackendBlock.js +552 -552
- package/dist/formats/webgl/core/glslBackendBodySet.js +243 -243
- package/dist/formats/webgl/core/glslEffectCompleteness.js +85 -85
- package/dist/formats/webgl/core/glslEffectCompleteness.js.map +1 -1
- package/dist/formats/webgl/core/helpers.js +167 -167
- package/dist/formats/webgl/core/inspectGlslEffectContainer.js +122 -122
- package/dist/formats/webgl/core/readGlslEffectContainer.js +202 -256
- package/dist/formats/webgl/core/readGlslEffectContainer.js.map +1 -1
- package/dist/formats/webgl/index.js +2 -2
- package/dist/formats/webgpu/CjsWebgpuFormat.js +357 -357
- package/dist/formats/webgpu/core/buildCarbonEffectContainer.js +89 -89
- package/dist/formats/webgpu/core/carbonWebgpu/CarbonWebgpuContainer.js +354 -354
- package/dist/formats/webgpu/core/carbonWebgpu/containerViews.js +355 -355
- package/dist/formats/webgpu/core/carbonWebgpu/validateContainer.js +90 -90
- package/dist/formats/webgpu/core/effectAnalysis.js +82 -82
- package/dist/formats/webgpu/core/effectBackendBodySet.js +306 -306
- package/dist/formats/webgpu/core/errors.js +20 -20
- package/dist/formats/webgpu/core/helpers.js +443 -443
- package/dist/formats/webgpu/core/ir/analyzeRegisterValues.js +212 -212
- package/dist/formats/webgpu/core/ir/buildControlFlow.js +220 -220
- package/dist/formats/webgpu/core/ir/indexableTemps.js +137 -137
- package/dist/formats/webgpu/core/ir/inferValueTypes.js +449 -449
- package/dist/formats/webgpu/core/ir/lowerDxbcToIr.js +494 -494
- package/dist/formats/webgpu/core/ir/resolveRegisterFlow.js +177 -177
- package/dist/formats/webgpu/core/ir/sourceLanes.js +61 -61
- package/dist/formats/webgpu/core/packageEffect.js +381 -381
- package/dist/formats/webgpu/core/packageEffectSelection.js +164 -164
- package/dist/formats/webgpu/core/packageMetadata.js +17 -17
- package/dist/formats/webgpu/core/schema.js +4 -4
- package/dist/formats/webgpu/core/wgsl/buildResourceTransformPlan.js +263 -263
- package/dist/formats/webgpu/core/wgsl/buildWgslBindingPlan.js +172 -172
- package/dist/formats/webgpu/core/wgsl/buildWgslSet.js +325 -325
- package/dist/formats/webgpu/core/wgsl/emitWgsl.js +356 -356
- package/dist/formats/webgpu/core/wgsl/hoistEscapingValues.js +77 -77
- package/dist/formats/webgpu/core/wgsl/lowerBindingLayout.js +451 -451
- package/dist/formats/webgpu/core/wgsl/lowerComputeProgram.js +735 -735
- package/dist/formats/webgpu/core/wgsl/lowerCreateHistogramsComputeProgram.js +457 -457
- package/dist/formats/webgpu/core/wgsl/lowerFragmentProgram.js +1572 -1572
- package/dist/formats/webgpu/core/wgsl/lowerMergeHistogramsComputeProgram.js +659 -659
- package/dist/formats/webgpu/core/wgsl/lowerParticleClearComputePrograms.js +734 -734
- package/dist/formats/webgpu/core/wgsl/lowerParticleEmitComputeProgram.js +583 -583
- package/dist/formats/webgpu/core/wgsl/lowerSkinVerticesComputeProgram.js +621 -621
- package/dist/formats/webgpu/core/wgsl/lowerSortComputeProgram.js +824 -824
- package/dist/formats/webgpu/core/wgsl/lowerSortInnerComputeProgram.js +697 -697
- package/dist/formats/webgpu/core/wgsl/lowerSortStepComputeProgram.js +559 -559
- package/dist/formats/webgpu/core/wgsl/lowerVertexProgram.js +1328 -1328
- package/dist/formats/webgpu/core/wgsl/particleEmitSemanticDigest.js +110 -110
- package/dist/formats/webgpu/core/wgsl/precisionControls.js +55 -55
- package/dist/formats/webgpu/core/wgsl/selectionPlans.js +717 -717
- package/dist/formats/webgpu/core/wgsl/uniformity.js +78 -78
- package/dist/formats/webgpu/core/wgsl/validateExactComputeIr.js +196 -196
- package/dist/formats/webgpu/core/wgsl/validateHandleOperand.js +37 -37
- package/dist/formats/webgpu/index.js +2 -2
- package/dist/formats/webm/CjsWebmFormat.js +197 -197
- package/dist/formats/webm/core/helpers.js +572 -572
- package/dist/formats/webm/index.js +2 -2
- package/dist/formats/webp/CjsWebpFormat.js +140 -140
- package/dist/formats/webp/core/helpers.js +237 -237
- package/dist/formats/webp/index.js +2 -2
- package/dist/formats/wem/CjsWemFormat.js +250 -250
- package/dist/formats/wem/core/bitStream.js +261 -261
- package/dist/formats/wem/core/codebookLibrary.js +164 -164
- package/dist/formats/wem/core/helpers.js +437 -437
- package/dist/formats/wem/core/packedCodebooksAotuv603.js +30 -30
- package/dist/formats/wem/core/ptadpcm.js +77 -77
- package/dist/formats/wem/core/resolve.js +121 -121
- package/dist/formats/wem/core/wemToOgg.js +485 -485
- package/dist/formats/wem/index.js +2 -2
- package/dist/formats/yaml/CjsYamlFormat.js +134 -134
- package/dist/formats/yaml/core/CjsYamlReader.js +400 -400
- package/dist/formats/yaml/core/helpers.js +196 -196
- package/dist/formats/yaml/index.js +2 -2
- package/dist/index.js +64 -64
- package/dist/resource/CjsLoadingObject.js +19 -19
- package/dist/resource/CjsResource.js +801 -801
- package/dist/resource/ResourceHandlerMode.js +14 -14
- package/dist/resource/Tr2LightProfileRes.js +32 -32
- package/dist/resource/audio/AudioGeometryResData.js +47 -47
- package/dist/resource/audio/CjsAudioBufferRes.js +86 -86
- package/dist/resource/audio/CjsAudioRes.js +213 -213
- package/dist/resource/audio/index.js +4 -4
- package/dist/resource/geometry/MeshDecalData.js +37 -37
- package/dist/resource/geometry/MeshDecalLodData.js +34 -34
- package/dist/resource/geometry/TriGeometryRes.js +675 -675
- package/dist/resource/geometry/TriGeometryResAreaData.js +59 -59
- package/dist/resource/geometry/TriGeometryResJointData.js +38 -38
- package/dist/resource/geometry/TriGeometryResLodData.js +88 -88
- package/dist/resource/geometry/TriGeometryResMeshData.js +63 -63
- package/dist/resource/geometry/TriGeometryResSkeletonData.js +34 -34
- package/dist/resource/geometry/TriJointBinding.js +38 -38
- package/dist/resource/geometry/TriMorphTargetGeometryConstants.js +46 -46
- package/dist/resource/geometry/TriRtGeometryConstants.js +88 -88
- package/dist/resource/geometry/granny/GStateBindingCallbackData.js +31 -31
- package/dist/resource/geometry/granny/Tr2GrannyIntersectionResult.js +60 -60
- package/dist/resource/geometry/granny/Tr2GrannyStateRes.js +36 -36
- package/dist/resource/geometry/granny/TriGrannyRes.js +35 -35
- package/dist/resource/geometry/granny/enums.js +10 -10
- package/dist/resource/geometry/granny/index.js +6 -6
- package/dist/resource/geometry/index.js +17 -17
- package/dist/resource/index.js +54 -54
- package/dist/resource/resourceBoundary.js +64 -64
- package/dist/resource/shader/Tr2EffectRes.js +336 -336
- package/dist/resource/shader/Tr2MaterialArea.js +31 -31
- package/dist/resource/shader/Tr2MaterialMesh.js +27 -27
- package/dist/resource/shader/Tr2MaterialRes.js +31 -31
- package/dist/resource/shader/Tr2Shader.js +283 -283
- package/dist/resource/shader/Tr2ShaderPermutation.js +43 -43
- package/dist/resource/shader/index.js +17 -17
- package/dist/resource/shader/reflection/Tr2EffectConstant.js +143 -143
- package/dist/resource/shader/reflection/Tr2EffectDefine.js +30 -30
- package/dist/resource/shader/reflection/Tr2EffectDescription.js +114 -114
- package/dist/resource/shader/reflection/Tr2EffectLibrary.js +168 -168
- package/dist/resource/shader/reflection/Tr2EffectParameterAnnotation.js +125 -125
- package/dist/resource/shader/reflection/Tr2EffectResource.js +120 -120
- package/dist/resource/shader/reflection/Tr2EffectStageInput.js +372 -372
- package/dist/resource/shader/reflection/Tr2EffectTechnique.js +78 -78
- package/dist/resource/shader/reflection/Tr2Pass.js +168 -168
- package/dist/resource/shader/reflection/carbonRecordFields.js +159 -159
- package/dist/resource/shader/reflection/shaderStage.js +22 -22
- package/dist/resource/shader/sampler/Tr2SamplerSetup.js +135 -135
- package/dist/resource/texture/CjsTextureArrayRes.js +472 -472
- package/dist/resource/texture/CjsTextureArrayResParameterProxy.js +179 -179
- package/dist/resource/texture/Tr2ImageRes.js +120 -120
- package/dist/resource/texture/Tr2TextureLodManager.js +82 -82
- package/dist/resource/texture/Tr2TextureLodUpdateRequest.js +37 -37
- package/dist/resource/texture/Tr2TexturePackChannel.js +37 -37
- package/dist/resource/texture/Tr2TexturePipeline.js +54 -54
- package/dist/resource/texture/Tr2TexturePipelineParams.js +34 -34
- package/dist/resource/texture/Tr2TexturePipelineStepCompress.js +40 -40
- package/dist/resource/texture/Tr2TexturePipelineStepGenerateMips.js +22 -22
- package/dist/resource/texture/Tr2TexturePipelineStepLimitSize.js +34 -34
- package/dist/resource/texture/Tr2TexturePipelineStepLoad.js +31 -31
- package/dist/resource/texture/Tr2TexturePipelineStepPack.js +43 -43
- package/dist/resource/texture/TriTextureRes.js +359 -359
- package/dist/resource/texture/index.js +15 -15
- package/dist/resource/texture/texturePipelineBehavior.js +308 -308
- package/dist/worker/CjsResManMainThreadLoader.js +89 -89
- package/dist/worker/CjsResManWorker.js +218 -218
- package/dist/worker/CjsResManWorkerLoader.js +437 -437
- package/dist/worker/protocol.js +12 -12
- package/docs/README.md +98 -98
- package/docs/architecture.md +118 -118
- package/docs/concepts/resource-lifecycle.md +226 -226
- package/docs/concepts/shader-resource-model.md +111 -111
- package/docs/concepts/writing-an-engine-adapter.md +115 -115
- package/docs/formats/README.md +138 -138
- package/docs/formats/carbon-effect-container.md +553 -553
- package/docs/formats/dxbc/README.md +68 -68
- package/docs/formats/dxbc/architecture.md +80 -80
- package/docs/formats/dxbc/reference/api.md +105 -77
- package/docs/formats/dxbc/reference/classes/README.md +9 -9
- package/docs/formats/dxbc/reference/decoded-output.md +122 -122
- package/docs/formats/gr2.md +160 -160
- package/docs/formats/hlsl/README.md +54 -54
- package/docs/formats/hlsl/architecture.md +66 -65
- package/docs/formats/hlsl/guides/hydrating-json-output.md +60 -60
- package/docs/formats/hlsl/guides/reading-effects.md +68 -64
- package/docs/formats/hlsl/reference/advanced-analysis.md +61 -61
- package/docs/formats/hlsl/reference/api.md +91 -92
- package/docs/formats/hlsl/reference/classes/README.md +11 -11
- package/docs/formats/hlsl/reference/json-graph.md +97 -97
- package/docs/formats/pickle.md +82 -82
- package/docs/formats/provenance.md +196 -196
- package/docs/formats/stl.md +37 -37
- package/docs/formats/webgl/README.md +115 -115
- package/docs/formats/webgl/architecture.md +69 -69
- package/docs/formats/webgl/carbon-constant-layouts.md +326 -326
- package/docs/formats/webgl/decl-io.md +1234 -1234
- package/docs/formats/webgl/memory-structured.md +890 -890
- package/docs/formats/webgl/reference/classes/README.md +9 -9
- package/docs/formats/webgl/texture-sample.md +964 -964
- package/docs/formats/webgpu/README.md +84 -84
- package/docs/formats/webgpu/architecture.md +95 -95
- package/docs/formats/webgpu/formats/carbon-webgpu.md +215 -215
- package/docs/formats/webgpu/guides/effect-packaging.md +189 -189
- package/docs/formats/webgpu/reference/api.md +196 -196
- package/docs/formats/webgpu/reference/classes/README.md +9 -9
- package/docs/formats/webgpu/reference/wgsl-compatibility.md +1546 -1546
- package/docs/formats/wwise.md +146 -146
- package/docs/reference/classes/README.md +35 -35
- package/docs/reference/classes/audio.md +30 -30
- package/docs/reference/classes/core.md +216 -216
- package/docs/reference/classes/dropped.md +46 -46
- package/docs/reference/classes/formats.md +944 -944
- package/docs/reference/classes/resources.md +456 -456
- package/docs/reference/classes/texture.md +26 -26
- package/docs/reference/events.md +117 -117
- package/docs/reference/motherlode-cache.md +275 -275
- package/docs/reference/queues.md +194 -194
- package/docs/reference/reload.md +107 -107
- package/docs/reference/texture-arrays.md +113 -113
- package/docs/reference/texture-pipeline.md +53 -53
- package/docs/reference/workers.md +142 -142
- package/docs/roadmap.md +150 -150
- package/format-notices/black/LICENSE +21 -21
- package/format-notices/black/NOTICE +47 -47
- package/format-notices/bnk/LICENSE +21 -21
- package/format-notices/bnk/NOTICE +21 -21
- package/format-notices/cmf/LICENSE +21 -21
- package/format-notices/cmf/NOTICE +36 -36
- package/format-notices/dds/LICENSE +21 -21
- package/format-notices/dds/NOTICE +14 -14
- package/format-notices/dxbc/LICENSE +21 -21
- package/format-notices/dxbc/NOTICE +20 -20
- package/format-notices/fbx/LICENSE +21 -21
- package/format-notices/fbx/NOTICE +14 -14
- package/format-notices/flac/LICENSE +21 -21
- package/format-notices/flac/NOTICE +14 -14
- package/format-notices/gif/LICENSE +21 -21
- package/format-notices/gif/NOTICE +14 -14
- package/format-notices/gltf/LICENSE +21 -21
- package/format-notices/gltf/NOTICE +27 -27
- package/format-notices/gr2/LICENSE +21 -21
- package/format-notices/gr2/NOTICE +60 -60
- package/format-notices/gr2/THIRD-PARTY-NOTICES.md +93 -93
- package/format-notices/hlsl/LICENSE +21 -21
- package/format-notices/hlsl/NOTICE +25 -25
- package/format-notices/jpeg/LICENSE +21 -21
- package/format-notices/jpeg/NOTICE +14 -14
- package/format-notices/mp3/LICENSE +21 -21
- package/format-notices/mp3/NOTICE +14 -14
- package/format-notices/mp4/LICENSE +21 -21
- package/format-notices/mp4/NOTICE +14 -14
- package/format-notices/obj/LICENSE +21 -21
- package/format-notices/obj/NOTICE +26 -26
- package/format-notices/ogg/LICENSE +21 -21
- package/format-notices/ogg/NOTICE +28 -28
- package/format-notices/png/LICENSE +21 -21
- package/format-notices/png/NOTICE +14 -14
- package/format-notices/red/LICENSE +21 -21
- package/format-notices/red/NOTICE +31 -31
- package/format-notices/stl/LICENSE +21 -21
- package/format-notices/stl/NOTICE +21 -21
- package/format-notices/tga/LICENSE +21 -21
- package/format-notices/tga/NOTICE +14 -14
- package/format-notices/wav/LICENSE +21 -21
- package/format-notices/wav/NOTICE +14 -14
- package/format-notices/webgl/LICENSE +21 -21
- package/format-notices/webgl/NOTICE +35 -35
- package/format-notices/webgpu/LICENSE +21 -21
- package/format-notices/webgpu/NOTICE +31 -31
- package/format-notices/webm/LICENSE +21 -21
- package/format-notices/webm/NOTICE +14 -14
- package/format-notices/webp/LICENSE +21 -21
- package/format-notices/webp/NOTICE +14 -14
- package/format-notices/wem/LICENSE +57 -57
- package/format-notices/wem/NOTICE +33 -33
- package/format-notices/yaml/LICENSE +21 -21
- package/format-notices/yaml/NOTICE +44 -44
- package/package.json +63 -63
|
@@ -1,306 +1,306 @@
|
|
|
1
|
-
import { HlslEffectBindingManifest } from '../../hlsl/core/tr2/shader/HlslEffectBindingManifest.js';
|
|
2
|
-
import { enumerateUniqueEffectBodies } from '../../../format/effect/effectBodyInventory.js';
|
|
3
|
-
import { buildEffectAnalysis } from './helpers.js';
|
|
4
|
-
import { normalizeBytecodeBytes } from './effectAnalysis.js';
|
|
5
|
-
import { lowerDxbcToIr } from './ir/lowerDxbcToIr.js';
|
|
6
|
-
import { buildWgslBindingPlan } from './wgsl/buildWgslBindingPlan.js';
|
|
7
|
-
import { buildWgsl } from './wgsl/emitWgsl.js';
|
|
8
|
-
import { buildWgslSet } from './wgsl/buildWgslSet.js';
|
|
9
|
-
import { buildResourceTransformPlan } from './wgsl/buildResourceTransformPlan.js';
|
|
10
|
-
import { sha256Utf8, sha256Bytes } from '../../../format/effect/sha256.js';
|
|
11
|
-
import { selectEffectStages } from './packageEffectSelection.js';
|
|
12
|
-
import { compareUtf8 } from '../../../format/compareUtf8.js';
|
|
13
|
-
import { isParticleClearEffectCandidate, preflightParticleClearEffectProfile, particleClearEffectProofFor } from './wgsl/lowerParticleClearComputePrograms.js';
|
|
14
|
-
|
|
15
|
-
const EFFECT_BACKEND_BODY_SET_CHUNK = "WGSB";
|
|
16
|
-
const EFFECT_BACKEND_BODY_SET_FORMAT = "CJS_WGSL_BODY_SET";
|
|
17
|
-
const EFFECT_BACKEND_BODY_SET_VERSION = 1;
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
* One translation unit is exactly one pass of one body: the binding plan, the
|
|
21
|
-
* resource-transform plan, and every stage's emitted WGSL are derived together.
|
|
22
|
-
* Bodies that share an identical pass signature therefore share one unit.
|
|
23
|
-
*
|
|
24
|
-
* @param {object} pass Pass entry carrying its ordered stage records.
|
|
25
|
-
* @returns {string} Stable signature for the pass translation unit.
|
|
26
|
-
*/
|
|
27
|
-
function passUnitSignature(pass) {
|
|
28
|
-
return JSON.stringify({
|
|
29
|
-
passKey: pass.passKey,
|
|
30
|
-
stages: pass.stages.map(stage => ({
|
|
31
|
-
stageName: stage.stageName,
|
|
32
|
-
bytecode: stage.bytecodeDigest,
|
|
33
|
-
semanticBindings: stage.semanticBindings,
|
|
34
|
-
// An effect profile changes emission, so two otherwise identical
|
|
35
|
-
// passes must not share one unit when their proofs differ.
|
|
36
|
-
effectProfileProof: stage.effectProfileProof ? sha256Utf8(JSON.stringify(stage.effectProfileProof)) : null
|
|
37
|
-
})).sort((left, right) => compareUtf8(left.stageName, right.stageName))
|
|
38
|
-
});
|
|
39
|
-
}
|
|
40
|
-
function collectBodyStageBytecode(effectDescription) {
|
|
41
|
-
const bytecodeByKey = new Map();
|
|
42
|
-
for (const technique of effectDescription?.techniques ?? []) {
|
|
43
|
-
for (let passIndex = 0; passIndex < technique.passes.length; passIndex++) {
|
|
44
|
-
const stageInputs = technique.passes[passIndex].stageInputs;
|
|
45
|
-
for (let stageType = 0; stageType < stageInputs.length; stageType++) {
|
|
46
|
-
const stage = stageInputs[stageType];
|
|
47
|
-
if (!stage?.m_exists) continue;
|
|
48
|
-
const stageName = stage.cjsShaderBytecode?.stageName;
|
|
49
|
-
const value = stage.cjsShaderBytecode?.bytes;
|
|
50
|
-
if (!stageName || value === undefined || value === null) continue;
|
|
51
|
-
const key = `${technique.name}.pass${passIndex}.${stageName}`;
|
|
52
|
-
const bytes = normalizeBytecodeBytes(value, `${key} stage bytecode`);
|
|
53
|
-
if (!bytes?.length) {
|
|
54
|
-
throw new TypeError(`${key} stage bytecode must be a non-empty byte view`);
|
|
55
|
-
}
|
|
56
|
-
bytecodeByKey.set(key, {
|
|
57
|
-
techniqueName: technique.name,
|
|
58
|
-
passIndex,
|
|
59
|
-
stageType,
|
|
60
|
-
stageName,
|
|
61
|
-
bytes
|
|
62
|
-
});
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
return bytecodeByKey;
|
|
67
|
-
}
|
|
68
|
-
function resolveBody(effectRes, permutationIndex, source) {
|
|
69
|
-
const shader = effectRes.GetShaderByIndex(permutationIndex);
|
|
70
|
-
if (!shader) {
|
|
71
|
-
throw new Error(`Effect body at permutation ${permutationIndex} could not be decoded`);
|
|
72
|
-
}
|
|
73
|
-
const effectDescription = shader.GetEffectDescription();
|
|
74
|
-
if (!effectDescription) {
|
|
75
|
-
throw new Error(`Effect body at permutation ${permutationIndex} has no effect description`);
|
|
76
|
-
}
|
|
77
|
-
const resolved = {
|
|
78
|
-
effectRes,
|
|
79
|
-
shader,
|
|
80
|
-
selection: {
|
|
81
|
-
bodyIndex: permutationIndex,
|
|
82
|
-
selectedOptions: []
|
|
83
|
-
},
|
|
84
|
-
effectDescription,
|
|
85
|
-
bindingManifest: HlslEffectBindingManifest.fromEffectDescription(effectDescription),
|
|
86
|
-
stageBytecodeByKey: collectBodyStageBytecode(effectDescription)
|
|
87
|
-
};
|
|
88
|
-
return {
|
|
89
|
-
resolved,
|
|
90
|
-
analysis: buildEffectAnalysis(resolved, {
|
|
91
|
-
source,
|
|
92
|
-
decodeBytecode: false,
|
|
93
|
-
decodeInstructions: false
|
|
94
|
-
})
|
|
95
|
-
};
|
|
96
|
-
}
|
|
97
|
-
function buildPassEntries(analysis, resolved, selection, effectProfileContext) {
|
|
98
|
-
const selectedStages = selectEffectStages(analysis.stages, selection);
|
|
99
|
-
const passes = new Map();
|
|
100
|
-
for (const stage of selectedStages) {
|
|
101
|
-
const passKey = `${stage.techniqueName}.pass${stage.passIndex}`;
|
|
102
|
-
if (!passes.has(passKey)) {
|
|
103
|
-
passes.set(passKey, {
|
|
104
|
-
passKey,
|
|
105
|
-
stages: []
|
|
106
|
-
});
|
|
107
|
-
}
|
|
108
|
-
const bytecode = resolved.stageBytecodeByKey.get(stage.key)?.bytes;
|
|
109
|
-
if (!bytecode?.length) {
|
|
110
|
-
throw new Error(`${stage.key} has no shader bytecode`);
|
|
111
|
-
}
|
|
112
|
-
passes.get(passKey).stages.push({
|
|
113
|
-
key: stage.key,
|
|
114
|
-
stageName: stage.stageName,
|
|
115
|
-
bytecodeKey: stage.key,
|
|
116
|
-
bytecodeDigest: sha256Bytes(bytecode),
|
|
117
|
-
semanticBindings: analysis.stages.find(candidate => candidate.techniqueName === stage.techniqueName && candidate.passIndex === stage.passIndex && candidate.stageName === stage.stageName)?.bindings || [],
|
|
118
|
-
effectProfileProof: particleClearEffectProofFor(effectProfileContext, stage.key)
|
|
119
|
-
});
|
|
120
|
-
}
|
|
121
|
-
return Array.from(passes.values());
|
|
122
|
-
}
|
|
123
|
-
function translatePassUnit(pass, programForKey, source, bindingPolicy) {
|
|
124
|
-
const irEntries = pass.stages.map(stage => ({
|
|
125
|
-
key: stage.key,
|
|
126
|
-
ir: programForKey(stage.bytecodeKey),
|
|
127
|
-
semanticBindings: stage.semanticBindings,
|
|
128
|
-
effectProfileProof: stage.effectProfileProof
|
|
129
|
-
}));
|
|
130
|
-
const resourceTransformPlan = buildResourceTransformPlan(irEntries.map(entry => ({
|
|
131
|
-
ir: entry.ir,
|
|
132
|
-
semanticBindings: entry.semanticBindings
|
|
133
|
-
})), {
|
|
134
|
-
layoutKey: pass.passKey
|
|
135
|
-
});
|
|
136
|
-
const proof = irEntries.find(entry => entry.effectProfileProof)?.effectProfileProof ?? null;
|
|
137
|
-
const plan = buildWgslBindingPlan(irEntries.map(entry => entry.ir), {
|
|
138
|
-
...(bindingPolicy ?? {}),
|
|
139
|
-
...(proof ? {
|
|
140
|
-
effectProfileProof: proof
|
|
141
|
-
} : {}),
|
|
142
|
-
...(resourceTransformPlan ? {
|
|
143
|
-
resourceTransformPlan
|
|
144
|
-
} : {})
|
|
145
|
-
});
|
|
146
|
-
return buildWgslSet(irEntries.map(entry => ({
|
|
147
|
-
key: entry.key,
|
|
148
|
-
shader: buildWgsl(entry.ir, {
|
|
149
|
-
bindingPlan: plan,
|
|
150
|
-
...(resourceTransformPlan ? {
|
|
151
|
-
resourceTransformPlan
|
|
152
|
-
} : {}),
|
|
153
|
-
...(entry.effectProfileProof ? {
|
|
154
|
-
effectProfileProof: entry.effectProfileProof
|
|
155
|
-
} : {})
|
|
156
|
-
})
|
|
157
|
-
})));
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
/**
|
|
161
|
-
* Translate every unique source body into backend programs, layouts, and
|
|
162
|
-
* resource transforms, sharing one translation unit between bodies whose pass
|
|
163
|
-
* is byte-for-byte identical.
|
|
164
|
-
*
|
|
165
|
-
* A body that cannot be lowered is retained as an explicitly unsupported
|
|
166
|
-
* in-memory record carrying its reason. Portable source reflection is built
|
|
167
|
-
* separately from the same effect; this body-set document does not store it.
|
|
168
|
-
*
|
|
169
|
-
* @param {object} effectRes Loaded version-15 `Tr2EffectRes`.
|
|
170
|
-
* @param {object} permutationGraph Validated `PGRF` document.
|
|
171
|
-
* @param {object} [options] Source label, stage selection, and binding policy.
|
|
172
|
-
* @returns {object} Frozen `CJS_WGSL_BODY_SET` document.
|
|
173
|
-
*/
|
|
174
|
-
function buildEffectBackendBodySet(effectRes, permutationGraph, options = {}) {
|
|
175
|
-
const source = options.source || "memory";
|
|
176
|
-
const selection = options.selection ?? null;
|
|
177
|
-
const bindingPolicy = options.bindingPolicy ?? null;
|
|
178
|
-
const groups = enumerateUniqueEffectBodies(effectRes);
|
|
179
|
-
if (groups.length !== permutationGraph.bodies.length) {
|
|
180
|
-
throw new Error("Effect backend body set requires one unique body per permutation-graph body");
|
|
181
|
-
}
|
|
182
|
-
const unitsBySignature = new Map();
|
|
183
|
-
const graphBodiesByKey = new Map(permutationGraph.bodies.map(body => [body.key, body]));
|
|
184
|
-
const passUnits = [];
|
|
185
|
-
const bodies = [];
|
|
186
|
-
const seenBodyKeys = new Set();
|
|
187
|
-
for (const group of groups) {
|
|
188
|
-
const variant = permutationGraph.variants[group.permutationIndex];
|
|
189
|
-
const graphBody = variant ? graphBodiesByKey.get(variant.bodyKey) : null;
|
|
190
|
-
if (!graphBody) {
|
|
191
|
-
throw new Error(`Effect backend body ${group.permutationIndex} does not reconcile with its permutation graph record`);
|
|
192
|
-
}
|
|
193
|
-
if (seenBodyKeys.has(graphBody.key)) {
|
|
194
|
-
throw new Error(`Effect backend body ${graphBody.key} was enumerated more than once`);
|
|
195
|
-
}
|
|
196
|
-
seenBodyKeys.add(graphBody.key);
|
|
197
|
-
let resolvedBody = null;
|
|
198
|
-
let passes = null;
|
|
199
|
-
let programForKey = null;
|
|
200
|
-
try {
|
|
201
|
-
resolvedBody = resolveBody(effectRes, group.permutationIndex, source);
|
|
202
|
-
|
|
203
|
-
// One IR cache per body, so a stage shared by two passes lowers once
|
|
204
|
-
// and the effect-profile preflight can seed it exactly as the
|
|
205
|
-
// selected-body path does.
|
|
206
|
-
const programsByKey = new Map();
|
|
207
|
-
programForKey = key => {
|
|
208
|
-
if (programsByKey.has(key)) return programsByKey.get(key);
|
|
209
|
-
const bytecode = resolvedBody.resolved.stageBytecodeByKey.get(key)?.bytes;
|
|
210
|
-
if (!bytecode?.length) {
|
|
211
|
-
throw new Error(`${key} has no shader bytecode`);
|
|
212
|
-
}
|
|
213
|
-
const program = lowerDxbcToIr(bytecode, {
|
|
214
|
-
source: `${source}#${key}`
|
|
215
|
-
});
|
|
216
|
-
programsByKey.set(key, program);
|
|
217
|
-
return program;
|
|
218
|
-
};
|
|
219
|
-
let effectProfileContext = null;
|
|
220
|
-
if (isParticleClearEffectCandidate(resolvedBody.resolved.effectDescription)) {
|
|
221
|
-
programForKey("Main.pass0.compute");
|
|
222
|
-
programForKey("Main.pass1.compute");
|
|
223
|
-
effectProfileContext = preflightParticleClearEffectProfile(resolvedBody.resolved.effectDescription, programsByKey);
|
|
224
|
-
}
|
|
225
|
-
passes = buildPassEntries(resolvedBody.analysis, resolvedBody.resolved, selection, effectProfileContext);
|
|
226
|
-
} catch (error) {
|
|
227
|
-
// Stage selection and profile preflight fail closed per body: an
|
|
228
|
-
// unsupported stage kind in one body must not fail the package.
|
|
229
|
-
bodies.push(Object.freeze({
|
|
230
|
-
bodyKey: graphBody.key,
|
|
231
|
-
representativePermutationIndex: group.permutationIndex,
|
|
232
|
-
status: "unsupported",
|
|
233
|
-
error: String(error?.message ?? error),
|
|
234
|
-
passCount: 0,
|
|
235
|
-
passes: Object.freeze([])
|
|
236
|
-
}));
|
|
237
|
-
continue;
|
|
238
|
-
}
|
|
239
|
-
const bodyPasses = [];
|
|
240
|
-
let failure = null;
|
|
241
|
-
for (const pass of passes) {
|
|
242
|
-
const signature = passUnitSignature(pass);
|
|
243
|
-
let unit = unitsBySignature.get(signature);
|
|
244
|
-
if (!unit) {
|
|
245
|
-
let wgsl = null;
|
|
246
|
-
try {
|
|
247
|
-
wgsl = translatePassUnit(pass, programForKey, source, bindingPolicy);
|
|
248
|
-
} catch (error) {
|
|
249
|
-
failure = String(error?.message ?? error);
|
|
250
|
-
break;
|
|
251
|
-
}
|
|
252
|
-
unit = {
|
|
253
|
-
key: `unit${passUnits.length}`,
|
|
254
|
-
sha256: sha256Utf8(`${JSON.stringify(wgsl)}\n`),
|
|
255
|
-
wgslSetVersion: wgsl.formatVersion,
|
|
256
|
-
shaders: wgsl.shaders,
|
|
257
|
-
layouts: wgsl.layouts,
|
|
258
|
-
...(wgsl.resourceTransforms ? {
|
|
259
|
-
resourceTransforms: wgsl.resourceTransforms
|
|
260
|
-
} : {})
|
|
261
|
-
};
|
|
262
|
-
unitsBySignature.set(signature, unit);
|
|
263
|
-
passUnits.push(unit);
|
|
264
|
-
}
|
|
265
|
-
bodyPasses.push(Object.freeze({
|
|
266
|
-
passKey: pass.passKey,
|
|
267
|
-
unitKey: unit.key
|
|
268
|
-
}));
|
|
269
|
-
}
|
|
270
|
-
bodies.push(Object.freeze(failure ? {
|
|
271
|
-
bodyKey: graphBody.key,
|
|
272
|
-
representativePermutationIndex: group.permutationIndex,
|
|
273
|
-
status: "unsupported",
|
|
274
|
-
error: failure,
|
|
275
|
-
passCount: 0,
|
|
276
|
-
passes: Object.freeze([])
|
|
277
|
-
} : {
|
|
278
|
-
bodyKey: graphBody.key,
|
|
279
|
-
representativePermutationIndex: group.permutationIndex,
|
|
280
|
-
status: "translated",
|
|
281
|
-
error: null,
|
|
282
|
-
passCount: bodyPasses.length,
|
|
283
|
-
passes: Object.freeze(bodyPasses)
|
|
284
|
-
}));
|
|
285
|
-
}
|
|
286
|
-
const translatedCount = bodies.filter(body => body.status === "translated").length;
|
|
287
|
-
if (!translatedCount) {
|
|
288
|
-
throw new Error("Effect backend body set requires at least one translated body");
|
|
289
|
-
}
|
|
290
|
-
return Object.freeze({
|
|
291
|
-
format: EFFECT_BACKEND_BODY_SET_FORMAT,
|
|
292
|
-
formatVersion: EFFECT_BACKEND_BODY_SET_VERSION,
|
|
293
|
-
coverage: Object.freeze({
|
|
294
|
-
bodies: translatedCount === bodies.length ? "all-unique" : "partial",
|
|
295
|
-
programs: "complete-for-translated"
|
|
296
|
-
}),
|
|
297
|
-
bodyCount: bodies.length,
|
|
298
|
-
translatedBodyCount: translatedCount,
|
|
299
|
-
passUnitCount: passUnits.length,
|
|
300
|
-
passUnits: Object.freeze(passUnits.map(unit => Object.freeze(unit))),
|
|
301
|
-
bodies: Object.freeze(bodies)
|
|
302
|
-
});
|
|
303
|
-
}
|
|
304
|
-
|
|
305
|
-
export { EFFECT_BACKEND_BODY_SET_CHUNK, EFFECT_BACKEND_BODY_SET_FORMAT, EFFECT_BACKEND_BODY_SET_VERSION, buildEffectBackendBodySet };
|
|
306
|
-
//# sourceMappingURL=effectBackendBodySet.js.map
|
|
1
|
+
import { HlslEffectBindingManifest } from '../../hlsl/core/tr2/shader/HlslEffectBindingManifest.js';
|
|
2
|
+
import { enumerateUniqueEffectBodies } from '../../../format/effect/effectBodyInventory.js';
|
|
3
|
+
import { buildEffectAnalysis } from './helpers.js';
|
|
4
|
+
import { normalizeBytecodeBytes } from './effectAnalysis.js';
|
|
5
|
+
import { lowerDxbcToIr } from './ir/lowerDxbcToIr.js';
|
|
6
|
+
import { buildWgslBindingPlan } from './wgsl/buildWgslBindingPlan.js';
|
|
7
|
+
import { buildWgsl } from './wgsl/emitWgsl.js';
|
|
8
|
+
import { buildWgslSet } from './wgsl/buildWgslSet.js';
|
|
9
|
+
import { buildResourceTransformPlan } from './wgsl/buildResourceTransformPlan.js';
|
|
10
|
+
import { sha256Utf8, sha256Bytes } from '../../../format/effect/sha256.js';
|
|
11
|
+
import { selectEffectStages } from './packageEffectSelection.js';
|
|
12
|
+
import { compareUtf8 } from '../../../format/compareUtf8.js';
|
|
13
|
+
import { isParticleClearEffectCandidate, preflightParticleClearEffectProfile, particleClearEffectProofFor } from './wgsl/lowerParticleClearComputePrograms.js';
|
|
14
|
+
|
|
15
|
+
const EFFECT_BACKEND_BODY_SET_CHUNK = "WGSB";
|
|
16
|
+
const EFFECT_BACKEND_BODY_SET_FORMAT = "CJS_WGSL_BODY_SET";
|
|
17
|
+
const EFFECT_BACKEND_BODY_SET_VERSION = 1;
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* One translation unit is exactly one pass of one body: the binding plan, the
|
|
21
|
+
* resource-transform plan, and every stage's emitted WGSL are derived together.
|
|
22
|
+
* Bodies that share an identical pass signature therefore share one unit.
|
|
23
|
+
*
|
|
24
|
+
* @param {object} pass Pass entry carrying its ordered stage records.
|
|
25
|
+
* @returns {string} Stable signature for the pass translation unit.
|
|
26
|
+
*/
|
|
27
|
+
function passUnitSignature(pass) {
|
|
28
|
+
return JSON.stringify({
|
|
29
|
+
passKey: pass.passKey,
|
|
30
|
+
stages: pass.stages.map(stage => ({
|
|
31
|
+
stageName: stage.stageName,
|
|
32
|
+
bytecode: stage.bytecodeDigest,
|
|
33
|
+
semanticBindings: stage.semanticBindings,
|
|
34
|
+
// An effect profile changes emission, so two otherwise identical
|
|
35
|
+
// passes must not share one unit when their proofs differ.
|
|
36
|
+
effectProfileProof: stage.effectProfileProof ? sha256Utf8(JSON.stringify(stage.effectProfileProof)) : null
|
|
37
|
+
})).sort((left, right) => compareUtf8(left.stageName, right.stageName))
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
function collectBodyStageBytecode(effectDescription) {
|
|
41
|
+
const bytecodeByKey = new Map();
|
|
42
|
+
for (const technique of effectDescription?.techniques ?? []) {
|
|
43
|
+
for (let passIndex = 0; passIndex < technique.passes.length; passIndex++) {
|
|
44
|
+
const stageInputs = technique.passes[passIndex].stageInputs;
|
|
45
|
+
for (let stageType = 0; stageType < stageInputs.length; stageType++) {
|
|
46
|
+
const stage = stageInputs[stageType];
|
|
47
|
+
if (!stage?.m_exists) continue;
|
|
48
|
+
const stageName = stage.cjsShaderBytecode?.stageName;
|
|
49
|
+
const value = stage.cjsShaderBytecode?.bytes;
|
|
50
|
+
if (!stageName || value === undefined || value === null) continue;
|
|
51
|
+
const key = `${technique.name}.pass${passIndex}.${stageName}`;
|
|
52
|
+
const bytes = normalizeBytecodeBytes(value, `${key} stage bytecode`);
|
|
53
|
+
if (!bytes?.length) {
|
|
54
|
+
throw new TypeError(`${key} stage bytecode must be a non-empty byte view`);
|
|
55
|
+
}
|
|
56
|
+
bytecodeByKey.set(key, {
|
|
57
|
+
techniqueName: technique.name,
|
|
58
|
+
passIndex,
|
|
59
|
+
stageType,
|
|
60
|
+
stageName,
|
|
61
|
+
bytes
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return bytecodeByKey;
|
|
67
|
+
}
|
|
68
|
+
function resolveBody(effectRes, permutationIndex, source) {
|
|
69
|
+
const shader = effectRes.GetShaderByIndex(permutationIndex);
|
|
70
|
+
if (!shader) {
|
|
71
|
+
throw new Error(`Effect body at permutation ${permutationIndex} could not be decoded`);
|
|
72
|
+
}
|
|
73
|
+
const effectDescription = shader.GetEffectDescription();
|
|
74
|
+
if (!effectDescription) {
|
|
75
|
+
throw new Error(`Effect body at permutation ${permutationIndex} has no effect description`);
|
|
76
|
+
}
|
|
77
|
+
const resolved = {
|
|
78
|
+
effectRes,
|
|
79
|
+
shader,
|
|
80
|
+
selection: {
|
|
81
|
+
bodyIndex: permutationIndex,
|
|
82
|
+
selectedOptions: []
|
|
83
|
+
},
|
|
84
|
+
effectDescription,
|
|
85
|
+
bindingManifest: HlslEffectBindingManifest.fromEffectDescription(effectDescription),
|
|
86
|
+
stageBytecodeByKey: collectBodyStageBytecode(effectDescription)
|
|
87
|
+
};
|
|
88
|
+
return {
|
|
89
|
+
resolved,
|
|
90
|
+
analysis: buildEffectAnalysis(resolved, {
|
|
91
|
+
source,
|
|
92
|
+
decodeBytecode: false,
|
|
93
|
+
decodeInstructions: false
|
|
94
|
+
})
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
function buildPassEntries(analysis, resolved, selection, effectProfileContext) {
|
|
98
|
+
const selectedStages = selectEffectStages(analysis.stages, selection);
|
|
99
|
+
const passes = new Map();
|
|
100
|
+
for (const stage of selectedStages) {
|
|
101
|
+
const passKey = `${stage.techniqueName}.pass${stage.passIndex}`;
|
|
102
|
+
if (!passes.has(passKey)) {
|
|
103
|
+
passes.set(passKey, {
|
|
104
|
+
passKey,
|
|
105
|
+
stages: []
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
const bytecode = resolved.stageBytecodeByKey.get(stage.key)?.bytes;
|
|
109
|
+
if (!bytecode?.length) {
|
|
110
|
+
throw new Error(`${stage.key} has no shader bytecode`);
|
|
111
|
+
}
|
|
112
|
+
passes.get(passKey).stages.push({
|
|
113
|
+
key: stage.key,
|
|
114
|
+
stageName: stage.stageName,
|
|
115
|
+
bytecodeKey: stage.key,
|
|
116
|
+
bytecodeDigest: sha256Bytes(bytecode),
|
|
117
|
+
semanticBindings: analysis.stages.find(candidate => candidate.techniqueName === stage.techniqueName && candidate.passIndex === stage.passIndex && candidate.stageName === stage.stageName)?.bindings || [],
|
|
118
|
+
effectProfileProof: particleClearEffectProofFor(effectProfileContext, stage.key)
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
return Array.from(passes.values());
|
|
122
|
+
}
|
|
123
|
+
function translatePassUnit(pass, programForKey, source, bindingPolicy) {
|
|
124
|
+
const irEntries = pass.stages.map(stage => ({
|
|
125
|
+
key: stage.key,
|
|
126
|
+
ir: programForKey(stage.bytecodeKey),
|
|
127
|
+
semanticBindings: stage.semanticBindings,
|
|
128
|
+
effectProfileProof: stage.effectProfileProof
|
|
129
|
+
}));
|
|
130
|
+
const resourceTransformPlan = buildResourceTransformPlan(irEntries.map(entry => ({
|
|
131
|
+
ir: entry.ir,
|
|
132
|
+
semanticBindings: entry.semanticBindings
|
|
133
|
+
})), {
|
|
134
|
+
layoutKey: pass.passKey
|
|
135
|
+
});
|
|
136
|
+
const proof = irEntries.find(entry => entry.effectProfileProof)?.effectProfileProof ?? null;
|
|
137
|
+
const plan = buildWgslBindingPlan(irEntries.map(entry => entry.ir), {
|
|
138
|
+
...(bindingPolicy ?? {}),
|
|
139
|
+
...(proof ? {
|
|
140
|
+
effectProfileProof: proof
|
|
141
|
+
} : {}),
|
|
142
|
+
...(resourceTransformPlan ? {
|
|
143
|
+
resourceTransformPlan
|
|
144
|
+
} : {})
|
|
145
|
+
});
|
|
146
|
+
return buildWgslSet(irEntries.map(entry => ({
|
|
147
|
+
key: entry.key,
|
|
148
|
+
shader: buildWgsl(entry.ir, {
|
|
149
|
+
bindingPlan: plan,
|
|
150
|
+
...(resourceTransformPlan ? {
|
|
151
|
+
resourceTransformPlan
|
|
152
|
+
} : {}),
|
|
153
|
+
...(entry.effectProfileProof ? {
|
|
154
|
+
effectProfileProof: entry.effectProfileProof
|
|
155
|
+
} : {})
|
|
156
|
+
})
|
|
157
|
+
})));
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
* Translate every unique source body into backend programs, layouts, and
|
|
162
|
+
* resource transforms, sharing one translation unit between bodies whose pass
|
|
163
|
+
* is byte-for-byte identical.
|
|
164
|
+
*
|
|
165
|
+
* A body that cannot be lowered is retained as an explicitly unsupported
|
|
166
|
+
* in-memory record carrying its reason. Portable source reflection is built
|
|
167
|
+
* separately from the same effect; this body-set document does not store it.
|
|
168
|
+
*
|
|
169
|
+
* @param {object} effectRes Loaded version-15 `Tr2EffectRes`.
|
|
170
|
+
* @param {object} permutationGraph Validated `PGRF` document.
|
|
171
|
+
* @param {object} [options] Source label, stage selection, and binding policy.
|
|
172
|
+
* @returns {object} Frozen `CJS_WGSL_BODY_SET` document.
|
|
173
|
+
*/
|
|
174
|
+
function buildEffectBackendBodySet(effectRes, permutationGraph, options = {}) {
|
|
175
|
+
const source = options.source || "memory";
|
|
176
|
+
const selection = options.selection ?? null;
|
|
177
|
+
const bindingPolicy = options.bindingPolicy ?? null;
|
|
178
|
+
const groups = enumerateUniqueEffectBodies(effectRes);
|
|
179
|
+
if (groups.length !== permutationGraph.bodies.length) {
|
|
180
|
+
throw new Error("Effect backend body set requires one unique body per permutation-graph body");
|
|
181
|
+
}
|
|
182
|
+
const unitsBySignature = new Map();
|
|
183
|
+
const graphBodiesByKey = new Map(permutationGraph.bodies.map(body => [body.key, body]));
|
|
184
|
+
const passUnits = [];
|
|
185
|
+
const bodies = [];
|
|
186
|
+
const seenBodyKeys = new Set();
|
|
187
|
+
for (const group of groups) {
|
|
188
|
+
const variant = permutationGraph.variants[group.permutationIndex];
|
|
189
|
+
const graphBody = variant ? graphBodiesByKey.get(variant.bodyKey) : null;
|
|
190
|
+
if (!graphBody) {
|
|
191
|
+
throw new Error(`Effect backend body ${group.permutationIndex} does not reconcile with its permutation graph record`);
|
|
192
|
+
}
|
|
193
|
+
if (seenBodyKeys.has(graphBody.key)) {
|
|
194
|
+
throw new Error(`Effect backend body ${graphBody.key} was enumerated more than once`);
|
|
195
|
+
}
|
|
196
|
+
seenBodyKeys.add(graphBody.key);
|
|
197
|
+
let resolvedBody = null;
|
|
198
|
+
let passes = null;
|
|
199
|
+
let programForKey = null;
|
|
200
|
+
try {
|
|
201
|
+
resolvedBody = resolveBody(effectRes, group.permutationIndex, source);
|
|
202
|
+
|
|
203
|
+
// One IR cache per body, so a stage shared by two passes lowers once
|
|
204
|
+
// and the effect-profile preflight can seed it exactly as the
|
|
205
|
+
// selected-body path does.
|
|
206
|
+
const programsByKey = new Map();
|
|
207
|
+
programForKey = key => {
|
|
208
|
+
if (programsByKey.has(key)) return programsByKey.get(key);
|
|
209
|
+
const bytecode = resolvedBody.resolved.stageBytecodeByKey.get(key)?.bytes;
|
|
210
|
+
if (!bytecode?.length) {
|
|
211
|
+
throw new Error(`${key} has no shader bytecode`);
|
|
212
|
+
}
|
|
213
|
+
const program = lowerDxbcToIr(bytecode, {
|
|
214
|
+
source: `${source}#${key}`
|
|
215
|
+
});
|
|
216
|
+
programsByKey.set(key, program);
|
|
217
|
+
return program;
|
|
218
|
+
};
|
|
219
|
+
let effectProfileContext = null;
|
|
220
|
+
if (isParticleClearEffectCandidate(resolvedBody.resolved.effectDescription)) {
|
|
221
|
+
programForKey("Main.pass0.compute");
|
|
222
|
+
programForKey("Main.pass1.compute");
|
|
223
|
+
effectProfileContext = preflightParticleClearEffectProfile(resolvedBody.resolved.effectDescription, programsByKey);
|
|
224
|
+
}
|
|
225
|
+
passes = buildPassEntries(resolvedBody.analysis, resolvedBody.resolved, selection, effectProfileContext);
|
|
226
|
+
} catch (error) {
|
|
227
|
+
// Stage selection and profile preflight fail closed per body: an
|
|
228
|
+
// unsupported stage kind in one body must not fail the package.
|
|
229
|
+
bodies.push(Object.freeze({
|
|
230
|
+
bodyKey: graphBody.key,
|
|
231
|
+
representativePermutationIndex: group.permutationIndex,
|
|
232
|
+
status: "unsupported",
|
|
233
|
+
error: String(error?.message ?? error),
|
|
234
|
+
passCount: 0,
|
|
235
|
+
passes: Object.freeze([])
|
|
236
|
+
}));
|
|
237
|
+
continue;
|
|
238
|
+
}
|
|
239
|
+
const bodyPasses = [];
|
|
240
|
+
let failure = null;
|
|
241
|
+
for (const pass of passes) {
|
|
242
|
+
const signature = passUnitSignature(pass);
|
|
243
|
+
let unit = unitsBySignature.get(signature);
|
|
244
|
+
if (!unit) {
|
|
245
|
+
let wgsl = null;
|
|
246
|
+
try {
|
|
247
|
+
wgsl = translatePassUnit(pass, programForKey, source, bindingPolicy);
|
|
248
|
+
} catch (error) {
|
|
249
|
+
failure = String(error?.message ?? error);
|
|
250
|
+
break;
|
|
251
|
+
}
|
|
252
|
+
unit = {
|
|
253
|
+
key: `unit${passUnits.length}`,
|
|
254
|
+
sha256: sha256Utf8(`${JSON.stringify(wgsl)}\n`),
|
|
255
|
+
wgslSetVersion: wgsl.formatVersion,
|
|
256
|
+
shaders: wgsl.shaders,
|
|
257
|
+
layouts: wgsl.layouts,
|
|
258
|
+
...(wgsl.resourceTransforms ? {
|
|
259
|
+
resourceTransforms: wgsl.resourceTransforms
|
|
260
|
+
} : {})
|
|
261
|
+
};
|
|
262
|
+
unitsBySignature.set(signature, unit);
|
|
263
|
+
passUnits.push(unit);
|
|
264
|
+
}
|
|
265
|
+
bodyPasses.push(Object.freeze({
|
|
266
|
+
passKey: pass.passKey,
|
|
267
|
+
unitKey: unit.key
|
|
268
|
+
}));
|
|
269
|
+
}
|
|
270
|
+
bodies.push(Object.freeze(failure ? {
|
|
271
|
+
bodyKey: graphBody.key,
|
|
272
|
+
representativePermutationIndex: group.permutationIndex,
|
|
273
|
+
status: "unsupported",
|
|
274
|
+
error: failure,
|
|
275
|
+
passCount: 0,
|
|
276
|
+
passes: Object.freeze([])
|
|
277
|
+
} : {
|
|
278
|
+
bodyKey: graphBody.key,
|
|
279
|
+
representativePermutationIndex: group.permutationIndex,
|
|
280
|
+
status: "translated",
|
|
281
|
+
error: null,
|
|
282
|
+
passCount: bodyPasses.length,
|
|
283
|
+
passes: Object.freeze(bodyPasses)
|
|
284
|
+
}));
|
|
285
|
+
}
|
|
286
|
+
const translatedCount = bodies.filter(body => body.status === "translated").length;
|
|
287
|
+
if (!translatedCount) {
|
|
288
|
+
throw new Error("Effect backend body set requires at least one translated body");
|
|
289
|
+
}
|
|
290
|
+
return Object.freeze({
|
|
291
|
+
format: EFFECT_BACKEND_BODY_SET_FORMAT,
|
|
292
|
+
formatVersion: EFFECT_BACKEND_BODY_SET_VERSION,
|
|
293
|
+
coverage: Object.freeze({
|
|
294
|
+
bodies: translatedCount === bodies.length ? "all-unique" : "partial",
|
|
295
|
+
programs: "complete-for-translated"
|
|
296
|
+
}),
|
|
297
|
+
bodyCount: bodies.length,
|
|
298
|
+
translatedBodyCount: translatedCount,
|
|
299
|
+
passUnitCount: passUnits.length,
|
|
300
|
+
passUnits: Object.freeze(passUnits.map(unit => Object.freeze(unit))),
|
|
301
|
+
bodies: Object.freeze(bodies)
|
|
302
|
+
});
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
export { EFFECT_BACKEND_BODY_SET_CHUNK, EFFECT_BACKEND_BODY_SET_FORMAT, EFFECT_BACKEND_BODY_SET_VERSION, buildEffectBackendBodySet };
|
|
306
|
+
//# sourceMappingURL=effectBackendBodySet.js.map
|
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Error raised when a Carbon WebGPU package or WebGPU analysis pass cannot be
|
|
3
|
-
* completed safely.
|
|
4
|
-
*/
|
|
5
|
-
class WebgpuReadError extends Error {
|
|
6
|
-
/**
|
|
7
|
-
* Creates a read/analysis error with structured location details.
|
|
8
|
-
*
|
|
9
|
-
* @param {string} message Human-readable failure reason.
|
|
10
|
-
* @param {object} [details] Extra reader state such as source or offset.
|
|
11
|
-
*/
|
|
12
|
-
constructor(message, details = {}) {
|
|
13
|
-
super(message);
|
|
14
|
-
this.name = "WebgpuReadError";
|
|
15
|
-
this.details = details;
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
export { WebgpuReadError };
|
|
20
|
-
//# sourceMappingURL=errors.js.map
|
|
1
|
+
/**
|
|
2
|
+
* Error raised when a Carbon WebGPU package or WebGPU analysis pass cannot be
|
|
3
|
+
* completed safely.
|
|
4
|
+
*/
|
|
5
|
+
class WebgpuReadError extends Error {
|
|
6
|
+
/**
|
|
7
|
+
* Creates a read/analysis error with structured location details.
|
|
8
|
+
*
|
|
9
|
+
* @param {string} message Human-readable failure reason.
|
|
10
|
+
* @param {object} [details] Extra reader state such as source or offset.
|
|
11
|
+
*/
|
|
12
|
+
constructor(message, details = {}) {
|
|
13
|
+
super(message);
|
|
14
|
+
this.name = "WebgpuReadError";
|
|
15
|
+
this.details = details;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export { WebgpuReadError };
|
|
20
|
+
//# sourceMappingURL=errors.js.map
|