@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,381 +1,381 @@
|
|
|
1
|
-
import { readEffectAnalysis } from './effectAnalysis.js';
|
|
2
|
-
import { buildEffectAnalysis, inspectWithValues } from './helpers.js';
|
|
3
|
-
import { buildCarbonEffectContainer } from './buildCarbonEffectContainer.js';
|
|
4
|
-
import { lowerDxbcToIr } from './ir/lowerDxbcToIr.js';
|
|
5
|
-
import { buildWgslBindingPlan } from './wgsl/buildWgslBindingPlan.js';
|
|
6
|
-
import { buildWgsl } from './wgsl/emitWgsl.js';
|
|
7
|
-
import { buildWgslSet } from './wgsl/buildWgslSet.js';
|
|
8
|
-
import { buildResourceTransformPlan } from './wgsl/buildResourceTransformPlan.js';
|
|
9
|
-
import { buildEffectPermutationGraph, EFFECT_PERMUTATION_GRAPH_VERSION, EFFECT_PERMUTATION_GRAPH_FORMAT, EFFECT_PERMUTATION_GRAPH_CHUNK } from '../../../format/effect/effectPermutationGraph.js';
|
|
10
|
-
import { buildEffectBackendBodySet, EFFECT_BACKEND_BODY_SET_VERSION, EFFECT_BACKEND_BODY_SET_FORMAT, EFFECT_BACKEND_BODY_SET_CHUNK } from './effectBackendBodySet.js';
|
|
11
|
-
import { DXBC_WGSL_TRANSLATOR_VERSION, DXBC_WGSL_TRANSLATOR_NAME, FORMAT_WEBGPU_PACKAGE_VERSION, FORMAT_WEBGPU_PACKAGE_NAME, WEBGPU_BACKEND_NAME, EFFECT_INFO_VERSION } from './packageMetadata.js';
|
|
12
|
-
import { sha256Utf8, sha256Bytes } from '../../../format/effect/sha256.js';
|
|
13
|
-
import { isParticleClearEffectCandidate, preflightParticleClearEffectProfile, particleClearEffectProofFor } from './wgsl/lowerParticleClearComputePrograms.js';
|
|
14
|
-
import { normalizeEffectPermutation, validateResolvedPermutation, selectEffectStages, buildWgslSelectionMetadata } from './packageEffectSelection.js';
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* Build one structurally valid Carbon WebGPU package from compiled Tr2 effect bytes.
|
|
18
|
-
*
|
|
19
|
-
* The version-15 build result retains every unique body's portable source
|
|
20
|
-
* reflection as in-memory evidence while the emitted Carbon wire stores WGSL
|
|
21
|
-
* or empty program slots plus representable non-program fields. Filesystem
|
|
22
|
-
* concerns remain in callers.
|
|
23
|
-
*
|
|
24
|
-
* @param {Uint8Array|ArrayBuffer|ArrayBufferView} input Compiled effect bytes.
|
|
25
|
-
* @param {object} [options] Source, body-mode, permutation, and stage-selection policy.
|
|
26
|
-
* @returns {object} Package bytes plus inspection and provenance documents.
|
|
27
|
-
*/
|
|
28
|
-
function buildEffectPackage(input, options = {}) {
|
|
29
|
-
const mode = normalizeMode(options.mode, options.allPermutations);
|
|
30
|
-
const source = normalizeSource(options.source);
|
|
31
|
-
const outputPath = normalizeOptionalString(options.outputPath, "Effect outputPath");
|
|
32
|
-
const sourceIdentity = normalizeSourceIdentity(options.sourceIdentity, source, input);
|
|
33
|
-
const permutation = normalizeEffectPermutation(options.permutation);
|
|
34
|
-
const selection = normalizeSelection(options.selection);
|
|
35
|
-
const resolved = readEffectAnalysis(input, {
|
|
36
|
-
source,
|
|
37
|
-
permutation
|
|
38
|
-
});
|
|
39
|
-
|
|
40
|
-
// One INFO version means one contract, and that contract requires complete
|
|
41
|
-
// source reflection, which only version-15 input can supply.
|
|
42
|
-
if (resolved.effectRes?.m_version !== 15) {
|
|
43
|
-
throw new Error("Effect package requires a version-15 compiled effect, got version " + (resolved.effectRes?.m_version ?? "unknown"));
|
|
44
|
-
}
|
|
45
|
-
validateResolvedPermutation(permutation, resolved.selection?.selectedOptions ?? []);
|
|
46
|
-
const analysis = buildEffectAnalysis(resolved, {
|
|
47
|
-
source,
|
|
48
|
-
decodeBytecode: false,
|
|
49
|
-
decodeInstructions: false
|
|
50
|
-
});
|
|
51
|
-
const bytecodeByKey = resolved.stageBytecodeByKey;
|
|
52
|
-
const selectedStages = selectEffectStages(analysis.stages, selection);
|
|
53
|
-
const programsByKey = new Map();
|
|
54
|
-
const programForKey = key => {
|
|
55
|
-
if (programsByKey.has(key)) return programsByKey.get(key);
|
|
56
|
-
const bytecode = bytecodeByKey.get(key)?.bytes;
|
|
57
|
-
if (!bytecode?.length) {
|
|
58
|
-
throw new Error(`${key} has no shader bytecode`);
|
|
59
|
-
}
|
|
60
|
-
const program = lowerDxbcToIr(bytecode, {
|
|
61
|
-
source: `${source}#${key}`
|
|
62
|
-
});
|
|
63
|
-
programsByKey.set(key, program);
|
|
64
|
-
return program;
|
|
65
|
-
};
|
|
66
|
-
let effectProfileContext = null;
|
|
67
|
-
if (isParticleClearEffectCandidate(resolved.effectDescription)) {
|
|
68
|
-
programForKey("Main.pass0.compute");
|
|
69
|
-
programForKey("Main.pass1.compute");
|
|
70
|
-
effectProfileContext = preflightParticleClearEffectProfile(resolved.effectDescription, programsByKey);
|
|
71
|
-
}
|
|
72
|
-
const irEntries = selectedStages.map(stage => ({
|
|
73
|
-
key: stage.key,
|
|
74
|
-
passKey: `${stage.techniqueName}.pass${stage.passIndex}`,
|
|
75
|
-
ir: programForKey(stage.key),
|
|
76
|
-
semanticBindings: analysis.stages.find(candidate => candidate.techniqueName === stage.techniqueName && candidate.passIndex === stage.passIndex && candidate.stageName === stage.stageName)?.bindings || [],
|
|
77
|
-
effectProfileProof: particleClearEffectProofFor(effectProfileContext, stage.key)
|
|
78
|
-
}));
|
|
79
|
-
const programsByPass = new Map();
|
|
80
|
-
for (const entry of irEntries) {
|
|
81
|
-
if (!programsByPass.has(entry.passKey)) {
|
|
82
|
-
programsByPass.set(entry.passKey, []);
|
|
83
|
-
}
|
|
84
|
-
programsByPass.get(entry.passKey).push(entry);
|
|
85
|
-
}
|
|
86
|
-
const resourceTransformPlans = new Map(Array.from(programsByPass, ([key, entries]) => [key, buildResourceTransformPlan(entries.map(entry => ({
|
|
87
|
-
ir: entry.ir,
|
|
88
|
-
semanticBindings: entry.semanticBindings
|
|
89
|
-
})), {
|
|
90
|
-
layoutKey: key
|
|
91
|
-
})]));
|
|
92
|
-
const plans = new Map(Array.from(programsByPass, ([key, entries]) => {
|
|
93
|
-
const proof = entries.find(entry => entry.effectProfileProof)?.effectProfileProof ?? null;
|
|
94
|
-
const resourceTransformPlan = resourceTransformPlans.get(key);
|
|
95
|
-
return [key, buildWgslBindingPlan(entries.map(entry => entry.ir), {
|
|
96
|
-
...(options.bindingPolicy ?? {}),
|
|
97
|
-
...(proof ? {
|
|
98
|
-
effectProfileProof: proof
|
|
99
|
-
} : {}),
|
|
100
|
-
...(resourceTransformPlan ? {
|
|
101
|
-
resourceTransformPlan
|
|
102
|
-
} : {})
|
|
103
|
-
})];
|
|
104
|
-
}));
|
|
105
|
-
const shaderEntries = irEntries.map(entry => ({
|
|
106
|
-
key: entry.key,
|
|
107
|
-
shader: buildWgsl(entry.ir, {
|
|
108
|
-
bindingPlan: plans.get(entry.passKey),
|
|
109
|
-
...(resourceTransformPlans.get(entry.passKey) ? {
|
|
110
|
-
resourceTransformPlan: resourceTransformPlans.get(entry.passKey)
|
|
111
|
-
} : {}),
|
|
112
|
-
...(entry.effectProfileProof ? {
|
|
113
|
-
effectProfileProof: entry.effectProfileProof
|
|
114
|
-
} : {})
|
|
115
|
-
})
|
|
116
|
-
}));
|
|
117
|
-
const wgsl = buildWgslSet(shaderEntries);
|
|
118
|
-
const wgslSelection = buildWgslSelectionMetadata(selection, selectedStages);
|
|
119
|
-
const permutationGraph = buildEffectPermutationGraph(resolved.effectRes);
|
|
120
|
-
// The source is complete when it is a version-15 container. This used to be
|
|
121
|
-
// read off a built reflection document, which made the document look load
|
|
122
|
-
// bearing when it was only ever a consequence of the same version check.
|
|
123
|
-
const sourceComplete = resolved.effectRes.m_version === 15;
|
|
124
|
-
if (mode === "all" && !sourceComplete) {
|
|
125
|
-
throw new Error("Effect package mode all requires a complete version-15 source");
|
|
126
|
-
}
|
|
127
|
-
const backendBodySet = mode === "all" ? buildEffectBackendBodySet(resolved.effectRes, permutationGraph, {
|
|
128
|
-
source,
|
|
129
|
-
selection,
|
|
130
|
-
bindingPolicy: options.bindingPolicy
|
|
131
|
-
}) : null;
|
|
132
|
-
const completeness = Object.freeze({
|
|
133
|
-
packageValid: true,
|
|
134
|
-
sourceComplete,
|
|
135
|
-
backendComplete: false,
|
|
136
|
-
runtimeComplete: false
|
|
137
|
-
});
|
|
138
|
-
const info = {
|
|
139
|
-
format: "CARBON_WEBGPU",
|
|
140
|
-
formatVersion: EFFECT_INFO_VERSION,
|
|
141
|
-
packageKind: "tr2-effect-webgpu",
|
|
142
|
-
sourcePath: source,
|
|
143
|
-
outputPath,
|
|
144
|
-
sourceIdentity,
|
|
145
|
-
targetBackend: WEBGPU_BACKEND_NAME,
|
|
146
|
-
backendPackage: FORMAT_WEBGPU_PACKAGE_NAME,
|
|
147
|
-
backendPackageVersion: FORMAT_WEBGPU_PACKAGE_VERSION,
|
|
148
|
-
translator: DXBC_WGSL_TRANSLATOR_NAME,
|
|
149
|
-
translatorVersion: DXBC_WGSL_TRANSLATOR_VERSION,
|
|
150
|
-
permutationGraph: Object.freeze({
|
|
151
|
-
chunk: EFFECT_PERMUTATION_GRAPH_CHUNK,
|
|
152
|
-
format: EFFECT_PERMUTATION_GRAPH_FORMAT,
|
|
153
|
-
formatVersion: EFFECT_PERMUTATION_GRAPH_VERSION,
|
|
154
|
-
sha256: sha256Utf8(`${JSON.stringify(permutationGraph)}\n`),
|
|
155
|
-
permutationCount: permutationGraph.variants.length,
|
|
156
|
-
uniqueBodyCount: permutationGraph.bodies.length
|
|
157
|
-
}),
|
|
158
|
-
...(sourceComplete ? {
|
|
159
|
-
sourceBodyCoverage: "all-unique",
|
|
160
|
-
backendBodyCoverage: backendBodySet ? backendBodySet.coverage.bodies : "selected"
|
|
161
|
-
} : {}),
|
|
162
|
-
...(backendBodySet ? {
|
|
163
|
-
backendBodySet: Object.freeze({
|
|
164
|
-
chunk: EFFECT_BACKEND_BODY_SET_CHUNK,
|
|
165
|
-
format: EFFECT_BACKEND_BODY_SET_FORMAT,
|
|
166
|
-
formatVersion: EFFECT_BACKEND_BODY_SET_VERSION,
|
|
167
|
-
sha256: sha256Utf8(`${JSON.stringify(backendBodySet)}\n`),
|
|
168
|
-
bodyCount: backendBodySet.bodyCount,
|
|
169
|
-
translatedBodyCount: backendBodySet.translatedBodyCount,
|
|
170
|
-
passUnitCount: backendBodySet.passUnitCount
|
|
171
|
-
})
|
|
172
|
-
} : {}),
|
|
173
|
-
bodyMode: mode,
|
|
174
|
-
completeness,
|
|
175
|
-
stageCount: analysis.stages.length,
|
|
176
|
-
selectedStageCount: selectedStages.length,
|
|
177
|
-
shaderCount: wgsl.shaders.length,
|
|
178
|
-
layoutCount: wgsl.layouts.length
|
|
179
|
-
};
|
|
180
|
-
const metadata = {
|
|
181
|
-
effectName: analysis.effectName,
|
|
182
|
-
sourcePath: source,
|
|
183
|
-
bodyMode: mode,
|
|
184
|
-
bodyIndex: analysis.bodyIndex,
|
|
185
|
-
selectedOptions: analysis.selectedOptions,
|
|
186
|
-
...(wgslSelection ? {
|
|
187
|
-
wgslSelection
|
|
188
|
-
} : {})
|
|
189
|
-
};
|
|
190
|
-
// The switchover. Former stored chunks are now compatibility views over the
|
|
191
|
-
// Carbon records: the permutation graph comes from the header and offset
|
|
192
|
-
// table, and a translated pass comes from shaderData plus its trailing
|
|
193
|
-
// block. The description tree retains only representable non-program
|
|
194
|
-
// reflection; full portable source reflection remains in the rich
|
|
195
|
-
// in-memory return value below.
|
|
196
|
-
//
|
|
197
|
-
// The wire no longer stores cross-chunk digests. The rich return value keeps
|
|
198
|
-
// hashes as build evidence; they are not records in the emitted container.
|
|
199
|
-
const emittedBodySet = backendBodySet ?? selectedModeBodySet(permutationGraph, wgsl, analysis.bodyIndex);
|
|
200
|
-
const container = buildCarbonEffectContainer(resolved.effectRes, permutationGraph, emittedBodySet, {
|
|
201
|
-
compilerVersion: resolved.effectRes.m_compilerVersionBytes
|
|
202
|
-
});
|
|
203
|
-
const bytes = container.bytes;
|
|
204
|
-
const inspection = inspectWithValues(bytes, {
|
|
205
|
-
source,
|
|
206
|
-
emit: "json"
|
|
207
|
-
});
|
|
208
|
-
const qualification = Object.freeze({
|
|
209
|
-
ok: true,
|
|
210
|
-
level: "structural",
|
|
211
|
-
validator: "carbon-webgpu-structural",
|
|
212
|
-
mode,
|
|
213
|
-
...completeness,
|
|
214
|
-
selectedStageCount: selectedStages.length,
|
|
215
|
-
shaderCount: wgsl.shaders.length,
|
|
216
|
-
layoutCount: wgsl.layouts.length,
|
|
217
|
-
...(backendBodySet ? {
|
|
218
|
-
backendBodyCount: backendBodySet.bodyCount,
|
|
219
|
-
backendTranslatedBodyCount: backendBodySet.translatedBodyCount,
|
|
220
|
-
backendPassUnitCount: backendBodySet.passUnitCount
|
|
221
|
-
} : {}),
|
|
222
|
-
nativeComparison: false
|
|
223
|
-
});
|
|
224
|
-
return Object.freeze({
|
|
225
|
-
bytes,
|
|
226
|
-
info: Object.freeze(info),
|
|
227
|
-
metadata: Object.freeze(metadata),
|
|
228
|
-
permutationGraph,
|
|
229
|
-
analysis,
|
|
230
|
-
wgsl,
|
|
231
|
-
backendBodySet,
|
|
232
|
-
inspection: Object.freeze(inspection),
|
|
233
|
-
qualification
|
|
234
|
-
});
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
/**
|
|
238
|
-
* Wraps a selected-mode translation as the body set the container emitter takes.
|
|
239
|
-
*
|
|
240
|
-
* `mode: "all"` builds a real body set covering every unique body. `mode:
|
|
241
|
-
* "selected"` translates exactly one, and the container still carries every
|
|
242
|
-
* permutation — that asymmetry is the format working as intended rather than a
|
|
243
|
-
* gap. When the container emitter rebuilds an untranslated body, it retains
|
|
244
|
-
* representable non-program description fields and writes zero-length program
|
|
245
|
-
* slots.
|
|
246
|
-
*
|
|
247
|
-
* So this does not translate anything. It reshapes the one translation already
|
|
248
|
-
* performed into the body-set contract, and marks every other body unsupported.
|
|
249
|
-
*
|
|
250
|
-
* @param {object} permutationGraph Validated permutation graph.
|
|
251
|
-
* @param {object} wgsl Emitted WGSL set for the selected body.
|
|
252
|
-
* @param {number} bodyIndex Selected permutation index.
|
|
253
|
-
* @returns {object} Body set covering one translated body.
|
|
254
|
-
*/
|
|
255
|
-
function selectedModeBodySet(permutationGraph, wgsl, bodyIndex) {
|
|
256
|
-
const selectedBodyKey = permutationGraph.variants.find(variant => variant.permutationIndex === bodyIndex)?.bodyKey ?? permutationGraph.variants[0]?.bodyKey ?? null;
|
|
257
|
-
const shadersByPass = new Map();
|
|
258
|
-
for (const shader of wgsl.shaders) {
|
|
259
|
-
const passKey = `${shader.techniqueName}.pass${shader.passIndex}`;
|
|
260
|
-
if (!shadersByPass.has(passKey)) shadersByPass.set(passKey, []);
|
|
261
|
-
shadersByPass.get(passKey).push(shader);
|
|
262
|
-
}
|
|
263
|
-
const passUnits = [];
|
|
264
|
-
const passes = [];
|
|
265
|
-
for (const [passKey, shaders] of shadersByPass) {
|
|
266
|
-
const transforms = (wgsl.resourceTransforms ?? []).filter(transform => transform.layoutKey === passKey);
|
|
267
|
-
const unit = {
|
|
268
|
-
key: `unit${passUnits.length}`,
|
|
269
|
-
wgslSetVersion: wgsl.formatVersion,
|
|
270
|
-
shaders,
|
|
271
|
-
layouts: wgsl.layouts.filter(layout => layout.key === passKey),
|
|
272
|
-
...(transforms.length ? {
|
|
273
|
-
resourceTransforms: transforms
|
|
274
|
-
} : {})
|
|
275
|
-
};
|
|
276
|
-
passUnits.push(unit);
|
|
277
|
-
passes.push({
|
|
278
|
-
passKey,
|
|
279
|
-
unitKey: unit.key
|
|
280
|
-
});
|
|
281
|
-
}
|
|
282
|
-
const bodies = permutationGraph.bodies.map(body => body.key === selectedBodyKey ? {
|
|
283
|
-
bodyKey: body.key,
|
|
284
|
-
representativePermutationIndex: bodyIndex,
|
|
285
|
-
status: "translated",
|
|
286
|
-
error: null,
|
|
287
|
-
passCount: passes.length,
|
|
288
|
-
passes
|
|
289
|
-
} : {
|
|
290
|
-
bodyKey: body.key,
|
|
291
|
-
representativePermutationIndex: permutationGraph.variants.find(variant => variant.bodyKey === body.key)?.permutationIndex ?? 0,
|
|
292
|
-
status: "unsupported",
|
|
293
|
-
error: "not translated in selected mode",
|
|
294
|
-
passCount: 0,
|
|
295
|
-
passes: []
|
|
296
|
-
});
|
|
297
|
-
return {
|
|
298
|
-
bodyCount: bodies.length,
|
|
299
|
-
translatedBodyCount: 1,
|
|
300
|
-
passUnitCount: passUnits.length,
|
|
301
|
-
passUnits,
|
|
302
|
-
bodies
|
|
303
|
-
};
|
|
304
|
-
}
|
|
305
|
-
function normalizeMode(value, allPermutations) {
|
|
306
|
-
if (allPermutations !== undefined && typeof allPermutations !== "boolean") {
|
|
307
|
-
throw new TypeError("Effect allPermutations compatibility option must be boolean");
|
|
308
|
-
}
|
|
309
|
-
const mode = String(allPermutations === true ? "all" : value ?? "selected").trim();
|
|
310
|
-
if (mode !== "selected" && mode !== "all") {
|
|
311
|
-
throw new Error(`Effect package mode ${mode || "<empty>"} is not supported; ` + "supported modes are selected and all");
|
|
312
|
-
}
|
|
313
|
-
return mode;
|
|
314
|
-
}
|
|
315
|
-
function normalizeSource(value) {
|
|
316
|
-
const source = String(value ?? "memory").trim();
|
|
317
|
-
return source || "memory";
|
|
318
|
-
}
|
|
319
|
-
function normalizeOptionalString(value, name) {
|
|
320
|
-
if (value === undefined || value === null) {
|
|
321
|
-
return null;
|
|
322
|
-
}
|
|
323
|
-
const result = String(value).trim();
|
|
324
|
-
if (!result) {
|
|
325
|
-
throw new TypeError(`${name} must be a non-empty string or null`);
|
|
326
|
-
}
|
|
327
|
-
return result;
|
|
328
|
-
}
|
|
329
|
-
function normalizeSelection(value) {
|
|
330
|
-
if (value === undefined || value === null) {
|
|
331
|
-
return null;
|
|
332
|
-
}
|
|
333
|
-
if (!value || typeof value !== "object" || Array.isArray(value)) {
|
|
334
|
-
throw new TypeError("Effect stage selection must be an object");
|
|
335
|
-
}
|
|
336
|
-
const techniqueName = String(value.techniqueName ?? "").trim();
|
|
337
|
-
const passIndex = value.passIndex ?? null;
|
|
338
|
-
const stageNames = value.stageNames ?? [];
|
|
339
|
-
if (!techniqueName) {
|
|
340
|
-
throw new TypeError("Effect stage selection requires techniqueName");
|
|
341
|
-
}
|
|
342
|
-
if (passIndex !== null && (!Number.isSafeInteger(passIndex) || passIndex < 0)) {
|
|
343
|
-
throw new TypeError("Effect stage selection passIndex must be a non-negative integer or null");
|
|
344
|
-
}
|
|
345
|
-
if (!Array.isArray(stageNames) || stageNames.some(stageName => !["vertex", "pixel", "compute"].includes(stageName))) {
|
|
346
|
-
throw new TypeError("Effect stage selection supports only vertex, pixel, and compute stageNames");
|
|
347
|
-
}
|
|
348
|
-
if (stageNames.length && passIndex === null) {
|
|
349
|
-
throw new TypeError("Effect stageNames require an exact passIndex");
|
|
350
|
-
}
|
|
351
|
-
return Object.freeze({
|
|
352
|
-
techniqueName,
|
|
353
|
-
passIndex,
|
|
354
|
-
stageNames: Object.freeze([...new Set(stageNames)])
|
|
355
|
-
});
|
|
356
|
-
}
|
|
357
|
-
function normalizeSourceIdentity(value, source, input) {
|
|
358
|
-
if (value !== undefined && value !== null && (!value || typeof value !== "object" || Array.isArray(value))) {
|
|
359
|
-
throw new TypeError("Effect sourceIdentity must be an object");
|
|
360
|
-
}
|
|
361
|
-
const bytes = input instanceof Uint8Array ? input : input instanceof ArrayBuffer ? new Uint8Array(input) : ArrayBuffer.isView(input) ? new Uint8Array(input.buffer, input.byteOffset, input.byteLength) : null;
|
|
362
|
-
if (!bytes) {
|
|
363
|
-
throw new TypeError("Effect input must be Uint8Array, ArrayBuffer, or ArrayBufferView bytes");
|
|
364
|
-
}
|
|
365
|
-
const sha256 = sha256Bytes(bytes);
|
|
366
|
-
if (value?.sha256 !== undefined && value?.sha256 !== null && value.sha256 !== sha256) {
|
|
367
|
-
throw new Error("Effect sourceIdentity.sha256 does not match the exact effect input bytes");
|
|
368
|
-
}
|
|
369
|
-
return Object.freeze({
|
|
370
|
-
logicalPath: value?.logicalPath ?? source,
|
|
371
|
-
game: value?.game ?? null,
|
|
372
|
-
client: value?.client ?? null,
|
|
373
|
-
build: value?.build === undefined || value?.build === null ? null : String(value.build),
|
|
374
|
-
byteLength: bytes.byteLength,
|
|
375
|
-
md5: value?.md5 ?? null,
|
|
376
|
-
sha256
|
|
377
|
-
});
|
|
378
|
-
}
|
|
379
|
-
|
|
380
|
-
export { buildEffectPackage };
|
|
381
|
-
//# sourceMappingURL=packageEffect.js.map
|
|
1
|
+
import { readEffectAnalysis } from './effectAnalysis.js';
|
|
2
|
+
import { buildEffectAnalysis, inspectWithValues } from './helpers.js';
|
|
3
|
+
import { buildCarbonEffectContainer } from './buildCarbonEffectContainer.js';
|
|
4
|
+
import { lowerDxbcToIr } from './ir/lowerDxbcToIr.js';
|
|
5
|
+
import { buildWgslBindingPlan } from './wgsl/buildWgslBindingPlan.js';
|
|
6
|
+
import { buildWgsl } from './wgsl/emitWgsl.js';
|
|
7
|
+
import { buildWgslSet } from './wgsl/buildWgslSet.js';
|
|
8
|
+
import { buildResourceTransformPlan } from './wgsl/buildResourceTransformPlan.js';
|
|
9
|
+
import { buildEffectPermutationGraph, EFFECT_PERMUTATION_GRAPH_VERSION, EFFECT_PERMUTATION_GRAPH_FORMAT, EFFECT_PERMUTATION_GRAPH_CHUNK } from '../../../format/effect/effectPermutationGraph.js';
|
|
10
|
+
import { buildEffectBackendBodySet, EFFECT_BACKEND_BODY_SET_VERSION, EFFECT_BACKEND_BODY_SET_FORMAT, EFFECT_BACKEND_BODY_SET_CHUNK } from './effectBackendBodySet.js';
|
|
11
|
+
import { DXBC_WGSL_TRANSLATOR_VERSION, DXBC_WGSL_TRANSLATOR_NAME, FORMAT_WEBGPU_PACKAGE_VERSION, FORMAT_WEBGPU_PACKAGE_NAME, WEBGPU_BACKEND_NAME, EFFECT_INFO_VERSION } from './packageMetadata.js';
|
|
12
|
+
import { sha256Utf8, sha256Bytes } from '../../../format/effect/sha256.js';
|
|
13
|
+
import { isParticleClearEffectCandidate, preflightParticleClearEffectProfile, particleClearEffectProofFor } from './wgsl/lowerParticleClearComputePrograms.js';
|
|
14
|
+
import { normalizeEffectPermutation, validateResolvedPermutation, selectEffectStages, buildWgslSelectionMetadata } from './packageEffectSelection.js';
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Build one structurally valid Carbon WebGPU package from compiled Tr2 effect bytes.
|
|
18
|
+
*
|
|
19
|
+
* The version-15 build result retains every unique body's portable source
|
|
20
|
+
* reflection as in-memory evidence while the emitted Carbon wire stores WGSL
|
|
21
|
+
* or empty program slots plus representable non-program fields. Filesystem
|
|
22
|
+
* concerns remain in callers.
|
|
23
|
+
*
|
|
24
|
+
* @param {Uint8Array|ArrayBuffer|ArrayBufferView} input Compiled effect bytes.
|
|
25
|
+
* @param {object} [options] Source, body-mode, permutation, and stage-selection policy.
|
|
26
|
+
* @returns {object} Package bytes plus inspection and provenance documents.
|
|
27
|
+
*/
|
|
28
|
+
function buildEffectPackage(input, options = {}) {
|
|
29
|
+
const mode = normalizeMode(options.mode, options.allPermutations);
|
|
30
|
+
const source = normalizeSource(options.source);
|
|
31
|
+
const outputPath = normalizeOptionalString(options.outputPath, "Effect outputPath");
|
|
32
|
+
const sourceIdentity = normalizeSourceIdentity(options.sourceIdentity, source, input);
|
|
33
|
+
const permutation = normalizeEffectPermutation(options.permutation);
|
|
34
|
+
const selection = normalizeSelection(options.selection);
|
|
35
|
+
const resolved = readEffectAnalysis(input, {
|
|
36
|
+
source,
|
|
37
|
+
permutation
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
// One INFO version means one contract, and that contract requires complete
|
|
41
|
+
// source reflection, which only version-15 input can supply.
|
|
42
|
+
if (resolved.effectRes?.m_version !== 15) {
|
|
43
|
+
throw new Error("Effect package requires a version-15 compiled effect, got version " + (resolved.effectRes?.m_version ?? "unknown"));
|
|
44
|
+
}
|
|
45
|
+
validateResolvedPermutation(permutation, resolved.selection?.selectedOptions ?? []);
|
|
46
|
+
const analysis = buildEffectAnalysis(resolved, {
|
|
47
|
+
source,
|
|
48
|
+
decodeBytecode: false,
|
|
49
|
+
decodeInstructions: false
|
|
50
|
+
});
|
|
51
|
+
const bytecodeByKey = resolved.stageBytecodeByKey;
|
|
52
|
+
const selectedStages = selectEffectStages(analysis.stages, selection);
|
|
53
|
+
const programsByKey = new Map();
|
|
54
|
+
const programForKey = key => {
|
|
55
|
+
if (programsByKey.has(key)) return programsByKey.get(key);
|
|
56
|
+
const bytecode = bytecodeByKey.get(key)?.bytes;
|
|
57
|
+
if (!bytecode?.length) {
|
|
58
|
+
throw new Error(`${key} has no shader bytecode`);
|
|
59
|
+
}
|
|
60
|
+
const program = lowerDxbcToIr(bytecode, {
|
|
61
|
+
source: `${source}#${key}`
|
|
62
|
+
});
|
|
63
|
+
programsByKey.set(key, program);
|
|
64
|
+
return program;
|
|
65
|
+
};
|
|
66
|
+
let effectProfileContext = null;
|
|
67
|
+
if (isParticleClearEffectCandidate(resolved.effectDescription)) {
|
|
68
|
+
programForKey("Main.pass0.compute");
|
|
69
|
+
programForKey("Main.pass1.compute");
|
|
70
|
+
effectProfileContext = preflightParticleClearEffectProfile(resolved.effectDescription, programsByKey);
|
|
71
|
+
}
|
|
72
|
+
const irEntries = selectedStages.map(stage => ({
|
|
73
|
+
key: stage.key,
|
|
74
|
+
passKey: `${stage.techniqueName}.pass${stage.passIndex}`,
|
|
75
|
+
ir: programForKey(stage.key),
|
|
76
|
+
semanticBindings: analysis.stages.find(candidate => candidate.techniqueName === stage.techniqueName && candidate.passIndex === stage.passIndex && candidate.stageName === stage.stageName)?.bindings || [],
|
|
77
|
+
effectProfileProof: particleClearEffectProofFor(effectProfileContext, stage.key)
|
|
78
|
+
}));
|
|
79
|
+
const programsByPass = new Map();
|
|
80
|
+
for (const entry of irEntries) {
|
|
81
|
+
if (!programsByPass.has(entry.passKey)) {
|
|
82
|
+
programsByPass.set(entry.passKey, []);
|
|
83
|
+
}
|
|
84
|
+
programsByPass.get(entry.passKey).push(entry);
|
|
85
|
+
}
|
|
86
|
+
const resourceTransformPlans = new Map(Array.from(programsByPass, ([key, entries]) => [key, buildResourceTransformPlan(entries.map(entry => ({
|
|
87
|
+
ir: entry.ir,
|
|
88
|
+
semanticBindings: entry.semanticBindings
|
|
89
|
+
})), {
|
|
90
|
+
layoutKey: key
|
|
91
|
+
})]));
|
|
92
|
+
const plans = new Map(Array.from(programsByPass, ([key, entries]) => {
|
|
93
|
+
const proof = entries.find(entry => entry.effectProfileProof)?.effectProfileProof ?? null;
|
|
94
|
+
const resourceTransformPlan = resourceTransformPlans.get(key);
|
|
95
|
+
return [key, buildWgslBindingPlan(entries.map(entry => entry.ir), {
|
|
96
|
+
...(options.bindingPolicy ?? {}),
|
|
97
|
+
...(proof ? {
|
|
98
|
+
effectProfileProof: proof
|
|
99
|
+
} : {}),
|
|
100
|
+
...(resourceTransformPlan ? {
|
|
101
|
+
resourceTransformPlan
|
|
102
|
+
} : {})
|
|
103
|
+
})];
|
|
104
|
+
}));
|
|
105
|
+
const shaderEntries = irEntries.map(entry => ({
|
|
106
|
+
key: entry.key,
|
|
107
|
+
shader: buildWgsl(entry.ir, {
|
|
108
|
+
bindingPlan: plans.get(entry.passKey),
|
|
109
|
+
...(resourceTransformPlans.get(entry.passKey) ? {
|
|
110
|
+
resourceTransformPlan: resourceTransformPlans.get(entry.passKey)
|
|
111
|
+
} : {}),
|
|
112
|
+
...(entry.effectProfileProof ? {
|
|
113
|
+
effectProfileProof: entry.effectProfileProof
|
|
114
|
+
} : {})
|
|
115
|
+
})
|
|
116
|
+
}));
|
|
117
|
+
const wgsl = buildWgslSet(shaderEntries);
|
|
118
|
+
const wgslSelection = buildWgslSelectionMetadata(selection, selectedStages);
|
|
119
|
+
const permutationGraph = buildEffectPermutationGraph(resolved.effectRes);
|
|
120
|
+
// The source is complete when it is a version-15 container. This used to be
|
|
121
|
+
// read off a built reflection document, which made the document look load
|
|
122
|
+
// bearing when it was only ever a consequence of the same version check.
|
|
123
|
+
const sourceComplete = resolved.effectRes.m_version === 15;
|
|
124
|
+
if (mode === "all" && !sourceComplete) {
|
|
125
|
+
throw new Error("Effect package mode all requires a complete version-15 source");
|
|
126
|
+
}
|
|
127
|
+
const backendBodySet = mode === "all" ? buildEffectBackendBodySet(resolved.effectRes, permutationGraph, {
|
|
128
|
+
source,
|
|
129
|
+
selection,
|
|
130
|
+
bindingPolicy: options.bindingPolicy
|
|
131
|
+
}) : null;
|
|
132
|
+
const completeness = Object.freeze({
|
|
133
|
+
packageValid: true,
|
|
134
|
+
sourceComplete,
|
|
135
|
+
backendComplete: false,
|
|
136
|
+
runtimeComplete: false
|
|
137
|
+
});
|
|
138
|
+
const info = {
|
|
139
|
+
format: "CARBON_WEBGPU",
|
|
140
|
+
formatVersion: EFFECT_INFO_VERSION,
|
|
141
|
+
packageKind: "tr2-effect-webgpu",
|
|
142
|
+
sourcePath: source,
|
|
143
|
+
outputPath,
|
|
144
|
+
sourceIdentity,
|
|
145
|
+
targetBackend: WEBGPU_BACKEND_NAME,
|
|
146
|
+
backendPackage: FORMAT_WEBGPU_PACKAGE_NAME,
|
|
147
|
+
backendPackageVersion: FORMAT_WEBGPU_PACKAGE_VERSION,
|
|
148
|
+
translator: DXBC_WGSL_TRANSLATOR_NAME,
|
|
149
|
+
translatorVersion: DXBC_WGSL_TRANSLATOR_VERSION,
|
|
150
|
+
permutationGraph: Object.freeze({
|
|
151
|
+
chunk: EFFECT_PERMUTATION_GRAPH_CHUNK,
|
|
152
|
+
format: EFFECT_PERMUTATION_GRAPH_FORMAT,
|
|
153
|
+
formatVersion: EFFECT_PERMUTATION_GRAPH_VERSION,
|
|
154
|
+
sha256: sha256Utf8(`${JSON.stringify(permutationGraph)}\n`),
|
|
155
|
+
permutationCount: permutationGraph.variants.length,
|
|
156
|
+
uniqueBodyCount: permutationGraph.bodies.length
|
|
157
|
+
}),
|
|
158
|
+
...(sourceComplete ? {
|
|
159
|
+
sourceBodyCoverage: "all-unique",
|
|
160
|
+
backendBodyCoverage: backendBodySet ? backendBodySet.coverage.bodies : "selected"
|
|
161
|
+
} : {}),
|
|
162
|
+
...(backendBodySet ? {
|
|
163
|
+
backendBodySet: Object.freeze({
|
|
164
|
+
chunk: EFFECT_BACKEND_BODY_SET_CHUNK,
|
|
165
|
+
format: EFFECT_BACKEND_BODY_SET_FORMAT,
|
|
166
|
+
formatVersion: EFFECT_BACKEND_BODY_SET_VERSION,
|
|
167
|
+
sha256: sha256Utf8(`${JSON.stringify(backendBodySet)}\n`),
|
|
168
|
+
bodyCount: backendBodySet.bodyCount,
|
|
169
|
+
translatedBodyCount: backendBodySet.translatedBodyCount,
|
|
170
|
+
passUnitCount: backendBodySet.passUnitCount
|
|
171
|
+
})
|
|
172
|
+
} : {}),
|
|
173
|
+
bodyMode: mode,
|
|
174
|
+
completeness,
|
|
175
|
+
stageCount: analysis.stages.length,
|
|
176
|
+
selectedStageCount: selectedStages.length,
|
|
177
|
+
shaderCount: wgsl.shaders.length,
|
|
178
|
+
layoutCount: wgsl.layouts.length
|
|
179
|
+
};
|
|
180
|
+
const metadata = {
|
|
181
|
+
effectName: analysis.effectName,
|
|
182
|
+
sourcePath: source,
|
|
183
|
+
bodyMode: mode,
|
|
184
|
+
bodyIndex: analysis.bodyIndex,
|
|
185
|
+
selectedOptions: analysis.selectedOptions,
|
|
186
|
+
...(wgslSelection ? {
|
|
187
|
+
wgslSelection
|
|
188
|
+
} : {})
|
|
189
|
+
};
|
|
190
|
+
// The switchover. Former stored chunks are now compatibility views over the
|
|
191
|
+
// Carbon records: the permutation graph comes from the header and offset
|
|
192
|
+
// table, and a translated pass comes from shaderData plus its trailing
|
|
193
|
+
// block. The description tree retains only representable non-program
|
|
194
|
+
// reflection; full portable source reflection remains in the rich
|
|
195
|
+
// in-memory return value below.
|
|
196
|
+
//
|
|
197
|
+
// The wire no longer stores cross-chunk digests. The rich return value keeps
|
|
198
|
+
// hashes as build evidence; they are not records in the emitted container.
|
|
199
|
+
const emittedBodySet = backendBodySet ?? selectedModeBodySet(permutationGraph, wgsl, analysis.bodyIndex);
|
|
200
|
+
const container = buildCarbonEffectContainer(resolved.effectRes, permutationGraph, emittedBodySet, {
|
|
201
|
+
compilerVersion: resolved.effectRes.m_compilerVersionBytes
|
|
202
|
+
});
|
|
203
|
+
const bytes = container.bytes;
|
|
204
|
+
const inspection = inspectWithValues(bytes, {
|
|
205
|
+
source,
|
|
206
|
+
emit: "json"
|
|
207
|
+
});
|
|
208
|
+
const qualification = Object.freeze({
|
|
209
|
+
ok: true,
|
|
210
|
+
level: "structural",
|
|
211
|
+
validator: "carbon-webgpu-structural",
|
|
212
|
+
mode,
|
|
213
|
+
...completeness,
|
|
214
|
+
selectedStageCount: selectedStages.length,
|
|
215
|
+
shaderCount: wgsl.shaders.length,
|
|
216
|
+
layoutCount: wgsl.layouts.length,
|
|
217
|
+
...(backendBodySet ? {
|
|
218
|
+
backendBodyCount: backendBodySet.bodyCount,
|
|
219
|
+
backendTranslatedBodyCount: backendBodySet.translatedBodyCount,
|
|
220
|
+
backendPassUnitCount: backendBodySet.passUnitCount
|
|
221
|
+
} : {}),
|
|
222
|
+
nativeComparison: false
|
|
223
|
+
});
|
|
224
|
+
return Object.freeze({
|
|
225
|
+
bytes,
|
|
226
|
+
info: Object.freeze(info),
|
|
227
|
+
metadata: Object.freeze(metadata),
|
|
228
|
+
permutationGraph,
|
|
229
|
+
analysis,
|
|
230
|
+
wgsl,
|
|
231
|
+
backendBodySet,
|
|
232
|
+
inspection: Object.freeze(inspection),
|
|
233
|
+
qualification
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
/**
|
|
238
|
+
* Wraps a selected-mode translation as the body set the container emitter takes.
|
|
239
|
+
*
|
|
240
|
+
* `mode: "all"` builds a real body set covering every unique body. `mode:
|
|
241
|
+
* "selected"` translates exactly one, and the container still carries every
|
|
242
|
+
* permutation — that asymmetry is the format working as intended rather than a
|
|
243
|
+
* gap. When the container emitter rebuilds an untranslated body, it retains
|
|
244
|
+
* representable non-program description fields and writes zero-length program
|
|
245
|
+
* slots.
|
|
246
|
+
*
|
|
247
|
+
* So this does not translate anything. It reshapes the one translation already
|
|
248
|
+
* performed into the body-set contract, and marks every other body unsupported.
|
|
249
|
+
*
|
|
250
|
+
* @param {object} permutationGraph Validated permutation graph.
|
|
251
|
+
* @param {object} wgsl Emitted WGSL set for the selected body.
|
|
252
|
+
* @param {number} bodyIndex Selected permutation index.
|
|
253
|
+
* @returns {object} Body set covering one translated body.
|
|
254
|
+
*/
|
|
255
|
+
function selectedModeBodySet(permutationGraph, wgsl, bodyIndex) {
|
|
256
|
+
const selectedBodyKey = permutationGraph.variants.find(variant => variant.permutationIndex === bodyIndex)?.bodyKey ?? permutationGraph.variants[0]?.bodyKey ?? null;
|
|
257
|
+
const shadersByPass = new Map();
|
|
258
|
+
for (const shader of wgsl.shaders) {
|
|
259
|
+
const passKey = `${shader.techniqueName}.pass${shader.passIndex}`;
|
|
260
|
+
if (!shadersByPass.has(passKey)) shadersByPass.set(passKey, []);
|
|
261
|
+
shadersByPass.get(passKey).push(shader);
|
|
262
|
+
}
|
|
263
|
+
const passUnits = [];
|
|
264
|
+
const passes = [];
|
|
265
|
+
for (const [passKey, shaders] of shadersByPass) {
|
|
266
|
+
const transforms = (wgsl.resourceTransforms ?? []).filter(transform => transform.layoutKey === passKey);
|
|
267
|
+
const unit = {
|
|
268
|
+
key: `unit${passUnits.length}`,
|
|
269
|
+
wgslSetVersion: wgsl.formatVersion,
|
|
270
|
+
shaders,
|
|
271
|
+
layouts: wgsl.layouts.filter(layout => layout.key === passKey),
|
|
272
|
+
...(transforms.length ? {
|
|
273
|
+
resourceTransforms: transforms
|
|
274
|
+
} : {})
|
|
275
|
+
};
|
|
276
|
+
passUnits.push(unit);
|
|
277
|
+
passes.push({
|
|
278
|
+
passKey,
|
|
279
|
+
unitKey: unit.key
|
|
280
|
+
});
|
|
281
|
+
}
|
|
282
|
+
const bodies = permutationGraph.bodies.map(body => body.key === selectedBodyKey ? {
|
|
283
|
+
bodyKey: body.key,
|
|
284
|
+
representativePermutationIndex: bodyIndex,
|
|
285
|
+
status: "translated",
|
|
286
|
+
error: null,
|
|
287
|
+
passCount: passes.length,
|
|
288
|
+
passes
|
|
289
|
+
} : {
|
|
290
|
+
bodyKey: body.key,
|
|
291
|
+
representativePermutationIndex: permutationGraph.variants.find(variant => variant.bodyKey === body.key)?.permutationIndex ?? 0,
|
|
292
|
+
status: "unsupported",
|
|
293
|
+
error: "not translated in selected mode",
|
|
294
|
+
passCount: 0,
|
|
295
|
+
passes: []
|
|
296
|
+
});
|
|
297
|
+
return {
|
|
298
|
+
bodyCount: bodies.length,
|
|
299
|
+
translatedBodyCount: 1,
|
|
300
|
+
passUnitCount: passUnits.length,
|
|
301
|
+
passUnits,
|
|
302
|
+
bodies
|
|
303
|
+
};
|
|
304
|
+
}
|
|
305
|
+
function normalizeMode(value, allPermutations) {
|
|
306
|
+
if (allPermutations !== undefined && typeof allPermutations !== "boolean") {
|
|
307
|
+
throw new TypeError("Effect allPermutations compatibility option must be boolean");
|
|
308
|
+
}
|
|
309
|
+
const mode = String(allPermutations === true ? "all" : value ?? "selected").trim();
|
|
310
|
+
if (mode !== "selected" && mode !== "all") {
|
|
311
|
+
throw new Error(`Effect package mode ${mode || "<empty>"} is not supported; ` + "supported modes are selected and all");
|
|
312
|
+
}
|
|
313
|
+
return mode;
|
|
314
|
+
}
|
|
315
|
+
function normalizeSource(value) {
|
|
316
|
+
const source = String(value ?? "memory").trim();
|
|
317
|
+
return source || "memory";
|
|
318
|
+
}
|
|
319
|
+
function normalizeOptionalString(value, name) {
|
|
320
|
+
if (value === undefined || value === null) {
|
|
321
|
+
return null;
|
|
322
|
+
}
|
|
323
|
+
const result = String(value).trim();
|
|
324
|
+
if (!result) {
|
|
325
|
+
throw new TypeError(`${name} must be a non-empty string or null`);
|
|
326
|
+
}
|
|
327
|
+
return result;
|
|
328
|
+
}
|
|
329
|
+
function normalizeSelection(value) {
|
|
330
|
+
if (value === undefined || value === null) {
|
|
331
|
+
return null;
|
|
332
|
+
}
|
|
333
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) {
|
|
334
|
+
throw new TypeError("Effect stage selection must be an object");
|
|
335
|
+
}
|
|
336
|
+
const techniqueName = String(value.techniqueName ?? "").trim();
|
|
337
|
+
const passIndex = value.passIndex ?? null;
|
|
338
|
+
const stageNames = value.stageNames ?? [];
|
|
339
|
+
if (!techniqueName) {
|
|
340
|
+
throw new TypeError("Effect stage selection requires techniqueName");
|
|
341
|
+
}
|
|
342
|
+
if (passIndex !== null && (!Number.isSafeInteger(passIndex) || passIndex < 0)) {
|
|
343
|
+
throw new TypeError("Effect stage selection passIndex must be a non-negative integer or null");
|
|
344
|
+
}
|
|
345
|
+
if (!Array.isArray(stageNames) || stageNames.some(stageName => !["vertex", "pixel", "compute"].includes(stageName))) {
|
|
346
|
+
throw new TypeError("Effect stage selection supports only vertex, pixel, and compute stageNames");
|
|
347
|
+
}
|
|
348
|
+
if (stageNames.length && passIndex === null) {
|
|
349
|
+
throw new TypeError("Effect stageNames require an exact passIndex");
|
|
350
|
+
}
|
|
351
|
+
return Object.freeze({
|
|
352
|
+
techniqueName,
|
|
353
|
+
passIndex,
|
|
354
|
+
stageNames: Object.freeze([...new Set(stageNames)])
|
|
355
|
+
});
|
|
356
|
+
}
|
|
357
|
+
function normalizeSourceIdentity(value, source, input) {
|
|
358
|
+
if (value !== undefined && value !== null && (!value || typeof value !== "object" || Array.isArray(value))) {
|
|
359
|
+
throw new TypeError("Effect sourceIdentity must be an object");
|
|
360
|
+
}
|
|
361
|
+
const bytes = input instanceof Uint8Array ? input : input instanceof ArrayBuffer ? new Uint8Array(input) : ArrayBuffer.isView(input) ? new Uint8Array(input.buffer, input.byteOffset, input.byteLength) : null;
|
|
362
|
+
if (!bytes) {
|
|
363
|
+
throw new TypeError("Effect input must be Uint8Array, ArrayBuffer, or ArrayBufferView bytes");
|
|
364
|
+
}
|
|
365
|
+
const sha256 = sha256Bytes(bytes);
|
|
366
|
+
if (value?.sha256 !== undefined && value?.sha256 !== null && value.sha256 !== sha256) {
|
|
367
|
+
throw new Error("Effect sourceIdentity.sha256 does not match the exact effect input bytes");
|
|
368
|
+
}
|
|
369
|
+
return Object.freeze({
|
|
370
|
+
logicalPath: value?.logicalPath ?? source,
|
|
371
|
+
game: value?.game ?? null,
|
|
372
|
+
client: value?.client ?? null,
|
|
373
|
+
build: value?.build === undefined || value?.build === null ? null : String(value.build),
|
|
374
|
+
byteLength: bytes.byteLength,
|
|
375
|
+
md5: value?.md5 ?? null,
|
|
376
|
+
sha256
|
|
377
|
+
});
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
export { buildEffectPackage };
|
|
381
|
+
//# sourceMappingURL=packageEffect.js.map
|