@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,152 +1,152 @@
|
|
|
1
|
-
import { compareUtf8 } from '../../../../format/compareUtf8.js';
|
|
2
|
-
import { recogniseDetailMapFamily, DETAIL_MAP_ARRAY_NAME } from '../../../hlsl/core/detailMapFamily.js';
|
|
3
|
-
|
|
4
|
-
const RESOURCE_IDENTITY = /^sampled-resource:(\d+):(\d+)$/u;
|
|
5
|
-
const SAMPLE_OPCODES = new Set(["sample_b"]);
|
|
6
|
-
function deepFreeze(value) {
|
|
7
|
-
if (!value || typeof value !== "object" || Object.isFrozen(value)) return value;
|
|
8
|
-
for (const entry of Object.values(value)) deepFreeze(entry);
|
|
9
|
-
return Object.freeze(value);
|
|
10
|
-
}
|
|
11
|
-
function bindingRegister(binding) {
|
|
12
|
-
return binding.range?.lowerBound ?? binding.registerIndex;
|
|
13
|
-
}
|
|
14
|
-
function bindingSpace(binding) {
|
|
15
|
-
return binding.range?.registerSpace ?? 0;
|
|
16
|
-
}
|
|
17
|
-
function bindingIdentity(binding) {
|
|
18
|
-
return `${binding.resourceKind}:${bindingSpace(binding)}:${bindingRegister(binding)}`;
|
|
19
|
-
}
|
|
20
|
-
function scopeIdentity(identity, stage) {
|
|
21
|
-
return `${identity}@${stage}`;
|
|
22
|
-
}
|
|
23
|
-
function normalizeInput(input, transformId, index) {
|
|
24
|
-
const parameter = input?.parameter;
|
|
25
|
-
const layer = input?.layer;
|
|
26
|
-
const identity = input?.identity;
|
|
27
|
-
const scoped = input?.scopeIdentity;
|
|
28
|
-
if (typeof parameter !== "string" || !parameter || !Number.isInteger(layer) || layer !== index || typeof identity !== "string" || !RESOURCE_IDENTITY.test(identity) || scoped !== `${identity}@fragment`) {
|
|
29
|
-
throw new Error(`WGSL resource transform ${transformId} has an invalid input at layer ${index}`);
|
|
30
|
-
}
|
|
31
|
-
return {
|
|
32
|
-
parameter,
|
|
33
|
-
layer,
|
|
34
|
-
identity,
|
|
35
|
-
scopeIdentity: scoped
|
|
36
|
-
};
|
|
37
|
-
}
|
|
38
|
-
function normalizeTransform(transform) {
|
|
39
|
-
const id = transform?.id;
|
|
40
|
-
if (typeof id !== "string" || !id || transform.version !== 1 || transform.kind !== "texture-2d-array" || typeof transform.layoutKey !== "string" || !transform.layoutKey || transform.stage !== "fragment" || !Array.isArray(transform.inputs) || transform.inputs.length < 2) {
|
|
41
|
-
throw new Error(`WGSL resource transform ${id || "<unknown>"} has an invalid texture-array contract`);
|
|
42
|
-
}
|
|
43
|
-
const inputs = transform.inputs.map((input, index) => normalizeInput(input, id, index));
|
|
44
|
-
const inputParameters = new Set(inputs.map(input => input.parameter));
|
|
45
|
-
const inputIdentities = new Set(inputs.map(input => input.identity));
|
|
46
|
-
if (inputParameters.size !== inputs.length || inputIdentities.size !== inputs.length) {
|
|
47
|
-
throw new Error(`WGSL resource transform ${id} contains duplicate inputs`);
|
|
48
|
-
}
|
|
49
|
-
const output = transform.output;
|
|
50
|
-
if (typeof output?.name !== "string" || !output.name || output.identity !== inputs[0].identity || output.scopeIdentity !== inputs[0].scopeIdentity || output.viewDimension !== "2d-array" || output.layerCount !== inputs.length || transform.representation !== "native-or-rgba8" || transform.missingLayer !== "reject") {
|
|
51
|
-
throw new Error(`WGSL resource transform ${id} has an invalid output contract`);
|
|
52
|
-
}
|
|
53
|
-
return {
|
|
54
|
-
id,
|
|
55
|
-
version: 1,
|
|
56
|
-
kind: "texture-2d-array",
|
|
57
|
-
layoutKey: transform.layoutKey,
|
|
58
|
-
stage: "fragment",
|
|
59
|
-
inputs,
|
|
60
|
-
output: {
|
|
61
|
-
name: output.name,
|
|
62
|
-
identity: output.identity,
|
|
63
|
-
scopeIdentity: output.scopeIdentity,
|
|
64
|
-
viewDimension: "2d-array",
|
|
65
|
-
layerCount: output.layerCount
|
|
66
|
-
},
|
|
67
|
-
representation: "native-or-rgba8",
|
|
68
|
-
missingLayer: "reject"
|
|
69
|
-
};
|
|
70
|
-
}
|
|
71
|
-
|
|
1
|
+
import { compareUtf8 } from '../../../../format/compareUtf8.js';
|
|
2
|
+
import { recogniseDetailMapFamily, DETAIL_MAP_ARRAY_NAME } from '../../../hlsl/core/detailMapFamily.js';
|
|
3
|
+
|
|
4
|
+
const RESOURCE_IDENTITY = /^sampled-resource:(\d+):(\d+)$/u;
|
|
5
|
+
const SAMPLE_OPCODES = new Set(["sample_b"]);
|
|
6
|
+
function deepFreeze(value) {
|
|
7
|
+
if (!value || typeof value !== "object" || Object.isFrozen(value)) return value;
|
|
8
|
+
for (const entry of Object.values(value)) deepFreeze(entry);
|
|
9
|
+
return Object.freeze(value);
|
|
10
|
+
}
|
|
11
|
+
function bindingRegister(binding) {
|
|
12
|
+
return binding.range?.lowerBound ?? binding.registerIndex;
|
|
13
|
+
}
|
|
14
|
+
function bindingSpace(binding) {
|
|
15
|
+
return binding.range?.registerSpace ?? 0;
|
|
16
|
+
}
|
|
17
|
+
function bindingIdentity(binding) {
|
|
18
|
+
return `${binding.resourceKind}:${bindingSpace(binding)}:${bindingRegister(binding)}`;
|
|
19
|
+
}
|
|
20
|
+
function scopeIdentity(identity, stage) {
|
|
21
|
+
return `${identity}@${stage}`;
|
|
22
|
+
}
|
|
23
|
+
function normalizeInput(input, transformId, index) {
|
|
24
|
+
const parameter = input?.parameter;
|
|
25
|
+
const layer = input?.layer;
|
|
26
|
+
const identity = input?.identity;
|
|
27
|
+
const scoped = input?.scopeIdentity;
|
|
28
|
+
if (typeof parameter !== "string" || !parameter || !Number.isInteger(layer) || layer !== index || typeof identity !== "string" || !RESOURCE_IDENTITY.test(identity) || scoped !== `${identity}@fragment`) {
|
|
29
|
+
throw new Error(`WGSL resource transform ${transformId} has an invalid input at layer ${index}`);
|
|
30
|
+
}
|
|
31
|
+
return {
|
|
32
|
+
parameter,
|
|
33
|
+
layer,
|
|
34
|
+
identity,
|
|
35
|
+
scopeIdentity: scoped
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
function normalizeTransform(transform) {
|
|
39
|
+
const id = transform?.id;
|
|
40
|
+
if (typeof id !== "string" || !id || transform.version !== 1 || transform.kind !== "texture-2d-array" || typeof transform.layoutKey !== "string" || !transform.layoutKey || transform.stage !== "fragment" || !Array.isArray(transform.inputs) || transform.inputs.length < 2) {
|
|
41
|
+
throw new Error(`WGSL resource transform ${id || "<unknown>"} has an invalid texture-array contract`);
|
|
42
|
+
}
|
|
43
|
+
const inputs = transform.inputs.map((input, index) => normalizeInput(input, id, index));
|
|
44
|
+
const inputParameters = new Set(inputs.map(input => input.parameter));
|
|
45
|
+
const inputIdentities = new Set(inputs.map(input => input.identity));
|
|
46
|
+
if (inputParameters.size !== inputs.length || inputIdentities.size !== inputs.length) {
|
|
47
|
+
throw new Error(`WGSL resource transform ${id} contains duplicate inputs`);
|
|
48
|
+
}
|
|
49
|
+
const output = transform.output;
|
|
50
|
+
if (typeof output?.name !== "string" || !output.name || output.identity !== inputs[0].identity || output.scopeIdentity !== inputs[0].scopeIdentity || output.viewDimension !== "2d-array" || output.layerCount !== inputs.length || transform.representation !== "native-or-rgba8" || transform.missingLayer !== "reject") {
|
|
51
|
+
throw new Error(`WGSL resource transform ${id} has an invalid output contract`);
|
|
52
|
+
}
|
|
53
|
+
return {
|
|
54
|
+
id,
|
|
55
|
+
version: 1,
|
|
56
|
+
kind: "texture-2d-array",
|
|
57
|
+
layoutKey: transform.layoutKey,
|
|
58
|
+
stage: "fragment",
|
|
59
|
+
inputs,
|
|
60
|
+
output: {
|
|
61
|
+
name: output.name,
|
|
62
|
+
identity: output.identity,
|
|
63
|
+
scopeIdentity: output.scopeIdentity,
|
|
64
|
+
viewDimension: "2d-array",
|
|
65
|
+
layerCount: output.layerCount
|
|
66
|
+
},
|
|
67
|
+
representation: "native-or-rgba8",
|
|
68
|
+
missingLayer: "reject"
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
|
|
72
72
|
/**
|
|
73
73
|
* Validates and freezes the compiler-owned resource-transform plan.
|
|
74
74
|
*
|
|
75
75
|
* @param {object|null|undefined} value Candidate plan.
|
|
76
76
|
* @param {string|null} [layoutKey] Optional expected pass layout key.
|
|
77
77
|
* @returns {object|null} Canonical frozen plan, or null.
|
|
78
|
-
*/
|
|
79
|
-
function normalizeResourceTransformPlan(value, layoutKey = null) {
|
|
80
|
-
if (value === undefined || value === null) return null;
|
|
81
|
-
if (value?.format !== "CJS_WGSL_RESOURCE_TRANSFORM_PLAN" || value.formatVersion !== 1 || !Array.isArray(value.resourceTransforms) || !value.resourceTransforms.length) {
|
|
82
|
-
throw new TypeError("WGSL resource transform plan must be a non-empty version-1 document");
|
|
83
|
-
}
|
|
84
|
-
const resourceTransforms = value.resourceTransforms.map(normalizeTransform).sort((left, right) => compareUtf8(left.id, right.id));
|
|
85
|
-
const ids = new Set();
|
|
86
|
-
for (const transform of resourceTransforms) {
|
|
87
|
-
if (ids.has(transform.id)) {
|
|
88
|
-
throw new Error(`WGSL resource transform plan contains duplicate id ${transform.id}`);
|
|
89
|
-
}
|
|
90
|
-
ids.add(transform.id);
|
|
91
|
-
if (layoutKey !== null && transform.layoutKey !== layoutKey) {
|
|
92
|
-
throw new Error(`WGSL resource transform ${transform.id} targets ${transform.layoutKey}, expected ${layoutKey}`);
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
return deepFreeze({
|
|
96
|
-
format: "CJS_WGSL_RESOURCE_TRANSFORM_PLAN",
|
|
97
|
-
formatVersion: 1,
|
|
98
|
-
resourceTransforms
|
|
99
|
-
});
|
|
100
|
-
}
|
|
101
|
-
function bindingMatchesForOperand(program, resourceKind, operand) {
|
|
102
|
-
const candidates = program.bindings.filter(binding => binding.resourceKind === resourceKind);
|
|
103
|
-
const rangeId = operand?.resourceReference?.rangeId;
|
|
104
|
-
return Number.isInteger(rangeId) ? candidates.filter(binding => binding.range?.rangeId === rangeId) : candidates.filter(binding => bindingRegister(binding) === operand?.registerIndex);
|
|
105
|
-
}
|
|
106
|
-
function resolveBindingForOperand(program, resourceKind, operand) {
|
|
107
|
-
const matches = bindingMatchesForOperand(program, resourceKind, operand);
|
|
108
|
-
if (matches.length !== 1) return null;
|
|
109
|
-
const binding = matches[0];
|
|
110
|
-
const absolute = operand?.resourceReference?.absoluteIndex;
|
|
111
|
-
if (operand?.typeName !== (resourceKind === "sampler" ? "sampler" : "resource") || (operand.modifierName ?? "none") !== "none" || (operand.minPrecisionName ?? "default") !== "default" || operand.nonUniform || operand.indices?.some(index => index?.relative) || operand.resourceReference?.nonUniform || absolute?.relative || absolute !== undefined && (absolute?.values?.length !== 1 || absolute.values[0] !== bindingRegister(binding))) {
|
|
112
|
-
return null;
|
|
113
|
-
}
|
|
114
|
-
return binding;
|
|
115
|
-
}
|
|
116
|
-
function operandFingerprint(operand) {
|
|
117
|
-
return JSON.stringify({
|
|
118
|
-
typeName: operand?.typeName ?? null,
|
|
119
|
-
selectionModeName: operand?.selectionModeName ?? null,
|
|
120
|
-
mask: operand?.mask ?? "",
|
|
121
|
-
swizzle: operand?.swizzle ?? "",
|
|
122
|
-
selected: operand?.selected ?? "",
|
|
123
|
-
modifierName: operand?.modifierName ?? "none",
|
|
124
|
-
minPrecisionName: operand?.minPrecisionName ?? "default",
|
|
125
|
-
registerIndex: operand?.registerIndex ?? null,
|
|
126
|
-
indices: (operand?.indices || []).map(index => ({
|
|
127
|
-
values: index?.values || [],
|
|
128
|
-
relative: index?.relative ?? null
|
|
129
|
-
})),
|
|
130
|
-
immediateValues: (operand?.immediateValues || []).map(entry => entry?.uint32)
|
|
131
|
-
});
|
|
132
|
-
}
|
|
133
|
-
function semanticResource(binding) {
|
|
134
|
-
if (binding?.kind !== "resource") return null;
|
|
135
|
-
const parameter = binding.metadataName ?? binding.carbon?.name;
|
|
136
|
-
if (typeof parameter !== "string" || !parameter) return null;
|
|
137
|
-
return {
|
|
138
|
-
parameter,
|
|
139
|
-
registerIndex: binding.registerIndex,
|
|
140
|
-
registerSpace: binding.registerSpace ?? 0,
|
|
141
|
-
arrayElements: binding.arrayCount ?? binding.carbon?.arrayElements,
|
|
142
|
-
type: binding.carbon?.type,
|
|
143
|
-
isSRGB: binding.carbon?.isSRGB
|
|
144
|
-
};
|
|
145
|
-
}
|
|
146
|
-
function rejectCandidate() {
|
|
147
|
-
return null;
|
|
148
|
-
}
|
|
149
|
-
|
|
78
|
+
*/
|
|
79
|
+
function normalizeResourceTransformPlan(value, layoutKey = null) {
|
|
80
|
+
if (value === undefined || value === null) return null;
|
|
81
|
+
if (value?.format !== "CJS_WGSL_RESOURCE_TRANSFORM_PLAN" || value.formatVersion !== 1 || !Array.isArray(value.resourceTransforms) || !value.resourceTransforms.length) {
|
|
82
|
+
throw new TypeError("WGSL resource transform plan must be a non-empty version-1 document");
|
|
83
|
+
}
|
|
84
|
+
const resourceTransforms = value.resourceTransforms.map(normalizeTransform).sort((left, right) => compareUtf8(left.id, right.id));
|
|
85
|
+
const ids = new Set();
|
|
86
|
+
for (const transform of resourceTransforms) {
|
|
87
|
+
if (ids.has(transform.id)) {
|
|
88
|
+
throw new Error(`WGSL resource transform plan contains duplicate id ${transform.id}`);
|
|
89
|
+
}
|
|
90
|
+
ids.add(transform.id);
|
|
91
|
+
if (layoutKey !== null && transform.layoutKey !== layoutKey) {
|
|
92
|
+
throw new Error(`WGSL resource transform ${transform.id} targets ${transform.layoutKey}, expected ${layoutKey}`);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return deepFreeze({
|
|
96
|
+
format: "CJS_WGSL_RESOURCE_TRANSFORM_PLAN",
|
|
97
|
+
formatVersion: 1,
|
|
98
|
+
resourceTransforms
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
function bindingMatchesForOperand(program, resourceKind, operand) {
|
|
102
|
+
const candidates = program.bindings.filter(binding => binding.resourceKind === resourceKind);
|
|
103
|
+
const rangeId = operand?.resourceReference?.rangeId;
|
|
104
|
+
return Number.isInteger(rangeId) ? candidates.filter(binding => binding.range?.rangeId === rangeId) : candidates.filter(binding => bindingRegister(binding) === operand?.registerIndex);
|
|
105
|
+
}
|
|
106
|
+
function resolveBindingForOperand(program, resourceKind, operand) {
|
|
107
|
+
const matches = bindingMatchesForOperand(program, resourceKind, operand);
|
|
108
|
+
if (matches.length !== 1) return null;
|
|
109
|
+
const binding = matches[0];
|
|
110
|
+
const absolute = operand?.resourceReference?.absoluteIndex;
|
|
111
|
+
if (operand?.typeName !== (resourceKind === "sampler" ? "sampler" : "resource") || (operand.modifierName ?? "none") !== "none" || (operand.minPrecisionName ?? "default") !== "default" || operand.nonUniform || operand.indices?.some(index => index?.relative) || operand.resourceReference?.nonUniform || absolute?.relative || absolute !== undefined && (absolute?.values?.length !== 1 || absolute.values[0] !== bindingRegister(binding))) {
|
|
112
|
+
return null;
|
|
113
|
+
}
|
|
114
|
+
return binding;
|
|
115
|
+
}
|
|
116
|
+
function operandFingerprint(operand) {
|
|
117
|
+
return JSON.stringify({
|
|
118
|
+
typeName: operand?.typeName ?? null,
|
|
119
|
+
selectionModeName: operand?.selectionModeName ?? null,
|
|
120
|
+
mask: operand?.mask ?? "",
|
|
121
|
+
swizzle: operand?.swizzle ?? "",
|
|
122
|
+
selected: operand?.selected ?? "",
|
|
123
|
+
modifierName: operand?.modifierName ?? "none",
|
|
124
|
+
minPrecisionName: operand?.minPrecisionName ?? "default",
|
|
125
|
+
registerIndex: operand?.registerIndex ?? null,
|
|
126
|
+
indices: (operand?.indices || []).map(index => ({
|
|
127
|
+
values: index?.values || [],
|
|
128
|
+
relative: index?.relative ?? null
|
|
129
|
+
})),
|
|
130
|
+
immediateValues: (operand?.immediateValues || []).map(entry => entry?.uint32)
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
function semanticResource(binding) {
|
|
134
|
+
if (binding?.kind !== "resource") return null;
|
|
135
|
+
const parameter = binding.metadataName ?? binding.carbon?.name;
|
|
136
|
+
if (typeof parameter !== "string" || !parameter) return null;
|
|
137
|
+
return {
|
|
138
|
+
parameter,
|
|
139
|
+
registerIndex: binding.registerIndex,
|
|
140
|
+
registerSpace: binding.registerSpace ?? 0,
|
|
141
|
+
arrayElements: binding.arrayCount ?? binding.carbon?.arrayElements,
|
|
142
|
+
type: binding.carbon?.type,
|
|
143
|
+
isSRGB: binding.carbon?.isSRGB
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
function rejectCandidate() {
|
|
147
|
+
return null;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
150
|
/**
|
|
151
151
|
* Recognizes the exact Carbon Detail-map sample family and builds a late
|
|
152
152
|
* physical texture-array overlay. The source IR remains unchanged.
|
|
@@ -155,123 +155,123 @@ function rejectCandidate() {
|
|
|
155
155
|
* @param {object} options Planner options.
|
|
156
156
|
* @param {string} options.layoutKey Canonical pass key.
|
|
157
157
|
* @returns {object|null} Frozen transform plan, or null when proof is absent.
|
|
158
|
-
*/
|
|
159
|
-
function buildResourceTransformPlan(entries, options = {}) {
|
|
160
|
-
if (!Array.isArray(entries) || !entries.length) {
|
|
161
|
-
throw new TypeError("WGSL resource transform planning expects pass stage entries");
|
|
162
|
-
}
|
|
163
|
-
const layoutKey = options.layoutKey;
|
|
164
|
-
if (typeof layoutKey !== "string" || !layoutKey) {
|
|
165
|
-
throw new TypeError("WGSL resource transform planning requires a layoutKey");
|
|
166
|
-
}
|
|
167
|
-
const fragments = entries.filter(entry => entry?.ir?.stage === "pixel");
|
|
168
|
-
if (fragments.length !== 1) return null;
|
|
169
|
-
const {
|
|
170
|
-
ir: program
|
|
171
|
-
} = fragments[0];
|
|
172
|
-
if (program?.format !== "CJS_SHADER_IR" || program.formatVersion !== 1 || !Array.isArray(fragments[0].semanticBindings)) {
|
|
173
|
-
throw new TypeError("WGSL resource transform planning requires version-1 IR and semantic bindings");
|
|
174
|
-
}
|
|
175
|
-
const semanticResources = fragments[0].semanticBindings.map(semanticResource).filter(Boolean);
|
|
176
|
-
|
|
177
|
-
// Which registers make up the family is a fact about Carbon's resources,
|
|
178
|
-
// not about WGSL, so it is decided by the recogniser WebGL uses too. Both
|
|
179
|
-
// backends therefore merge the same registers in the same layer order, and a
|
|
180
|
-
// change to that rule cannot land on one backend only. Everything below is
|
|
181
|
-
// the part WGSL has to prove for itself: that every use of those registers
|
|
182
|
-
// is a plain sample this planner can redirect at an array layer.
|
|
183
|
-
const family = recogniseDetailMapFamily(semanticResources);
|
|
184
|
-
if (!family) return null;
|
|
185
|
-
const sources = [];
|
|
186
|
-
for (const {
|
|
187
|
-
parameter,
|
|
188
|
-
registerIndex,
|
|
189
|
-
registerSpace
|
|
190
|
-
} of family.layers) {
|
|
191
|
-
const semantic = {
|
|
192
|
-
parameter,
|
|
193
|
-
registerIndex,
|
|
194
|
-
registerSpace
|
|
195
|
-
};
|
|
196
|
-
if (!Number.isInteger(registerSpace) || registerSpace < 0) return rejectCandidate();
|
|
197
|
-
const matches = program.bindings.filter(binding => binding.resourceKind === "sampled-resource" && bindingSpace(binding) === registerSpace && bindingRegister(binding) === registerIndex);
|
|
198
|
-
if (matches.length !== 1) return rejectCandidate();
|
|
199
|
-
const binding = matches[0];
|
|
200
|
-
const returns = binding.returnType?.returnTypeNames || [];
|
|
201
|
-
if (binding.resourceDimension !== "texture2d" || binding.structureStride !== null || binding.range?.unbounded || binding.range?.registerCount !== 1 || returns.length !== 4 || returns.some(entry => entry !== "float")) {
|
|
202
|
-
return rejectCandidate();
|
|
203
|
-
}
|
|
204
|
-
sources.push({
|
|
205
|
-
parameter,
|
|
206
|
-
semantic,
|
|
207
|
-
binding,
|
|
208
|
-
identity: bindingIdentity(binding)
|
|
209
|
-
});
|
|
210
|
-
}
|
|
211
|
-
const sourceByIdentity = new Map(sources.map(source => [source.identity, source]));
|
|
212
|
-
const uses = new Map(sources.map(source => [source.identity, 0]));
|
|
213
|
-
let samplerIdentity = null;
|
|
214
|
-
let biasFingerprint = null;
|
|
215
|
-
for (const instruction of program.instructions) {
|
|
216
|
-
for (let operandIndex = 0; operandIndex < instruction.operands.length; operandIndex += 1) {
|
|
217
|
-
const operand = instruction.operands[operandIndex];
|
|
218
|
-
if (operand?.typeName !== "resource") continue;
|
|
219
|
-
const binding = resolveBindingForOperand(program, "sampled-resource", operand);
|
|
220
|
-
if (!binding) {
|
|
221
|
-
const unresolvedCandidate = bindingMatchesForOperand(program, "sampled-resource", operand).some(candidate => sourceByIdentity.has(bindingIdentity(candidate)));
|
|
222
|
-
if (unresolvedCandidate) return rejectCandidate();
|
|
223
|
-
continue;
|
|
224
|
-
}
|
|
225
|
-
const identity = bindingIdentity(binding);
|
|
226
|
-
if (!sourceByIdentity.has(identity)) continue;
|
|
227
|
-
if (!SAMPLE_OPCODES.has(instruction.opcodeName) || operandIndex !== 2 || instruction.extensions?.some(extension => extension.typeName === "sample_controls") || instruction.operands.length !== 5) {
|
|
228
|
-
return rejectCandidate();
|
|
229
|
-
}
|
|
230
|
-
const sampler = resolveBindingForOperand(program, "sampler", instruction.operands[3]);
|
|
231
|
-
if (!sampler) return rejectCandidate();
|
|
232
|
-
const currentSamplerIdentity = bindingIdentity(sampler);
|
|
233
|
-
const currentBiasFingerprint = operandFingerprint(instruction.operands[4]);
|
|
234
|
-
if (samplerIdentity !== null && samplerIdentity !== currentSamplerIdentity || biasFingerprint !== null && biasFingerprint !== currentBiasFingerprint) {
|
|
235
|
-
return rejectCandidate();
|
|
236
|
-
}
|
|
237
|
-
samplerIdentity = currentSamplerIdentity;
|
|
238
|
-
biasFingerprint = currentBiasFingerprint;
|
|
239
|
-
uses.set(identity, uses.get(identity) + 1);
|
|
240
|
-
}
|
|
241
|
-
}
|
|
242
|
-
if (samplerIdentity === null || Array.from(uses.values()).some(count => count < 1)) {
|
|
243
|
-
return rejectCandidate();
|
|
244
|
-
}
|
|
245
|
-
const inputs = sources.map((source, layer) => ({
|
|
246
|
-
parameter: source.parameter,
|
|
247
|
-
layer,
|
|
248
|
-
identity: source.identity,
|
|
249
|
-
scopeIdentity: scopeIdentity(source.identity, "fragment")
|
|
250
|
-
}));
|
|
251
|
-
const first = inputs[0];
|
|
252
|
-
const id = `${layoutKey}:detail-map-array:${first.identity}`;
|
|
253
|
-
return normalizeResourceTransformPlan({
|
|
254
|
-
format: "CJS_WGSL_RESOURCE_TRANSFORM_PLAN",
|
|
255
|
-
formatVersion: 1,
|
|
256
|
-
resourceTransforms: [{
|
|
257
|
-
id,
|
|
258
|
-
version: 1,
|
|
259
|
-
kind: "texture-2d-array",
|
|
260
|
-
layoutKey,
|
|
261
|
-
stage: "fragment",
|
|
262
|
-
inputs,
|
|
263
|
-
output: {
|
|
264
|
-
name: DETAIL_MAP_ARRAY_NAME,
|
|
265
|
-
identity: first.identity,
|
|
266
|
-
scopeIdentity: first.scopeIdentity,
|
|
267
|
-
viewDimension: "2d-array",
|
|
268
|
-
layerCount: inputs.length
|
|
269
|
-
},
|
|
270
|
-
representation: "native-or-rgba8",
|
|
271
|
-
missingLayer: "reject"
|
|
272
|
-
}]
|
|
273
|
-
}, layoutKey);
|
|
274
|
-
}
|
|
275
|
-
|
|
276
|
-
export { buildResourceTransformPlan, normalizeResourceTransformPlan };
|
|
277
|
-
//# sourceMappingURL=buildResourceTransformPlan.js.map
|
|
158
|
+
*/
|
|
159
|
+
function buildResourceTransformPlan(entries, options = {}) {
|
|
160
|
+
if (!Array.isArray(entries) || !entries.length) {
|
|
161
|
+
throw new TypeError("WGSL resource transform planning expects pass stage entries");
|
|
162
|
+
}
|
|
163
|
+
const layoutKey = options.layoutKey;
|
|
164
|
+
if (typeof layoutKey !== "string" || !layoutKey) {
|
|
165
|
+
throw new TypeError("WGSL resource transform planning requires a layoutKey");
|
|
166
|
+
}
|
|
167
|
+
const fragments = entries.filter(entry => entry?.ir?.stage === "pixel");
|
|
168
|
+
if (fragments.length !== 1) return null;
|
|
169
|
+
const {
|
|
170
|
+
ir: program
|
|
171
|
+
} = fragments[0];
|
|
172
|
+
if (program?.format !== "CJS_SHADER_IR" || program.formatVersion !== 1 || !Array.isArray(fragments[0].semanticBindings)) {
|
|
173
|
+
throw new TypeError("WGSL resource transform planning requires version-1 IR and semantic bindings");
|
|
174
|
+
}
|
|
175
|
+
const semanticResources = fragments[0].semanticBindings.map(semanticResource).filter(Boolean);
|
|
176
|
+
|
|
177
|
+
// Which registers make up the family is a fact about Carbon's resources,
|
|
178
|
+
// not about WGSL, so it is decided by the recogniser WebGL uses too. Both
|
|
179
|
+
// backends therefore merge the same registers in the same layer order, and a
|
|
180
|
+
// change to that rule cannot land on one backend only. Everything below is
|
|
181
|
+
// the part WGSL has to prove for itself: that every use of those registers
|
|
182
|
+
// is a plain sample this planner can redirect at an array layer.
|
|
183
|
+
const family = recogniseDetailMapFamily(semanticResources);
|
|
184
|
+
if (!family) return null;
|
|
185
|
+
const sources = [];
|
|
186
|
+
for (const {
|
|
187
|
+
parameter,
|
|
188
|
+
registerIndex,
|
|
189
|
+
registerSpace
|
|
190
|
+
} of family.layers) {
|
|
191
|
+
const semantic = {
|
|
192
|
+
parameter,
|
|
193
|
+
registerIndex,
|
|
194
|
+
registerSpace
|
|
195
|
+
};
|
|
196
|
+
if (!Number.isInteger(registerSpace) || registerSpace < 0) return rejectCandidate();
|
|
197
|
+
const matches = program.bindings.filter(binding => binding.resourceKind === "sampled-resource" && bindingSpace(binding) === registerSpace && bindingRegister(binding) === registerIndex);
|
|
198
|
+
if (matches.length !== 1) return rejectCandidate();
|
|
199
|
+
const binding = matches[0];
|
|
200
|
+
const returns = binding.returnType?.returnTypeNames || [];
|
|
201
|
+
if (binding.resourceDimension !== "texture2d" || binding.structureStride !== null || binding.range?.unbounded || binding.range?.registerCount !== 1 || returns.length !== 4 || returns.some(entry => entry !== "float")) {
|
|
202
|
+
return rejectCandidate();
|
|
203
|
+
}
|
|
204
|
+
sources.push({
|
|
205
|
+
parameter,
|
|
206
|
+
semantic,
|
|
207
|
+
binding,
|
|
208
|
+
identity: bindingIdentity(binding)
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
const sourceByIdentity = new Map(sources.map(source => [source.identity, source]));
|
|
212
|
+
const uses = new Map(sources.map(source => [source.identity, 0]));
|
|
213
|
+
let samplerIdentity = null;
|
|
214
|
+
let biasFingerprint = null;
|
|
215
|
+
for (const instruction of program.instructions) {
|
|
216
|
+
for (let operandIndex = 0; operandIndex < instruction.operands.length; operandIndex += 1) {
|
|
217
|
+
const operand = instruction.operands[operandIndex];
|
|
218
|
+
if (operand?.typeName !== "resource") continue;
|
|
219
|
+
const binding = resolveBindingForOperand(program, "sampled-resource", operand);
|
|
220
|
+
if (!binding) {
|
|
221
|
+
const unresolvedCandidate = bindingMatchesForOperand(program, "sampled-resource", operand).some(candidate => sourceByIdentity.has(bindingIdentity(candidate)));
|
|
222
|
+
if (unresolvedCandidate) return rejectCandidate();
|
|
223
|
+
continue;
|
|
224
|
+
}
|
|
225
|
+
const identity = bindingIdentity(binding);
|
|
226
|
+
if (!sourceByIdentity.has(identity)) continue;
|
|
227
|
+
if (!SAMPLE_OPCODES.has(instruction.opcodeName) || operandIndex !== 2 || instruction.extensions?.some(extension => extension.typeName === "sample_controls") || instruction.operands.length !== 5) {
|
|
228
|
+
return rejectCandidate();
|
|
229
|
+
}
|
|
230
|
+
const sampler = resolveBindingForOperand(program, "sampler", instruction.operands[3]);
|
|
231
|
+
if (!sampler) return rejectCandidate();
|
|
232
|
+
const currentSamplerIdentity = bindingIdentity(sampler);
|
|
233
|
+
const currentBiasFingerprint = operandFingerprint(instruction.operands[4]);
|
|
234
|
+
if (samplerIdentity !== null && samplerIdentity !== currentSamplerIdentity || biasFingerprint !== null && biasFingerprint !== currentBiasFingerprint) {
|
|
235
|
+
return rejectCandidate();
|
|
236
|
+
}
|
|
237
|
+
samplerIdentity = currentSamplerIdentity;
|
|
238
|
+
biasFingerprint = currentBiasFingerprint;
|
|
239
|
+
uses.set(identity, uses.get(identity) + 1);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
if (samplerIdentity === null || Array.from(uses.values()).some(count => count < 1)) {
|
|
243
|
+
return rejectCandidate();
|
|
244
|
+
}
|
|
245
|
+
const inputs = sources.map((source, layer) => ({
|
|
246
|
+
parameter: source.parameter,
|
|
247
|
+
layer,
|
|
248
|
+
identity: source.identity,
|
|
249
|
+
scopeIdentity: scopeIdentity(source.identity, "fragment")
|
|
250
|
+
}));
|
|
251
|
+
const first = inputs[0];
|
|
252
|
+
const id = `${layoutKey}:detail-map-array:${first.identity}`;
|
|
253
|
+
return normalizeResourceTransformPlan({
|
|
254
|
+
format: "CJS_WGSL_RESOURCE_TRANSFORM_PLAN",
|
|
255
|
+
formatVersion: 1,
|
|
256
|
+
resourceTransforms: [{
|
|
257
|
+
id,
|
|
258
|
+
version: 1,
|
|
259
|
+
kind: "texture-2d-array",
|
|
260
|
+
layoutKey,
|
|
261
|
+
stage: "fragment",
|
|
262
|
+
inputs,
|
|
263
|
+
output: {
|
|
264
|
+
name: DETAIL_MAP_ARRAY_NAME,
|
|
265
|
+
identity: first.identity,
|
|
266
|
+
scopeIdentity: first.scopeIdentity,
|
|
267
|
+
viewDimension: "2d-array",
|
|
268
|
+
layerCount: inputs.length
|
|
269
|
+
},
|
|
270
|
+
representation: "native-or-rgba8",
|
|
271
|
+
missingLayer: "reject"
|
|
272
|
+
}]
|
|
273
|
+
}, layoutKey);
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
export { buildResourceTransformPlan, normalizeResourceTransformPlan };
|
|
277
|
+
//# sourceMappingURL=buildResourceTransformPlan.js.map
|