@carbonenginejs/runtime-resource 0.12.2 → 0.13.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 -108
- package/dist/CjsMotherLode.js +1271 -1271
- package/dist/CjsResMan.js +3858 -3494
- package/dist/CjsResMan.js.map +1 -1
- 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 +408 -361
- package/dist/format/carbonEffect/CjsCarbonEffectReader.js.map +1 -1
- package/dist/format/carbonEffect/CjsCarbonEffectWriter.js +373 -373
- package/dist/format/carbonEffect/buildCarbonEffectContainer.js +182 -0
- package/dist/format/carbonEffect/buildCarbonEffectContainer.js.map +1 -0
- package/dist/format/carbonEffect/carbonEffectBackendBlock.js +321 -427
- package/dist/format/carbonEffect/carbonEffectBackendBlock.js.map +1 -1
- package/dist/format/carbonEffect/carbonEffectRecords.js +1147 -955
- package/dist/format/carbonEffect/carbonEffectRecords.js.map +1 -1
- package/dist/format/carbonEffect/carbonEffectResourceTransform.js +197 -0
- package/dist/format/carbonEffect/carbonEffectResourceTransform.js.map +1 -0
- package/dist/format/compareUtf8.js +36 -36
- package/dist/format/effect/effectBodyInventory.js +146 -0
- package/dist/format/effect/effectBodyInventory.js.map +1 -0
- package/dist/format/effect/effectPermutationGraph.js +257 -257
- package/dist/format/effect/effectPermutationGraph.js.map +1 -1
- 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 -292
- package/dist/formats/black/CjsBlackFormat.js.map +1 -1
- 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 -156
- package/dist/formats/bnk/CjsBnkFormat.js.map +1 -1
- package/dist/formats/bnk/core/busNodes.js +252 -0
- package/dist/formats/bnk/core/busNodes.js.map +1 -0
- package/dist/formats/bnk/core/effectNodes.js +147 -0
- package/dist/formats/bnk/core/effectNodes.js.map +1 -0
- package/dist/formats/bnk/core/eventAction.js +416 -305
- package/dist/formats/bnk/core/eventAction.js.map +1 -1
- package/dist/formats/bnk/core/globalSettings.js +215 -0
- package/dist/formats/bnk/core/globalSettings.js.map +1 -0
- package/dist/formats/bnk/core/graph.js +137 -137
- package/dist/formats/bnk/core/helpers.js +512 -480
- package/dist/formats/bnk/core/helpers.js.map +1 -1
- package/dist/formats/bnk/core/musicNodes.js +533 -509
- package/dist/formats/bnk/core/musicNodes.js.map +1 -1
- package/dist/formats/bnk/core/nodeBase.js +553 -532
- package/dist/formats/bnk/core/nodeBase.js.map +1 -1
- 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 +862 -862
- package/dist/formats/dds/index.js +2 -2
- package/dist/formats/dxbc/CjsDxbcFormat.js +142 -142
- 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/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 +290 -290
- package/dist/formats/gltf/core/helpers.js +307 -307
- 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 +254 -254
- 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 -781
- package/dist/formats/hlsl/core/carbonDescriptionToRuntime.js.map +1 -1
- package/dist/formats/hlsl/core/detailMapFamily.js +128 -0
- package/dist/formats/hlsl/core/detailMapFamily.js.map +1 -0
- 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 -0
- package/dist/formats/hlsl/core/localLightFamily.js.map +1 -0
- 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 -314
- package/dist/formats/hlsl/core/tr2/resources/HlslEffectRes.js.map +1 -1
- package/dist/formats/hlsl/core/tr2/resources/HlslShaderPermutation.js +33 -33
- package/dist/formats/hlsl/core/tr2/shader/HlslEffectBindingManifest.js +416 -416
- package/dist/formats/hlsl/core/tr2/shader/HlslEffectConstant.js +40 -40
- package/dist/formats/hlsl/core/tr2/shader/HlslEffectDescription.js +62 -742
- package/dist/formats/hlsl/core/tr2/shader/HlslEffectDescription.js.map +1 -1
- 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 -31
- package/dist/formats/index.js.map +1 -1
- 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 +253 -253
- package/dist/formats/obj/core/helpers.js +573 -573
- 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 -0
- package/dist/formats/pickle/CjsPickleFormat.js.map +1 -0
- package/dist/formats/pickle/core/CjsPickleProtocol0Reader.js +551 -0
- package/dist/formats/pickle/core/CjsPickleProtocol0Reader.js.map +1 -0
- package/dist/formats/pickle/index.js +2 -0
- package/dist/formats/pickle/index.js.map +1 -0
- 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 -68
- package/dist/formats/red/core/redGraph.js.map +1 -1
- package/dist/formats/red/core/schema.js +4 -4
- package/dist/formats/red/index.js +2 -2
- package/dist/formats/stl/CjsStlFormat.js +365 -365
- package/dist/formats/stl/core/helpers.js +261 -261
- 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 -221
- package/dist/formats/webgl/CjsWebglFormat.js.map +1 -1
- package/dist/formats/webgl/core/buildGlslEffectContainer.js +70 -0
- package/dist/formats/webgl/core/buildGlslEffectContainer.js.map +1 -0
- package/dist/formats/webgl/core/effectPackage.js +900 -792
- package/dist/formats/webgl/core/effectPackage.js.map +1 -1
- package/dist/formats/webgl/core/errors.js +27 -27
- package/dist/formats/webgl/core/errors.js.map +1 -1
- package/dist/formats/webgl/core/glsl/DxbcGlslEmitter.js +2820 -2678
- package/dist/formats/webgl/core/glsl/DxbcGlslEmitter.js.map +1 -1
- package/dist/formats/webgl/core/glsl/DxbcGlslHelpers.js +89 -89
- package/dist/formats/webgl/core/glsl/DxbcGlslOperandFormatter.js +486 -428
- package/dist/formats/webgl/core/glsl/DxbcGlslOperandFormatter.js.map +1 -1
- package/dist/formats/webgl/core/glsl/packedLightFixups.js +98 -0
- package/dist/formats/webgl/core/glsl/packedLightFixups.js.map +1 -0
- package/dist/formats/webgl/core/glslBackendBlock.js +552 -0
- package/dist/formats/webgl/core/glslBackendBlock.js.map +1 -0
- package/dist/formats/webgl/core/glslBackendBodySet.js +243 -0
- package/dist/formats/webgl/core/glslBackendBodySet.js.map +1 -0
- package/dist/formats/webgl/core/{cewgCompleteness.js → glslEffectCompleteness.js} +85 -81
- package/dist/formats/webgl/core/glslEffectCompleteness.js.map +1 -0
- package/dist/formats/webgl/core/helpers.js +167 -306
- package/dist/formats/webgl/core/helpers.js.map +1 -1
- package/dist/formats/webgl/core/inspectGlslEffectContainer.js +122 -0
- package/dist/formats/webgl/core/inspectGlslEffectContainer.js.map +1 -0
- package/dist/formats/webgl/core/readGlslEffectContainer.js +303 -0
- package/dist/formats/webgl/core/readGlslEffectContainer.js.map +1 -0
- package/dist/formats/webgl/index.js +2 -2
- package/dist/formats/webgpu/CjsWebgpuFormat.js +357 -357
- package/dist/formats/webgpu/CjsWebgpuFormat.js.map +1 -1
- package/dist/formats/webgpu/core/buildCarbonEffectContainer.js +89 -197
- package/dist/formats/webgpu/core/buildCarbonEffectContainer.js.map +1 -1
- package/dist/formats/webgpu/core/{cewgpu/CewgpuContainer.js → carbonWebgpu/CarbonWebgpuContainer.js} +354 -368
- package/dist/formats/webgpu/core/carbonWebgpu/CarbonWebgpuContainer.js.map +1 -0
- package/dist/formats/webgpu/core/{cewgpu → carbonWebgpu}/containerViews.js +355 -355
- package/dist/formats/webgpu/core/carbonWebgpu/containerViews.js.map +1 -0
- package/dist/formats/webgpu/core/{cewgpu → carbonWebgpu}/validateContainer.js +90 -90
- package/dist/formats/webgpu/core/carbonWebgpu/validateContainer.js.map +1 -0
- package/dist/formats/webgpu/core/effectAnalysis.js +82 -82
- package/dist/formats/webgpu/core/effectBackendBodySet.js +289 -289
- package/dist/formats/webgpu/core/effectBackendBodySet.js.map +1 -1
- package/dist/formats/webgpu/core/errors.js +20 -20
- package/dist/formats/webgpu/core/errors.js.map +1 -1
- package/dist/formats/webgpu/core/helpers.js +443 -443
- package/dist/formats/webgpu/core/helpers.js.map +1 -1
- 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 -385
- package/dist/formats/webgpu/core/packageEffect.js.map +1 -1
- package/dist/formats/webgpu/core/packageEffectSelection.js +164 -164
- package/dist/formats/webgpu/core/packageEffectSelection.js.map +1 -1
- 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/buildResourceTransformPlan.js.map +1 -1
- package/dist/formats/webgpu/core/wgsl/buildWgslBindingPlan.js +172 -172
- package/dist/formats/webgpu/core/wgsl/buildWgslSet.js +320 -320
- package/dist/formats/webgpu/core/wgsl/buildWgslSet.js.map +1 -1
- 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/CjsYamlFormat.js.map +1 -1
- package/dist/formats/yaml/core/CjsYamlReader.js +400 -402
- package/dist/formats/yaml/core/CjsYamlReader.js.map +1 -1
- package/dist/formats/yaml/core/helpers.js +196 -170
- package/dist/formats/yaml/core/helpers.js.map +1 -1
- package/dist/formats/yaml/index.js +2 -2
- package/dist/index.js +64 -62
- package/dist/index.js.map +1 -1
- package/dist/resource/CjsLoadingObject.js +19 -0
- package/dist/resource/CjsLoadingObject.js.map +1 -0
- package/dist/resource/CjsResource.js +801 -797
- package/dist/resource/CjsResource.js.map +1 -1
- package/dist/resource/ResourceHandlerMode.js +14 -0
- package/dist/resource/ResourceHandlerMode.js.map +1 -0
- 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 -52
- package/dist/resource/index.js.map +1 -1
- package/dist/resource/resourceBoundary.js +64 -64
- package/dist/resource/shader/Tr2EffectRes.js +336 -431
- package/dist/resource/shader/Tr2EffectRes.js.map +1 -1
- 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 -261
- package/dist/resource/shader/Tr2Shader.js.map +1 -1
- package/dist/resource/shader/Tr2ShaderPermutation.js +43 -43
- package/dist/resource/shader/index.js +17 -17
- package/dist/resource/shader/reflection/Tr2EffectConstant.js +143 -135
- package/dist/resource/shader/reflection/Tr2EffectConstant.js.map +1 -1
- package/dist/resource/shader/reflection/Tr2EffectDefine.js +30 -30
- package/dist/resource/shader/reflection/Tr2EffectDescription.js +114 -109
- package/dist/resource/shader/reflection/Tr2EffectDescription.js.map +1 -1
- package/dist/resource/shader/reflection/Tr2EffectLibrary.js +168 -147
- package/dist/resource/shader/reflection/Tr2EffectLibrary.js.map +1 -1
- package/dist/resource/shader/reflection/Tr2EffectParameterAnnotation.js +125 -105
- package/dist/resource/shader/reflection/Tr2EffectParameterAnnotation.js.map +1 -1
- package/dist/resource/shader/reflection/Tr2EffectResource.js +120 -86
- package/dist/resource/shader/reflection/Tr2EffectResource.js.map +1 -1
- package/dist/resource/shader/reflection/Tr2EffectStageInput.js +372 -241
- package/dist/resource/shader/reflection/Tr2EffectStageInput.js.map +1 -1
- package/dist/resource/shader/reflection/Tr2EffectTechnique.js +78 -68
- package/dist/resource/shader/reflection/Tr2EffectTechnique.js.map +1 -1
- package/dist/resource/shader/reflection/Tr2Pass.js +168 -111
- package/dist/resource/shader/reflection/Tr2Pass.js.map +1 -1
- package/dist/resource/shader/reflection/carbonRecordFields.js +159 -0
- package/dist/resource/shader/reflection/carbonRecordFields.js.map +1 -0
- package/dist/resource/shader/reflection/shaderStage.js +22 -0
- package/dist/resource/shader/reflection/shaderStage.js.map +1 -0
- package/dist/resource/shader/sampler/Tr2SamplerSetup.js +135 -77
- package/dist/resource/shader/sampler/Tr2SamplerSetup.js.map +1 -1
- 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 -87
- package/dist/worker/CjsResManMainThreadLoader.js.map +1 -1
- package/dist/worker/CjsResManWorker.js +218 -217
- package/dist/worker/CjsResManWorker.js.map +1 -1
- package/dist/worker/CjsResManWorkerLoader.js +437 -434
- package/dist/worker/CjsResManWorkerLoader.js.map +1 -1
- package/dist/worker/protocol.js +12 -12
- package/docs/README.md +98 -98
- package/docs/architecture.md +118 -109
- package/docs/concepts/resource-lifecycle.md +226 -225
- package/docs/concepts/shader-resource-model.md +111 -114
- package/docs/concepts/writing-an-engine-adapter.md +115 -115
- package/docs/formats/README.md +138 -136
- package/docs/formats/carbon-effect-container.md +553 -452
- package/docs/formats/dxbc/README.md +68 -68
- package/docs/formats/dxbc/architecture.md +80 -80
- package/docs/formats/dxbc/reference/api.md +77 -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 +65 -67
- package/docs/formats/hlsl/guides/hydrating-json-output.md +60 -62
- package/docs/formats/hlsl/guides/reading-effects.md +64 -64
- package/docs/formats/hlsl/reference/advanced-analysis.md +61 -66
- package/docs/formats/hlsl/reference/api.md +92 -98
- package/docs/formats/hlsl/reference/classes/README.md +11 -11
- package/docs/formats/hlsl/reference/json-graph.md +97 -100
- package/docs/formats/pickle.md +82 -0
- package/docs/formats/provenance.md +196 -196
- package/docs/formats/stl.md +37 -37
- package/docs/formats/webgl/README.md +115 -57
- package/docs/formats/webgl/architecture.md +69 -70
- 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 -871
- 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 -96
- package/docs/formats/webgpu/formats/{cewgpu.md → carbon-webgpu.md} +215 -216
- package/docs/formats/webgpu/guides/effect-packaging.md +189 -191
- package/docs/formats/webgpu/reference/api.md +196 -197
- package/docs/formats/webgpu/reference/classes/README.md +9 -9
- package/docs/formats/webgpu/reference/wgsl-compatibility.md +1546 -1543
- package/docs/formats/wwise.md +146 -85
- package/docs/reference/classes/README.md +35 -35
- package/docs/reference/classes/audio.md +30 -30
- package/docs/reference/classes/core.md +216 -206
- package/docs/reference/classes/dropped.md +46 -46
- package/docs/reference/classes/formats.md +944 -952
- 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 -110
- 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 -135
- 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
- package/dist/format/carbonEffect/carbonDescriptionFromPortable.js +0 -372
- package/dist/format/carbonEffect/carbonDescriptionFromPortable.js.map +0 -1
- package/dist/format/effect/effectReflectionPackage.js +0 -636
- package/dist/format/effect/effectReflectionPackage.js.map +0 -1
- package/dist/formats/hlsl/core/HlslReader.js +0 -16
- package/dist/formats/hlsl/core/HlslReader.js.map +0 -1
- package/dist/formats/hlsl/core/portableReflection.js +0 -848
- package/dist/formats/hlsl/core/portableReflection.js.map +0 -1
- package/dist/formats/hlsl/portable.js +0 -2
- package/dist/formats/hlsl/portable.js.map +0 -1
- package/dist/formats/webgl/core/cewg/CewgPackage.js +0 -340
- package/dist/formats/webgl/core/cewg/CewgPackage.js.map +0 -1
- package/dist/formats/webgl/core/cewg/CewgPackageBuilder.js +0 -104
- package/dist/formats/webgl/core/cewg/CewgPackageBuilder.js.map +0 -1
- package/dist/formats/webgl/core/cewg/binary.js +0 -19
- package/dist/formats/webgl/core/cewg/binary.js.map +0 -1
- package/dist/formats/webgl/core/cewgCompleteness.js.map +0 -1
- package/dist/formats/webgl/core/effectPackageValidation.js +0 -331
- package/dist/formats/webgl/core/effectPackageValidation.js.map +0 -1
- package/dist/formats/webgpu/core/cewgpu/CewgpuContainer.js.map +0 -1
- package/dist/formats/webgpu/core/cewgpu/containerViews.js.map +0 -1
- package/dist/formats/webgpu/core/cewgpu/validateContainer.js.map +0 -1
- package/dist/resource/shader/portable.js +0 -33
- package/dist/resource/shader/portable.js.map +0 -1
- package/docs/formats/hlsl/reference/portable-reflection.md +0 -141
- package/docs/formats/webgl/effect-reflection.md +0 -127
|
@@ -1,355 +1,355 @@
|
|
|
1
|
-
import { HlslEffectBindingManifest } from '../../../hlsl/core/tr2/shader/HlslEffectBindingManifest.js';
|
|
2
|
-
import { HlslShaderBytecode } from '../../../hlsl/core/HlslShaderBytecode.js';
|
|
3
|
-
import { hlslShaderStageName } from '../../../hlsl/core/tr2/HlslRenderContextEnum.js';
|
|
4
|
-
import { runtimeDescriptionFromCarbon } from '../../../hlsl/core/carbonDescriptionToRuntime.js';
|
|
5
|
-
import { buildEffectAnalysis } from '../helpers.js';
|
|
6
|
-
import { WGSL_SET_VERSION } from '../wgsl/buildWgslSet.js';
|
|
7
|
-
import { sha256Utf8 } from '../../../../format/effect/sha256.js';
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* Derived compatibility views over a container.
|
|
11
|
-
*
|
|
12
|
-
* The chunk package stored `ANLS` and `WGSL` as documents beside the reflection
|
|
13
|
-
* they were computed from, and carried digests to detect the two disagreeing.
|
|
14
|
-
* The container stores one document, so these are **views**: functions of the
|
|
15
|
-
* records, computed on read. The class of bug the digests guarded cannot occur,
|
|
16
|
-
* because there is no second copy to drift.
|
|
17
|
-
*
|
|
18
|
-
* The analysis view is deliberately not a reimplementation. It runs
|
|
19
|
-
* `buildEffectAnalysis` — the same function the packager runs on source — over a
|
|
20
|
-
* description rebuilt by `runtimeDescriptionFromCarbon`. That is what keeps the
|
|
21
|
-
* view honest: if it were rewritten to emit the fields consumers read today, it
|
|
22
|
-
* would be free to drift from the real analysis, and nothing would notice.
|
|
23
|
-
* `carbon-analysis-adapter-corpus.test.mjs` diffs the two over every shipped
|
|
24
|
-
* permutation and finds zero differences.
|
|
25
|
-
*
|
|
26
|
-
* These views exist for `engine-webgpu`, which reads format-package JSON for
|
|
27
|
-
* Carbon reflection instead of reading `Tr2Shader`. That is a recorded layering
|
|
28
|
-
* defect and is not this port's to fix; the views keep it working unchanged
|
|
29
|
-
* while the wire format moves underneath it. They go away with that cleanup.
|
|
30
|
-
*/
|
|
31
|
-
|
|
32
|
-
/**
|
|
33
|
-
* Resolves the permutation Carbon's own `GetShader()` would select with no
|
|
34
|
-
* option overrides.
|
|
35
|
-
*
|
|
36
|
-
* Carbon multiplies each axis's default option by the running product of the
|
|
37
|
-
* preceding axes' option counts. The chunk package stored a single selected
|
|
38
|
-
* body and its index; the container carries every permutation, so the view has
|
|
39
|
-
* to name a default rather than inherit one, and Carbon's own default is the
|
|
40
|
-
* only defensible choice.
|
|
41
|
-
*
|
|
42
|
-
* @param {object} container Loaded container.
|
|
43
|
-
* @returns {number} Permutation index.
|
|
44
|
-
*/
|
|
45
|
-
function defaultPermutationIndex(container) {
|
|
46
|
-
let multiplier = 1;
|
|
47
|
-
let index = 0;
|
|
48
|
-
for (const axis of container.carbon.permutations) {
|
|
49
|
-
index += axis.defaultOption * multiplier;
|
|
50
|
-
multiplier *= axis.options.length || 1;
|
|
51
|
-
}
|
|
52
|
-
return index < container.carbon.records.length ? index : 0;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
/**
|
|
56
|
-
* Rebuilds the runtime effect description for one permutation.
|
|
57
|
-
*
|
|
58
|
-
* @param {object} container Loaded container.
|
|
59
|
-
* @param {number} permutationIndex Permutation index.
|
|
60
|
-
* @param {string} source Source label.
|
|
61
|
-
* @returns {object} Runtime-shaped effect description.
|
|
62
|
-
*/
|
|
63
|
-
function describeRuntime(container, permutationIndex, source) {
|
|
64
|
-
return runtimeDescriptionFromCarbon(container.GetDescription(permutationIndex), {
|
|
65
|
-
effectName: source,
|
|
66
|
-
version: container.carbon.version,
|
|
67
|
-
bytecodeFor: (stage, stageType) => new HlslShaderBytecode({
|
|
68
|
-
stageType,
|
|
69
|
-
// Carbon's six stage names, not WebGPU's three. A three-entry table
|
|
70
|
-
// reports a geometry stage as null, which the corpus caught.
|
|
71
|
-
stageName: hlslShaderStageName(stageType),
|
|
72
|
-
bytes: stage.shaderData.bytes,
|
|
73
|
-
shaderSize: stage.shaderData.size,
|
|
74
|
-
stringTableOffset: stage.shaderData.offset,
|
|
75
|
-
effectName: source
|
|
76
|
-
})
|
|
77
|
-
});
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
/**
|
|
81
|
-
* Derives the analysis document for one permutation.
|
|
82
|
-
*
|
|
83
|
-
* One field is honestly different from the stored `ANLS` it replaces:
|
|
84
|
-
* `stages[].shaderBytecode` describes the **WGSL** program the container
|
|
85
|
-
* carries, where the stored document described the source DXBC. The container
|
|
86
|
-
* does not carry DXBC, so reproducing the old numbers would mean inventing
|
|
87
|
-
* them. Nothing in the engine's read surface uses this field; it is a
|
|
88
|
-
* diagnostic.
|
|
89
|
-
*
|
|
90
|
-
* @param {object} container Loaded container.
|
|
91
|
-
* @param {object} [options] View options.
|
|
92
|
-
* @param {string} [options.source] Source label.
|
|
93
|
-
* @param {number} [options.permutationIndex] Permutation to describe.
|
|
94
|
-
* @returns {object} Analysis document.
|
|
95
|
-
*/
|
|
96
|
-
function deriveAnalysis(container, options = {}) {
|
|
97
|
-
const source = options.source || container.sourcePath || "memory";
|
|
98
|
-
const permutationIndex = options.permutationIndex ?? defaultPermutationIndex(container);
|
|
99
|
-
const effectDescription = describeRuntime(container, permutationIndex, source);
|
|
100
|
-
return buildEffectAnalysis({
|
|
101
|
-
effectDescription,
|
|
102
|
-
bindingManifest: HlslEffectBindingManifest.fromEffectDescription(effectDescription, {
|
|
103
|
-
effectName: source
|
|
104
|
-
}),
|
|
105
|
-
effectRes: {
|
|
106
|
-
sourcePath: source,
|
|
107
|
-
m_compilerVersion: null
|
|
108
|
-
},
|
|
109
|
-
selection: {
|
|
110
|
-
bodyIndex: permutationIndex,
|
|
111
|
-
selectedOptions: container.carbon.permutations.map(axis => ({
|
|
112
|
-
name: axis.name.value,
|
|
113
|
-
value: axis.options[axis.defaultOption]?.value ?? null
|
|
114
|
-
}))
|
|
115
|
-
}
|
|
116
|
-
}, {
|
|
117
|
-
source,
|
|
118
|
-
decodeBytecode: false,
|
|
119
|
-
decodeInstructions: false
|
|
120
|
-
});
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
/**
|
|
124
|
-
* Derives the WGSL set document for one permutation.
|
|
125
|
-
*
|
|
126
|
-
* `sourceMap` is absent rather than empty, and that is not an oversight: its
|
|
127
|
-
* offsets index DXBC bytes the container does not carry, so it is a translator
|
|
128
|
-
* diagnostic and was dropped on write. It was separately measured to suppress
|
|
129
|
-
* no sharing, so keeping it would have bought nothing either.
|
|
130
|
-
*
|
|
131
|
-
* @param {object} container Loaded container.
|
|
132
|
-
* @param {object} [options] View options.
|
|
133
|
-
* @param {number} [options.permutationIndex] Permutation to describe.
|
|
134
|
-
* @returns {object} WGSL set document.
|
|
135
|
-
*/
|
|
136
|
-
function deriveWgsl(container, options = {}) {
|
|
137
|
-
const permutationIndex = options.permutationIndex ?? defaultPermutationIndex(container);
|
|
138
|
-
const body = container.GetBackendBodyPrograms(permutationIndex);
|
|
139
|
-
const shaders = [];
|
|
140
|
-
const layouts = [];
|
|
141
|
-
const resourceTransforms = [];
|
|
142
|
-
for (const pass of body?.passes ?? []) {
|
|
143
|
-
for (const shader of pass.shaders) {
|
|
144
|
-
shaders.push({
|
|
145
|
-
key: shader.key,
|
|
146
|
-
techniqueName: shader.techniqueName,
|
|
147
|
-
passIndex: shader.passIndex,
|
|
148
|
-
stageName: shader.stageName,
|
|
149
|
-
stage: shader.stage,
|
|
150
|
-
stageType: shader.stageType,
|
|
151
|
-
entryPoint: shader.entryPoint,
|
|
152
|
-
code: shader.code,
|
|
153
|
-
...(shader.threadGroupSize ? {
|
|
154
|
-
threadGroupSize: [...shader.threadGroupSize]
|
|
155
|
-
} : {})
|
|
156
|
-
});
|
|
157
|
-
}
|
|
158
|
-
for (const layout of pass.layouts) layouts.push(layout);
|
|
159
|
-
for (const transform of pass.resourceTransforms ?? []) resourceTransforms.push(transform);
|
|
160
|
-
}
|
|
161
|
-
return {
|
|
162
|
-
format: "CJS_WGSL_SET",
|
|
163
|
-
formatVersion: WGSL_SET_VERSION,
|
|
164
|
-
shaders,
|
|
165
|
-
layouts,
|
|
166
|
-
...(resourceTransforms.length ? {
|
|
167
|
-
resourceTransforms
|
|
168
|
-
} : {})
|
|
169
|
-
};
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
/**
|
|
173
|
-
* Derives the `WGSB` body-set view the chunk package used to store.
|
|
174
|
-
*
|
|
175
|
-
* `engine-webgpu` resolves a permutation's translated programs through this,
|
|
176
|
-
* which is part of the recorded layering defect -- it should read the shader,
|
|
177
|
-
* not a package document. The view keeps that path working unchanged while the
|
|
178
|
-
* wire format moves underneath it, and goes away with the cleanup.
|
|
179
|
-
*
|
|
180
|
-
* Nothing here is stored. A body's status is whether its stages carry programs,
|
|
181
|
-
* its passes are the record tree's passes, and a pass unit is that pass's
|
|
182
|
-
* shaders and layouts. Bodies are keyed by distinct stored offset, which is
|
|
183
|
-
* exactly what Carbon's alias dedupe produces.
|
|
184
|
-
*
|
|
185
|
-
* @param {object} container Loaded container.
|
|
186
|
-
* @returns {object} Body-set document.
|
|
187
|
-
*/
|
|
188
|
-
function deriveBackendBodySet(container) {
|
|
189
|
-
const bodyKeys = container.bodyKeyByOffset;
|
|
190
|
-
const passUnits = [];
|
|
191
|
-
const bodies = [];
|
|
192
|
-
const seen = new Set();
|
|
193
|
-
for (let index = 0; index < container.carbon.records.length; index += 1) {
|
|
194
|
-
const offset = container.carbon.records[index].offset;
|
|
195
|
-
if (seen.has(offset)) continue;
|
|
196
|
-
seen.add(offset);
|
|
197
|
-
const bodyKey = bodyKeys.get(offset);
|
|
198
|
-
const body = container.GetBackendBodyPrograms(index);
|
|
199
|
-
if (!body || body.status !== "translated") {
|
|
200
|
-
bodies.push({
|
|
201
|
-
bodyKey,
|
|
202
|
-
representativePermutationIndex: index,
|
|
203
|
-
status: "unsupported",
|
|
204
|
-
error: body?.error ?? "body carries no translated programs",
|
|
205
|
-
passCount: 0,
|
|
206
|
-
passes: []
|
|
207
|
-
});
|
|
208
|
-
continue;
|
|
209
|
-
}
|
|
210
|
-
const passes = [];
|
|
211
|
-
for (const pass of body.passes) {
|
|
212
|
-
const unit = {
|
|
213
|
-
key: `unit${passUnits.length}`,
|
|
214
|
-
// Hashed from the unit's own content. The chunk body set stored
|
|
215
|
-
// this digest to detect a unit drifting from what referenced it;
|
|
216
|
-
// derived from the content it identifies, it cannot.
|
|
217
|
-
sha256: sha256Utf8(`${JSON.stringify({
|
|
218
|
-
shaders: pass.shaders,
|
|
219
|
-
layouts: pass.layouts,
|
|
220
|
-
resourceTransforms: pass.resourceTransforms ?? []
|
|
221
|
-
})}
|
|
222
|
-
`),
|
|
223
|
-
wgslSetVersion: WGSL_SET_VERSION,
|
|
224
|
-
shaders: pass.shaders,
|
|
225
|
-
layouts: pass.layouts,
|
|
226
|
-
...(pass.resourceTransforms?.length ? {
|
|
227
|
-
resourceTransforms: pass.resourceTransforms
|
|
228
|
-
} : {})
|
|
229
|
-
};
|
|
230
|
-
passUnits.push(unit);
|
|
231
|
-
passes.push({
|
|
232
|
-
passKey: pass.passKey,
|
|
233
|
-
unitKey: unit.key
|
|
234
|
-
});
|
|
235
|
-
}
|
|
236
|
-
bodies.push({
|
|
237
|
-
bodyKey,
|
|
238
|
-
representativePermutationIndex: index,
|
|
239
|
-
status: "translated",
|
|
240
|
-
error: null,
|
|
241
|
-
passCount: passes.length,
|
|
242
|
-
passes
|
|
243
|
-
});
|
|
244
|
-
}
|
|
245
|
-
return {
|
|
246
|
-
format: "CJS_WGSL_BODY_SET",
|
|
247
|
-
formatVersion: 1,
|
|
248
|
-
bodyCount: bodies.length,
|
|
249
|
-
translatedBodyCount: bodies.filter(body => body.status === "translated").length,
|
|
250
|
-
passUnitCount: passUnits.length,
|
|
251
|
-
passUnits,
|
|
252
|
-
bodies
|
|
253
|
-
};
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
/**
|
|
257
|
-
* Finds the permutation a package resolves to.
|
|
258
|
-
*
|
|
259
|
-
* A "selected" package is not a different format -- the container always carries
|
|
260
|
-
* every permutation. What makes it selected is that exactly one body was
|
|
261
|
-
* translated, so the resolved permutation is the first one whose body carries
|
|
262
|
-
* programs. When every body is translated, there is nothing to single out and
|
|
263
|
-
* Carbon's own default applies.
|
|
264
|
-
*
|
|
265
|
-
* @param {object} container Loaded container.
|
|
266
|
-
* @returns {number} Permutation index.
|
|
267
|
-
*/
|
|
268
|
-
function resolvedPermutationIndex(container) {
|
|
269
|
-
const translated = [];
|
|
270
|
-
const seen = new Set();
|
|
271
|
-
for (let index = 0; index < container.carbon.records.length; index += 1) {
|
|
272
|
-
const offset = container.carbon.records[index].offset;
|
|
273
|
-
if (seen.has(offset)) continue;
|
|
274
|
-
seen.add(offset);
|
|
275
|
-
const body = container.GetBackendBodyPrograms(index);
|
|
276
|
-
if (body?.status === "translated") translated.push(index);
|
|
277
|
-
if (translated.length > 1) return defaultPermutationIndex(container);
|
|
278
|
-
}
|
|
279
|
-
return translated.length === 1 ? translated[0] : defaultPermutationIndex(container);
|
|
280
|
-
}
|
|
281
|
-
|
|
282
|
-
/**
|
|
283
|
-
* Derives the `META`-shaped view the chunk package used to store.
|
|
284
|
-
*
|
|
285
|
-
* Every field here is recovered from the records rather than carried:
|
|
286
|
-
* `selectedOptions` from the resolved permutation's option indices, and
|
|
287
|
-
* `wgslSelection` from which passes and stages actually hold programs. Build-time
|
|
288
|
-
* *policy* -- `bodyMode`, `sourceIdentity`, `completeness` -- is deliberately not
|
|
289
|
-
* here: it describes how the artifact was produced, not what it is, and Carbon
|
|
290
|
-
* stores none of it.
|
|
291
|
-
*
|
|
292
|
-
* @param {object} container Loaded container.
|
|
293
|
-
* @param {object} [options] View options.
|
|
294
|
-
* @param {string} [options.source] Source label.
|
|
295
|
-
* @param {number} [options.permutationIndex] Permutation to describe.
|
|
296
|
-
* @returns {object} Metadata document.
|
|
297
|
-
*/
|
|
298
|
-
function deriveMetadata(container, options = {}) {
|
|
299
|
-
const source = options.source || container.sourcePath || "memory";
|
|
300
|
-
const permutationIndex = options.permutationIndex ?? resolvedPermutationIndex(container);
|
|
301
|
-
const variant = container.permutationGraph.variants[permutationIndex];
|
|
302
|
-
const axes = container.carbon.permutations;
|
|
303
|
-
const selectedOptions = axes.map((axis, axisIndex) => ({
|
|
304
|
-
name: axis.name.value,
|
|
305
|
-
value: axis.options[variant?.optionIndices?.[axisIndex] ?? axis.defaultOption]?.value ?? null
|
|
306
|
-
}));
|
|
307
|
-
const body = container.GetBackendBodyPrograms(permutationIndex);
|
|
308
|
-
const selectedStageKeys = (body?.passes ?? []).flatMap(pass => pass.shaders.map(shader => shader.key));
|
|
309
|
-
const passKeys = (body?.passes ?? []).map(pass => pass.passKey);
|
|
310
|
-
return {
|
|
311
|
-
effectName: source,
|
|
312
|
-
sourcePath: source,
|
|
313
|
-
bodyIndex: permutationIndex,
|
|
314
|
-
selectedOptions,
|
|
315
|
-
...(passKeys.length === 1 ? {
|
|
316
|
-
wgslSelection: {
|
|
317
|
-
mode: "explicit",
|
|
318
|
-
completePasses: true,
|
|
319
|
-
techniqueName: passKeys[0].slice(0, passKeys[0].lastIndexOf(".pass")),
|
|
320
|
-
passIndex: Number(/\.pass([0-9]+)$/u.exec(passKeys[0])?.[1] ?? 0),
|
|
321
|
-
requestedStageNames: Array.from(new Set((body?.passes ?? []).flatMap(pass => pass.shaders.map(shader => shader.stageName)))),
|
|
322
|
-
selectedStageKeys
|
|
323
|
-
}
|
|
324
|
-
} : {})
|
|
325
|
-
};
|
|
326
|
-
}
|
|
327
|
-
|
|
328
|
-
/**
|
|
329
|
-
* Derives the `INFO`-shaped summary the chunk package used to store.
|
|
330
|
-
*
|
|
331
|
-
* Everything here is counted from the records rather than trusted from a stored
|
|
332
|
-
* field, which is why no digest accompanies it: a count derived from the thing
|
|
333
|
-
* it counts cannot disagree with it.
|
|
334
|
-
*
|
|
335
|
-
* @param {object} container Loaded container.
|
|
336
|
-
* @param {object} [options] View options.
|
|
337
|
-
* @param {string} [options.source] Source label.
|
|
338
|
-
* @returns {object} Info document.
|
|
339
|
-
*/
|
|
340
|
-
function deriveInfo(container, options = {}) {
|
|
341
|
-
const source = options.source || container.sourcePath || "memory";
|
|
342
|
-
const graph = container.permutationGraph;
|
|
343
|
-
return {
|
|
344
|
-
format: "
|
|
345
|
-
packageKind: "tr2-effect-webgpu",
|
|
346
|
-
sourcePath: source,
|
|
347
|
-
effectVersion: container.carbon.version,
|
|
348
|
-
compilerVersion: [...container.carbon.compilerVersion],
|
|
349
|
-
permutationCount: graph.variants.length,
|
|
350
|
-
uniqueBodyCount: graph.bodies.length
|
|
351
|
-
};
|
|
352
|
-
}
|
|
353
|
-
|
|
354
|
-
export { defaultPermutationIndex, deriveAnalysis, deriveBackendBodySet, deriveInfo, deriveMetadata, deriveWgsl, resolvedPermutationIndex };
|
|
355
|
-
//# sourceMappingURL=containerViews.js.map
|
|
1
|
+
import { HlslEffectBindingManifest } from '../../../hlsl/core/tr2/shader/HlslEffectBindingManifest.js';
|
|
2
|
+
import { HlslShaderBytecode } from '../../../hlsl/core/HlslShaderBytecode.js';
|
|
3
|
+
import { hlslShaderStageName } from '../../../hlsl/core/tr2/HlslRenderContextEnum.js';
|
|
4
|
+
import { runtimeDescriptionFromCarbon } from '../../../hlsl/core/carbonDescriptionToRuntime.js';
|
|
5
|
+
import { buildEffectAnalysis } from '../helpers.js';
|
|
6
|
+
import { WGSL_SET_VERSION } from '../wgsl/buildWgslSet.js';
|
|
7
|
+
import { sha256Utf8 } from '../../../../format/effect/sha256.js';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Derived compatibility views over a container.
|
|
11
|
+
*
|
|
12
|
+
* The chunk package stored `ANLS` and `WGSL` as documents beside the reflection
|
|
13
|
+
* they were computed from, and carried digests to detect the two disagreeing.
|
|
14
|
+
* The container stores one document, so these are **views**: functions of the
|
|
15
|
+
* records, computed on read. The class of bug the digests guarded cannot occur,
|
|
16
|
+
* because there is no second copy to drift.
|
|
17
|
+
*
|
|
18
|
+
* The analysis view is deliberately not a reimplementation. It runs
|
|
19
|
+
* `buildEffectAnalysis` — the same function the packager runs on source — over a
|
|
20
|
+
* description rebuilt by `runtimeDescriptionFromCarbon`. That is what keeps the
|
|
21
|
+
* view honest: if it were rewritten to emit the fields consumers read today, it
|
|
22
|
+
* would be free to drift from the real analysis, and nothing would notice.
|
|
23
|
+
* `carbon-analysis-adapter-corpus.test.mjs` diffs the two over every shipped
|
|
24
|
+
* permutation and finds zero differences.
|
|
25
|
+
*
|
|
26
|
+
* These views exist for `engine-webgpu`, which reads format-package JSON for
|
|
27
|
+
* Carbon reflection instead of reading `Tr2Shader`. That is a recorded layering
|
|
28
|
+
* defect and is not this port's to fix; the views keep it working unchanged
|
|
29
|
+
* while the wire format moves underneath it. They go away with that cleanup.
|
|
30
|
+
*/
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Resolves the permutation Carbon's own `GetShader()` would select with no
|
|
34
|
+
* option overrides.
|
|
35
|
+
*
|
|
36
|
+
* Carbon multiplies each axis's default option by the running product of the
|
|
37
|
+
* preceding axes' option counts. The chunk package stored a single selected
|
|
38
|
+
* body and its index; the container carries every permutation, so the view has
|
|
39
|
+
* to name a default rather than inherit one, and Carbon's own default is the
|
|
40
|
+
* only defensible choice.
|
|
41
|
+
*
|
|
42
|
+
* @param {object} container Loaded container.
|
|
43
|
+
* @returns {number} Permutation index.
|
|
44
|
+
*/
|
|
45
|
+
function defaultPermutationIndex(container) {
|
|
46
|
+
let multiplier = 1;
|
|
47
|
+
let index = 0;
|
|
48
|
+
for (const axis of container.carbon.permutations) {
|
|
49
|
+
index += axis.defaultOption * multiplier;
|
|
50
|
+
multiplier *= axis.options.length || 1;
|
|
51
|
+
}
|
|
52
|
+
return index < container.carbon.records.length ? index : 0;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Rebuilds the runtime effect description for one permutation.
|
|
57
|
+
*
|
|
58
|
+
* @param {object} container Loaded container.
|
|
59
|
+
* @param {number} permutationIndex Permutation index.
|
|
60
|
+
* @param {string} source Source label.
|
|
61
|
+
* @returns {object} Runtime-shaped effect description.
|
|
62
|
+
*/
|
|
63
|
+
function describeRuntime(container, permutationIndex, source) {
|
|
64
|
+
return runtimeDescriptionFromCarbon(container.GetDescription(permutationIndex), {
|
|
65
|
+
effectName: source,
|
|
66
|
+
version: container.carbon.version,
|
|
67
|
+
bytecodeFor: (stage, stageType) => new HlslShaderBytecode({
|
|
68
|
+
stageType,
|
|
69
|
+
// Carbon's six stage names, not WebGPU's three. A three-entry table
|
|
70
|
+
// reports a geometry stage as null, which the corpus caught.
|
|
71
|
+
stageName: hlslShaderStageName(stageType),
|
|
72
|
+
bytes: stage.shaderData.bytes,
|
|
73
|
+
shaderSize: stage.shaderData.size,
|
|
74
|
+
stringTableOffset: stage.shaderData.offset,
|
|
75
|
+
effectName: source
|
|
76
|
+
})
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Derives the analysis document for one permutation.
|
|
82
|
+
*
|
|
83
|
+
* One field is honestly different from the stored `ANLS` it replaces:
|
|
84
|
+
* `stages[].shaderBytecode` describes the **WGSL** program the container
|
|
85
|
+
* carries, where the stored document described the source DXBC. The container
|
|
86
|
+
* does not carry DXBC, so reproducing the old numbers would mean inventing
|
|
87
|
+
* them. Nothing in the engine's read surface uses this field; it is a
|
|
88
|
+
* diagnostic.
|
|
89
|
+
*
|
|
90
|
+
* @param {object} container Loaded container.
|
|
91
|
+
* @param {object} [options] View options.
|
|
92
|
+
* @param {string} [options.source] Source label.
|
|
93
|
+
* @param {number} [options.permutationIndex] Permutation to describe.
|
|
94
|
+
* @returns {object} Analysis document.
|
|
95
|
+
*/
|
|
96
|
+
function deriveAnalysis(container, options = {}) {
|
|
97
|
+
const source = options.source || container.sourcePath || "memory";
|
|
98
|
+
const permutationIndex = options.permutationIndex ?? defaultPermutationIndex(container);
|
|
99
|
+
const effectDescription = describeRuntime(container, permutationIndex, source);
|
|
100
|
+
return buildEffectAnalysis({
|
|
101
|
+
effectDescription,
|
|
102
|
+
bindingManifest: HlslEffectBindingManifest.fromEffectDescription(effectDescription, {
|
|
103
|
+
effectName: source
|
|
104
|
+
}),
|
|
105
|
+
effectRes: {
|
|
106
|
+
sourcePath: source,
|
|
107
|
+
m_compilerVersion: null
|
|
108
|
+
},
|
|
109
|
+
selection: {
|
|
110
|
+
bodyIndex: permutationIndex,
|
|
111
|
+
selectedOptions: container.carbon.permutations.map(axis => ({
|
|
112
|
+
name: axis.name.value,
|
|
113
|
+
value: axis.options[axis.defaultOption]?.value ?? null
|
|
114
|
+
}))
|
|
115
|
+
}
|
|
116
|
+
}, {
|
|
117
|
+
source,
|
|
118
|
+
decodeBytecode: false,
|
|
119
|
+
decodeInstructions: false
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* Derives the WGSL set document for one permutation.
|
|
125
|
+
*
|
|
126
|
+
* `sourceMap` is absent rather than empty, and that is not an oversight: its
|
|
127
|
+
* offsets index DXBC bytes the container does not carry, so it is a translator
|
|
128
|
+
* diagnostic and was dropped on write. It was separately measured to suppress
|
|
129
|
+
* no sharing, so keeping it would have bought nothing either.
|
|
130
|
+
*
|
|
131
|
+
* @param {object} container Loaded container.
|
|
132
|
+
* @param {object} [options] View options.
|
|
133
|
+
* @param {number} [options.permutationIndex] Permutation to describe.
|
|
134
|
+
* @returns {object} WGSL set document.
|
|
135
|
+
*/
|
|
136
|
+
function deriveWgsl(container, options = {}) {
|
|
137
|
+
const permutationIndex = options.permutationIndex ?? defaultPermutationIndex(container);
|
|
138
|
+
const body = container.GetBackendBodyPrograms(permutationIndex);
|
|
139
|
+
const shaders = [];
|
|
140
|
+
const layouts = [];
|
|
141
|
+
const resourceTransforms = [];
|
|
142
|
+
for (const pass of body?.passes ?? []) {
|
|
143
|
+
for (const shader of pass.shaders) {
|
|
144
|
+
shaders.push({
|
|
145
|
+
key: shader.key,
|
|
146
|
+
techniqueName: shader.techniqueName,
|
|
147
|
+
passIndex: shader.passIndex,
|
|
148
|
+
stageName: shader.stageName,
|
|
149
|
+
stage: shader.stage,
|
|
150
|
+
stageType: shader.stageType,
|
|
151
|
+
entryPoint: shader.entryPoint,
|
|
152
|
+
code: shader.code,
|
|
153
|
+
...(shader.threadGroupSize ? {
|
|
154
|
+
threadGroupSize: [...shader.threadGroupSize]
|
|
155
|
+
} : {})
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
for (const layout of pass.layouts) layouts.push(layout);
|
|
159
|
+
for (const transform of pass.resourceTransforms ?? []) resourceTransforms.push(transform);
|
|
160
|
+
}
|
|
161
|
+
return {
|
|
162
|
+
format: "CJS_WGSL_SET",
|
|
163
|
+
formatVersion: WGSL_SET_VERSION,
|
|
164
|
+
shaders,
|
|
165
|
+
layouts,
|
|
166
|
+
...(resourceTransforms.length ? {
|
|
167
|
+
resourceTransforms
|
|
168
|
+
} : {})
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
/**
|
|
173
|
+
* Derives the `WGSB` body-set view the chunk package used to store.
|
|
174
|
+
*
|
|
175
|
+
* `engine-webgpu` resolves a permutation's translated programs through this,
|
|
176
|
+
* which is part of the recorded layering defect -- it should read the shader,
|
|
177
|
+
* not a package document. The view keeps that path working unchanged while the
|
|
178
|
+
* wire format moves underneath it, and goes away with the cleanup.
|
|
179
|
+
*
|
|
180
|
+
* Nothing here is stored. A body's status is whether its stages carry programs,
|
|
181
|
+
* its passes are the record tree's passes, and a pass unit is that pass's
|
|
182
|
+
* shaders and layouts. Bodies are keyed by distinct stored offset, which is
|
|
183
|
+
* exactly what Carbon's alias dedupe produces.
|
|
184
|
+
*
|
|
185
|
+
* @param {object} container Loaded container.
|
|
186
|
+
* @returns {object} Body-set document.
|
|
187
|
+
*/
|
|
188
|
+
function deriveBackendBodySet(container) {
|
|
189
|
+
const bodyKeys = container.bodyKeyByOffset;
|
|
190
|
+
const passUnits = [];
|
|
191
|
+
const bodies = [];
|
|
192
|
+
const seen = new Set();
|
|
193
|
+
for (let index = 0; index < container.carbon.records.length; index += 1) {
|
|
194
|
+
const offset = container.carbon.records[index].offset;
|
|
195
|
+
if (seen.has(offset)) continue;
|
|
196
|
+
seen.add(offset);
|
|
197
|
+
const bodyKey = bodyKeys.get(offset);
|
|
198
|
+
const body = container.GetBackendBodyPrograms(index);
|
|
199
|
+
if (!body || body.status !== "translated") {
|
|
200
|
+
bodies.push({
|
|
201
|
+
bodyKey,
|
|
202
|
+
representativePermutationIndex: index,
|
|
203
|
+
status: "unsupported",
|
|
204
|
+
error: body?.error ?? "body carries no translated programs",
|
|
205
|
+
passCount: 0,
|
|
206
|
+
passes: []
|
|
207
|
+
});
|
|
208
|
+
continue;
|
|
209
|
+
}
|
|
210
|
+
const passes = [];
|
|
211
|
+
for (const pass of body.passes) {
|
|
212
|
+
const unit = {
|
|
213
|
+
key: `unit${passUnits.length}`,
|
|
214
|
+
// Hashed from the unit's own content. The chunk body set stored
|
|
215
|
+
// this digest to detect a unit drifting from what referenced it;
|
|
216
|
+
// derived from the content it identifies, it cannot.
|
|
217
|
+
sha256: sha256Utf8(`${JSON.stringify({
|
|
218
|
+
shaders: pass.shaders,
|
|
219
|
+
layouts: pass.layouts,
|
|
220
|
+
resourceTransforms: pass.resourceTransforms ?? []
|
|
221
|
+
})}
|
|
222
|
+
`),
|
|
223
|
+
wgslSetVersion: WGSL_SET_VERSION,
|
|
224
|
+
shaders: pass.shaders,
|
|
225
|
+
layouts: pass.layouts,
|
|
226
|
+
...(pass.resourceTransforms?.length ? {
|
|
227
|
+
resourceTransforms: pass.resourceTransforms
|
|
228
|
+
} : {})
|
|
229
|
+
};
|
|
230
|
+
passUnits.push(unit);
|
|
231
|
+
passes.push({
|
|
232
|
+
passKey: pass.passKey,
|
|
233
|
+
unitKey: unit.key
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
bodies.push({
|
|
237
|
+
bodyKey,
|
|
238
|
+
representativePermutationIndex: index,
|
|
239
|
+
status: "translated",
|
|
240
|
+
error: null,
|
|
241
|
+
passCount: passes.length,
|
|
242
|
+
passes
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
return {
|
|
246
|
+
format: "CJS_WGSL_BODY_SET",
|
|
247
|
+
formatVersion: 1,
|
|
248
|
+
bodyCount: bodies.length,
|
|
249
|
+
translatedBodyCount: bodies.filter(body => body.status === "translated").length,
|
|
250
|
+
passUnitCount: passUnits.length,
|
|
251
|
+
passUnits,
|
|
252
|
+
bodies
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
/**
|
|
257
|
+
* Finds the permutation a package resolves to.
|
|
258
|
+
*
|
|
259
|
+
* A "selected" package is not a different format -- the container always carries
|
|
260
|
+
* every permutation. What makes it selected is that exactly one body was
|
|
261
|
+
* translated, so the resolved permutation is the first one whose body carries
|
|
262
|
+
* programs. When every body is translated, there is nothing to single out and
|
|
263
|
+
* Carbon's own default applies.
|
|
264
|
+
*
|
|
265
|
+
* @param {object} container Loaded container.
|
|
266
|
+
* @returns {number} Permutation index.
|
|
267
|
+
*/
|
|
268
|
+
function resolvedPermutationIndex(container) {
|
|
269
|
+
const translated = [];
|
|
270
|
+
const seen = new Set();
|
|
271
|
+
for (let index = 0; index < container.carbon.records.length; index += 1) {
|
|
272
|
+
const offset = container.carbon.records[index].offset;
|
|
273
|
+
if (seen.has(offset)) continue;
|
|
274
|
+
seen.add(offset);
|
|
275
|
+
const body = container.GetBackendBodyPrograms(index);
|
|
276
|
+
if (body?.status === "translated") translated.push(index);
|
|
277
|
+
if (translated.length > 1) return defaultPermutationIndex(container);
|
|
278
|
+
}
|
|
279
|
+
return translated.length === 1 ? translated[0] : defaultPermutationIndex(container);
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
/**
|
|
283
|
+
* Derives the `META`-shaped view the chunk package used to store.
|
|
284
|
+
*
|
|
285
|
+
* Every field here is recovered from the records rather than carried:
|
|
286
|
+
* `selectedOptions` from the resolved permutation's option indices, and
|
|
287
|
+
* `wgslSelection` from which passes and stages actually hold programs. Build-time
|
|
288
|
+
* *policy* -- `bodyMode`, `sourceIdentity`, `completeness` -- is deliberately not
|
|
289
|
+
* here: it describes how the artifact was produced, not what it is, and Carbon
|
|
290
|
+
* stores none of it.
|
|
291
|
+
*
|
|
292
|
+
* @param {object} container Loaded container.
|
|
293
|
+
* @param {object} [options] View options.
|
|
294
|
+
* @param {string} [options.source] Source label.
|
|
295
|
+
* @param {number} [options.permutationIndex] Permutation to describe.
|
|
296
|
+
* @returns {object} Metadata document.
|
|
297
|
+
*/
|
|
298
|
+
function deriveMetadata(container, options = {}) {
|
|
299
|
+
const source = options.source || container.sourcePath || "memory";
|
|
300
|
+
const permutationIndex = options.permutationIndex ?? resolvedPermutationIndex(container);
|
|
301
|
+
const variant = container.permutationGraph.variants[permutationIndex];
|
|
302
|
+
const axes = container.carbon.permutations;
|
|
303
|
+
const selectedOptions = axes.map((axis, axisIndex) => ({
|
|
304
|
+
name: axis.name.value,
|
|
305
|
+
value: axis.options[variant?.optionIndices?.[axisIndex] ?? axis.defaultOption]?.value ?? null
|
|
306
|
+
}));
|
|
307
|
+
const body = container.GetBackendBodyPrograms(permutationIndex);
|
|
308
|
+
const selectedStageKeys = (body?.passes ?? []).flatMap(pass => pass.shaders.map(shader => shader.key));
|
|
309
|
+
const passKeys = (body?.passes ?? []).map(pass => pass.passKey);
|
|
310
|
+
return {
|
|
311
|
+
effectName: source,
|
|
312
|
+
sourcePath: source,
|
|
313
|
+
bodyIndex: permutationIndex,
|
|
314
|
+
selectedOptions,
|
|
315
|
+
...(passKeys.length === 1 ? {
|
|
316
|
+
wgslSelection: {
|
|
317
|
+
mode: "explicit",
|
|
318
|
+
completePasses: true,
|
|
319
|
+
techniqueName: passKeys[0].slice(0, passKeys[0].lastIndexOf(".pass")),
|
|
320
|
+
passIndex: Number(/\.pass([0-9]+)$/u.exec(passKeys[0])?.[1] ?? 0),
|
|
321
|
+
requestedStageNames: Array.from(new Set((body?.passes ?? []).flatMap(pass => pass.shaders.map(shader => shader.stageName)))),
|
|
322
|
+
selectedStageKeys
|
|
323
|
+
}
|
|
324
|
+
} : {})
|
|
325
|
+
};
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
/**
|
|
329
|
+
* Derives the `INFO`-shaped summary the chunk package used to store.
|
|
330
|
+
*
|
|
331
|
+
* Everything here is counted from the records rather than trusted from a stored
|
|
332
|
+
* field, which is why no digest accompanies it: a count derived from the thing
|
|
333
|
+
* it counts cannot disagree with it.
|
|
334
|
+
*
|
|
335
|
+
* @param {object} container Loaded container.
|
|
336
|
+
* @param {object} [options] View options.
|
|
337
|
+
* @param {string} [options.source] Source label.
|
|
338
|
+
* @returns {object} Info document.
|
|
339
|
+
*/
|
|
340
|
+
function deriveInfo(container, options = {}) {
|
|
341
|
+
const source = options.source || container.sourcePath || "memory";
|
|
342
|
+
const graph = container.permutationGraph;
|
|
343
|
+
return {
|
|
344
|
+
format: "CARBON_WEBGPU",
|
|
345
|
+
packageKind: "tr2-effect-webgpu",
|
|
346
|
+
sourcePath: source,
|
|
347
|
+
effectVersion: container.carbon.version,
|
|
348
|
+
compilerVersion: [...container.carbon.compilerVersion],
|
|
349
|
+
permutationCount: graph.variants.length,
|
|
350
|
+
uniqueBodyCount: graph.bodies.length
|
|
351
|
+
};
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
export { defaultPermutationIndex, deriveAnalysis, deriveBackendBodySet, deriveInfo, deriveMetadata, deriveWgsl, resolvedPermutationIndex };
|
|
355
|
+
//# sourceMappingURL=containerViews.js.map
|