@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,275 +1,275 @@
|
|
|
1
|
-
# MotherLode identity, cache, and retention
|
|
2
|
-
|
|
3
|
-
Status: Evolving
|
|
4
|
-
Scope: `@carbonenginejs/runtime-resource`
|
|
5
|
-
Audience: Users and integrators
|
|
6
|
-
Summary: Defines canonical resource identity, ownership and replacement, the recorded-byte cache, payload retention, read-cache provenance, and purge contracts.
|
|
7
|
-
|
|
8
|
-
## Canonical identity
|
|
9
|
-
|
|
10
|
-
Canonical resource identity is the normalized source path plus its promised
|
|
11
|
-
output tag. `variant` is the explicit tag; otherwise `emit`, `requirement`, or
|
|
12
|
-
`payload` supplies it. Human-readable identities are written as
|
|
13
|
-
`res:/ship.gr2@cmf`, although MotherLode uses an internal delimiter. Reader,
|
|
14
|
-
constructor, and format-option implementations never enter the key. CjsLibrary
|
|
15
|
-
chooses the promised output and ResMan executes the current setup-time format
|
|
16
|
-
registration for it.
|
|
17
|
-
|
|
18
|
-
Output selection is case-insensitive for identity and matching, but format
|
|
19
|
-
readers receive the canonical declared spelling (for example `cmfJson`). A
|
|
20
|
-
legacy direct object loader exposes only its unforced default; named output
|
|
21
|
-
variants belong on a format class. Unsupported `@output` requests fail before
|
|
22
|
-
cache lookup, so a resident handle cannot bypass the declaration.
|
|
23
|
-
|
|
24
|
-
The selected constructor, reader, and format defaults/options are setup-time
|
|
25
|
-
execution details, not MotherLode identity. A changed registration does not
|
|
26
|
-
create a hidden second resource; reset the affected identity
|
|
27
|
-
(`Delete`/`Clear`) or create a new manager. A changed output contract must use
|
|
28
|
-
a new tag such as `@cmf2`.
|
|
29
|
-
|
|
30
|
-
Do not restore a hidden execution-plan identity through function fingerprints,
|
|
31
|
-
arbitrary option serialization, `buildKey`, or `buildVersion`. Those details
|
|
32
|
-
cannot create a second canonical resource behind the same public path/output
|
|
33
|
-
promise. A materially different promised result requires an explicit output
|
|
34
|
-
tag.
|
|
35
|
-
|
|
36
|
-
## Ownership and replacement
|
|
37
|
-
|
|
38
|
-
`CjsResMan` resolves each normalized path and promised output to one canonical
|
|
39
|
-
MotherLode key. `Insert(key, resource, options)` reports `{ inserted,
|
|
40
|
-
replaced, displaced }`; replacement, deletion, clearing, and shutdown destroy
|
|
41
|
-
attached adapter allocations and release the complete CPU payload by default.
|
|
42
|
-
Callers that deliberately retain ownership may pass `{ cleanup: false }` and
|
|
43
|
-
keep the returned displaced resource. If replacement cleanup fails, insertion
|
|
44
|
-
throws a contextual error and leaves the existing owner registered. These
|
|
45
|
-
ordinary ownership removals preserve the handle's last resource state;
|
|
46
|
-
`PURGED` is reserved for successful policy eviction through inactivity or
|
|
47
|
-
byte pressure.
|
|
48
|
-
|
|
49
|
-
`PURGED` is not terminal for the handle. Purge deletes the payload, but the
|
|
50
|
-
handle revives itself: `IsGood()` renews activity through `KeepAlive()`, and
|
|
51
|
-
`KeepAlive()` reloads a purged resource along the ordinary first-load path. A
|
|
52
|
-
consumer therefore never learns that a purge happened and never manages
|
|
53
|
-
retention itself - it asks whether the resource is good, and that question is
|
|
54
|
-
what keeps it, or brings it back.
|
|
55
|
-
|
|
56
|
-
Liveness follows visibility. Something being drawn is asked about every frame
|
|
57
|
-
and stays live; something that stops being drawn stops being renewed, ages out,
|
|
58
|
-
and has its memory reclaimed; when it is drawn again the next `IsGood()`
|
|
59
|
-
restores it. `Reload()` is bounded by `maxReloadAttempts` precisely because the
|
|
60
|
-
render path calls this every frame, so one permanently missing resource cannot
|
|
61
|
-
become a retry storm. A reload refills the exact handle the consumer holds
|
|
62
|
-
rather than resolving whatever the manager currently caches for that path,
|
|
63
|
-
because a consumer holding a purged handle has no way to discover a
|
|
64
|
-
replacement.
|
|
65
|
-
|
|
66
|
-
`Startup()` and `Shutdown()` are idempotent. `HasKey`, `Lookup`, `Delete`,
|
|
67
|
-
`GetKeys`, `GetValues`, `GetSize`, `SetCacheSize`, `GetCacheSize`, `GetStats`,
|
|
68
|
-
`TrimCache`, `ReplaceExpected`, `Clear`, and `ClearCached` provide the
|
|
69
|
-
Carbon-shaped cache vocabulary plus the exact-owner compare-and-swap required
|
|
70
|
-
by staged JavaScript reload. The old `Has`, `GetCount`, and `DeleteAll` names
|
|
71
|
-
remain temporary compatibility aliases.
|
|
72
|
-
|
|
73
|
-
## Recorded-byte cache
|
|
74
|
-
|
|
75
|
-
Carbon can infer when only its cache retains a resource through
|
|
76
|
-
weak-reference and refcount transitions. JavaScript cannot reproduce that
|
|
77
|
-
ownership test reliably, so `CjsMotherLode` budgets only entries that a caller
|
|
78
|
-
explicitly classifies with `{ cached: true, bytes }`; JavaScript reachability
|
|
79
|
-
is never inferred. The byte value is an exact caller-supplied safe-integer
|
|
80
|
-
eviction weight, not a heuristic walk of the resource graph; runtime-resource
|
|
81
|
-
does not walk arbitrary cyclic/shared object graphs or invoke payload getters
|
|
82
|
-
to guess size.
|
|
83
|
-
|
|
84
|
-
Explicit cached entries receive a monotonic admission sequence. With default
|
|
85
|
-
cleanup, `TrimCache(options)` destroys adapters, releases payloads, detaches
|
|
86
|
-
lifecycle callbacks, marks compatible handles `PURGED`, and removes
|
|
87
|
-
positive-byte cached identities in oldest-admission order until
|
|
88
|
-
`cacheBytes <= cacheSize`. Live, locked, `cacheable: false`, and zero-byte
|
|
89
|
-
entries do not create pressure. `KeepAlive()` and `Lock()` promote a cached
|
|
90
|
-
record to live; `Unlock()` does not silently re-admit it.
|
|
91
|
-
|
|
92
|
-
`SetCacheSize(bytes, options)` installs and immediately enforces the new
|
|
93
|
-
budget. `CjsResMan.Update()` and `Tick()` retry cache housekeeping after
|
|
94
|
-
pumping queues; `{ cache: false }` skips it for one update without changing
|
|
95
|
-
policy. Cleanup is transactional per identity: a failed candidate remains
|
|
96
|
-
canonical, later candidates are still attempted, and the aggregate
|
|
97
|
-
`CJS_MOTHERLODE_CACHE_TRIM_FAILED` error carries successful evictions and any
|
|
98
|
-
remaining over-budget state. Trimming never reads, prepares, or reloads data.
|
|
99
|
-
|
|
100
|
-
## Payload retention
|
|
101
|
-
|
|
102
|
-
Reader and converter outputs are plain transient payload objects, not resource
|
|
103
|
-
classes or DTO models. A payload may contain more decoded data than a
|
|
104
|
-
particular resource or engine adapter needs. Each concrete resource validates
|
|
105
|
-
the fields it requires before publishing the payload and retains the scalars
|
|
106
|
-
and references it needs. An adapter may retain additional references in
|
|
107
|
-
adapter-owned state. Referencing payload-owned typed arrays is valid and
|
|
108
|
-
preferable to copying them merely to change ownership.
|
|
109
|
-
|
|
110
|
-
The lifecycle treats resource residency and payload residency independently:
|
|
111
|
-
|
|
112
|
-
```text
|
|
113
|
-
resource.KeepAlive()
|
|
114
|
-
-> renew resource/cache residency
|
|
115
|
-
|
|
116
|
-
resource.KeepPayloadAlive()
|
|
117
|
-
-> renew the attached payload lease
|
|
118
|
-
|
|
119
|
-
resource.ReleasePayload()
|
|
120
|
-
-> explicitly release the full payload reference
|
|
121
|
-
```
|
|
122
|
-
|
|
123
|
-
`CjsResMan` binds resource-facing `KeepAlive()`, `KeepPayloadAlive()`,
|
|
124
|
-
`Lock()`, and `Unlock()` to the resource's canonical MotherLode key.
|
|
125
|
-
`SetPayload()` renews both identity and payload activity when it publishes a
|
|
126
|
-
non-null payload. `GetPayload()`, `HasPayload()`, `IsPrepared()`, and other
|
|
127
|
-
state/payload queries are pure; reading the payload does not implicitly renew
|
|
128
|
-
its lease. `IsGood()` is the deliberate exception: it calls `KeepAlive()`,
|
|
129
|
-
renewing this handle and starting its bounded reload path when it is `PURGED`.
|
|
130
|
-
It does not recursively traverse or renew child resources.
|
|
131
|
-
|
|
132
|
-
A handle detached by ordinary ownership removal has no live MotherLode
|
|
133
|
-
controller. A purged handle retains the reload hook needed to re-register and
|
|
134
|
-
refill that exact handle, so `IsGood()`/`KeepAlive()` can recover it as
|
|
135
|
-
described under [Ownership and replacement](#ownership-and-replacement).
|
|
136
|
-
|
|
137
|
-
A released CPU payload retains only the small request needed to reconstruct
|
|
138
|
-
that same path/output from its source and `sourceRevision`. The retained
|
|
139
|
-
promised-output fields and source provenance win over later
|
|
140
|
-
`Ready()`/`GetObject()` overrides, while cache/reload policy remains per-call.
|
|
141
|
-
Payload leases protect active consumers; an engine may release its own backend
|
|
142
|
-
adapter without destroying shared CPU data.
|
|
143
|
-
|
|
144
|
-
Both semantic and generic/base resource results use the payload slot: the
|
|
145
|
-
manager stores the complete result through `SetPayload()` and mirrors it on
|
|
146
|
-
the compatibility `object` property for base resources. Payload release clears
|
|
147
|
-
that alias only while it still identifies the released value. Semantic
|
|
148
|
-
resources continue to expose `object === resource` while holding their
|
|
149
|
-
validated plain payload privately.
|
|
150
|
-
|
|
151
|
-
Object-operation promises are retained only while in flight. Concurrent
|
|
152
|
-
`GetObject()`/`Ready()` calls share one operation; a resident result is
|
|
153
|
-
returned without source work and renews the explicit payload lease.
|
|
154
|
-
Settlement removes the operation record so its result graph can be reclaimed
|
|
155
|
-
and a failure can be retried. After payload release, only a new explicit
|
|
156
|
-
object/readiness call reconstructs it; queries, lease calls, and purge sweeps
|
|
157
|
-
do not.
|
|
158
|
-
|
|
159
|
-
The processor preparing a resource decides when the full payload can be
|
|
160
|
-
released:
|
|
161
|
-
|
|
162
|
-
```text
|
|
163
|
-
format reader -> plain payload -> resource validation + adapter prepare
|
|
164
|
-
|
|
|
165
|
-
+-> resource retains required values/references
|
|
166
|
-
+-> adapter retains adapter-specific state/references
|
|
167
|
-
+-> release payload after successful preparation
|
|
168
|
-
`-> or renew its lease for deferred/further work
|
|
169
|
-
```
|
|
170
|
-
|
|
171
|
-
A time- or frame-based lease is a fallback against abandoned payloads. An
|
|
172
|
-
owner performing deferred work can renew the lease. If an expired payload is
|
|
173
|
-
required again, the caller must explicitly request reconstruction; lease
|
|
174
|
-
renewal and purging never fetch or reload source data. Dynamic or
|
|
175
|
-
non-reloadable resources must remain locked, retain the required payload, or
|
|
176
|
-
be able to recreate it.
|
|
177
|
-
|
|
178
|
-
Payload references are shared read-only by default. Preparing WebGL and
|
|
179
|
-
WebGPU adapters side by side should normally pass the same payload to both
|
|
180
|
-
consumers and retain it until both have finished. Copying is an explicit
|
|
181
|
-
consumer operation, justified when a consumer must mutate data, transfer and
|
|
182
|
-
detach an `ArrayBuffer`, or retain an independently writable snapshot. The
|
|
183
|
-
consumer should copy only the fields it requires; runtime-resource does not
|
|
184
|
-
automatically deep-clone payload or typed-array bundles.
|
|
185
|
-
|
|
186
|
-
## Read-cache provenance
|
|
187
|
-
|
|
188
|
-
Source and parsed-format caches use explicit provenance, separate from
|
|
189
|
-
path/output resource identity. `sourceRevision` is an opaque caller/source-
|
|
190
|
-
supplied string or finite number identifying source content for one source
|
|
191
|
-
object and normalized path. It scopes read caches only; it does not alter
|
|
192
|
-
MotherLode resource identity, and changing it does not replace a resident
|
|
193
|
-
payload without `reload: true`. Source and format records do not share across
|
|
194
|
-
revisions.
|
|
195
|
-
|
|
196
|
-
`cacheSource` and `cacheFormat` are tri-state per-call policies:
|
|
197
|
-
|
|
198
|
-
- omitted: share in-flight or explicitly retained work, then drop a newly
|
|
199
|
-
completed record;
|
|
200
|
-
- `true`: share and retain success; a joining caller upgrades the record;
|
|
201
|
-
- `false`: bypass sharing and retention.
|
|
202
|
-
|
|
203
|
-
Failures are never retained. Format records are additionally isolated by
|
|
204
|
-
selected source object, frozen registration descriptor, revision, and
|
|
205
|
-
effective format options, so another source or a re-registered default cannot
|
|
206
|
-
reuse a stale parse. Re-registering a format with new defaults therefore
|
|
207
|
-
cannot reuse an old descriptor's parse. Registered defaults are copied into
|
|
208
|
-
deeply frozen plain-object/array snapshots. Material format options that
|
|
209
|
-
cannot be represented safely (for example class instances with hidden mutable
|
|
210
|
-
state) bypass format-cache sharing instead of risking a false match;
|
|
211
|
-
functions and byte views use cache-local identity plus visible byte content
|
|
212
|
-
where applicable.
|
|
213
|
-
|
|
214
|
-
A resource loader retains the effective selected source and `sourceRevision`
|
|
215
|
-
for reconstruction, including the manager default selected at creation, but
|
|
216
|
-
not cache flags or one-shot reload.
|
|
217
|
-
|
|
218
|
-
## Explicit and automatic purging
|
|
219
|
-
|
|
220
|
-
`PurgeInactive(options)` performs an explicit deterministic sweep using
|
|
221
|
-
independent identity and payload frame/time limits. Locks skip both forms of
|
|
222
|
-
eviction. Identity expiry destroys adapter resources, releases the payload,
|
|
223
|
-
detaches lifecycle callbacks, marks compatible handles `PURGED`, and removes
|
|
224
|
-
the canonical key; payload expiry calls `ReleasePayload()` while retaining
|
|
225
|
-
identity and adapter allocations. Candidate failures are aggregated after the
|
|
226
|
-
sweep has continued over other entries. A sweep never fetches, prepares, or
|
|
227
|
-
reloads a resource.
|
|
228
|
-
|
|
229
|
-
Automatic scheduling is available only when a caller supplies
|
|
230
|
-
`autoPurgePolicy` to the constructor/`Register()` or calls
|
|
231
|
-
`SetAutoPurgePolicy()`. It is disabled by default and deliberately accepts
|
|
232
|
-
only millisecond limits: MotherLode activity frames count explicit
|
|
233
|
-
observations and are not renderer frames. A policy must set at least one of
|
|
234
|
-
`maxIdleMilliseconds` or `payloadMaxIdleMilliseconds`;
|
|
235
|
-
`intervalMilliseconds` defaults to 1000. The first
|
|
236
|
-
`PumpAutoPurge()`/`Update()` after configuration sweeps immediately, then the
|
|
237
|
-
interval sets the minimum cadence. `Update({ purge: false })` suppresses a
|
|
238
|
-
sweep for one update without changing cadence. A regressing clock rebases and
|
|
239
|
-
skips one pump; custom deterministic clocks should be shared with MotherLode.
|
|
240
|
-
Recorded-byte cache trimming is separate from this opt-in inactivity policy
|
|
241
|
-
and runs on ordinary updates unless `{ cache: false }` is supplied.
|
|
242
|
-
|
|
243
|
-
```js
|
|
244
|
-
const resMan = new CjsResMan({
|
|
245
|
-
source,
|
|
246
|
-
autoPurgePolicy: {
|
|
247
|
-
intervalMilliseconds: 1000,
|
|
248
|
-
maxIdleMilliseconds: 60_000,
|
|
249
|
-
payloadMaxIdleMilliseconds: 10_000
|
|
250
|
-
}
|
|
251
|
-
});
|
|
252
|
-
|
|
253
|
-
resMan.Update();
|
|
254
|
-
```
|
|
255
|
-
|
|
256
|
-
Both queued `QueueResourceObject()` work and direct `LoadResourceObject()`
|
|
257
|
-
work hold one manager-owned lock from request/loading publication through
|
|
258
|
-
success or failure. The lock is balanced independently of caller locks, so
|
|
259
|
-
automatic or manual sweeps cannot detach a handle while its read/prepare
|
|
260
|
-
operation is still active. Lock release is conditional on the same captured
|
|
261
|
-
ownership generation, so stale work cannot decrement a newly rebound handle's
|
|
262
|
-
lock. Scheduling and active-work protection do not fetch or reload data.
|
|
263
|
-
|
|
264
|
-
Cache trimming and automatic inactivity sweeps never fetch or reload as part
|
|
265
|
-
of the sweep itself. A later `IsGood()`/`KeepAlive()` call may recover the
|
|
266
|
-
purged handle through its bounded reload path. Application retention defaults,
|
|
267
|
-
automatic resource/payload byte estimation, and separate CPU/adapter budgets
|
|
268
|
-
remain future work; backend device-loss recovery belongs to the engine
|
|
269
|
-
realization contract. See the [roadmap](../roadmap.md).
|
|
270
|
-
|
|
271
|
-
## Related documentation
|
|
272
|
-
|
|
273
|
-
- [Resource lifecycle concepts](../concepts/resource-lifecycle.md)
|
|
274
|
-
- [Candidate-first atomic reload](../reference/reload.md)
|
|
275
|
-
- [Queues and the Wait fence](../reference/queues.md)
|
|
1
|
+
# MotherLode identity, cache, and retention
|
|
2
|
+
|
|
3
|
+
Status: Evolving
|
|
4
|
+
Scope: `@carbonenginejs/runtime-resource`
|
|
5
|
+
Audience: Users and integrators
|
|
6
|
+
Summary: Defines canonical resource identity, ownership and replacement, the recorded-byte cache, payload retention, read-cache provenance, and purge contracts.
|
|
7
|
+
|
|
8
|
+
## Canonical identity
|
|
9
|
+
|
|
10
|
+
Canonical resource identity is the normalized source path plus its promised
|
|
11
|
+
output tag. `variant` is the explicit tag; otherwise `emit`, `requirement`, or
|
|
12
|
+
`payload` supplies it. Human-readable identities are written as
|
|
13
|
+
`res:/ship.gr2@cmf`, although MotherLode uses an internal delimiter. Reader,
|
|
14
|
+
constructor, and format-option implementations never enter the key. CjsLibrary
|
|
15
|
+
chooses the promised output and ResMan executes the current setup-time format
|
|
16
|
+
registration for it.
|
|
17
|
+
|
|
18
|
+
Output selection is case-insensitive for identity and matching, but format
|
|
19
|
+
readers receive the canonical declared spelling (for example `cmfJson`). A
|
|
20
|
+
legacy direct object loader exposes only its unforced default; named output
|
|
21
|
+
variants belong on a format class. Unsupported `@output` requests fail before
|
|
22
|
+
cache lookup, so a resident handle cannot bypass the declaration.
|
|
23
|
+
|
|
24
|
+
The selected constructor, reader, and format defaults/options are setup-time
|
|
25
|
+
execution details, not MotherLode identity. A changed registration does not
|
|
26
|
+
create a hidden second resource; reset the affected identity
|
|
27
|
+
(`Delete`/`Clear`) or create a new manager. A changed output contract must use
|
|
28
|
+
a new tag such as `@cmf2`.
|
|
29
|
+
|
|
30
|
+
Do not restore a hidden execution-plan identity through function fingerprints,
|
|
31
|
+
arbitrary option serialization, `buildKey`, or `buildVersion`. Those details
|
|
32
|
+
cannot create a second canonical resource behind the same public path/output
|
|
33
|
+
promise. A materially different promised result requires an explicit output
|
|
34
|
+
tag.
|
|
35
|
+
|
|
36
|
+
## Ownership and replacement
|
|
37
|
+
|
|
38
|
+
`CjsResMan` resolves each normalized path and promised output to one canonical
|
|
39
|
+
MotherLode key. `Insert(key, resource, options)` reports `{ inserted,
|
|
40
|
+
replaced, displaced }`; replacement, deletion, clearing, and shutdown destroy
|
|
41
|
+
attached adapter allocations and release the complete CPU payload by default.
|
|
42
|
+
Callers that deliberately retain ownership may pass `{ cleanup: false }` and
|
|
43
|
+
keep the returned displaced resource. If replacement cleanup fails, insertion
|
|
44
|
+
throws a contextual error and leaves the existing owner registered. These
|
|
45
|
+
ordinary ownership removals preserve the handle's last resource state;
|
|
46
|
+
`PURGED` is reserved for successful policy eviction through inactivity or
|
|
47
|
+
byte pressure.
|
|
48
|
+
|
|
49
|
+
`PURGED` is not terminal for the handle. Purge deletes the payload, but the
|
|
50
|
+
handle revives itself: `IsGood()` renews activity through `KeepAlive()`, and
|
|
51
|
+
`KeepAlive()` reloads a purged resource along the ordinary first-load path. A
|
|
52
|
+
consumer therefore never learns that a purge happened and never manages
|
|
53
|
+
retention itself - it asks whether the resource is good, and that question is
|
|
54
|
+
what keeps it, or brings it back.
|
|
55
|
+
|
|
56
|
+
Liveness follows visibility. Something being drawn is asked about every frame
|
|
57
|
+
and stays live; something that stops being drawn stops being renewed, ages out,
|
|
58
|
+
and has its memory reclaimed; when it is drawn again the next `IsGood()`
|
|
59
|
+
restores it. `Reload()` is bounded by `maxReloadAttempts` precisely because the
|
|
60
|
+
render path calls this every frame, so one permanently missing resource cannot
|
|
61
|
+
become a retry storm. A reload refills the exact handle the consumer holds
|
|
62
|
+
rather than resolving whatever the manager currently caches for that path,
|
|
63
|
+
because a consumer holding a purged handle has no way to discover a
|
|
64
|
+
replacement.
|
|
65
|
+
|
|
66
|
+
`Startup()` and `Shutdown()` are idempotent. `HasKey`, `Lookup`, `Delete`,
|
|
67
|
+
`GetKeys`, `GetValues`, `GetSize`, `SetCacheSize`, `GetCacheSize`, `GetStats`,
|
|
68
|
+
`TrimCache`, `ReplaceExpected`, `Clear`, and `ClearCached` provide the
|
|
69
|
+
Carbon-shaped cache vocabulary plus the exact-owner compare-and-swap required
|
|
70
|
+
by staged JavaScript reload. The old `Has`, `GetCount`, and `DeleteAll` names
|
|
71
|
+
remain temporary compatibility aliases.
|
|
72
|
+
|
|
73
|
+
## Recorded-byte cache
|
|
74
|
+
|
|
75
|
+
Carbon can infer when only its cache retains a resource through
|
|
76
|
+
weak-reference and refcount transitions. JavaScript cannot reproduce that
|
|
77
|
+
ownership test reliably, so `CjsMotherLode` budgets only entries that a caller
|
|
78
|
+
explicitly classifies with `{ cached: true, bytes }`; JavaScript reachability
|
|
79
|
+
is never inferred. The byte value is an exact caller-supplied safe-integer
|
|
80
|
+
eviction weight, not a heuristic walk of the resource graph; runtime-resource
|
|
81
|
+
does not walk arbitrary cyclic/shared object graphs or invoke payload getters
|
|
82
|
+
to guess size.
|
|
83
|
+
|
|
84
|
+
Explicit cached entries receive a monotonic admission sequence. With default
|
|
85
|
+
cleanup, `TrimCache(options)` destroys adapters, releases payloads, detaches
|
|
86
|
+
lifecycle callbacks, marks compatible handles `PURGED`, and removes
|
|
87
|
+
positive-byte cached identities in oldest-admission order until
|
|
88
|
+
`cacheBytes <= cacheSize`. Live, locked, `cacheable: false`, and zero-byte
|
|
89
|
+
entries do not create pressure. `KeepAlive()` and `Lock()` promote a cached
|
|
90
|
+
record to live; `Unlock()` does not silently re-admit it.
|
|
91
|
+
|
|
92
|
+
`SetCacheSize(bytes, options)` installs and immediately enforces the new
|
|
93
|
+
budget. `CjsResMan.Update()` and `Tick()` retry cache housekeeping after
|
|
94
|
+
pumping queues; `{ cache: false }` skips it for one update without changing
|
|
95
|
+
policy. Cleanup is transactional per identity: a failed candidate remains
|
|
96
|
+
canonical, later candidates are still attempted, and the aggregate
|
|
97
|
+
`CJS_MOTHERLODE_CACHE_TRIM_FAILED` error carries successful evictions and any
|
|
98
|
+
remaining over-budget state. Trimming never reads, prepares, or reloads data.
|
|
99
|
+
|
|
100
|
+
## Payload retention
|
|
101
|
+
|
|
102
|
+
Reader and converter outputs are plain transient payload objects, not resource
|
|
103
|
+
classes or DTO models. A payload may contain more decoded data than a
|
|
104
|
+
particular resource or engine adapter needs. Each concrete resource validates
|
|
105
|
+
the fields it requires before publishing the payload and retains the scalars
|
|
106
|
+
and references it needs. An adapter may retain additional references in
|
|
107
|
+
adapter-owned state. Referencing payload-owned typed arrays is valid and
|
|
108
|
+
preferable to copying them merely to change ownership.
|
|
109
|
+
|
|
110
|
+
The lifecycle treats resource residency and payload residency independently:
|
|
111
|
+
|
|
112
|
+
```text
|
|
113
|
+
resource.KeepAlive()
|
|
114
|
+
-> renew resource/cache residency
|
|
115
|
+
|
|
116
|
+
resource.KeepPayloadAlive()
|
|
117
|
+
-> renew the attached payload lease
|
|
118
|
+
|
|
119
|
+
resource.ReleasePayload()
|
|
120
|
+
-> explicitly release the full payload reference
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
`CjsResMan` binds resource-facing `KeepAlive()`, `KeepPayloadAlive()`,
|
|
124
|
+
`Lock()`, and `Unlock()` to the resource's canonical MotherLode key.
|
|
125
|
+
`SetPayload()` renews both identity and payload activity when it publishes a
|
|
126
|
+
non-null payload. `GetPayload()`, `HasPayload()`, `IsPrepared()`, and other
|
|
127
|
+
state/payload queries are pure; reading the payload does not implicitly renew
|
|
128
|
+
its lease. `IsGood()` is the deliberate exception: it calls `KeepAlive()`,
|
|
129
|
+
renewing this handle and starting its bounded reload path when it is `PURGED`.
|
|
130
|
+
It does not recursively traverse or renew child resources.
|
|
131
|
+
|
|
132
|
+
A handle detached by ordinary ownership removal has no live MotherLode
|
|
133
|
+
controller. A purged handle retains the reload hook needed to re-register and
|
|
134
|
+
refill that exact handle, so `IsGood()`/`KeepAlive()` can recover it as
|
|
135
|
+
described under [Ownership and replacement](#ownership-and-replacement).
|
|
136
|
+
|
|
137
|
+
A released CPU payload retains only the small request needed to reconstruct
|
|
138
|
+
that same path/output from its source and `sourceRevision`. The retained
|
|
139
|
+
promised-output fields and source provenance win over later
|
|
140
|
+
`Ready()`/`GetObject()` overrides, while cache/reload policy remains per-call.
|
|
141
|
+
Payload leases protect active consumers; an engine may release its own backend
|
|
142
|
+
adapter without destroying shared CPU data.
|
|
143
|
+
|
|
144
|
+
Both semantic and generic/base resource results use the payload slot: the
|
|
145
|
+
manager stores the complete result through `SetPayload()` and mirrors it on
|
|
146
|
+
the compatibility `object` property for base resources. Payload release clears
|
|
147
|
+
that alias only while it still identifies the released value. Semantic
|
|
148
|
+
resources continue to expose `object === resource` while holding their
|
|
149
|
+
validated plain payload privately.
|
|
150
|
+
|
|
151
|
+
Object-operation promises are retained only while in flight. Concurrent
|
|
152
|
+
`GetObject()`/`Ready()` calls share one operation; a resident result is
|
|
153
|
+
returned without source work and renews the explicit payload lease.
|
|
154
|
+
Settlement removes the operation record so its result graph can be reclaimed
|
|
155
|
+
and a failure can be retried. After payload release, only a new explicit
|
|
156
|
+
object/readiness call reconstructs it; queries, lease calls, and purge sweeps
|
|
157
|
+
do not.
|
|
158
|
+
|
|
159
|
+
The processor preparing a resource decides when the full payload can be
|
|
160
|
+
released:
|
|
161
|
+
|
|
162
|
+
```text
|
|
163
|
+
format reader -> plain payload -> resource validation + adapter prepare
|
|
164
|
+
|
|
|
165
|
+
+-> resource retains required values/references
|
|
166
|
+
+-> adapter retains adapter-specific state/references
|
|
167
|
+
+-> release payload after successful preparation
|
|
168
|
+
`-> or renew its lease for deferred/further work
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
A time- or frame-based lease is a fallback against abandoned payloads. An
|
|
172
|
+
owner performing deferred work can renew the lease. If an expired payload is
|
|
173
|
+
required again, the caller must explicitly request reconstruction; lease
|
|
174
|
+
renewal and purging never fetch or reload source data. Dynamic or
|
|
175
|
+
non-reloadable resources must remain locked, retain the required payload, or
|
|
176
|
+
be able to recreate it.
|
|
177
|
+
|
|
178
|
+
Payload references are shared read-only by default. Preparing WebGL and
|
|
179
|
+
WebGPU adapters side by side should normally pass the same payload to both
|
|
180
|
+
consumers and retain it until both have finished. Copying is an explicit
|
|
181
|
+
consumer operation, justified when a consumer must mutate data, transfer and
|
|
182
|
+
detach an `ArrayBuffer`, or retain an independently writable snapshot. The
|
|
183
|
+
consumer should copy only the fields it requires; runtime-resource does not
|
|
184
|
+
automatically deep-clone payload or typed-array bundles.
|
|
185
|
+
|
|
186
|
+
## Read-cache provenance
|
|
187
|
+
|
|
188
|
+
Source and parsed-format caches use explicit provenance, separate from
|
|
189
|
+
path/output resource identity. `sourceRevision` is an opaque caller/source-
|
|
190
|
+
supplied string or finite number identifying source content for one source
|
|
191
|
+
object and normalized path. It scopes read caches only; it does not alter
|
|
192
|
+
MotherLode resource identity, and changing it does not replace a resident
|
|
193
|
+
payload without `reload: true`. Source and format records do not share across
|
|
194
|
+
revisions.
|
|
195
|
+
|
|
196
|
+
`cacheSource` and `cacheFormat` are tri-state per-call policies:
|
|
197
|
+
|
|
198
|
+
- omitted: share in-flight or explicitly retained work, then drop a newly
|
|
199
|
+
completed record;
|
|
200
|
+
- `true`: share and retain success; a joining caller upgrades the record;
|
|
201
|
+
- `false`: bypass sharing and retention.
|
|
202
|
+
|
|
203
|
+
Failures are never retained. Format records are additionally isolated by
|
|
204
|
+
selected source object, frozen registration descriptor, revision, and
|
|
205
|
+
effective format options, so another source or a re-registered default cannot
|
|
206
|
+
reuse a stale parse. Re-registering a format with new defaults therefore
|
|
207
|
+
cannot reuse an old descriptor's parse. Registered defaults are copied into
|
|
208
|
+
deeply frozen plain-object/array snapshots. Material format options that
|
|
209
|
+
cannot be represented safely (for example class instances with hidden mutable
|
|
210
|
+
state) bypass format-cache sharing instead of risking a false match;
|
|
211
|
+
functions and byte views use cache-local identity plus visible byte content
|
|
212
|
+
where applicable.
|
|
213
|
+
|
|
214
|
+
A resource loader retains the effective selected source and `sourceRevision`
|
|
215
|
+
for reconstruction, including the manager default selected at creation, but
|
|
216
|
+
not cache flags or one-shot reload.
|
|
217
|
+
|
|
218
|
+
## Explicit and automatic purging
|
|
219
|
+
|
|
220
|
+
`PurgeInactive(options)` performs an explicit deterministic sweep using
|
|
221
|
+
independent identity and payload frame/time limits. Locks skip both forms of
|
|
222
|
+
eviction. Identity expiry destroys adapter resources, releases the payload,
|
|
223
|
+
detaches lifecycle callbacks, marks compatible handles `PURGED`, and removes
|
|
224
|
+
the canonical key; payload expiry calls `ReleasePayload()` while retaining
|
|
225
|
+
identity and adapter allocations. Candidate failures are aggregated after the
|
|
226
|
+
sweep has continued over other entries. A sweep never fetches, prepares, or
|
|
227
|
+
reloads a resource.
|
|
228
|
+
|
|
229
|
+
Automatic scheduling is available only when a caller supplies
|
|
230
|
+
`autoPurgePolicy` to the constructor/`Register()` or calls
|
|
231
|
+
`SetAutoPurgePolicy()`. It is disabled by default and deliberately accepts
|
|
232
|
+
only millisecond limits: MotherLode activity frames count explicit
|
|
233
|
+
observations and are not renderer frames. A policy must set at least one of
|
|
234
|
+
`maxIdleMilliseconds` or `payloadMaxIdleMilliseconds`;
|
|
235
|
+
`intervalMilliseconds` defaults to 1000. The first
|
|
236
|
+
`PumpAutoPurge()`/`Update()` after configuration sweeps immediately, then the
|
|
237
|
+
interval sets the minimum cadence. `Update({ purge: false })` suppresses a
|
|
238
|
+
sweep for one update without changing cadence. A regressing clock rebases and
|
|
239
|
+
skips one pump; custom deterministic clocks should be shared with MotherLode.
|
|
240
|
+
Recorded-byte cache trimming is separate from this opt-in inactivity policy
|
|
241
|
+
and runs on ordinary updates unless `{ cache: false }` is supplied.
|
|
242
|
+
|
|
243
|
+
```js
|
|
244
|
+
const resMan = new CjsResMan({
|
|
245
|
+
source,
|
|
246
|
+
autoPurgePolicy: {
|
|
247
|
+
intervalMilliseconds: 1000,
|
|
248
|
+
maxIdleMilliseconds: 60_000,
|
|
249
|
+
payloadMaxIdleMilliseconds: 10_000
|
|
250
|
+
}
|
|
251
|
+
});
|
|
252
|
+
|
|
253
|
+
resMan.Update();
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
Both queued `QueueResourceObject()` work and direct `LoadResourceObject()`
|
|
257
|
+
work hold one manager-owned lock from request/loading publication through
|
|
258
|
+
success or failure. The lock is balanced independently of caller locks, so
|
|
259
|
+
automatic or manual sweeps cannot detach a handle while its read/prepare
|
|
260
|
+
operation is still active. Lock release is conditional on the same captured
|
|
261
|
+
ownership generation, so stale work cannot decrement a newly rebound handle's
|
|
262
|
+
lock. Scheduling and active-work protection do not fetch or reload data.
|
|
263
|
+
|
|
264
|
+
Cache trimming and automatic inactivity sweeps never fetch or reload as part
|
|
265
|
+
of the sweep itself. A later `IsGood()`/`KeepAlive()` call may recover the
|
|
266
|
+
purged handle through its bounded reload path. Application retention defaults,
|
|
267
|
+
automatic resource/payload byte estimation, and separate CPU/adapter budgets
|
|
268
|
+
remain future work; backend device-loss recovery belongs to the engine
|
|
269
|
+
realization contract. See the [roadmap](../roadmap.md).
|
|
270
|
+
|
|
271
|
+
## Related documentation
|
|
272
|
+
|
|
273
|
+
- [Resource lifecycle concepts](../concepts/resource-lifecycle.md)
|
|
274
|
+
- [Candidate-first atomic reload](../reference/reload.md)
|
|
275
|
+
- [Queues and the Wait fence](../reference/queues.md)
|