@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,111 +1,111 @@
|
|
|
1
|
-
# Shader resource model
|
|
2
|
-
|
|
3
|
-
Status: Stable
|
|
4
|
-
Scope: `@carbonenginejs/runtime-resource`, with notes on `@carbonenginejs/runtime-trinity`
|
|
5
|
-
Audience: Anyone touching `Tr2EffectRes`, `Tr2Shader`, `Tr2Effect`, or shader effect formats
|
|
6
|
-
Summary: Explains how one effect file, its permutations, and the objects that resolve them relate.
|
|
7
|
-
|
|
8
|
-
## Three levels
|
|
9
|
-
|
|
10
|
-
The distinction between resource, resolved shader, and effect instance is
|
|
11
|
-
load-bearing:
|
|
12
|
-
|
|
13
|
-
| Level | Represents | Owns |
|
|
14
|
-
| --- | --- | --- |
|
|
15
|
-
| `Tr2EffectRes` | One effect file | Bytes, permutation axes, offset table, and a cache of resolved shaders |
|
|
16
|
-
| `Tr2Shader` | One permutation | Techniques and passes for one option set |
|
|
17
|
-
| `Tr2Effect` | One instance | Authored options, a resource reference, and the currently resolved shader |
|
|
18
|
-
|
|
19
|
-
One file yields many shaders. One shader represents one permutation. Many
|
|
20
|
-
effect instances may share the same resource and cached shader.
|
|
21
|
-
|
|
22
|
-
## Carbon model
|
|
23
|
-
|
|
24
|
-
Carbon's `Tr2EffectRes` retains the whole compiled file, its permutation
|
|
25
|
-
records, and a map from permutation index to `Tr2Shader`. Its
|
|
26
|
-
`GetShader(options, count)` resolves an option tuple to an index and reuses the
|
|
27
|
-
cached shader for that index.
|
|
28
|
-
|
|
29
|
-
`Tr2Effect` inherits the shader pointer from `Tr2Material`. Rebuilding an
|
|
30
|
-
effect clears that pointer and resolves it again through the resource. This
|
|
31
|
-
creates two deliberate caches:
|
|
32
|
-
|
|
33
|
-
- the resource caches one hydrated shader per permutation index; and
|
|
34
|
-
- each effect instance caches its currently resolved pointer.
|
|
35
|
-
|
|
36
|
-
Changing effect options therefore selects another shader from the same loaded
|
|
37
|
-
file rather than loading another file.
|
|
38
|
-
|
|
39
|
-
## Runtime-resource model
|
|
40
|
-
|
|
41
|
-
`runtime-resource/src/resource/shader/Tr2EffectRes.js` follows the same shape:
|
|
42
|
-
|
|
43
|
-
| Carbon | Runtime-resource |
|
|
44
|
-
| --- | --- |
|
|
45
|
-
| shader map keyed by permutation index | private `#shaders` map |
|
|
46
|
-
| `GetShader(options, count)` | option resolution followed by `GetShaderByIndex` |
|
|
47
|
-
| permutation records | `permutationGraph.axes` and `variants` |
|
|
48
|
-
| offset-table body lookup | `CjsCarbonEffectReader` retained by `DoLoad`, read per index |
|
|
49
|
-
| retained file bytes | `GetPayload()` |
|
|
50
|
-
|
|
51
|
-
`runtime-trinity`'s `Tr2Effect.RebuildCachedDataInternal` clears and
|
|
52
|
-
re-resolves its shader through the effect resource. Renderer-owned pipelines,
|
|
53
|
-
bind groups, and GPU handles are not part of this device-free graph.
|
|
54
|
-
|
|
55
|
-
## Package coverage
|
|
56
|
-
|
|
57
|
-
Carbon effect files carry every permutation and select through a dense offset
|
|
58
|
-
table. Representative source files demonstrate why body count and permutation
|
|
59
|
-
count are different:
|
|
60
|
-
|
|
61
|
-
| File | Permutations | Distinct bodies |
|
|
62
|
-
| --- | ---: | ---: |
|
|
63
|
-
| `effect.dx11/.../unpacked_quadv5.sm_hi` | 480 | 144 |
|
|
64
|
-
| `effect.gles2/.../geometryviewer.sm_hi` | 80 | 27 |
|
|
65
|
-
| `effect.gles2/.../textureviewer.sm_hi` | 18 | 3 |
|
|
66
|
-
|
|
67
|
-
Current `.carbonwebgpu` bytes use Carbon's version-15 record layout and retain every
|
|
68
|
-
permutation row and representable non-program description fields, including
|
|
69
|
-
non-dynamic sampler names and the file's authored pass-stage order — Carbon's
|
|
70
|
-
runtime discards both, the file does not. Emitted body dedupe follows exact
|
|
71
|
-
emitted bytes, so it need not preserve the original source alias partition. `mode: "selected"` narrows which body receives translated
|
|
72
|
-
WGSL; it does not discard source permutations. `mode: "all"` attempts every
|
|
73
|
-
distinct body after the resolved selection passes the initial translation gate.
|
|
74
|
-
|
|
75
|
-
`.carbonwebgl` remains its own Carbon WebGL chunk format. Its current package contract also
|
|
76
|
-
preserves complete source permutation topology and supports selected versus
|
|
77
|
-
all backend coverage.
|
|
78
|
-
|
|
79
|
-
The selected/all distinction is therefore backend translation scope, not
|
|
80
|
-
source cardinality. A resource can still reason about every option tuple even
|
|
81
|
-
when some bodies have no translated backend program.
|
|
82
|
-
|
|
83
|
-
## Current integration boundaries
|
|
84
|
-
|
|
85
|
-
The read path is direct: `Tr2EffectRes.DoLoad` retains a
|
|
86
|
-
`CjsCarbonEffectReader` over the container bytes, and
|
|
87
|
-
`Tr2Shader.fromCarbonBinary(reader, index)` builds the device-free graph from
|
|
88
|
-
one description record. No intermediate document sits between them.
|
|
89
|
-
|
|
90
|
-
What remains unproven is execution, not construction. The presence of every
|
|
91
|
-
permutation proves source preservation; it does not prove a rendered result.
|
|
92
|
-
|
|
93
|
-
## Reading the model without inventing gaps
|
|
94
|
-
|
|
95
|
-
Three recurring mistakes explain most false conclusions in this area:
|
|
96
|
-
|
|
97
|
-
1. **Searching only one package.** `Tr2EffectRes` is in runtime-resource while
|
|
98
|
-
`Tr2Effect` is in runtime-trinity.
|
|
99
|
-
2. **Searching only the derived class.** The effect's shader pointer is
|
|
100
|
-
declared on its `Tr2Material` base.
|
|
101
|
-
3. **Confusing permutation rows with stored bodies.** Several rows may alias
|
|
102
|
-
one description body while remaining distinct option selections.
|
|
103
|
-
|
|
104
|
-
When an expected mechanism appears absent, check the owner package, base
|
|
105
|
-
classes, and record indirection before treating the absence as a design gap.
|
|
106
|
-
|
|
107
|
-
## Related documentation
|
|
108
|
-
|
|
109
|
-
- [Carbon WebGPU effect container](../formats/webgpu/formats/carbon-webgpu.md)
|
|
110
|
-
- [Carbon compiled-effect container](../formats/carbon-effect-container.md)
|
|
111
|
-
- [WebGPU effect packaging](../formats/webgpu/guides/effect-packaging.md)
|
|
1
|
+
# Shader resource model
|
|
2
|
+
|
|
3
|
+
Status: Stable
|
|
4
|
+
Scope: `@carbonenginejs/runtime-resource`, with notes on `@carbonenginejs/runtime-trinity`
|
|
5
|
+
Audience: Anyone touching `Tr2EffectRes`, `Tr2Shader`, `Tr2Effect`, or shader effect formats
|
|
6
|
+
Summary: Explains how one effect file, its permutations, and the objects that resolve them relate.
|
|
7
|
+
|
|
8
|
+
## Three levels
|
|
9
|
+
|
|
10
|
+
The distinction between resource, resolved shader, and effect instance is
|
|
11
|
+
load-bearing:
|
|
12
|
+
|
|
13
|
+
| Level | Represents | Owns |
|
|
14
|
+
| --- | --- | --- |
|
|
15
|
+
| `Tr2EffectRes` | One effect file | Bytes, permutation axes, offset table, and a cache of resolved shaders |
|
|
16
|
+
| `Tr2Shader` | One permutation | Techniques and passes for one option set |
|
|
17
|
+
| `Tr2Effect` | One instance | Authored options, a resource reference, and the currently resolved shader |
|
|
18
|
+
|
|
19
|
+
One file yields many shaders. One shader represents one permutation. Many
|
|
20
|
+
effect instances may share the same resource and cached shader.
|
|
21
|
+
|
|
22
|
+
## Carbon model
|
|
23
|
+
|
|
24
|
+
Carbon's `Tr2EffectRes` retains the whole compiled file, its permutation
|
|
25
|
+
records, and a map from permutation index to `Tr2Shader`. Its
|
|
26
|
+
`GetShader(options, count)` resolves an option tuple to an index and reuses the
|
|
27
|
+
cached shader for that index.
|
|
28
|
+
|
|
29
|
+
`Tr2Effect` inherits the shader pointer from `Tr2Material`. Rebuilding an
|
|
30
|
+
effect clears that pointer and resolves it again through the resource. This
|
|
31
|
+
creates two deliberate caches:
|
|
32
|
+
|
|
33
|
+
- the resource caches one hydrated shader per permutation index; and
|
|
34
|
+
- each effect instance caches its currently resolved pointer.
|
|
35
|
+
|
|
36
|
+
Changing effect options therefore selects another shader from the same loaded
|
|
37
|
+
file rather than loading another file.
|
|
38
|
+
|
|
39
|
+
## Runtime-resource model
|
|
40
|
+
|
|
41
|
+
`runtime-resource/src/resource/shader/Tr2EffectRes.js` follows the same shape:
|
|
42
|
+
|
|
43
|
+
| Carbon | Runtime-resource |
|
|
44
|
+
| --- | --- |
|
|
45
|
+
| shader map keyed by permutation index | private `#shaders` map |
|
|
46
|
+
| `GetShader(options, count)` | option resolution followed by `GetShaderByIndex` |
|
|
47
|
+
| permutation records | `permutationGraph.axes` and `variants` |
|
|
48
|
+
| offset-table body lookup | `CjsCarbonEffectReader` retained by `DoLoad`, read per index |
|
|
49
|
+
| retained file bytes | `GetPayload()` |
|
|
50
|
+
|
|
51
|
+
`runtime-trinity`'s `Tr2Effect.RebuildCachedDataInternal` clears and
|
|
52
|
+
re-resolves its shader through the effect resource. Renderer-owned pipelines,
|
|
53
|
+
bind groups, and GPU handles are not part of this device-free graph.
|
|
54
|
+
|
|
55
|
+
## Package coverage
|
|
56
|
+
|
|
57
|
+
Carbon effect files carry every permutation and select through a dense offset
|
|
58
|
+
table. Representative source files demonstrate why body count and permutation
|
|
59
|
+
count are different:
|
|
60
|
+
|
|
61
|
+
| File | Permutations | Distinct bodies |
|
|
62
|
+
| --- | ---: | ---: |
|
|
63
|
+
| `effect.dx11/.../unpacked_quadv5.sm_hi` | 480 | 144 |
|
|
64
|
+
| `effect.gles2/.../geometryviewer.sm_hi` | 80 | 27 |
|
|
65
|
+
| `effect.gles2/.../textureviewer.sm_hi` | 18 | 3 |
|
|
66
|
+
|
|
67
|
+
Current `.carbonwebgpu` bytes use Carbon's version-15 record layout and retain every
|
|
68
|
+
permutation row and representable non-program description fields, including
|
|
69
|
+
non-dynamic sampler names and the file's authored pass-stage order — Carbon's
|
|
70
|
+
runtime discards both, the file does not. Emitted body dedupe follows exact
|
|
71
|
+
emitted bytes, so it need not preserve the original source alias partition. `mode: "selected"` narrows which body receives translated
|
|
72
|
+
WGSL; it does not discard source permutations. `mode: "all"` attempts every
|
|
73
|
+
distinct body after the resolved selection passes the initial translation gate.
|
|
74
|
+
|
|
75
|
+
`.carbonwebgl` remains its own Carbon WebGL chunk format. Its current package contract also
|
|
76
|
+
preserves complete source permutation topology and supports selected versus
|
|
77
|
+
all backend coverage.
|
|
78
|
+
|
|
79
|
+
The selected/all distinction is therefore backend translation scope, not
|
|
80
|
+
source cardinality. A resource can still reason about every option tuple even
|
|
81
|
+
when some bodies have no translated backend program.
|
|
82
|
+
|
|
83
|
+
## Current integration boundaries
|
|
84
|
+
|
|
85
|
+
The read path is direct: `Tr2EffectRes.DoLoad` retains a
|
|
86
|
+
`CjsCarbonEffectReader` over the container bytes, and
|
|
87
|
+
`Tr2Shader.fromCarbonBinary(reader, index)` builds the device-free graph from
|
|
88
|
+
one description record. No intermediate document sits between them.
|
|
89
|
+
|
|
90
|
+
What remains unproven is execution, not construction. The presence of every
|
|
91
|
+
permutation proves source preservation; it does not prove a rendered result.
|
|
92
|
+
|
|
93
|
+
## Reading the model without inventing gaps
|
|
94
|
+
|
|
95
|
+
Three recurring mistakes explain most false conclusions in this area:
|
|
96
|
+
|
|
97
|
+
1. **Searching only one package.** `Tr2EffectRes` is in runtime-resource while
|
|
98
|
+
`Tr2Effect` is in runtime-trinity.
|
|
99
|
+
2. **Searching only the derived class.** The effect's shader pointer is
|
|
100
|
+
declared on its `Tr2Material` base.
|
|
101
|
+
3. **Confusing permutation rows with stored bodies.** Several rows may alias
|
|
102
|
+
one description body while remaining distinct option selections.
|
|
103
|
+
|
|
104
|
+
When an expected mechanism appears absent, check the owner package, base
|
|
105
|
+
classes, and record indirection before treating the absence as a design gap.
|
|
106
|
+
|
|
107
|
+
## Related documentation
|
|
108
|
+
|
|
109
|
+
- [Carbon WebGPU effect container](../formats/webgpu/formats/carbon-webgpu.md)
|
|
110
|
+
- [Carbon compiled-effect container](../formats/carbon-effect-container.md)
|
|
111
|
+
- [WebGPU effect packaging](../formats/webgpu/guides/effect-packaging.md)
|
|
@@ -1,115 +1,115 @@
|
|
|
1
|
-
# Writing an engine adapter
|
|
2
|
-
|
|
3
|
-
Status: Stable
|
|
4
|
-
Scope: `@carbonenginejs/runtime-resource`, addressed to engine packages
|
|
5
|
-
Audience: Anyone building `engine-webgl`, a second WebGPU engine, or any package that realizes CPU payloads into backend objects
|
|
6
|
-
Summary: The coupling rules, the reflection/topology seam, and the two mistakes `engine-webgpu` already made that a second engine must not repeat.
|
|
7
|
-
|
|
8
|
-
## Read this before writing a second engine
|
|
9
|
-
|
|
10
|
-
`engine-webgpu` is currently the only engine package. Most of its shape is right
|
|
11
|
-
and worth copying. Two things are not, and both are easier to avoid than to undo.
|
|
12
|
-
This document exists because the second engine is being written after the first
|
|
13
|
-
one's mistakes were diagnosed but before they were fixed.
|
|
14
|
-
|
|
15
|
-
## The coupling rule
|
|
16
|
-
|
|
17
|
-
**Engine packages take functions and duck-typed objects. They do not import the
|
|
18
|
-
layers above or beside them.**
|
|
19
|
-
|
|
20
|
-
`engine-webgpu` declares this as a non-goal and holds it: no dependency on
|
|
21
|
-
`runtime-core`, `runtime-resource`, or `runtime-trinity`. Three existing seams
|
|
22
|
-
show the pattern, and a new engine should reach for one of them rather than
|
|
23
|
-
inventing a fourth:
|
|
24
|
-
|
|
25
|
-
| seam | shape |
|
|
26
|
-
|---|---|
|
|
27
|
-
| `CjsWebGPUPackage.fromBytes(bytes, { read })` | the format reader arrives as a **function** |
|
|
28
|
-
| `CjsWebGPUTrinityBatchDispatcher(hooks)` | `ResolveMaterial` / `ResolveBindings` arrive as **hooks**; the batch is duck-typed on the `Tr2RenderBatch` shape |
|
|
29
|
-
| `CjsTextureArrayRes` | the engine calls `ConsumeUpdateRequest()`, prepares a candidate, then `CommitPreparedAdapterRevision()` — **the resource layer owns the state machine and never holds engine code** |
|
|
30
|
-
|
|
31
|
-
The third is the most instructive. Realization is not a callback the resource
|
|
32
|
-
layer fires into the engine; it is a request the engine consumes and a commit it
|
|
33
|
-
returns. The engine drives its own frame, which is what an engine must do, while
|
|
34
|
-
the resource layer keeps the queue, the revisions, and the failure handling.
|
|
35
|
-
|
|
36
|
-
## What the resource layer owns
|
|
37
|
-
|
|
38
|
-
Resource identity, the cache, CPU payload lifecycle, format selection, the
|
|
39
|
-
load/publication queues, and **permutation selection**. It stops at a published
|
|
40
|
-
CPU payload; it hands out objects and accepts commits.
|
|
41
|
-
|
|
42
|
-
It is GPU-free and stays that way. It does not define GPU-shaped interfaces for
|
|
43
|
-
engines to implement, which is precisely why the consume/commit shape is used
|
|
44
|
-
instead of an injected realizer.
|
|
45
|
-
|
|
46
|
-
## The seam: reflection from the shader, topology from the package
|
|
47
|
-
|
|
48
|
-
This is the distinction the first engine got wrong.
|
|
49
|
-
|
|
50
|
-
**Carbon reflection belongs to `Tr2Shader`.** One file yields many shaders, one
|
|
51
|
-
shader is one permutation, and many effects share them — see
|
|
52
|
-
[shader-resource-model.md](shader-resource-model.md). The surface is
|
|
53
|
-
`GetConstant(name)`, `GetResource(name)`, `GetParameterAnnotations(parameterName)`,
|
|
54
|
-
`GetEffectDescription()` and `iterateStages()`, reachable through
|
|
55
|
-
`Tr2EffectRes.DoLoad(bytes)` -> `Tr2Shader.fromCarbonBinary(reader, index)`.
|
|
56
|
-
|
|
57
|
-
**Backend binding topology belongs to the package**, because it has no Carbon
|
|
58
|
-
counterpart — it comes from the lowered IR, not from Carbon's D3D-era reflection.
|
|
59
|
-
|
|
60
|
-
| ask the shader | ask the package |
|
|
61
|
-
|---|---|
|
|
62
|
-
| `constants[].{name, offset, size}` | `group`, `binding`, `visibility` |
|
|
63
|
-
| resource `type`, `isSRGB` | `generatedSymbol`, `resourceKind` |
|
|
64
|
-
| annotations | `registerIndex`, `registerSpace` |
|
|
65
|
-
| the parameter's name | `viewDimension` |
|
|
66
|
-
|
|
67
|
-
If you find yourself wanting *richer package reflection*, you are on the wrong
|
|
68
|
-
side of this table. The data you want is on the shader, and it is there because
|
|
69
|
-
Carbon put it there.
|
|
70
|
-
|
|
71
|
-
## The two mistakes not to copy
|
|
72
|
-
|
|
73
|
-
### 1. Do not read format-package records for Carbon reflection
|
|
74
|
-
|
|
75
|
-
`engine-webgpu/src/core/packageHelpers.js` and
|
|
76
|
-
`src/core/spaceObjectMainBindings.js` read `metadataName`, `heapView`,
|
|
77
|
-
`carbon.type`, `carbon.isSRGB` and `carbon.constants[].{name, offset, size}`
|
|
78
|
-
directly out of the format package, to pack real material uniform bytes. Twelve
|
|
79
|
-
lines, two files, and a known layering defect: engine code must consume the
|
|
80
|
-
resource-owned `Tr2Shader` reflection graph rather than make format-package
|
|
81
|
-
records its material API.
|
|
82
|
-
|
|
83
|
-
It is deferred rather than fixed because nothing can use that path until the
|
|
84
|
-
shader work lands, so the break is theoretical. That is a reason not to rush it,
|
|
85
|
-
not a reason to reproduce it.
|
|
86
|
-
|
|
87
|
-
### 2. Do not reimplement permutation selection
|
|
88
|
-
|
|
89
|
-
`Tr2EffectRes` already keeps a permutation-index-keyed shader cache and resolves
|
|
90
|
-
options through it — Carbon's own mechanism, and ours matches. An engine that
|
|
91
|
-
grows its own index-keyed resolution is writing a second copy of a tested thing.
|
|
92
|
-
|
|
93
|
-
Building pipelines, bind groups and GPU objects is **not** duplication; that is
|
|
94
|
-
the engine's whole job. The line falls exactly where the table above falls.
|
|
95
|
-
|
|
96
|
-
## runtime-core is optional
|
|
97
|
-
|
|
98
|
-
`runtime-core` wires named services by default — `RegisterResourceBehavior`
|
|
99
|
-
registers "a structural request policy without importing its owner", and the
|
|
100
|
-
resource manager, space-object factory and audio manager register the same way.
|
|
101
|
-
It is a convenience wrapper, not a dependency.
|
|
102
|
-
|
|
103
|
-
Every hook it registers can be passed by hand. An engine that only works when
|
|
104
|
-
`runtime-core` is present has taken a dependency through the back door.
|
|
105
|
-
|
|
106
|
-
## Checklist for a new engine package
|
|
107
|
-
|
|
108
|
-
- no imports of `runtime-core`, `runtime-resource`, or `runtime-trinity`
|
|
109
|
-
- readers, material resolvers and batch shapes arrive injected or duck-typed
|
|
110
|
-
- Carbon reflection is read from a shader object handed in, never from format
|
|
111
|
-
records
|
|
112
|
-
- permutation selection is asked for, never reimplemented
|
|
113
|
-
- long-lived state machines and queues stay in the resource layer; the engine
|
|
114
|
-
consumes requests and commits results
|
|
115
|
-
- the package works with `runtime-core` absent
|
|
1
|
+
# Writing an engine adapter
|
|
2
|
+
|
|
3
|
+
Status: Stable
|
|
4
|
+
Scope: `@carbonenginejs/runtime-resource`, addressed to engine packages
|
|
5
|
+
Audience: Anyone building `engine-webgl`, a second WebGPU engine, or any package that realizes CPU payloads into backend objects
|
|
6
|
+
Summary: The coupling rules, the reflection/topology seam, and the two mistakes `engine-webgpu` already made that a second engine must not repeat.
|
|
7
|
+
|
|
8
|
+
## Read this before writing a second engine
|
|
9
|
+
|
|
10
|
+
`engine-webgpu` is currently the only engine package. Most of its shape is right
|
|
11
|
+
and worth copying. Two things are not, and both are easier to avoid than to undo.
|
|
12
|
+
This document exists because the second engine is being written after the first
|
|
13
|
+
one's mistakes were diagnosed but before they were fixed.
|
|
14
|
+
|
|
15
|
+
## The coupling rule
|
|
16
|
+
|
|
17
|
+
**Engine packages take functions and duck-typed objects. They do not import the
|
|
18
|
+
layers above or beside them.**
|
|
19
|
+
|
|
20
|
+
`engine-webgpu` declares this as a non-goal and holds it: no dependency on
|
|
21
|
+
`runtime-core`, `runtime-resource`, or `runtime-trinity`. Three existing seams
|
|
22
|
+
show the pattern, and a new engine should reach for one of them rather than
|
|
23
|
+
inventing a fourth:
|
|
24
|
+
|
|
25
|
+
| seam | shape |
|
|
26
|
+
|---|---|
|
|
27
|
+
| `CjsWebGPUPackage.fromBytes(bytes, { read })` | the format reader arrives as a **function** |
|
|
28
|
+
| `CjsWebGPUTrinityBatchDispatcher(hooks)` | `ResolveMaterial` / `ResolveBindings` arrive as **hooks**; the batch is duck-typed on the `Tr2RenderBatch` shape |
|
|
29
|
+
| `CjsTextureArrayRes` | the engine calls `ConsumeUpdateRequest()`, prepares a candidate, then `CommitPreparedAdapterRevision()` — **the resource layer owns the state machine and never holds engine code** |
|
|
30
|
+
|
|
31
|
+
The third is the most instructive. Realization is not a callback the resource
|
|
32
|
+
layer fires into the engine; it is a request the engine consumes and a commit it
|
|
33
|
+
returns. The engine drives its own frame, which is what an engine must do, while
|
|
34
|
+
the resource layer keeps the queue, the revisions, and the failure handling.
|
|
35
|
+
|
|
36
|
+
## What the resource layer owns
|
|
37
|
+
|
|
38
|
+
Resource identity, the cache, CPU payload lifecycle, format selection, the
|
|
39
|
+
load/publication queues, and **permutation selection**. It stops at a published
|
|
40
|
+
CPU payload; it hands out objects and accepts commits.
|
|
41
|
+
|
|
42
|
+
It is GPU-free and stays that way. It does not define GPU-shaped interfaces for
|
|
43
|
+
engines to implement, which is precisely why the consume/commit shape is used
|
|
44
|
+
instead of an injected realizer.
|
|
45
|
+
|
|
46
|
+
## The seam: reflection from the shader, topology from the package
|
|
47
|
+
|
|
48
|
+
This is the distinction the first engine got wrong.
|
|
49
|
+
|
|
50
|
+
**Carbon reflection belongs to `Tr2Shader`.** One file yields many shaders, one
|
|
51
|
+
shader is one permutation, and many effects share them — see
|
|
52
|
+
[shader-resource-model.md](shader-resource-model.md). The surface is
|
|
53
|
+
`GetConstant(name)`, `GetResource(name)`, `GetParameterAnnotations(parameterName)`,
|
|
54
|
+
`GetEffectDescription()` and `iterateStages()`, reachable through
|
|
55
|
+
`Tr2EffectRes.DoLoad(bytes)` -> `Tr2Shader.fromCarbonBinary(reader, index)`.
|
|
56
|
+
|
|
57
|
+
**Backend binding topology belongs to the package**, because it has no Carbon
|
|
58
|
+
counterpart — it comes from the lowered IR, not from Carbon's D3D-era reflection.
|
|
59
|
+
|
|
60
|
+
| ask the shader | ask the package |
|
|
61
|
+
|---|---|
|
|
62
|
+
| `constants[].{name, offset, size}` | `group`, `binding`, `visibility` |
|
|
63
|
+
| resource `type`, `isSRGB` | `generatedSymbol`, `resourceKind` |
|
|
64
|
+
| annotations | `registerIndex`, `registerSpace` |
|
|
65
|
+
| the parameter's name | `viewDimension` |
|
|
66
|
+
|
|
67
|
+
If you find yourself wanting *richer package reflection*, you are on the wrong
|
|
68
|
+
side of this table. The data you want is on the shader, and it is there because
|
|
69
|
+
Carbon put it there.
|
|
70
|
+
|
|
71
|
+
## The two mistakes not to copy
|
|
72
|
+
|
|
73
|
+
### 1. Do not read format-package records for Carbon reflection
|
|
74
|
+
|
|
75
|
+
`engine-webgpu/src/core/packageHelpers.js` and
|
|
76
|
+
`src/core/spaceObjectMainBindings.js` read `metadataName`, `heapView`,
|
|
77
|
+
`carbon.type`, `carbon.isSRGB` and `carbon.constants[].{name, offset, size}`
|
|
78
|
+
directly out of the format package, to pack real material uniform bytes. Twelve
|
|
79
|
+
lines, two files, and a known layering defect: engine code must consume the
|
|
80
|
+
resource-owned `Tr2Shader` reflection graph rather than make format-package
|
|
81
|
+
records its material API.
|
|
82
|
+
|
|
83
|
+
It is deferred rather than fixed because nothing can use that path until the
|
|
84
|
+
shader work lands, so the break is theoretical. That is a reason not to rush it,
|
|
85
|
+
not a reason to reproduce it.
|
|
86
|
+
|
|
87
|
+
### 2. Do not reimplement permutation selection
|
|
88
|
+
|
|
89
|
+
`Tr2EffectRes` already keeps a permutation-index-keyed shader cache and resolves
|
|
90
|
+
options through it — Carbon's own mechanism, and ours matches. An engine that
|
|
91
|
+
grows its own index-keyed resolution is writing a second copy of a tested thing.
|
|
92
|
+
|
|
93
|
+
Building pipelines, bind groups and GPU objects is **not** duplication; that is
|
|
94
|
+
the engine's whole job. The line falls exactly where the table above falls.
|
|
95
|
+
|
|
96
|
+
## runtime-core is optional
|
|
97
|
+
|
|
98
|
+
`runtime-core` wires named services by default — `RegisterResourceBehavior`
|
|
99
|
+
registers "a structural request policy without importing its owner", and the
|
|
100
|
+
resource manager, space-object factory and audio manager register the same way.
|
|
101
|
+
It is a convenience wrapper, not a dependency.
|
|
102
|
+
|
|
103
|
+
Every hook it registers can be passed by hand. An engine that only works when
|
|
104
|
+
`runtime-core` is present has taken a dependency through the back door.
|
|
105
|
+
|
|
106
|
+
## Checklist for a new engine package
|
|
107
|
+
|
|
108
|
+
- no imports of `runtime-core`, `runtime-resource`, or `runtime-trinity`
|
|
109
|
+
- readers, material resolvers and batch shapes arrive injected or duck-typed
|
|
110
|
+
- Carbon reflection is read from a shader object handed in, never from format
|
|
111
|
+
records
|
|
112
|
+
- permutation selection is asked for, never reimplemented
|
|
113
|
+
- long-lived state machines and queues stay in the resource layer; the engine
|
|
114
|
+
consumes requests and commits results
|
|
115
|
+
- the package works with `runtime-core` absent
|