@carbonenginejs/runtime-resource 0.12.2 → 0.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -21
- package/NOTICE +32 -32
- package/README.md +129 -108
- package/dist/CjsMotherLode.js +1271 -1271
- package/dist/CjsResMan.js +3858 -3494
- package/dist/CjsResMan.js.map +1 -1
- package/dist/CjsResManFetchProvider.js +94 -94
- package/dist/CjsResManWorkQueue.js +301 -301
- package/dist/_virtual/_rollupPluginBabelHelpers.js +150 -150
- package/dist/format/CjsBlueReader.js +358 -358
- package/dist/format/CjsByteReader.js +310 -310
- package/dist/format/CjsByteWriter.js +242 -242
- package/dist/format/CjsFormat.js +223 -223
- package/dist/format/CjsFormatError.js +41 -41
- package/dist/format/CjsReader.js +22 -22
- package/dist/format/CjsResourceProbe.js +279 -279
- package/dist/format/CjsStringTable.js +268 -268
- package/dist/format/carbonEffect/CjsCarbonEffectReader.js +408 -361
- package/dist/format/carbonEffect/CjsCarbonEffectReader.js.map +1 -1
- package/dist/format/carbonEffect/CjsCarbonEffectWriter.js +373 -373
- package/dist/format/carbonEffect/buildCarbonEffectContainer.js +182 -0
- package/dist/format/carbonEffect/buildCarbonEffectContainer.js.map +1 -0
- package/dist/format/carbonEffect/carbonEffectBackendBlock.js +321 -427
- package/dist/format/carbonEffect/carbonEffectBackendBlock.js.map +1 -1
- package/dist/format/carbonEffect/carbonEffectRecords.js +1147 -955
- package/dist/format/carbonEffect/carbonEffectRecords.js.map +1 -1
- package/dist/format/carbonEffect/carbonEffectResourceTransform.js +197 -0
- package/dist/format/carbonEffect/carbonEffectResourceTransform.js.map +1 -0
- package/dist/format/compareUtf8.js +36 -36
- package/dist/format/effect/effectBodyInventory.js +146 -0
- package/dist/format/effect/effectBodyInventory.js.map +1 -0
- package/dist/format/effect/effectPermutationGraph.js +257 -257
- package/dist/format/effect/effectPermutationGraph.js.map +1 -1
- package/dist/format/effect/sha256.js +114 -114
- package/dist/format/index.js +11 -11
- package/dist/format/payloadContract.js +193 -193
- package/dist/formats/black/CjsBlackFormat.js +310 -292
- package/dist/formats/black/CjsBlackFormat.js.map +1 -1
- package/dist/formats/black/core/CjsBlackBinaryReader.js +260 -260
- package/dist/formats/black/core/CjsBlackPropertyReaders.js +448 -448
- package/dist/formats/black/core/CjsBlackReader.js +764 -764
- package/dist/formats/black/core/CjsBlackSchemaRegistry.js +540 -540
- package/dist/formats/black/core/black-schema-v1-2026-07-23.json.js +4 -4
- package/dist/formats/black/core/blackConstants.js +7 -7
- package/dist/formats/black/core/blackDefinitions.js +10 -10
- package/dist/formats/black/core/blackEnums.js +6 -6
- package/dist/formats/black/core/blackSchema.js +3 -3
- package/dist/formats/black/core/blackVersion.js +22 -22
- package/dist/formats/black/core/helpers.js +199 -199
- package/dist/formats/black/core/schema.js +4 -4
- package/dist/formats/black/index.js +2 -2
- package/dist/formats/bnk/CjsBnkFormat.js +175 -156
- package/dist/formats/bnk/CjsBnkFormat.js.map +1 -1
- package/dist/formats/bnk/core/busNodes.js +252 -0
- package/dist/formats/bnk/core/busNodes.js.map +1 -0
- package/dist/formats/bnk/core/effectNodes.js +147 -0
- package/dist/formats/bnk/core/effectNodes.js.map +1 -0
- package/dist/formats/bnk/core/eventAction.js +416 -305
- package/dist/formats/bnk/core/eventAction.js.map +1 -1
- package/dist/formats/bnk/core/globalSettings.js +215 -0
- package/dist/formats/bnk/core/globalSettings.js.map +1 -0
- package/dist/formats/bnk/core/graph.js +137 -137
- package/dist/formats/bnk/core/helpers.js +512 -480
- package/dist/formats/bnk/core/helpers.js.map +1 -1
- package/dist/formats/bnk/core/musicNodes.js +533 -509
- package/dist/formats/bnk/core/musicNodes.js.map +1 -1
- package/dist/formats/bnk/core/nodeBase.js +553 -532
- package/dist/formats/bnk/core/nodeBase.js.map +1 -1
- package/dist/formats/bnk/core/sfxNodes.js +632 -632
- package/dist/formats/bnk/core/soundbanksInfo.js +209 -209
- package/dist/formats/bnk/index.js +2 -2
- package/dist/formats/cmf/CjsCmfFormat.js +497 -497
- package/dist/formats/cmf/core/binary.js +194 -194
- package/dist/formats/cmf/core/buffers.js +237 -237
- package/dist/formats/cmf/core/constants.js +47 -47
- package/dist/formats/cmf/core/gr2Anim.js +453 -453
- package/dist/formats/cmf/core/helpers.js +318 -318
- package/dist/formats/cmf/core/pack.js +276 -276
- package/dist/formats/cmf/core/schema.js +374 -374
- package/dist/formats/cmf/core/shared.js +277 -277
- package/dist/formats/cmf/core/writer.js +571 -571
- package/dist/formats/cmf/index.js +2 -2
- package/dist/formats/dds/CjsDdsFormat.js +200 -200
- package/dist/formats/dds/core/bc6h.js +298 -298
- package/dist/formats/dds/core/bc7.js +272 -272
- package/dist/formats/dds/core/helpers.js +862 -862
- package/dist/formats/dds/index.js +2 -2
- package/dist/formats/dxbc/CjsDxbcFormat.js +142 -142
- package/dist/formats/dxbc/core/DxbcReader.js +266 -266
- package/dist/formats/dxbc/core/container.js +169 -169
- package/dist/formats/dxbc/core/decoder.js +789 -789
- package/dist/formats/dxbc/core/errors.js +19 -19
- package/dist/formats/dxbc/core/helpers.js +220 -220
- package/dist/formats/dxbc/core/opcodes.js +45 -45
- package/dist/formats/dxbc/core/program.js +91 -91
- package/dist/formats/dxbc/core/signature.js +172 -172
- package/dist/formats/dxbc/index.js +2 -2
- package/dist/formats/fbx/CjsFbxFormat.js +266 -266
- package/dist/formats/fbx/core/helpers.js +3932 -3932
- package/dist/formats/fbx/index.js +2 -2
- package/dist/formats/flac/CjsFlacFormat.js +142 -142
- package/dist/formats/flac/core/helpers.js +315 -315
- package/dist/formats/flac/index.js +2 -2
- package/dist/formats/gif/CjsGifFormat.js +141 -141
- package/dist/formats/gif/core/helpers.js +380 -380
- package/dist/formats/gif/index.js +2 -2
- package/dist/formats/gltf/CjsGltfFormat.js +290 -290
- package/dist/formats/gltf/core/helpers.js +307 -307
- package/dist/formats/gltf/core/json.js +79 -79
- package/dist/formats/gltf/core/parser.js +679 -679
- package/dist/formats/gltf/core/targets.js +173 -173
- package/dist/formats/gltf/index.js +2 -2
- package/dist/formats/gr2/CjsGr2Format.js +289 -289
- package/dist/formats/gr2/core/bitknit2.js +282 -282
- package/dist/formats/gr2/core/curves.js +1047 -1047
- package/dist/formats/gr2/core/gsf.js +72 -72
- package/dist/formats/gr2/core/helpers.js +352 -352
- package/dist/formats/gr2/core/json.js +622 -622
- package/dist/formats/gr2/core/oodle1.js +388 -388
- package/dist/formats/gr2/core/tangents.js +48 -48
- package/dist/formats/gr2/core/targets.js +361 -361
- package/dist/formats/gr2/index.js +2 -2
- package/dist/formats/hlsl/CjsHlslFormat.js +254 -254
- package/dist/formats/hlsl/core/HlslBinaryUtils.js +15 -15
- package/dist/formats/hlsl/core/HlslEffectReadError.js +19 -19
- package/dist/formats/hlsl/core/HlslEffectStateManager.js +130 -130
- package/dist/formats/hlsl/core/HlslRenderStateSetup.js +37 -37
- package/dist/formats/hlsl/core/HlslResourceSetDescription.js +94 -94
- package/dist/formats/hlsl/core/HlslShaderBytecode.js +44 -44
- package/dist/formats/hlsl/core/analysis.js +51 -51
- package/dist/formats/hlsl/core/carbonDescriptionToRuntime.js +850 -781
- package/dist/formats/hlsl/core/carbonDescriptionToRuntime.js.map +1 -1
- package/dist/formats/hlsl/core/detailMapFamily.js +128 -0
- package/dist/formats/hlsl/core/detailMapFamily.js.map +1 -0
- package/dist/formats/hlsl/core/helpers.js +270 -270
- package/dist/formats/hlsl/core/json.js +284 -284
- package/dist/formats/hlsl/core/localLightFamily.js +133 -0
- package/dist/formats/hlsl/core/localLightFamily.js.map +1 -0
- package/dist/formats/hlsl/core/metadata.js +327 -327
- package/dist/formats/hlsl/core/render-states.js +280 -280
- package/dist/formats/hlsl/core/tr2/HlslRenderContextEnum.js +43 -43
- package/dist/formats/hlsl/core/tr2/resources/HlslEffectRes.js +320 -314
- package/dist/formats/hlsl/core/tr2/resources/HlslEffectRes.js.map +1 -1
- package/dist/formats/hlsl/core/tr2/resources/HlslShaderPermutation.js +33 -33
- package/dist/formats/hlsl/core/tr2/shader/HlslEffectBindingManifest.js +416 -416
- package/dist/formats/hlsl/core/tr2/shader/HlslEffectConstant.js +40 -40
- package/dist/formats/hlsl/core/tr2/shader/HlslEffectDescription.js +62 -742
- package/dist/formats/hlsl/core/tr2/shader/HlslEffectDescription.js.map +1 -1
- package/dist/formats/hlsl/core/tr2/shader/HlslEffectLibrary.js +52 -52
- package/dist/formats/hlsl/core/tr2/shader/HlslEffectParameterAnnotation.js +38 -38
- package/dist/formats/hlsl/core/tr2/shader/HlslEffectResource.js +50 -50
- package/dist/formats/hlsl/core/tr2/shader/HlslEffectStageInput.js +86 -86
- package/dist/formats/hlsl/core/tr2/shader/HlslEffectTechnique.js +31 -31
- package/dist/formats/hlsl/core/tr2/shader/HlslPass.js +42 -42
- package/dist/formats/hlsl/core/tr2/shader/HlslSamplerDescription.js +55 -55
- package/dist/formats/hlsl/core/tr2/shader/HlslSamplerSetup.js +29 -29
- package/dist/formats/hlsl/core/tr2/shader/HlslShader.js +220 -220
- package/dist/formats/hlsl/core/tr2/shader/HlslShaderOption.js +30 -30
- package/dist/formats/hlsl/index.js +3 -3
- package/dist/formats/index.js +33 -31
- package/dist/formats/index.js.map +1 -1
- package/dist/formats/jpeg/CjsJpegFormat.js +212 -212
- package/dist/formats/jpeg/core/helpers.js +402 -402
- package/dist/formats/jpeg/core/jpeg.js +480 -480
- package/dist/formats/jpeg/index.js +2 -2
- package/dist/formats/mp3/CjsMp3Format.js +197 -197
- package/dist/formats/mp3/core/helpers.js +375 -375
- package/dist/formats/mp3/index.js +2 -2
- package/dist/formats/mp4/CjsMp4Format.js +197 -197
- package/dist/formats/mp4/core/helpers.js +484 -484
- package/dist/formats/mp4/index.js +2 -2
- package/dist/formats/obj/CjsObjFormat.js +253 -253
- package/dist/formats/obj/core/helpers.js +573 -573
- package/dist/formats/obj/core/json.js +64 -64
- package/dist/formats/obj/core/parser.js +321 -321
- package/dist/formats/obj/index.js +2 -2
- package/dist/formats/ogg/CjsOggFormat.js +143 -143
- package/dist/formats/ogg/core/helpers.js +410 -410
- package/dist/formats/ogg/core/imdct.js +178 -178
- package/dist/formats/ogg/core/vorbis.js +1017 -1017
- package/dist/formats/ogg/index.js +2 -2
- package/dist/formats/pickle/CjsPickleFormat.js +214 -0
- package/dist/formats/pickle/CjsPickleFormat.js.map +1 -0
- package/dist/formats/pickle/core/CjsPickleProtocol0Reader.js +551 -0
- package/dist/formats/pickle/core/CjsPickleProtocol0Reader.js.map +1 -0
- package/dist/formats/pickle/index.js +2 -0
- package/dist/formats/pickle/index.js.map +1 -0
- package/dist/formats/png/CjsPngFormat.js +201 -201
- package/dist/formats/png/core/helpers.js +635 -635
- package/dist/formats/png/index.js +2 -2
- package/dist/formats/red/CjsRedFormat.js +263 -263
- package/dist/formats/red/core/CjsRedReader.js +246 -246
- package/dist/formats/red/core/blackDefinitions.js +3 -3
- package/dist/formats/red/core/helpers.js +158 -158
- package/dist/formats/red/core/redGraph.js +71 -68
- package/dist/formats/red/core/redGraph.js.map +1 -1
- package/dist/formats/red/core/schema.js +4 -4
- package/dist/formats/red/index.js +2 -2
- package/dist/formats/stl/CjsStlFormat.js +365 -365
- package/dist/formats/stl/core/helpers.js +261 -261
- package/dist/formats/stl/core/json.js +51 -51
- package/dist/formats/stl/core/stl.js +642 -642
- package/dist/formats/stl/core/targets.js +173 -173
- package/dist/formats/stl/index.js +2 -2
- package/dist/formats/tga/CjsTgaFormat.js +197 -197
- package/dist/formats/tga/core/helpers.js +493 -493
- package/dist/formats/tga/index.js +2 -2
- package/dist/formats/wav/CjsWavFormat.js +198 -198
- package/dist/formats/wav/core/helpers.js +365 -365
- package/dist/formats/wav/index.js +2 -2
- package/dist/formats/webgl/CjsWebglFormat.js +199 -221
- package/dist/formats/webgl/CjsWebglFormat.js.map +1 -1
- package/dist/formats/webgl/core/buildGlslEffectContainer.js +70 -0
- package/dist/formats/webgl/core/buildGlslEffectContainer.js.map +1 -0
- package/dist/formats/webgl/core/effectPackage.js +900 -792
- package/dist/formats/webgl/core/effectPackage.js.map +1 -1
- package/dist/formats/webgl/core/errors.js +27 -27
- package/dist/formats/webgl/core/errors.js.map +1 -1
- package/dist/formats/webgl/core/glsl/DxbcGlslEmitter.js +2820 -2678
- package/dist/formats/webgl/core/glsl/DxbcGlslEmitter.js.map +1 -1
- package/dist/formats/webgl/core/glsl/DxbcGlslHelpers.js +89 -89
- package/dist/formats/webgl/core/glsl/DxbcGlslOperandFormatter.js +486 -428
- package/dist/formats/webgl/core/glsl/DxbcGlslOperandFormatter.js.map +1 -1
- package/dist/formats/webgl/core/glsl/packedLightFixups.js +98 -0
- package/dist/formats/webgl/core/glsl/packedLightFixups.js.map +1 -0
- package/dist/formats/webgl/core/glslBackendBlock.js +552 -0
- package/dist/formats/webgl/core/glslBackendBlock.js.map +1 -0
- package/dist/formats/webgl/core/glslBackendBodySet.js +243 -0
- package/dist/formats/webgl/core/glslBackendBodySet.js.map +1 -0
- package/dist/formats/webgl/core/{cewgCompleteness.js → glslEffectCompleteness.js} +85 -81
- package/dist/formats/webgl/core/glslEffectCompleteness.js.map +1 -0
- package/dist/formats/webgl/core/helpers.js +167 -306
- package/dist/formats/webgl/core/helpers.js.map +1 -1
- package/dist/formats/webgl/core/inspectGlslEffectContainer.js +122 -0
- package/dist/formats/webgl/core/inspectGlslEffectContainer.js.map +1 -0
- package/dist/formats/webgl/core/readGlslEffectContainer.js +303 -0
- package/dist/formats/webgl/core/readGlslEffectContainer.js.map +1 -0
- package/dist/formats/webgl/index.js +2 -2
- package/dist/formats/webgpu/CjsWebgpuFormat.js +357 -357
- package/dist/formats/webgpu/CjsWebgpuFormat.js.map +1 -1
- package/dist/formats/webgpu/core/buildCarbonEffectContainer.js +89 -197
- package/dist/formats/webgpu/core/buildCarbonEffectContainer.js.map +1 -1
- package/dist/formats/webgpu/core/{cewgpu/CewgpuContainer.js → carbonWebgpu/CarbonWebgpuContainer.js} +354 -368
- package/dist/formats/webgpu/core/carbonWebgpu/CarbonWebgpuContainer.js.map +1 -0
- package/dist/formats/webgpu/core/{cewgpu → carbonWebgpu}/containerViews.js +355 -355
- package/dist/formats/webgpu/core/carbonWebgpu/containerViews.js.map +1 -0
- package/dist/formats/webgpu/core/{cewgpu → carbonWebgpu}/validateContainer.js +90 -90
- package/dist/formats/webgpu/core/carbonWebgpu/validateContainer.js.map +1 -0
- package/dist/formats/webgpu/core/effectAnalysis.js +82 -82
- package/dist/formats/webgpu/core/effectBackendBodySet.js +289 -289
- package/dist/formats/webgpu/core/effectBackendBodySet.js.map +1 -1
- package/dist/formats/webgpu/core/errors.js +20 -20
- package/dist/formats/webgpu/core/errors.js.map +1 -1
- package/dist/formats/webgpu/core/helpers.js +443 -443
- package/dist/formats/webgpu/core/helpers.js.map +1 -1
- package/dist/formats/webgpu/core/ir/analyzeRegisterValues.js +212 -212
- package/dist/formats/webgpu/core/ir/buildControlFlow.js +220 -220
- package/dist/formats/webgpu/core/ir/indexableTemps.js +137 -137
- package/dist/formats/webgpu/core/ir/inferValueTypes.js +449 -449
- package/dist/formats/webgpu/core/ir/lowerDxbcToIr.js +494 -494
- package/dist/formats/webgpu/core/ir/resolveRegisterFlow.js +177 -177
- package/dist/formats/webgpu/core/ir/sourceLanes.js +61 -61
- package/dist/formats/webgpu/core/packageEffect.js +381 -385
- package/dist/formats/webgpu/core/packageEffect.js.map +1 -1
- package/dist/formats/webgpu/core/packageEffectSelection.js +164 -164
- package/dist/formats/webgpu/core/packageEffectSelection.js.map +1 -1
- package/dist/formats/webgpu/core/packageMetadata.js +17 -17
- package/dist/formats/webgpu/core/schema.js +4 -4
- package/dist/formats/webgpu/core/wgsl/buildResourceTransformPlan.js +263 -263
- package/dist/formats/webgpu/core/wgsl/buildResourceTransformPlan.js.map +1 -1
- package/dist/formats/webgpu/core/wgsl/buildWgslBindingPlan.js +172 -172
- package/dist/formats/webgpu/core/wgsl/buildWgslSet.js +320 -320
- package/dist/formats/webgpu/core/wgsl/buildWgslSet.js.map +1 -1
- package/dist/formats/webgpu/core/wgsl/emitWgsl.js +356 -356
- package/dist/formats/webgpu/core/wgsl/hoistEscapingValues.js +77 -77
- package/dist/formats/webgpu/core/wgsl/lowerBindingLayout.js +451 -451
- package/dist/formats/webgpu/core/wgsl/lowerComputeProgram.js +735 -735
- package/dist/formats/webgpu/core/wgsl/lowerCreateHistogramsComputeProgram.js +457 -457
- package/dist/formats/webgpu/core/wgsl/lowerFragmentProgram.js +1572 -1572
- package/dist/formats/webgpu/core/wgsl/lowerMergeHistogramsComputeProgram.js +659 -659
- package/dist/formats/webgpu/core/wgsl/lowerParticleClearComputePrograms.js +734 -734
- package/dist/formats/webgpu/core/wgsl/lowerParticleEmitComputeProgram.js +583 -583
- package/dist/formats/webgpu/core/wgsl/lowerSkinVerticesComputeProgram.js +621 -621
- package/dist/formats/webgpu/core/wgsl/lowerSortComputeProgram.js +824 -824
- package/dist/formats/webgpu/core/wgsl/lowerSortInnerComputeProgram.js +697 -697
- package/dist/formats/webgpu/core/wgsl/lowerSortStepComputeProgram.js +559 -559
- package/dist/formats/webgpu/core/wgsl/lowerVertexProgram.js +1328 -1328
- package/dist/formats/webgpu/core/wgsl/particleEmitSemanticDigest.js +110 -110
- package/dist/formats/webgpu/core/wgsl/precisionControls.js +55 -55
- package/dist/formats/webgpu/core/wgsl/selectionPlans.js +717 -717
- package/dist/formats/webgpu/core/wgsl/uniformity.js +78 -78
- package/dist/formats/webgpu/core/wgsl/validateExactComputeIr.js +196 -196
- package/dist/formats/webgpu/core/wgsl/validateHandleOperand.js +37 -37
- package/dist/formats/webgpu/index.js +2 -2
- package/dist/formats/webm/CjsWebmFormat.js +197 -197
- package/dist/formats/webm/core/helpers.js +572 -572
- package/dist/formats/webm/index.js +2 -2
- package/dist/formats/webp/CjsWebpFormat.js +140 -140
- package/dist/formats/webp/core/helpers.js +237 -237
- package/dist/formats/webp/index.js +2 -2
- package/dist/formats/wem/CjsWemFormat.js +250 -250
- package/dist/formats/wem/core/bitStream.js +261 -261
- package/dist/formats/wem/core/codebookLibrary.js +164 -164
- package/dist/formats/wem/core/helpers.js +437 -437
- package/dist/formats/wem/core/packedCodebooksAotuv603.js +30 -30
- package/dist/formats/wem/core/ptadpcm.js +77 -77
- package/dist/formats/wem/core/resolve.js +121 -121
- package/dist/formats/wem/core/wemToOgg.js +485 -485
- package/dist/formats/wem/index.js +2 -2
- package/dist/formats/yaml/CjsYamlFormat.js +134 -134
- package/dist/formats/yaml/CjsYamlFormat.js.map +1 -1
- package/dist/formats/yaml/core/CjsYamlReader.js +400 -402
- package/dist/formats/yaml/core/CjsYamlReader.js.map +1 -1
- package/dist/formats/yaml/core/helpers.js +196 -170
- package/dist/formats/yaml/core/helpers.js.map +1 -1
- package/dist/formats/yaml/index.js +2 -2
- package/dist/index.js +64 -62
- package/dist/index.js.map +1 -1
- package/dist/resource/CjsLoadingObject.js +19 -0
- package/dist/resource/CjsLoadingObject.js.map +1 -0
- package/dist/resource/CjsResource.js +801 -797
- package/dist/resource/CjsResource.js.map +1 -1
- package/dist/resource/ResourceHandlerMode.js +14 -0
- package/dist/resource/ResourceHandlerMode.js.map +1 -0
- package/dist/resource/Tr2LightProfileRes.js +32 -32
- package/dist/resource/audio/AudioGeometryResData.js +47 -47
- package/dist/resource/audio/CjsAudioBufferRes.js +86 -86
- package/dist/resource/audio/CjsAudioRes.js +213 -213
- package/dist/resource/audio/index.js +4 -4
- package/dist/resource/geometry/MeshDecalData.js +37 -37
- package/dist/resource/geometry/MeshDecalLodData.js +34 -34
- package/dist/resource/geometry/TriGeometryRes.js +675 -675
- package/dist/resource/geometry/TriGeometryResAreaData.js +59 -59
- package/dist/resource/geometry/TriGeometryResJointData.js +38 -38
- package/dist/resource/geometry/TriGeometryResLodData.js +88 -88
- package/dist/resource/geometry/TriGeometryResMeshData.js +63 -63
- package/dist/resource/geometry/TriGeometryResSkeletonData.js +34 -34
- package/dist/resource/geometry/TriJointBinding.js +38 -38
- package/dist/resource/geometry/TriMorphTargetGeometryConstants.js +46 -46
- package/dist/resource/geometry/TriRtGeometryConstants.js +88 -88
- package/dist/resource/geometry/granny/GStateBindingCallbackData.js +31 -31
- package/dist/resource/geometry/granny/Tr2GrannyIntersectionResult.js +60 -60
- package/dist/resource/geometry/granny/Tr2GrannyStateRes.js +36 -36
- package/dist/resource/geometry/granny/TriGrannyRes.js +35 -35
- package/dist/resource/geometry/granny/enums.js +10 -10
- package/dist/resource/geometry/granny/index.js +6 -6
- package/dist/resource/geometry/index.js +17 -17
- package/dist/resource/index.js +54 -52
- package/dist/resource/index.js.map +1 -1
- package/dist/resource/resourceBoundary.js +64 -64
- package/dist/resource/shader/Tr2EffectRes.js +336 -431
- package/dist/resource/shader/Tr2EffectRes.js.map +1 -1
- package/dist/resource/shader/Tr2MaterialArea.js +31 -31
- package/dist/resource/shader/Tr2MaterialMesh.js +27 -27
- package/dist/resource/shader/Tr2MaterialRes.js +31 -31
- package/dist/resource/shader/Tr2Shader.js +283 -261
- package/dist/resource/shader/Tr2Shader.js.map +1 -1
- package/dist/resource/shader/Tr2ShaderPermutation.js +43 -43
- package/dist/resource/shader/index.js +17 -17
- package/dist/resource/shader/reflection/Tr2EffectConstant.js +143 -135
- package/dist/resource/shader/reflection/Tr2EffectConstant.js.map +1 -1
- package/dist/resource/shader/reflection/Tr2EffectDefine.js +30 -30
- package/dist/resource/shader/reflection/Tr2EffectDescription.js +114 -109
- package/dist/resource/shader/reflection/Tr2EffectDescription.js.map +1 -1
- package/dist/resource/shader/reflection/Tr2EffectLibrary.js +168 -147
- package/dist/resource/shader/reflection/Tr2EffectLibrary.js.map +1 -1
- package/dist/resource/shader/reflection/Tr2EffectParameterAnnotation.js +125 -105
- package/dist/resource/shader/reflection/Tr2EffectParameterAnnotation.js.map +1 -1
- package/dist/resource/shader/reflection/Tr2EffectResource.js +120 -86
- package/dist/resource/shader/reflection/Tr2EffectResource.js.map +1 -1
- package/dist/resource/shader/reflection/Tr2EffectStageInput.js +372 -241
- package/dist/resource/shader/reflection/Tr2EffectStageInput.js.map +1 -1
- package/dist/resource/shader/reflection/Tr2EffectTechnique.js +78 -68
- package/dist/resource/shader/reflection/Tr2EffectTechnique.js.map +1 -1
- package/dist/resource/shader/reflection/Tr2Pass.js +168 -111
- package/dist/resource/shader/reflection/Tr2Pass.js.map +1 -1
- package/dist/resource/shader/reflection/carbonRecordFields.js +159 -0
- package/dist/resource/shader/reflection/carbonRecordFields.js.map +1 -0
- package/dist/resource/shader/reflection/shaderStage.js +22 -0
- package/dist/resource/shader/reflection/shaderStage.js.map +1 -0
- package/dist/resource/shader/sampler/Tr2SamplerSetup.js +135 -77
- package/dist/resource/shader/sampler/Tr2SamplerSetup.js.map +1 -1
- package/dist/resource/texture/CjsTextureArrayRes.js +472 -472
- package/dist/resource/texture/CjsTextureArrayResParameterProxy.js +179 -179
- package/dist/resource/texture/Tr2ImageRes.js +120 -120
- package/dist/resource/texture/Tr2TextureLodManager.js +82 -82
- package/dist/resource/texture/Tr2TextureLodUpdateRequest.js +37 -37
- package/dist/resource/texture/Tr2TexturePackChannel.js +37 -37
- package/dist/resource/texture/Tr2TexturePipeline.js +54 -54
- package/dist/resource/texture/Tr2TexturePipelineParams.js +34 -34
- package/dist/resource/texture/Tr2TexturePipelineStepCompress.js +40 -40
- package/dist/resource/texture/Tr2TexturePipelineStepGenerateMips.js +22 -22
- package/dist/resource/texture/Tr2TexturePipelineStepLimitSize.js +34 -34
- package/dist/resource/texture/Tr2TexturePipelineStepLoad.js +31 -31
- package/dist/resource/texture/Tr2TexturePipelineStepPack.js +43 -43
- package/dist/resource/texture/TriTextureRes.js +359 -359
- package/dist/resource/texture/index.js +15 -15
- package/dist/resource/texture/texturePipelineBehavior.js +308 -308
- package/dist/worker/CjsResManMainThreadLoader.js +89 -87
- package/dist/worker/CjsResManMainThreadLoader.js.map +1 -1
- package/dist/worker/CjsResManWorker.js +218 -217
- package/dist/worker/CjsResManWorker.js.map +1 -1
- package/dist/worker/CjsResManWorkerLoader.js +437 -434
- package/dist/worker/CjsResManWorkerLoader.js.map +1 -1
- package/dist/worker/protocol.js +12 -12
- package/docs/README.md +98 -98
- package/docs/architecture.md +118 -109
- package/docs/concepts/resource-lifecycle.md +226 -225
- package/docs/concepts/shader-resource-model.md +111 -114
- package/docs/concepts/writing-an-engine-adapter.md +115 -115
- package/docs/formats/README.md +138 -136
- package/docs/formats/carbon-effect-container.md +553 -452
- package/docs/formats/dxbc/README.md +68 -68
- package/docs/formats/dxbc/architecture.md +80 -80
- package/docs/formats/dxbc/reference/api.md +77 -77
- package/docs/formats/dxbc/reference/classes/README.md +9 -9
- package/docs/formats/dxbc/reference/decoded-output.md +122 -122
- package/docs/formats/gr2.md +160 -160
- package/docs/formats/hlsl/README.md +54 -54
- package/docs/formats/hlsl/architecture.md +65 -67
- package/docs/formats/hlsl/guides/hydrating-json-output.md +60 -62
- package/docs/formats/hlsl/guides/reading-effects.md +64 -64
- package/docs/formats/hlsl/reference/advanced-analysis.md +61 -66
- package/docs/formats/hlsl/reference/api.md +92 -98
- package/docs/formats/hlsl/reference/classes/README.md +11 -11
- package/docs/formats/hlsl/reference/json-graph.md +97 -100
- package/docs/formats/pickle.md +82 -0
- package/docs/formats/provenance.md +196 -196
- package/docs/formats/stl.md +37 -37
- package/docs/formats/webgl/README.md +115 -57
- package/docs/formats/webgl/architecture.md +69 -70
- package/docs/formats/webgl/carbon-constant-layouts.md +326 -326
- package/docs/formats/webgl/decl-io.md +1234 -1234
- package/docs/formats/webgl/memory-structured.md +890 -871
- package/docs/formats/webgl/reference/classes/README.md +9 -9
- package/docs/formats/webgl/texture-sample.md +964 -964
- package/docs/formats/webgpu/README.md +84 -84
- package/docs/formats/webgpu/architecture.md +95 -96
- package/docs/formats/webgpu/formats/{cewgpu.md → carbon-webgpu.md} +215 -216
- package/docs/formats/webgpu/guides/effect-packaging.md +189 -191
- package/docs/formats/webgpu/reference/api.md +196 -197
- package/docs/formats/webgpu/reference/classes/README.md +9 -9
- package/docs/formats/webgpu/reference/wgsl-compatibility.md +1546 -1543
- package/docs/formats/wwise.md +146 -85
- package/docs/reference/classes/README.md +35 -35
- package/docs/reference/classes/audio.md +30 -30
- package/docs/reference/classes/core.md +216 -206
- package/docs/reference/classes/dropped.md +46 -46
- package/docs/reference/classes/formats.md +944 -952
- package/docs/reference/classes/resources.md +456 -456
- package/docs/reference/classes/texture.md +26 -26
- package/docs/reference/events.md +117 -117
- package/docs/reference/motherlode-cache.md +275 -275
- package/docs/reference/queues.md +194 -110
- package/docs/reference/reload.md +107 -107
- package/docs/reference/texture-arrays.md +113 -113
- package/docs/reference/texture-pipeline.md +53 -53
- package/docs/reference/workers.md +142 -135
- package/docs/roadmap.md +150 -150
- package/format-notices/black/LICENSE +21 -21
- package/format-notices/black/NOTICE +47 -47
- package/format-notices/bnk/LICENSE +21 -21
- package/format-notices/bnk/NOTICE +21 -21
- package/format-notices/cmf/LICENSE +21 -21
- package/format-notices/cmf/NOTICE +36 -36
- package/format-notices/dds/LICENSE +21 -21
- package/format-notices/dds/NOTICE +14 -14
- package/format-notices/dxbc/LICENSE +21 -21
- package/format-notices/dxbc/NOTICE +20 -20
- package/format-notices/fbx/LICENSE +21 -21
- package/format-notices/fbx/NOTICE +14 -14
- package/format-notices/flac/LICENSE +21 -21
- package/format-notices/flac/NOTICE +14 -14
- package/format-notices/gif/LICENSE +21 -21
- package/format-notices/gif/NOTICE +14 -14
- package/format-notices/gltf/LICENSE +21 -21
- package/format-notices/gltf/NOTICE +27 -27
- package/format-notices/gr2/LICENSE +21 -21
- package/format-notices/gr2/NOTICE +60 -60
- package/format-notices/gr2/THIRD-PARTY-NOTICES.md +93 -93
- package/format-notices/hlsl/LICENSE +21 -21
- package/format-notices/hlsl/NOTICE +25 -25
- package/format-notices/jpeg/LICENSE +21 -21
- package/format-notices/jpeg/NOTICE +14 -14
- package/format-notices/mp3/LICENSE +21 -21
- package/format-notices/mp3/NOTICE +14 -14
- package/format-notices/mp4/LICENSE +21 -21
- package/format-notices/mp4/NOTICE +14 -14
- package/format-notices/obj/LICENSE +21 -21
- package/format-notices/obj/NOTICE +26 -26
- package/format-notices/ogg/LICENSE +21 -21
- package/format-notices/ogg/NOTICE +28 -28
- package/format-notices/png/LICENSE +21 -21
- package/format-notices/png/NOTICE +14 -14
- package/format-notices/red/LICENSE +21 -21
- package/format-notices/red/NOTICE +31 -31
- package/format-notices/stl/LICENSE +21 -21
- package/format-notices/stl/NOTICE +21 -21
- package/format-notices/tga/LICENSE +21 -21
- package/format-notices/tga/NOTICE +14 -14
- package/format-notices/wav/LICENSE +21 -21
- package/format-notices/wav/NOTICE +14 -14
- package/format-notices/webgl/LICENSE +21 -21
- package/format-notices/webgl/NOTICE +35 -35
- package/format-notices/webgpu/LICENSE +21 -21
- package/format-notices/webgpu/NOTICE +31 -31
- package/format-notices/webm/LICENSE +21 -21
- package/format-notices/webm/NOTICE +14 -14
- package/format-notices/webp/LICENSE +21 -21
- package/format-notices/webp/NOTICE +14 -14
- package/format-notices/wem/LICENSE +57 -57
- package/format-notices/wem/NOTICE +33 -33
- package/format-notices/yaml/LICENSE +21 -21
- package/format-notices/yaml/NOTICE +44 -44
- package/package.json +63 -63
- package/dist/format/carbonEffect/carbonDescriptionFromPortable.js +0 -372
- package/dist/format/carbonEffect/carbonDescriptionFromPortable.js.map +0 -1
- package/dist/format/effect/effectReflectionPackage.js +0 -636
- package/dist/format/effect/effectReflectionPackage.js.map +0 -1
- package/dist/formats/hlsl/core/HlslReader.js +0 -16
- package/dist/formats/hlsl/core/HlslReader.js.map +0 -1
- package/dist/formats/hlsl/core/portableReflection.js +0 -848
- package/dist/formats/hlsl/core/portableReflection.js.map +0 -1
- package/dist/formats/hlsl/portable.js +0 -2
- package/dist/formats/hlsl/portable.js.map +0 -1
- package/dist/formats/webgl/core/cewg/CewgPackage.js +0 -340
- package/dist/formats/webgl/core/cewg/CewgPackage.js.map +0 -1
- package/dist/formats/webgl/core/cewg/CewgPackageBuilder.js +0 -104
- package/dist/formats/webgl/core/cewg/CewgPackageBuilder.js.map +0 -1
- package/dist/formats/webgl/core/cewg/binary.js +0 -19
- package/dist/formats/webgl/core/cewg/binary.js.map +0 -1
- package/dist/formats/webgl/core/cewgCompleteness.js.map +0 -1
- package/dist/formats/webgl/core/effectPackageValidation.js +0 -331
- package/dist/formats/webgl/core/effectPackageValidation.js.map +0 -1
- package/dist/formats/webgpu/core/cewgpu/CewgpuContainer.js.map +0 -1
- package/dist/formats/webgpu/core/cewgpu/containerViews.js.map +0 -1
- package/dist/formats/webgpu/core/cewgpu/validateContainer.js.map +0 -1
- package/dist/resource/shader/portable.js +0 -33
- package/dist/resource/shader/portable.js.map +0 -1
- package/docs/formats/hlsl/reference/portable-reflection.md +0 -141
- package/docs/formats/webgl/effect-reflection.md +0 -127
|
@@ -1,268 +1,268 @@
|
|
|
1
|
-
import { CjsFormatWriteError } from './CjsFormatError.js';
|
|
2
|
-
|
|
3
|
-
// Source: trinity/shadercompiler/StringTable.cpp, trinity/shadercompiler/StringTable.h
|
|
4
|
-
|
|
5
|
-
const textEncoder = new TextEncoder();
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* The null arena reference. `StringTable::GetOffset` returns this for an
|
|
9
|
-
* invalid or unknown reference (`StringTable.cpp:52-68`), and Carbon's reader
|
|
10
|
-
* tolerates it at exactly one wire position: a stage's default-constant-value
|
|
11
|
-
* offset when the accompanying size is zero
|
|
12
|
-
* (`Tr2EffectDescription.cpp:80-91`). Everywhere else it fails the load.
|
|
13
|
-
*/
|
|
14
|
-
const CJS_STRING_TABLE_NULL_REFERENCE = 0xffffffff;
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* Compares two byte runs the way Carbon's `Blob::operator<` does: `memcmp`
|
|
18
|
-
* over the shorter length, then shorter-wins on a tie
|
|
19
|
-
* (`StringTable.h:109-122`).
|
|
20
|
-
*
|
|
21
|
-
* @param {Uint8Array} a First byte run.
|
|
22
|
-
* @param {Uint8Array} b Second byte run.
|
|
23
|
-
* @returns {number} Negative, zero, or positive ordering result.
|
|
24
|
-
*/
|
|
25
|
-
function compareTableBlobs(a, b) {
|
|
26
|
-
const shared = Math.min(a.length, b.length);
|
|
27
|
-
for (let index = 0; index < shared; index += 1) {
|
|
28
|
-
if (a[index] !== b[index]) return a[index] - b[index];
|
|
29
|
-
}
|
|
30
|
-
return a.length - b.length;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
/**
|
|
34
|
-
* FNV-1a over every byte, used only to bucket dedupe candidates.
|
|
35
|
-
*
|
|
36
|
-
* Carbon hashes a stride-sampled subset (`StringTable.h:124-134`); hashing all
|
|
37
|
-
* bytes costs the same asymptotically and collides less. Either way the
|
|
38
|
-
* decision is made by the full byte comparison that follows, so the choice of
|
|
39
|
-
* hash cannot change the emitted arena.
|
|
40
|
-
*
|
|
41
|
-
* @param {Uint8Array} bytes Byte run to hash.
|
|
42
|
-
* @returns {number} 32-bit hash.
|
|
43
|
-
*/
|
|
44
|
-
function hashBytes(bytes) {
|
|
45
|
-
let hash = 0x811c9dc5;
|
|
46
|
-
for (let index = 0; index < bytes.length; index += 1) {
|
|
47
|
-
hash ^= bytes[index];
|
|
48
|
-
hash = Math.imul(hash, 0x01000193);
|
|
49
|
-
}
|
|
50
|
-
return hash >>> 0;
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
/**
|
|
54
|
-
* Carbon's compiled-effect string table: a deduplicated blob arena whose
|
|
55
|
-
* offsets are assigned by a bytewise sort rather than by insertion order.
|
|
56
|
-
*
|
|
57
|
-
* The arena holds three kinds of entry, distinguished only by how the wire
|
|
58
|
-
* refers to them:
|
|
59
|
-
*
|
|
60
|
-
* - NUL-terminated strings, added with the terminator (`strlen + 1`,
|
|
61
|
-
* `StringTable.cpp:18-21`), referenced by a bare `u32` offset;
|
|
62
|
-
* - sized blobs — shader bytecode, program source, default constant values —
|
|
63
|
-
* added with exactly their own bytes and no terminator
|
|
64
|
-
* (`StringTable.cpp:23-41`), referenced by a `{u32 size, u32 offset}` pair;
|
|
65
|
-
* - nothing else. Carbon persists no manifest: `StringTable::Write` emits a
|
|
66
|
-
* `u32` payload size and the payload (`StringTable.cpp:110-143`), and every
|
|
67
|
-
* reference site resolves its own entry.
|
|
68
|
-
*
|
|
69
|
-
* Two deliberate departures from Carbon, both of which make byte-identical
|
|
70
|
-
* output more likely rather than less:
|
|
71
|
-
*
|
|
72
|
-
* - `m_size` is initialised. Carbon's constructor leaves it indeterminate
|
|
73
|
-
* (`StringTable.cpp:9-12`, `StringTable.h:170`) and gets away with it only
|
|
74
|
-
* because the one instance is a zero-initialised global.
|
|
75
|
-
* - adding after an offset has been handed out is an error rather than a silent
|
|
76
|
-
* resort. In Carbon, `GetOffset` re-sorts whenever the table is dirty
|
|
77
|
-
* (`StringTable.cpp:59-62`), which reassigns *every* offset — including
|
|
78
|
-
* offsets already baked into packed bodies. Carbon avoids the corruption by
|
|
79
|
-
* interning all late strings before the packing pass; we fail closed instead.
|
|
80
|
-
*/
|
|
81
|
-
class CjsStringTable {
|
|
82
|
-
#blobs = [];
|
|
83
|
-
#buckets = new Map();
|
|
84
|
-
#byteLength = 0;
|
|
85
|
-
#offsets = null;
|
|
86
|
-
#handedOutOffsets = false;
|
|
87
|
-
|
|
88
|
-
/**
|
|
89
|
-
* Returns the arena payload byte count, excluding the `u32` size prefix.
|
|
90
|
-
*
|
|
91
|
-
* This is Carbon's `m_size` and the value the reader bounds-checks every
|
|
92
|
-
* offset against.
|
|
93
|
-
*
|
|
94
|
-
* @returns {number} Payload byte count.
|
|
95
|
-
*/
|
|
96
|
-
get byteLength() {
|
|
97
|
-
return this.#byteLength;
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
/**
|
|
101
|
-
* Returns the byte count the arena occupies in the file, including its own
|
|
102
|
-
* `u32` size prefix.
|
|
103
|
-
*
|
|
104
|
-
* This is Carbon's `GetSize()` (`StringTable.cpp:82-85`), the term used by
|
|
105
|
-
* the body-offset base arithmetic.
|
|
106
|
-
*
|
|
107
|
-
* @returns {number} On-disk byte count.
|
|
108
|
-
*/
|
|
109
|
-
get containerSize() {
|
|
110
|
-
return this.#byteLength + 4;
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
/**
|
|
114
|
-
* Returns the number of distinct entries in the arena.
|
|
115
|
-
*
|
|
116
|
-
* @returns {number} Deduplicated entry count.
|
|
117
|
-
*/
|
|
118
|
-
get entryCount() {
|
|
119
|
-
return this.#blobs.length;
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
/**
|
|
123
|
-
* Interns a NUL-terminated string and returns its reference.
|
|
124
|
-
*
|
|
125
|
-
* @param {string} value Text to intern, stored with a trailing NUL.
|
|
126
|
-
* @returns {number} Arena reference for later `offsetOf`.
|
|
127
|
-
*/
|
|
128
|
-
addString(value) {
|
|
129
|
-
const text = textEncoder.encode(String(value));
|
|
130
|
-
const bytes = new Uint8Array(text.length + 1);
|
|
131
|
-
bytes.set(text, 0);
|
|
132
|
-
return this.#add(bytes);
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
/**
|
|
136
|
-
* Interns exact bytes with no terminator and returns their reference.
|
|
137
|
-
*
|
|
138
|
-
* @param {ArrayBufferView|Uint8Array} value Bytes to intern.
|
|
139
|
-
* @returns {number} Arena reference for later `offsetOf`.
|
|
140
|
-
*/
|
|
141
|
-
addBytes(value) {
|
|
142
|
-
const source = value instanceof Uint8Array ? value : new Uint8Array(value.buffer, value.byteOffset, value.byteLength);
|
|
143
|
-
return this.#add(Uint8Array.from(source));
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
/**
|
|
147
|
-
* Assigns every entry its final offset by Carbon's bytewise sort.
|
|
148
|
-
*
|
|
149
|
-
* Idempotent while the table is unchanged. Returns this table so it can be
|
|
150
|
-
* chained onto construction.
|
|
151
|
-
*
|
|
152
|
-
* @returns {CjsStringTable} This table.
|
|
153
|
-
*/
|
|
154
|
-
finish() {
|
|
155
|
-
if (this.#offsets) return this;
|
|
156
|
-
const order = this.#blobs.map((blob, index) => index);
|
|
157
|
-
order.sort((a, b) => compareTableBlobs(this.#blobs[a], this.#blobs[b]));
|
|
158
|
-
const offsets = new Array(this.#blobs.length);
|
|
159
|
-
let cursor = 0;
|
|
160
|
-
for (const index of order) {
|
|
161
|
-
offsets[index] = cursor;
|
|
162
|
-
cursor += this.#blobs[index].length;
|
|
163
|
-
}
|
|
164
|
-
this.#offsets = offsets;
|
|
165
|
-
return this;
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
/**
|
|
169
|
-
* Resolves an arena reference to its byte offset.
|
|
170
|
-
*
|
|
171
|
-
* `null` and `undefined` resolve to the `0xffffffff` null reference, so a
|
|
172
|
-
* caller can pass an absent optional field straight through.
|
|
173
|
-
*
|
|
174
|
-
* @param {number|null|undefined} reference Reference from `addString`/`addBytes`.
|
|
175
|
-
* @returns {number} Byte offset, or `0xffffffff` for a null reference.
|
|
176
|
-
*/
|
|
177
|
-
offsetOf(reference) {
|
|
178
|
-
if (reference === null || reference === undefined) {
|
|
179
|
-
return CJS_STRING_TABLE_NULL_REFERENCE;
|
|
180
|
-
}
|
|
181
|
-
if (!Number.isInteger(reference) || reference < 0 || reference >= this.#blobs.length) {
|
|
182
|
-
throw new CjsFormatWriteError("Unknown string-table reference", {
|
|
183
|
-
reference,
|
|
184
|
-
entryCount: this.#blobs.length
|
|
185
|
-
});
|
|
186
|
-
}
|
|
187
|
-
this.finish();
|
|
188
|
-
this.#handedOutOffsets = true;
|
|
189
|
-
return this.#offsets[reference];
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
/**
|
|
193
|
-
* Returns the interned bytes behind a reference.
|
|
194
|
-
*
|
|
195
|
-
* @param {number} reference Reference from `addString`/`addBytes`.
|
|
196
|
-
* @returns {Uint8Array} View over the interned bytes.
|
|
197
|
-
*/
|
|
198
|
-
bytesOf(reference) {
|
|
199
|
-
if (!Number.isInteger(reference) || reference < 0 || reference >= this.#blobs.length) {
|
|
200
|
-
throw new CjsFormatWriteError("Unknown string-table reference", {
|
|
201
|
-
reference,
|
|
202
|
-
entryCount: this.#blobs.length
|
|
203
|
-
});
|
|
204
|
-
}
|
|
205
|
-
return this.#blobs[reference];
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
/**
|
|
209
|
-
* Materialises the arena payload in sorted order.
|
|
210
|
-
*
|
|
211
|
-
* @returns {Uint8Array} Arena payload, without the `u32` size prefix.
|
|
212
|
-
*/
|
|
213
|
-
toBytes() {
|
|
214
|
-
this.finish();
|
|
215
|
-
const out = new Uint8Array(this.#byteLength);
|
|
216
|
-
for (let index = 0; index < this.#blobs.length; index += 1) {
|
|
217
|
-
out.set(this.#blobs[index], this.#offsets[index]);
|
|
218
|
-
}
|
|
219
|
-
return out;
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
/**
|
|
223
|
-
* Writes the arena exactly as `StringTable::Write` does: a `u32` payload
|
|
224
|
-
* size followed by the payload (`StringTable.cpp:110-143`).
|
|
225
|
-
*
|
|
226
|
-
* @param {import("./CjsByteWriter.js").CjsByteWriter} writer Target writer.
|
|
227
|
-
*/
|
|
228
|
-
write(writer) {
|
|
229
|
-
this.finish();
|
|
230
|
-
writer.u32(this.#byteLength);
|
|
231
|
-
if (this.#byteLength === 0) return;
|
|
232
|
-
writer.bytes(this.toBytes());
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
/**
|
|
236
|
-
* Interns a byte run, returning an existing reference when the bytes match
|
|
237
|
-
* exactly. Dedupe is on full content and length, with no suffix merging —
|
|
238
|
-
* Carbon's `Blob::operator==` (`StringTable.h:104-107`).
|
|
239
|
-
*
|
|
240
|
-
* @param {Uint8Array} bytes Owned bytes to intern.
|
|
241
|
-
* @returns {number} Arena reference.
|
|
242
|
-
*/
|
|
243
|
-
#add(bytes) {
|
|
244
|
-
const key = hashBytes(bytes);
|
|
245
|
-
const bucket = this.#buckets.get(key);
|
|
246
|
-
if (bucket) {
|
|
247
|
-
for (const candidate of bucket) {
|
|
248
|
-
if (compareTableBlobs(this.#blobs[candidate], bytes) === 0) {
|
|
249
|
-
return candidate;
|
|
250
|
-
}
|
|
251
|
-
}
|
|
252
|
-
}
|
|
253
|
-
if (this.#handedOutOffsets) {
|
|
254
|
-
throw new CjsFormatWriteError("String-table entry added after offsets were resolved; every offset already handed out would shift", {
|
|
255
|
-
byteLength: bytes.length
|
|
256
|
-
});
|
|
257
|
-
}
|
|
258
|
-
const reference = this.#blobs.length;
|
|
259
|
-
this.#blobs.push(bytes);
|
|
260
|
-
this.#byteLength += bytes.length;
|
|
261
|
-
this.#offsets = null;
|
|
262
|
-
if (bucket) bucket.push(reference);else this.#buckets.set(key, [reference]);
|
|
263
|
-
return reference;
|
|
264
|
-
}
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
export { CJS_STRING_TABLE_NULL_REFERENCE, CjsStringTable, compareTableBlobs };
|
|
268
|
-
//# sourceMappingURL=CjsStringTable.js.map
|
|
1
|
+
import { CjsFormatWriteError } from './CjsFormatError.js';
|
|
2
|
+
|
|
3
|
+
// Source: trinity/shadercompiler/StringTable.cpp, trinity/shadercompiler/StringTable.h
|
|
4
|
+
|
|
5
|
+
const textEncoder = new TextEncoder();
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* The null arena reference. `StringTable::GetOffset` returns this for an
|
|
9
|
+
* invalid or unknown reference (`StringTable.cpp:52-68`), and Carbon's reader
|
|
10
|
+
* tolerates it at exactly one wire position: a stage's default-constant-value
|
|
11
|
+
* offset when the accompanying size is zero
|
|
12
|
+
* (`Tr2EffectDescription.cpp:80-91`). Everywhere else it fails the load.
|
|
13
|
+
*/
|
|
14
|
+
const CJS_STRING_TABLE_NULL_REFERENCE = 0xffffffff;
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Compares two byte runs the way Carbon's `Blob::operator<` does: `memcmp`
|
|
18
|
+
* over the shorter length, then shorter-wins on a tie
|
|
19
|
+
* (`StringTable.h:109-122`).
|
|
20
|
+
*
|
|
21
|
+
* @param {Uint8Array} a First byte run.
|
|
22
|
+
* @param {Uint8Array} b Second byte run.
|
|
23
|
+
* @returns {number} Negative, zero, or positive ordering result.
|
|
24
|
+
*/
|
|
25
|
+
function compareTableBlobs(a, b) {
|
|
26
|
+
const shared = Math.min(a.length, b.length);
|
|
27
|
+
for (let index = 0; index < shared; index += 1) {
|
|
28
|
+
if (a[index] !== b[index]) return a[index] - b[index];
|
|
29
|
+
}
|
|
30
|
+
return a.length - b.length;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* FNV-1a over every byte, used only to bucket dedupe candidates.
|
|
35
|
+
*
|
|
36
|
+
* Carbon hashes a stride-sampled subset (`StringTable.h:124-134`); hashing all
|
|
37
|
+
* bytes costs the same asymptotically and collides less. Either way the
|
|
38
|
+
* decision is made by the full byte comparison that follows, so the choice of
|
|
39
|
+
* hash cannot change the emitted arena.
|
|
40
|
+
*
|
|
41
|
+
* @param {Uint8Array} bytes Byte run to hash.
|
|
42
|
+
* @returns {number} 32-bit hash.
|
|
43
|
+
*/
|
|
44
|
+
function hashBytes(bytes) {
|
|
45
|
+
let hash = 0x811c9dc5;
|
|
46
|
+
for (let index = 0; index < bytes.length; index += 1) {
|
|
47
|
+
hash ^= bytes[index];
|
|
48
|
+
hash = Math.imul(hash, 0x01000193);
|
|
49
|
+
}
|
|
50
|
+
return hash >>> 0;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Carbon's compiled-effect string table: a deduplicated blob arena whose
|
|
55
|
+
* offsets are assigned by a bytewise sort rather than by insertion order.
|
|
56
|
+
*
|
|
57
|
+
* The arena holds three kinds of entry, distinguished only by how the wire
|
|
58
|
+
* refers to them:
|
|
59
|
+
*
|
|
60
|
+
* - NUL-terminated strings, added with the terminator (`strlen + 1`,
|
|
61
|
+
* `StringTable.cpp:18-21`), referenced by a bare `u32` offset;
|
|
62
|
+
* - sized blobs — shader bytecode, program source, default constant values —
|
|
63
|
+
* added with exactly their own bytes and no terminator
|
|
64
|
+
* (`StringTable.cpp:23-41`), referenced by a `{u32 size, u32 offset}` pair;
|
|
65
|
+
* - nothing else. Carbon persists no manifest: `StringTable::Write` emits a
|
|
66
|
+
* `u32` payload size and the payload (`StringTable.cpp:110-143`), and every
|
|
67
|
+
* reference site resolves its own entry.
|
|
68
|
+
*
|
|
69
|
+
* Two deliberate departures from Carbon, both of which make byte-identical
|
|
70
|
+
* output more likely rather than less:
|
|
71
|
+
*
|
|
72
|
+
* - `m_size` is initialised. Carbon's constructor leaves it indeterminate
|
|
73
|
+
* (`StringTable.cpp:9-12`, `StringTable.h:170`) and gets away with it only
|
|
74
|
+
* because the one instance is a zero-initialised global.
|
|
75
|
+
* - adding after an offset has been handed out is an error rather than a silent
|
|
76
|
+
* resort. In Carbon, `GetOffset` re-sorts whenever the table is dirty
|
|
77
|
+
* (`StringTable.cpp:59-62`), which reassigns *every* offset — including
|
|
78
|
+
* offsets already baked into packed bodies. Carbon avoids the corruption by
|
|
79
|
+
* interning all late strings before the packing pass; we fail closed instead.
|
|
80
|
+
*/
|
|
81
|
+
class CjsStringTable {
|
|
82
|
+
#blobs = [];
|
|
83
|
+
#buckets = new Map();
|
|
84
|
+
#byteLength = 0;
|
|
85
|
+
#offsets = null;
|
|
86
|
+
#handedOutOffsets = false;
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Returns the arena payload byte count, excluding the `u32` size prefix.
|
|
90
|
+
*
|
|
91
|
+
* This is Carbon's `m_size` and the value the reader bounds-checks every
|
|
92
|
+
* offset against.
|
|
93
|
+
*
|
|
94
|
+
* @returns {number} Payload byte count.
|
|
95
|
+
*/
|
|
96
|
+
get byteLength() {
|
|
97
|
+
return this.#byteLength;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* Returns the byte count the arena occupies in the file, including its own
|
|
102
|
+
* `u32` size prefix.
|
|
103
|
+
*
|
|
104
|
+
* This is Carbon's `GetSize()` (`StringTable.cpp:82-85`), the term used by
|
|
105
|
+
* the body-offset base arithmetic.
|
|
106
|
+
*
|
|
107
|
+
* @returns {number} On-disk byte count.
|
|
108
|
+
*/
|
|
109
|
+
get containerSize() {
|
|
110
|
+
return this.#byteLength + 4;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Returns the number of distinct entries in the arena.
|
|
115
|
+
*
|
|
116
|
+
* @returns {number} Deduplicated entry count.
|
|
117
|
+
*/
|
|
118
|
+
get entryCount() {
|
|
119
|
+
return this.#blobs.length;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Interns a NUL-terminated string and returns its reference.
|
|
124
|
+
*
|
|
125
|
+
* @param {string} value Text to intern, stored with a trailing NUL.
|
|
126
|
+
* @returns {number} Arena reference for later `offsetOf`.
|
|
127
|
+
*/
|
|
128
|
+
addString(value) {
|
|
129
|
+
const text = textEncoder.encode(String(value));
|
|
130
|
+
const bytes = new Uint8Array(text.length + 1);
|
|
131
|
+
bytes.set(text, 0);
|
|
132
|
+
return this.#add(bytes);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* Interns exact bytes with no terminator and returns their reference.
|
|
137
|
+
*
|
|
138
|
+
* @param {ArrayBufferView|Uint8Array} value Bytes to intern.
|
|
139
|
+
* @returns {number} Arena reference for later `offsetOf`.
|
|
140
|
+
*/
|
|
141
|
+
addBytes(value) {
|
|
142
|
+
const source = value instanceof Uint8Array ? value : new Uint8Array(value.buffer, value.byteOffset, value.byteLength);
|
|
143
|
+
return this.#add(Uint8Array.from(source));
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* Assigns every entry its final offset by Carbon's bytewise sort.
|
|
148
|
+
*
|
|
149
|
+
* Idempotent while the table is unchanged. Returns this table so it can be
|
|
150
|
+
* chained onto construction.
|
|
151
|
+
*
|
|
152
|
+
* @returns {CjsStringTable} This table.
|
|
153
|
+
*/
|
|
154
|
+
finish() {
|
|
155
|
+
if (this.#offsets) return this;
|
|
156
|
+
const order = this.#blobs.map((blob, index) => index);
|
|
157
|
+
order.sort((a, b) => compareTableBlobs(this.#blobs[a], this.#blobs[b]));
|
|
158
|
+
const offsets = new Array(this.#blobs.length);
|
|
159
|
+
let cursor = 0;
|
|
160
|
+
for (const index of order) {
|
|
161
|
+
offsets[index] = cursor;
|
|
162
|
+
cursor += this.#blobs[index].length;
|
|
163
|
+
}
|
|
164
|
+
this.#offsets = offsets;
|
|
165
|
+
return this;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/**
|
|
169
|
+
* Resolves an arena reference to its byte offset.
|
|
170
|
+
*
|
|
171
|
+
* `null` and `undefined` resolve to the `0xffffffff` null reference, so a
|
|
172
|
+
* caller can pass an absent optional field straight through.
|
|
173
|
+
*
|
|
174
|
+
* @param {number|null|undefined} reference Reference from `addString`/`addBytes`.
|
|
175
|
+
* @returns {number} Byte offset, or `0xffffffff` for a null reference.
|
|
176
|
+
*/
|
|
177
|
+
offsetOf(reference) {
|
|
178
|
+
if (reference === null || reference === undefined) {
|
|
179
|
+
return CJS_STRING_TABLE_NULL_REFERENCE;
|
|
180
|
+
}
|
|
181
|
+
if (!Number.isInteger(reference) || reference < 0 || reference >= this.#blobs.length) {
|
|
182
|
+
throw new CjsFormatWriteError("Unknown string-table reference", {
|
|
183
|
+
reference,
|
|
184
|
+
entryCount: this.#blobs.length
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
this.finish();
|
|
188
|
+
this.#handedOutOffsets = true;
|
|
189
|
+
return this.#offsets[reference];
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/**
|
|
193
|
+
* Returns the interned bytes behind a reference.
|
|
194
|
+
*
|
|
195
|
+
* @param {number} reference Reference from `addString`/`addBytes`.
|
|
196
|
+
* @returns {Uint8Array} View over the interned bytes.
|
|
197
|
+
*/
|
|
198
|
+
bytesOf(reference) {
|
|
199
|
+
if (!Number.isInteger(reference) || reference < 0 || reference >= this.#blobs.length) {
|
|
200
|
+
throw new CjsFormatWriteError("Unknown string-table reference", {
|
|
201
|
+
reference,
|
|
202
|
+
entryCount: this.#blobs.length
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
return this.#blobs[reference];
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
/**
|
|
209
|
+
* Materialises the arena payload in sorted order.
|
|
210
|
+
*
|
|
211
|
+
* @returns {Uint8Array} Arena payload, without the `u32` size prefix.
|
|
212
|
+
*/
|
|
213
|
+
toBytes() {
|
|
214
|
+
this.finish();
|
|
215
|
+
const out = new Uint8Array(this.#byteLength);
|
|
216
|
+
for (let index = 0; index < this.#blobs.length; index += 1) {
|
|
217
|
+
out.set(this.#blobs[index], this.#offsets[index]);
|
|
218
|
+
}
|
|
219
|
+
return out;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
/**
|
|
223
|
+
* Writes the arena exactly as `StringTable::Write` does: a `u32` payload
|
|
224
|
+
* size followed by the payload (`StringTable.cpp:110-143`).
|
|
225
|
+
*
|
|
226
|
+
* @param {import("./CjsByteWriter.js").CjsByteWriter} writer Target writer.
|
|
227
|
+
*/
|
|
228
|
+
write(writer) {
|
|
229
|
+
this.finish();
|
|
230
|
+
writer.u32(this.#byteLength);
|
|
231
|
+
if (this.#byteLength === 0) return;
|
|
232
|
+
writer.bytes(this.toBytes());
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
/**
|
|
236
|
+
* Interns a byte run, returning an existing reference when the bytes match
|
|
237
|
+
* exactly. Dedupe is on full content and length, with no suffix merging —
|
|
238
|
+
* Carbon's `Blob::operator==` (`StringTable.h:104-107`).
|
|
239
|
+
*
|
|
240
|
+
* @param {Uint8Array} bytes Owned bytes to intern.
|
|
241
|
+
* @returns {number} Arena reference.
|
|
242
|
+
*/
|
|
243
|
+
#add(bytes) {
|
|
244
|
+
const key = hashBytes(bytes);
|
|
245
|
+
const bucket = this.#buckets.get(key);
|
|
246
|
+
if (bucket) {
|
|
247
|
+
for (const candidate of bucket) {
|
|
248
|
+
if (compareTableBlobs(this.#blobs[candidate], bytes) === 0) {
|
|
249
|
+
return candidate;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
if (this.#handedOutOffsets) {
|
|
254
|
+
throw new CjsFormatWriteError("String-table entry added after offsets were resolved; every offset already handed out would shift", {
|
|
255
|
+
byteLength: bytes.length
|
|
256
|
+
});
|
|
257
|
+
}
|
|
258
|
+
const reference = this.#blobs.length;
|
|
259
|
+
this.#blobs.push(bytes);
|
|
260
|
+
this.#byteLength += bytes.length;
|
|
261
|
+
this.#offsets = null;
|
|
262
|
+
if (bucket) bucket.push(reference);else this.#buckets.set(key, [reference]);
|
|
263
|
+
return reference;
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
export { CJS_STRING_TABLE_NULL_REFERENCE, CjsStringTable, compareTableBlobs };
|
|
268
|
+
//# sourceMappingURL=CjsStringTable.js.map
|