@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,78 +1,78 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Fragment-stage control-flow uniformity analysis.
|
|
3
|
-
*
|
|
4
|
-
* WGSL forbids screen-space derivatives — the `dpdx*`/`dpdy*` family and the
|
|
5
|
-
* implicit-LOD samples that derive internally (`textureSample`,
|
|
6
|
-
* `textureSampleBias`) — inside NON-UNIFORM control flow (a branch whose
|
|
7
|
-
* condition can differ between the pixels of a 2x2 quad). This module tags each
|
|
8
|
-
* SSA value as "varying" (per-pixel) or uniform so the fragment lowerer can
|
|
9
|
-
* identify those operations when an enclosing branch condition is varying and
|
|
10
|
-
* emit the explicit derivative-uniformity diagnostic opt-out.
|
|
11
|
-
*
|
|
12
|
-
* Soundness note: constant-buffer and immediate operands are NOT represented as
|
|
13
|
-
* SSA values (they are resolved at emit time), so the only varying SEEDS are
|
|
14
|
-
* interpolated fragment inputs (`input[N]`, which includes `SV_Position`) and,
|
|
15
|
-
* conservatively, all texture sampling/loading and derivative results. This
|
|
16
|
-
* avoids known false negatives but can flag a result that happens to be
|
|
17
|
-
* dynamically uniform; the only consequence is a broader diagnostic opt-out.
|
|
18
|
-
*/
|
|
19
|
-
|
|
20
|
-
const VARYING_PRODUCERS = new Set(["deriv_rtx", "deriv_rty", "deriv_rtx_coarse", "deriv_rty_coarse", "deriv_rtx_fine", "deriv_rty_fine", "sample", "sample_b", "sample_c", "sample_c_lz", "sample_d", "sample_l", "gather4", "ld", "ld_structured"]);
|
|
21
|
-
|
|
22
|
-
/**
|
|
23
|
-
* Computes the set of value ids whose result can vary per pixel.
|
|
24
|
-
*
|
|
25
|
-
* @param {object} program Frozen CJS_SHADER_IR fragment program.
|
|
26
|
-
* @returns {Set<string>} Ids of varying (non-uniform) values.
|
|
27
|
-
*/
|
|
28
|
-
function computeVaryingValues(program) {
|
|
29
|
-
const varying = new Set();
|
|
30
|
-
const instructions = program.instructions;
|
|
31
|
-
for (const value of program.values) {
|
|
32
|
-
if (value.origin === "program-input" && /^input\[/.test(value.register || "")) {
|
|
33
|
-
varying.add(value.id);
|
|
34
|
-
continue;
|
|
35
|
-
}
|
|
36
|
-
if (value.origin === "instruction-write" && VARYING_PRODUCERS.has(instructions[value.instructionIndex]?.opcodeName)) {
|
|
37
|
-
varying.add(value.id);
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
const inputsFor = value => {
|
|
41
|
-
if (value.origin === "instruction-write") {
|
|
42
|
-
const instruction = instructions[value.instructionIndex];
|
|
43
|
-
return (instruction?.dataflow?.reads || []).flatMap(read => read.refs || []).map(ref => ref.valueId);
|
|
44
|
-
}
|
|
45
|
-
if (value.origin === "control-flow-merge") {
|
|
46
|
-
return (value.incoming || []).map(entry => entry.valueId);
|
|
47
|
-
}
|
|
48
|
-
return [];
|
|
49
|
-
};
|
|
50
|
-
let changed = true;
|
|
51
|
-
while (changed) {
|
|
52
|
-
changed = false;
|
|
53
|
-
for (const value of program.values) {
|
|
54
|
-
if (varying.has(value.id)) continue;
|
|
55
|
-
if (inputsFor(value).some(id => varying.has(id))) {
|
|
56
|
-
varying.add(value.id);
|
|
57
|
-
changed = true;
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
return varying;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
/**
|
|
65
|
-
* Reports whether a branch/switch instruction's scalar condition is uniform.
|
|
66
|
-
*
|
|
67
|
-
* @param {object} instruction DXBC control instruction (`if`/`switch`/`breakc`).
|
|
68
|
-
* @param {Set<string>} varying Varying value ids from {@link computeVaryingValues}.
|
|
69
|
-
* @returns {boolean} True when every value feeding the condition is uniform.
|
|
70
|
-
*/
|
|
71
|
-
function conditionIsUniform(instruction, varying) {
|
|
72
|
-
const conditionRead = (instruction.dataflow?.reads || []).find(read => read.kind !== "index-read" && read.operandIndex === 0);
|
|
73
|
-
if (!conditionRead) return true;
|
|
74
|
-
return !(conditionRead.refs || []).some(ref => varying.has(ref.valueId));
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
export { computeVaryingValues, conditionIsUniform };
|
|
78
|
-
//# sourceMappingURL=uniformity.js.map
|
|
1
|
+
/**
|
|
2
|
+
* Fragment-stage control-flow uniformity analysis.
|
|
3
|
+
*
|
|
4
|
+
* WGSL forbids screen-space derivatives — the `dpdx*`/`dpdy*` family and the
|
|
5
|
+
* implicit-LOD samples that derive internally (`textureSample`,
|
|
6
|
+
* `textureSampleBias`) — inside NON-UNIFORM control flow (a branch whose
|
|
7
|
+
* condition can differ between the pixels of a 2x2 quad). This module tags each
|
|
8
|
+
* SSA value as "varying" (per-pixel) or uniform so the fragment lowerer can
|
|
9
|
+
* identify those operations when an enclosing branch condition is varying and
|
|
10
|
+
* emit the explicit derivative-uniformity diagnostic opt-out.
|
|
11
|
+
*
|
|
12
|
+
* Soundness note: constant-buffer and immediate operands are NOT represented as
|
|
13
|
+
* SSA values (they are resolved at emit time), so the only varying SEEDS are
|
|
14
|
+
* interpolated fragment inputs (`input[N]`, which includes `SV_Position`) and,
|
|
15
|
+
* conservatively, all texture sampling/loading and derivative results. This
|
|
16
|
+
* avoids known false negatives but can flag a result that happens to be
|
|
17
|
+
* dynamically uniform; the only consequence is a broader diagnostic opt-out.
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
const VARYING_PRODUCERS = new Set(["deriv_rtx", "deriv_rty", "deriv_rtx_coarse", "deriv_rty_coarse", "deriv_rtx_fine", "deriv_rty_fine", "sample", "sample_b", "sample_c", "sample_c_lz", "sample_d", "sample_l", "gather4", "ld", "ld_structured"]);
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Computes the set of value ids whose result can vary per pixel.
|
|
24
|
+
*
|
|
25
|
+
* @param {object} program Frozen CJS_SHADER_IR fragment program.
|
|
26
|
+
* @returns {Set<string>} Ids of varying (non-uniform) values.
|
|
27
|
+
*/
|
|
28
|
+
function computeVaryingValues(program) {
|
|
29
|
+
const varying = new Set();
|
|
30
|
+
const instructions = program.instructions;
|
|
31
|
+
for (const value of program.values) {
|
|
32
|
+
if (value.origin === "program-input" && /^input\[/.test(value.register || "")) {
|
|
33
|
+
varying.add(value.id);
|
|
34
|
+
continue;
|
|
35
|
+
}
|
|
36
|
+
if (value.origin === "instruction-write" && VARYING_PRODUCERS.has(instructions[value.instructionIndex]?.opcodeName)) {
|
|
37
|
+
varying.add(value.id);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
const inputsFor = value => {
|
|
41
|
+
if (value.origin === "instruction-write") {
|
|
42
|
+
const instruction = instructions[value.instructionIndex];
|
|
43
|
+
return (instruction?.dataflow?.reads || []).flatMap(read => read.refs || []).map(ref => ref.valueId);
|
|
44
|
+
}
|
|
45
|
+
if (value.origin === "control-flow-merge") {
|
|
46
|
+
return (value.incoming || []).map(entry => entry.valueId);
|
|
47
|
+
}
|
|
48
|
+
return [];
|
|
49
|
+
};
|
|
50
|
+
let changed = true;
|
|
51
|
+
while (changed) {
|
|
52
|
+
changed = false;
|
|
53
|
+
for (const value of program.values) {
|
|
54
|
+
if (varying.has(value.id)) continue;
|
|
55
|
+
if (inputsFor(value).some(id => varying.has(id))) {
|
|
56
|
+
varying.add(value.id);
|
|
57
|
+
changed = true;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return varying;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Reports whether a branch/switch instruction's scalar condition is uniform.
|
|
66
|
+
*
|
|
67
|
+
* @param {object} instruction DXBC control instruction (`if`/`switch`/`breakc`).
|
|
68
|
+
* @param {Set<string>} varying Varying value ids from {@link computeVaryingValues}.
|
|
69
|
+
* @returns {boolean} True when every value feeding the condition is uniform.
|
|
70
|
+
*/
|
|
71
|
+
function conditionIsUniform(instruction, varying) {
|
|
72
|
+
const conditionRead = (instruction.dataflow?.reads || []).find(read => read.kind !== "index-read" && read.operandIndex === 0);
|
|
73
|
+
if (!conditionRead) return true;
|
|
74
|
+
return !(conditionRead.refs || []).some(ref => varying.has(ref.valueId));
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
export { computeVaryingValues, conditionIsUniform };
|
|
78
|
+
//# sourceMappingURL=uniformity.js.map
|
|
@@ -1,196 +1,196 @@
|
|
|
1
|
-
const BINDING_DECLARATIONS = Object.freeze({
|
|
2
|
-
dcl_constant_buffer: Object.freeze({
|
|
3
|
-
resourceKind: "uniform-buffer",
|
|
4
|
-
operandType: "constant_buffer"
|
|
5
|
-
}),
|
|
6
|
-
dcl_sampler: Object.freeze({
|
|
7
|
-
resourceKind: "sampler",
|
|
8
|
-
operandType: "sampler"
|
|
9
|
-
}),
|
|
10
|
-
dcl_resource: Object.freeze({
|
|
11
|
-
resourceKind: "sampled-resource",
|
|
12
|
-
operandType: "resource"
|
|
13
|
-
}),
|
|
14
|
-
dcl_resource_raw: Object.freeze({
|
|
15
|
-
resourceKind: "sampled-resource",
|
|
16
|
-
operandType: "resource"
|
|
17
|
-
}),
|
|
18
|
-
dcl_resource_structured: Object.freeze({
|
|
19
|
-
resourceKind: "sampled-resource",
|
|
20
|
-
operandType: "resource"
|
|
21
|
-
}),
|
|
22
|
-
dcl_unordered_access_view_typed: Object.freeze({
|
|
23
|
-
resourceKind: "storage-resource",
|
|
24
|
-
operandType: "uav"
|
|
25
|
-
}),
|
|
26
|
-
dcl_unordered_access_view_raw: Object.freeze({
|
|
27
|
-
resourceKind: "storage-resource",
|
|
28
|
-
operandType: "uav"
|
|
29
|
-
}),
|
|
30
|
-
dcl_unordered_access_view_structured: Object.freeze({
|
|
31
|
-
resourceKind: "storage-resource",
|
|
32
|
-
operandType: "uav"
|
|
33
|
-
})
|
|
34
|
-
});
|
|
35
|
-
const RANGE_FIELDS = Object.freeze(["bindingModel", "rangeId", "lowerBound", "upperBound", "unbounded", "registerCount", "registerSpace"]);
|
|
36
|
-
const RETURN_TYPE_NAMES = Object.freeze({
|
|
37
|
-
3: "sint",
|
|
38
|
-
4: "uint",
|
|
39
|
-
5: "float"
|
|
40
|
-
});
|
|
41
|
-
function fail(context, message) {
|
|
42
|
-
throw new Error(`${context} ${message}`);
|
|
43
|
-
}
|
|
44
|
-
function hasOwn(value, property) {
|
|
45
|
-
return Object.prototype.hasOwnProperty.call(value, property);
|
|
46
|
-
}
|
|
47
|
-
function isDenseArrayOfLength(value, length) {
|
|
48
|
-
return Array.isArray(value) && value.length === length && Array.from({
|
|
49
|
-
length
|
|
50
|
-
}, (_, index) => hasOwn(value, index)).every(Boolean);
|
|
51
|
-
}
|
|
52
|
-
function rejectTailTokens(entries, kind, context) {
|
|
53
|
-
for (const entry of entries) {
|
|
54
|
-
if (entry?.tailTokens !== undefined && (!Array.isArray(entry.tailTokens) || entry.tailTokens.length !== 0)) {
|
|
55
|
-
const location = kind === "declaration" ? `at DXBC offset ${entry?.dxbcOffset ?? "<unknown>"}` : `${entry?.index ?? "<unknown>"}`;
|
|
56
|
-
fail(context, `has inconsistent envelope metadata: ${kind} ${location} has unconsumed tail tokens; exact compute programs must not contain trailing payload words`);
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
function fixedRegisterRange(data, binding, context) {
|
|
61
|
-
const registerIndex = data?.registerIndex;
|
|
62
|
-
if (!data || hasOwn(data, "bindingModel") || hasOwn(data, "bindingRange") || !Number.isInteger(registerIndex) || registerIndex < 0) {
|
|
63
|
-
fail(context, `binding ${binding.id || "<unknown>"} has an invalid fixed register declaration`);
|
|
64
|
-
}
|
|
65
|
-
return {
|
|
66
|
-
bindingModel: "sm5.0-register",
|
|
67
|
-
rangeId: null,
|
|
68
|
-
lowerBound: registerIndex,
|
|
69
|
-
upperBound: registerIndex,
|
|
70
|
-
unbounded: false,
|
|
71
|
-
registerCount: 1,
|
|
72
|
-
registerSpace: 0
|
|
73
|
-
};
|
|
74
|
-
}
|
|
75
|
-
function finiteRange(data, binding, context) {
|
|
76
|
-
const range = data?.bindingRange;
|
|
77
|
-
if (!data || !hasOwn(data, "bindingModel") || !hasOwn(data, "bindingRange") || data.bindingModel !== "sm5.1-range" || range?.bindingModel !== "sm5.1-range" || !Number.isInteger(range.rangeId) || range.rangeId < 0 || !Number.isInteger(range.lowerBound) || range.lowerBound < 0 || !Number.isInteger(range.upperBound) || range.upperBound < range.lowerBound || range.unbounded !== false || range.registerCount !== range.upperBound - range.lowerBound + 1 || !Number.isInteger(range.registerSpace) || range.registerSpace < 0 || data.registerIndex !== range.lowerBound) {
|
|
78
|
-
fail(context, `binding ${binding.id || "<unknown>"} has an invalid finite SM5.1 range declaration`);
|
|
79
|
-
}
|
|
80
|
-
return range;
|
|
81
|
-
}
|
|
82
|
-
function declarationRange(declaration, binding, context) {
|
|
83
|
-
const data = declaration.data;
|
|
84
|
-
return data && (hasOwn(data, "bindingModel") || hasOwn(data, "bindingRange")) ? finiteRange(declaration.data, binding, context) : fixedRegisterRange(declaration.data, binding, context);
|
|
85
|
-
}
|
|
86
|
-
function validateRangeIdentity(binding, range, context) {
|
|
87
|
-
if (!binding.range || RANGE_FIELDS.some(field => binding.range[field] !== range[field]) || binding.registerIndex !== range.lowerBound) {
|
|
88
|
-
fail(context, `binding ${binding.id || "<unknown>"} has inconsistent declaration range identity; array or unbounded range metadata is not canonical`);
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
function isCanonicalIndex(index, dimension, value) {
|
|
92
|
-
return index?.dimension === dimension && index.representation === 0 && index.relative === null && index.values?.length === 1 && index.values[0] === value;
|
|
93
|
-
}
|
|
94
|
-
function isCanonicalFixedIndex(index, dimension, value) {
|
|
95
|
-
return (index?.dimension ?? dimension) === dimension && (index.representation ?? 0) === 0 && index.relative === null && index.values?.length === 1 && index.values[0] === value;
|
|
96
|
-
}
|
|
97
|
-
function validateHandleIdentity(declaration, binding, descriptor, range, context) {
|
|
98
|
-
const operand = declaration.operands?.[0];
|
|
99
|
-
const ranged = range.bindingModel === "sm5.1-range";
|
|
100
|
-
const handleRegister = ranged ? range.rangeId : range.lowerBound;
|
|
101
|
-
const indices = operand?.indices;
|
|
102
|
-
const validIndices = ranged ? indices?.length === 3 && isCanonicalIndex(indices[0], 0, range.rangeId) && isCanonicalIndex(indices[1], 1, range.lowerBound) && isCanonicalIndex(indices[2], 2, range.upperBound) : descriptor.operandType === "constant_buffer" ? indices?.length === 2 && isCanonicalFixedIndex(indices[0], 0, range.lowerBound) && isCanonicalFixedIndex(indices[1], 1, declaration.data?.sizeInVec4) : indices?.length === 1 && isCanonicalFixedIndex(indices[0], 0, range.lowerBound);
|
|
103
|
-
if (declaration.operands?.length !== 1 || operand?.typeName !== descriptor.operandType || binding.operandType !== descriptor.operandType || operand.registerIndex !== handleRegister || !validIndices) {
|
|
104
|
-
fail(context, `binding ${binding.id || "<unknown>"} has inconsistent declaration handle identity`);
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
function validateBinding(program, binding, context) {
|
|
108
|
-
const declarations = program.declarations.filter(entry => entry?.dxbcOffset === binding?.declarationOffset);
|
|
109
|
-
if (declarations.length !== 1) {
|
|
110
|
-
fail(context, `binding ${binding?.id || "<unknown>"} has inconsistent declaration identity`);
|
|
111
|
-
}
|
|
112
|
-
const declaration = declarations[0];
|
|
113
|
-
const descriptor = BINDING_DECLARATIONS[declaration.opcodeName];
|
|
114
|
-
if (!descriptor || binding.resourceKind !== descriptor.resourceKind) {
|
|
115
|
-
fail(context, `binding ${binding?.id || "<unknown>"} has inconsistent declaration resource kind`);
|
|
116
|
-
}
|
|
117
|
-
const range = declarationRange(declaration, binding, context);
|
|
118
|
-
validateRangeIdentity(binding, range, context);
|
|
119
|
-
validateHandleIdentity(declaration, binding, descriptor, range, context);
|
|
120
|
-
const expectedId = `${descriptor.resourceKind}:space${range.registerSpace}:range${range.rangeId ?? range.lowerBound}`;
|
|
121
|
-
if (binding.id !== expectedId) {
|
|
122
|
-
fail(context, `binding ${binding.id || "<unknown>"} has noncanonical id; expected ${expectedId}`);
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
/**
|
|
127
|
-
* Validates the raw framing shared by exact compute profiles.
|
|
128
|
-
*
|
|
129
|
-
* The decoder is the sole canonical producer of this metadata. Lowering rejects
|
|
130
|
-
* foreign or tampered envelopes instead of normalizing them.
|
|
131
|
-
*
|
|
132
|
-
* @param {object} program CJS shader IR program.
|
|
133
|
-
* @param {string} [context] Error-message prefix.
|
|
134
|
-
* @returns {true} True when the exact envelope is canonical.
|
|
135
|
-
*/
|
|
136
|
-
function validateExactComputeEnvelope(program, context = "WGSL exact compute") {
|
|
137
|
-
if (!Array.isArray(program?.declarations) || !Array.isArray(program?.instructions) || !Array.isArray(program?.bindings)) {
|
|
138
|
-
throw new TypeError(`${context} envelope requires declaration, instruction, and binding arrays`);
|
|
139
|
-
}
|
|
140
|
-
rejectTailTokens(program.declarations, "declaration", context);
|
|
141
|
-
rejectTailTokens(program.instructions, "instruction", context);
|
|
142
|
-
for (const binding of program.bindings) validateBinding(program, binding, context);
|
|
143
|
-
return true;
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
/**
|
|
147
|
-
* Validates the redundant numeric/name component records retained for a typed
|
|
148
|
-
* resource declaration or binding.
|
|
149
|
-
*
|
|
150
|
-
* The exact scalar-word profiles consume the names, while the decoder also
|
|
151
|
-
* retains their numeric DXBC component classes. Both copies must describe the
|
|
152
|
-
* same four components.
|
|
153
|
-
*
|
|
154
|
-
* @param {object} returnType Typed resource return metadata.
|
|
155
|
-
* @param {string} [context] Error-message prefix.
|
|
156
|
-
* @returns {true} True when the two component records agree.
|
|
157
|
-
*/
|
|
158
|
-
function validateReturnTypeMirror(returnType, context = "WGSL exact compute return type") {
|
|
159
|
-
const numeric = returnType?.returnTypes;
|
|
160
|
-
const names = returnType?.returnTypeNames;
|
|
161
|
-
if (!isDenseArrayOfLength(numeric, 4) || !isDenseArrayOfLength(names, 4) || numeric.some((entry, index) => !Number.isInteger(entry) || !Object.prototype.hasOwnProperty.call(RETURN_TYPE_NAMES, entry) || RETURN_TYPE_NAMES[entry] !== names[index])) {
|
|
162
|
-
fail(context, "has inconsistent numeric/name return-type component mirrors");
|
|
163
|
-
}
|
|
164
|
-
return true;
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
/**
|
|
168
|
-
* Validates one canonical SM5.0 resource-dimension/resource-return extension
|
|
169
|
-
* pair, including both semantic fields and their redundant numeric words.
|
|
170
|
-
*
|
|
171
|
-
* @param {object[]} extensions Instruction opcode extensions.
|
|
172
|
-
* @param {object} expected Expected semantic extension values.
|
|
173
|
-
* @param {number} expected.resourceDimension Numeric resource dimension.
|
|
174
|
-
* @param {string} expected.resourceDimensionName Resource dimension name.
|
|
175
|
-
* @param {number} expected.structureStride Structured byte stride.
|
|
176
|
-
* @param {number[]} expected.resourceReturnTypes Four numeric component types.
|
|
177
|
-
* @param {string} [context] Error-message prefix.
|
|
178
|
-
* @returns {true} True when the exact extension pair is canonical.
|
|
179
|
-
*/
|
|
180
|
-
function validateSm50ResourceExtensions(extensions, expected, context = "WGSL exact compute instruction") {
|
|
181
|
-
const resourceReturnTypes = expected?.resourceReturnTypes;
|
|
182
|
-
if (!Number.isInteger(expected?.resourceDimension) || !Number.isInteger(expected?.structureStride) || !isDenseArrayOfLength(resourceReturnTypes, 4)) {
|
|
183
|
-
throw new TypeError(`${context} requires exact expected SM5.0 resource extensions`);
|
|
184
|
-
}
|
|
185
|
-
const dimensionToken = (0x80000000 | expected.structureStride << 11 | expected.resourceDimension << 6 | 2) >>> 0;
|
|
186
|
-
const returnToken = (3 | resourceReturnTypes[0] << 6 | resourceReturnTypes[1] << 10 | resourceReturnTypes[2] << 14 | resourceReturnTypes[3] << 18) >>> 0;
|
|
187
|
-
const dimension = extensions?.[0];
|
|
188
|
-
const returns = extensions?.[1];
|
|
189
|
-
if (!Array.isArray(extensions) || extensions.length !== 2 || dimension?.token !== dimensionToken || dimension.type !== 2 || dimension.typeName !== "resource_dimension" || dimension.resourceDimension !== expected.resourceDimension || dimension.resourceDimensionName !== expected.resourceDimensionName || dimension.structureStride !== expected.structureStride || returns?.token !== returnToken || returns.type !== 3 || returns.typeName !== "resource_return_type" || !isDenseArrayOfLength(returns.resourceReturnTypes, 4) || returns.resourceReturnTypes.some((entry, index) => entry !== resourceReturnTypes[index])) {
|
|
190
|
-
fail(context, "has inconsistent SM5.0 resource-extension semantic or numeric mirrors");
|
|
191
|
-
}
|
|
192
|
-
return true;
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
export { validateExactComputeEnvelope, validateReturnTypeMirror, validateSm50ResourceExtensions };
|
|
196
|
-
//# sourceMappingURL=validateExactComputeIr.js.map
|
|
1
|
+
const BINDING_DECLARATIONS = Object.freeze({
|
|
2
|
+
dcl_constant_buffer: Object.freeze({
|
|
3
|
+
resourceKind: "uniform-buffer",
|
|
4
|
+
operandType: "constant_buffer"
|
|
5
|
+
}),
|
|
6
|
+
dcl_sampler: Object.freeze({
|
|
7
|
+
resourceKind: "sampler",
|
|
8
|
+
operandType: "sampler"
|
|
9
|
+
}),
|
|
10
|
+
dcl_resource: Object.freeze({
|
|
11
|
+
resourceKind: "sampled-resource",
|
|
12
|
+
operandType: "resource"
|
|
13
|
+
}),
|
|
14
|
+
dcl_resource_raw: Object.freeze({
|
|
15
|
+
resourceKind: "sampled-resource",
|
|
16
|
+
operandType: "resource"
|
|
17
|
+
}),
|
|
18
|
+
dcl_resource_structured: Object.freeze({
|
|
19
|
+
resourceKind: "sampled-resource",
|
|
20
|
+
operandType: "resource"
|
|
21
|
+
}),
|
|
22
|
+
dcl_unordered_access_view_typed: Object.freeze({
|
|
23
|
+
resourceKind: "storage-resource",
|
|
24
|
+
operandType: "uav"
|
|
25
|
+
}),
|
|
26
|
+
dcl_unordered_access_view_raw: Object.freeze({
|
|
27
|
+
resourceKind: "storage-resource",
|
|
28
|
+
operandType: "uav"
|
|
29
|
+
}),
|
|
30
|
+
dcl_unordered_access_view_structured: Object.freeze({
|
|
31
|
+
resourceKind: "storage-resource",
|
|
32
|
+
operandType: "uav"
|
|
33
|
+
})
|
|
34
|
+
});
|
|
35
|
+
const RANGE_FIELDS = Object.freeze(["bindingModel", "rangeId", "lowerBound", "upperBound", "unbounded", "registerCount", "registerSpace"]);
|
|
36
|
+
const RETURN_TYPE_NAMES = Object.freeze({
|
|
37
|
+
3: "sint",
|
|
38
|
+
4: "uint",
|
|
39
|
+
5: "float"
|
|
40
|
+
});
|
|
41
|
+
function fail(context, message) {
|
|
42
|
+
throw new Error(`${context} ${message}`);
|
|
43
|
+
}
|
|
44
|
+
function hasOwn(value, property) {
|
|
45
|
+
return Object.prototype.hasOwnProperty.call(value, property);
|
|
46
|
+
}
|
|
47
|
+
function isDenseArrayOfLength(value, length) {
|
|
48
|
+
return Array.isArray(value) && value.length === length && Array.from({
|
|
49
|
+
length
|
|
50
|
+
}, (_, index) => hasOwn(value, index)).every(Boolean);
|
|
51
|
+
}
|
|
52
|
+
function rejectTailTokens(entries, kind, context) {
|
|
53
|
+
for (const entry of entries) {
|
|
54
|
+
if (entry?.tailTokens !== undefined && (!Array.isArray(entry.tailTokens) || entry.tailTokens.length !== 0)) {
|
|
55
|
+
const location = kind === "declaration" ? `at DXBC offset ${entry?.dxbcOffset ?? "<unknown>"}` : `${entry?.index ?? "<unknown>"}`;
|
|
56
|
+
fail(context, `has inconsistent envelope metadata: ${kind} ${location} has unconsumed tail tokens; exact compute programs must not contain trailing payload words`);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
function fixedRegisterRange(data, binding, context) {
|
|
61
|
+
const registerIndex = data?.registerIndex;
|
|
62
|
+
if (!data || hasOwn(data, "bindingModel") || hasOwn(data, "bindingRange") || !Number.isInteger(registerIndex) || registerIndex < 0) {
|
|
63
|
+
fail(context, `binding ${binding.id || "<unknown>"} has an invalid fixed register declaration`);
|
|
64
|
+
}
|
|
65
|
+
return {
|
|
66
|
+
bindingModel: "sm5.0-register",
|
|
67
|
+
rangeId: null,
|
|
68
|
+
lowerBound: registerIndex,
|
|
69
|
+
upperBound: registerIndex,
|
|
70
|
+
unbounded: false,
|
|
71
|
+
registerCount: 1,
|
|
72
|
+
registerSpace: 0
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
function finiteRange(data, binding, context) {
|
|
76
|
+
const range = data?.bindingRange;
|
|
77
|
+
if (!data || !hasOwn(data, "bindingModel") || !hasOwn(data, "bindingRange") || data.bindingModel !== "sm5.1-range" || range?.bindingModel !== "sm5.1-range" || !Number.isInteger(range.rangeId) || range.rangeId < 0 || !Number.isInteger(range.lowerBound) || range.lowerBound < 0 || !Number.isInteger(range.upperBound) || range.upperBound < range.lowerBound || range.unbounded !== false || range.registerCount !== range.upperBound - range.lowerBound + 1 || !Number.isInteger(range.registerSpace) || range.registerSpace < 0 || data.registerIndex !== range.lowerBound) {
|
|
78
|
+
fail(context, `binding ${binding.id || "<unknown>"} has an invalid finite SM5.1 range declaration`);
|
|
79
|
+
}
|
|
80
|
+
return range;
|
|
81
|
+
}
|
|
82
|
+
function declarationRange(declaration, binding, context) {
|
|
83
|
+
const data = declaration.data;
|
|
84
|
+
return data && (hasOwn(data, "bindingModel") || hasOwn(data, "bindingRange")) ? finiteRange(declaration.data, binding, context) : fixedRegisterRange(declaration.data, binding, context);
|
|
85
|
+
}
|
|
86
|
+
function validateRangeIdentity(binding, range, context) {
|
|
87
|
+
if (!binding.range || RANGE_FIELDS.some(field => binding.range[field] !== range[field]) || binding.registerIndex !== range.lowerBound) {
|
|
88
|
+
fail(context, `binding ${binding.id || "<unknown>"} has inconsistent declaration range identity; array or unbounded range metadata is not canonical`);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
function isCanonicalIndex(index, dimension, value) {
|
|
92
|
+
return index?.dimension === dimension && index.representation === 0 && index.relative === null && index.values?.length === 1 && index.values[0] === value;
|
|
93
|
+
}
|
|
94
|
+
function isCanonicalFixedIndex(index, dimension, value) {
|
|
95
|
+
return (index?.dimension ?? dimension) === dimension && (index.representation ?? 0) === 0 && index.relative === null && index.values?.length === 1 && index.values[0] === value;
|
|
96
|
+
}
|
|
97
|
+
function validateHandleIdentity(declaration, binding, descriptor, range, context) {
|
|
98
|
+
const operand = declaration.operands?.[0];
|
|
99
|
+
const ranged = range.bindingModel === "sm5.1-range";
|
|
100
|
+
const handleRegister = ranged ? range.rangeId : range.lowerBound;
|
|
101
|
+
const indices = operand?.indices;
|
|
102
|
+
const validIndices = ranged ? indices?.length === 3 && isCanonicalIndex(indices[0], 0, range.rangeId) && isCanonicalIndex(indices[1], 1, range.lowerBound) && isCanonicalIndex(indices[2], 2, range.upperBound) : descriptor.operandType === "constant_buffer" ? indices?.length === 2 && isCanonicalFixedIndex(indices[0], 0, range.lowerBound) && isCanonicalFixedIndex(indices[1], 1, declaration.data?.sizeInVec4) : indices?.length === 1 && isCanonicalFixedIndex(indices[0], 0, range.lowerBound);
|
|
103
|
+
if (declaration.operands?.length !== 1 || operand?.typeName !== descriptor.operandType || binding.operandType !== descriptor.operandType || operand.registerIndex !== handleRegister || !validIndices) {
|
|
104
|
+
fail(context, `binding ${binding.id || "<unknown>"} has inconsistent declaration handle identity`);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
function validateBinding(program, binding, context) {
|
|
108
|
+
const declarations = program.declarations.filter(entry => entry?.dxbcOffset === binding?.declarationOffset);
|
|
109
|
+
if (declarations.length !== 1) {
|
|
110
|
+
fail(context, `binding ${binding?.id || "<unknown>"} has inconsistent declaration identity`);
|
|
111
|
+
}
|
|
112
|
+
const declaration = declarations[0];
|
|
113
|
+
const descriptor = BINDING_DECLARATIONS[declaration.opcodeName];
|
|
114
|
+
if (!descriptor || binding.resourceKind !== descriptor.resourceKind) {
|
|
115
|
+
fail(context, `binding ${binding?.id || "<unknown>"} has inconsistent declaration resource kind`);
|
|
116
|
+
}
|
|
117
|
+
const range = declarationRange(declaration, binding, context);
|
|
118
|
+
validateRangeIdentity(binding, range, context);
|
|
119
|
+
validateHandleIdentity(declaration, binding, descriptor, range, context);
|
|
120
|
+
const expectedId = `${descriptor.resourceKind}:space${range.registerSpace}:range${range.rangeId ?? range.lowerBound}`;
|
|
121
|
+
if (binding.id !== expectedId) {
|
|
122
|
+
fail(context, `binding ${binding.id || "<unknown>"} has noncanonical id; expected ${expectedId}`);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Validates the raw framing shared by exact compute profiles.
|
|
128
|
+
*
|
|
129
|
+
* The decoder is the sole canonical producer of this metadata. Lowering rejects
|
|
130
|
+
* foreign or tampered envelopes instead of normalizing them.
|
|
131
|
+
*
|
|
132
|
+
* @param {object} program CJS shader IR program.
|
|
133
|
+
* @param {string} [context] Error-message prefix.
|
|
134
|
+
* @returns {true} True when the exact envelope is canonical.
|
|
135
|
+
*/
|
|
136
|
+
function validateExactComputeEnvelope(program, context = "WGSL exact compute") {
|
|
137
|
+
if (!Array.isArray(program?.declarations) || !Array.isArray(program?.instructions) || !Array.isArray(program?.bindings)) {
|
|
138
|
+
throw new TypeError(`${context} envelope requires declaration, instruction, and binding arrays`);
|
|
139
|
+
}
|
|
140
|
+
rejectTailTokens(program.declarations, "declaration", context);
|
|
141
|
+
rejectTailTokens(program.instructions, "instruction", context);
|
|
142
|
+
for (const binding of program.bindings) validateBinding(program, binding, context);
|
|
143
|
+
return true;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* Validates the redundant numeric/name component records retained for a typed
|
|
148
|
+
* resource declaration or binding.
|
|
149
|
+
*
|
|
150
|
+
* The exact scalar-word profiles consume the names, while the decoder also
|
|
151
|
+
* retains their numeric DXBC component classes. Both copies must describe the
|
|
152
|
+
* same four components.
|
|
153
|
+
*
|
|
154
|
+
* @param {object} returnType Typed resource return metadata.
|
|
155
|
+
* @param {string} [context] Error-message prefix.
|
|
156
|
+
* @returns {true} True when the two component records agree.
|
|
157
|
+
*/
|
|
158
|
+
function validateReturnTypeMirror(returnType, context = "WGSL exact compute return type") {
|
|
159
|
+
const numeric = returnType?.returnTypes;
|
|
160
|
+
const names = returnType?.returnTypeNames;
|
|
161
|
+
if (!isDenseArrayOfLength(numeric, 4) || !isDenseArrayOfLength(names, 4) || numeric.some((entry, index) => !Number.isInteger(entry) || !Object.prototype.hasOwnProperty.call(RETURN_TYPE_NAMES, entry) || RETURN_TYPE_NAMES[entry] !== names[index])) {
|
|
162
|
+
fail(context, "has inconsistent numeric/name return-type component mirrors");
|
|
163
|
+
}
|
|
164
|
+
return true;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* Validates one canonical SM5.0 resource-dimension/resource-return extension
|
|
169
|
+
* pair, including both semantic fields and their redundant numeric words.
|
|
170
|
+
*
|
|
171
|
+
* @param {object[]} extensions Instruction opcode extensions.
|
|
172
|
+
* @param {object} expected Expected semantic extension values.
|
|
173
|
+
* @param {number} expected.resourceDimension Numeric resource dimension.
|
|
174
|
+
* @param {string} expected.resourceDimensionName Resource dimension name.
|
|
175
|
+
* @param {number} expected.structureStride Structured byte stride.
|
|
176
|
+
* @param {number[]} expected.resourceReturnTypes Four numeric component types.
|
|
177
|
+
* @param {string} [context] Error-message prefix.
|
|
178
|
+
* @returns {true} True when the exact extension pair is canonical.
|
|
179
|
+
*/
|
|
180
|
+
function validateSm50ResourceExtensions(extensions, expected, context = "WGSL exact compute instruction") {
|
|
181
|
+
const resourceReturnTypes = expected?.resourceReturnTypes;
|
|
182
|
+
if (!Number.isInteger(expected?.resourceDimension) || !Number.isInteger(expected?.structureStride) || !isDenseArrayOfLength(resourceReturnTypes, 4)) {
|
|
183
|
+
throw new TypeError(`${context} requires exact expected SM5.0 resource extensions`);
|
|
184
|
+
}
|
|
185
|
+
const dimensionToken = (0x80000000 | expected.structureStride << 11 | expected.resourceDimension << 6 | 2) >>> 0;
|
|
186
|
+
const returnToken = (3 | resourceReturnTypes[0] << 6 | resourceReturnTypes[1] << 10 | resourceReturnTypes[2] << 14 | resourceReturnTypes[3] << 18) >>> 0;
|
|
187
|
+
const dimension = extensions?.[0];
|
|
188
|
+
const returns = extensions?.[1];
|
|
189
|
+
if (!Array.isArray(extensions) || extensions.length !== 2 || dimension?.token !== dimensionToken || dimension.type !== 2 || dimension.typeName !== "resource_dimension" || dimension.resourceDimension !== expected.resourceDimension || dimension.resourceDimensionName !== expected.resourceDimensionName || dimension.structureStride !== expected.structureStride || returns?.token !== returnToken || returns.type !== 3 || returns.typeName !== "resource_return_type" || !isDenseArrayOfLength(returns.resourceReturnTypes, 4) || returns.resourceReturnTypes.some((entry, index) => entry !== resourceReturnTypes[index])) {
|
|
190
|
+
fail(context, "has inconsistent SM5.0 resource-extension semantic or numeric mirrors");
|
|
191
|
+
}
|
|
192
|
+
return true;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
export { validateExactComputeEnvelope, validateReturnTypeMirror, validateSm50ResourceExtensions };
|
|
196
|
+
//# sourceMappingURL=validateExactComputeIr.js.map
|
|
@@ -1,37 +1,37 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Requires one fixed, unmodified, default-precision resource-handle operand.
|
|
3
|
-
*
|
|
4
|
-
* @param {object} instruction Decoded instruction.
|
|
5
|
-
* @param {number} operandIndex Handle operand index.
|
|
6
|
-
* @param {string} expectedType Required operand type.
|
|
7
|
-
* @param {string} stage Stage name used in diagnostics.
|
|
8
|
-
* @returns {object} Validated operand.
|
|
9
|
-
*/
|
|
10
|
-
function validateFixedHandleOperand(instruction, operandIndex, expectedType, stage) {
|
|
11
|
-
const operand = instruction.operands[operandIndex];
|
|
12
|
-
const hasRelativeIdentity = operand?.indices?.some(entry => entry?.relative) || operand?.resourceReference?.absoluteIndex?.relative;
|
|
13
|
-
if (operand?.typeName !== expectedType || (operand.modifierName ?? "none") !== "none" || (operand.minPrecisionName ?? "default") !== "default" || hasRelativeIdentity) {
|
|
14
|
-
throw new Error(`WGSL ${stage} instruction ${instruction.index} requires a fixed, unmodified, default-precision ${expectedType} handle at operand ${operandIndex}`);
|
|
15
|
-
}
|
|
16
|
-
return operand;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
* Confirms an operand's absolute handle index matches its resolved binding.
|
|
21
|
-
*
|
|
22
|
-
* @param {object} operand Validated handle operand.
|
|
23
|
-
* @param {object|null} binding Resolved binding.
|
|
24
|
-
* @param {string} stage Stage name used in diagnostics.
|
|
25
|
-
* @returns {object|null} The unchanged binding.
|
|
26
|
-
*/
|
|
27
|
-
function validateFixedHandleBinding(operand, binding, stage) {
|
|
28
|
-
const absoluteIndex = operand?.resourceReference?.absoluteIndex;
|
|
29
|
-
if (!binding || absoluteIndex === undefined) return binding;
|
|
30
|
-
if (absoluteIndex?.relative || absoluteIndex?.values?.length !== 1 || absoluteIndex.values[0] !== binding.registerIndex) {
|
|
31
|
-
throw new Error(`WGSL ${stage} handle has an out-of-range fixed handle identity`);
|
|
32
|
-
}
|
|
33
|
-
return binding;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
export { validateFixedHandleBinding, validateFixedHandleOperand };
|
|
37
|
-
//# sourceMappingURL=validateHandleOperand.js.map
|
|
1
|
+
/**
|
|
2
|
+
* Requires one fixed, unmodified, default-precision resource-handle operand.
|
|
3
|
+
*
|
|
4
|
+
* @param {object} instruction Decoded instruction.
|
|
5
|
+
* @param {number} operandIndex Handle operand index.
|
|
6
|
+
* @param {string} expectedType Required operand type.
|
|
7
|
+
* @param {string} stage Stage name used in diagnostics.
|
|
8
|
+
* @returns {object} Validated operand.
|
|
9
|
+
*/
|
|
10
|
+
function validateFixedHandleOperand(instruction, operandIndex, expectedType, stage) {
|
|
11
|
+
const operand = instruction.operands[operandIndex];
|
|
12
|
+
const hasRelativeIdentity = operand?.indices?.some(entry => entry?.relative) || operand?.resourceReference?.absoluteIndex?.relative;
|
|
13
|
+
if (operand?.typeName !== expectedType || (operand.modifierName ?? "none") !== "none" || (operand.minPrecisionName ?? "default") !== "default" || hasRelativeIdentity) {
|
|
14
|
+
throw new Error(`WGSL ${stage} instruction ${instruction.index} requires a fixed, unmodified, default-precision ${expectedType} handle at operand ${operandIndex}`);
|
|
15
|
+
}
|
|
16
|
+
return operand;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Confirms an operand's absolute handle index matches its resolved binding.
|
|
21
|
+
*
|
|
22
|
+
* @param {object} operand Validated handle operand.
|
|
23
|
+
* @param {object|null} binding Resolved binding.
|
|
24
|
+
* @param {string} stage Stage name used in diagnostics.
|
|
25
|
+
* @returns {object|null} The unchanged binding.
|
|
26
|
+
*/
|
|
27
|
+
function validateFixedHandleBinding(operand, binding, stage) {
|
|
28
|
+
const absoluteIndex = operand?.resourceReference?.absoluteIndex;
|
|
29
|
+
if (!binding || absoluteIndex === undefined) return binding;
|
|
30
|
+
if (absoluteIndex?.relative || absoluteIndex?.values?.length !== 1 || absoluteIndex.values[0] !== binding.registerIndex) {
|
|
31
|
+
throw new Error(`WGSL ${stage} handle has an out-of-range fixed handle identity`);
|
|
32
|
+
}
|
|
33
|
+
return binding;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export { validateFixedHandleBinding, validateFixedHandleOperand };
|
|
37
|
+
//# sourceMappingURL=validateHandleOperand.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { CjsWebgpuFormat, CjsWebgpuFormat as default } from './CjsWebgpuFormat.js';
|
|
2
|
-
//# sourceMappingURL=index.js.map
|
|
1
|
+
export { CjsWebgpuFormat, CjsWebgpuFormat as default } from './CjsWebgpuFormat.js';
|
|
2
|
+
//# sourceMappingURL=index.js.map
|