@carbonenginejs/runtime-resource 0.12.0 → 0.12.1

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.
Files changed (170) hide show
  1. package/dist/CjsResMan.js +4 -4
  2. package/dist/CjsResMan.js.map +1 -1
  3. package/dist/_virtual/_rollupPluginBabelHelpers.js +1 -4
  4. package/dist/_virtual/_rollupPluginBabelHelpers.js.map +1 -1
  5. package/dist/format/CjsByteReader.js +310 -0
  6. package/dist/format/CjsByteReader.js.map +1 -0
  7. package/dist/format/CjsByteWriter.js +242 -0
  8. package/dist/format/CjsByteWriter.js.map +1 -0
  9. package/dist/format/CjsFormatError.js +41 -0
  10. package/dist/format/CjsFormatError.js.map +1 -0
  11. package/dist/format/CjsStringTable.js +268 -0
  12. package/dist/format/CjsStringTable.js.map +1 -0
  13. package/dist/format/carbonEffect/CjsCarbonEffectReader.js +361 -0
  14. package/dist/format/carbonEffect/CjsCarbonEffectReader.js.map +1 -0
  15. package/dist/format/carbonEffect/CjsCarbonEffectWriter.js +373 -0
  16. package/dist/format/carbonEffect/CjsCarbonEffectWriter.js.map +1 -0
  17. package/dist/format/carbonEffect/carbonDescriptionFromPortable.js +372 -0
  18. package/dist/format/carbonEffect/carbonDescriptionFromPortable.js.map +1 -0
  19. package/dist/format/carbonEffect/carbonEffectBackendBlock.js +427 -0
  20. package/dist/format/carbonEffect/carbonEffectBackendBlock.js.map +1 -0
  21. package/dist/format/carbonEffect/carbonEffectRecords.js +955 -0
  22. package/dist/format/carbonEffect/carbonEffectRecords.js.map +1 -0
  23. package/dist/format/compareUtf8.js +36 -0
  24. package/dist/format/compareUtf8.js.map +1 -0
  25. package/dist/format/index.js +11 -0
  26. package/dist/format/index.js.map +1 -0
  27. package/dist/formats/bnk/CjsBnkFormat.js +10 -4
  28. package/dist/formats/bnk/CjsBnkFormat.js.map +1 -1
  29. package/dist/formats/bnk/core/eventAction.js +305 -0
  30. package/dist/formats/bnk/core/eventAction.js.map +1 -0
  31. package/dist/formats/bnk/core/helpers.js +11 -2
  32. package/dist/formats/bnk/core/helpers.js.map +1 -1
  33. package/dist/formats/bnk/core/nodeBase.js +532 -0
  34. package/dist/formats/bnk/core/nodeBase.js.map +1 -0
  35. package/dist/formats/bnk/core/sfxNodes.js +252 -152
  36. package/dist/formats/bnk/core/sfxNodes.js.map +1 -1
  37. package/dist/formats/hlsl/core/HlslReader.js +7 -257
  38. package/dist/formats/hlsl/core/HlslReader.js.map +1 -1
  39. package/dist/formats/hlsl/core/carbonDescriptionToRuntime.js +781 -0
  40. package/dist/formats/hlsl/core/carbonDescriptionToRuntime.js.map +1 -0
  41. package/dist/formats/hlsl/core/tr2/resources/HlslEffectRes.js +21 -1
  42. package/dist/formats/hlsl/core/tr2/resources/HlslEffectRes.js.map +1 -1
  43. package/dist/formats/index.js +1 -1
  44. package/dist/formats/webgl/core/cewg/CewgPackage.js +2 -1
  45. package/dist/formats/webgl/core/cewg/CewgPackage.js.map +1 -1
  46. package/dist/formats/webgl/core/cewg/binary.js +11 -93
  47. package/dist/formats/webgl/core/cewg/binary.js.map +1 -1
  48. package/dist/formats/webgl/core/effectPackage.js +1 -1
  49. package/dist/formats/webgpu/CjsWebgpuFormat.js +4 -23
  50. package/dist/formats/webgpu/CjsWebgpuFormat.js.map +1 -1
  51. package/dist/formats/webgpu/core/buildCarbonEffectContainer.js +197 -0
  52. package/dist/formats/webgpu/core/buildCarbonEffectContainer.js.map +1 -0
  53. package/dist/formats/webgpu/core/cewgpu/CewgpuContainer.js +368 -0
  54. package/dist/formats/webgpu/core/cewgpu/CewgpuContainer.js.map +1 -0
  55. package/dist/formats/webgpu/core/cewgpu/containerViews.js +355 -0
  56. package/dist/formats/webgpu/core/cewgpu/containerViews.js.map +1 -0
  57. package/dist/formats/webgpu/core/cewgpu/validateContainer.js +90 -0
  58. package/dist/formats/webgpu/core/cewgpu/validateContainer.js.map +1 -0
  59. package/dist/formats/webgpu/core/effectBackendBodySet.js +21 -20
  60. package/dist/formats/webgpu/core/effectBackendBodySet.js.map +1 -1
  61. package/dist/formats/webgpu/core/helpers.js +87 -92
  62. package/dist/formats/webgpu/core/helpers.js.map +1 -1
  63. package/dist/formats/webgpu/core/ir/analyzeRegisterValues.js +14 -13
  64. package/dist/formats/webgpu/core/ir/analyzeRegisterValues.js.map +1 -1
  65. package/dist/formats/webgpu/core/ir/inferValueTypes.js +10 -8
  66. package/dist/formats/webgpu/core/ir/inferValueTypes.js.map +1 -1
  67. package/dist/formats/webgpu/core/packageEffect.js +94 -9
  68. package/dist/formats/webgpu/core/packageEffect.js.map +1 -1
  69. package/dist/formats/webgpu/core/packageMetadata.js +10 -1
  70. package/dist/formats/webgpu/core/packageMetadata.js.map +1 -1
  71. package/dist/formats/webgpu/core/wgsl/buildResourceTransformPlan.js +17 -15
  72. package/dist/formats/webgpu/core/wgsl/buildResourceTransformPlan.js.map +1 -1
  73. package/dist/formats/webgpu/core/wgsl/buildWgslBindingPlan.js +13 -12
  74. package/dist/formats/webgpu/core/wgsl/buildWgslBindingPlan.js.map +1 -1
  75. package/dist/formats/webgpu/core/wgsl/buildWgslSet.js +9 -8
  76. package/dist/formats/webgpu/core/wgsl/buildWgslSet.js.map +1 -1
  77. package/dist/formats/webgpu/core/wgsl/lowerComputeProgram.js +23 -22
  78. package/dist/formats/webgpu/core/wgsl/lowerComputeProgram.js.map +1 -1
  79. package/dist/formats/webgpu/core/wgsl/selectionPlans.js +46 -44
  80. package/dist/formats/webgpu/core/wgsl/selectionPlans.js.map +1 -1
  81. package/dist/resource/CjsResource.js +700 -684
  82. package/dist/resource/CjsResource.js.map +1 -1
  83. package/dist/resource/Tr2LightProfileRes.js +18 -27
  84. package/dist/resource/Tr2LightProfileRes.js.map +1 -1
  85. package/dist/resource/audio/CjsAudioBufferRes.js +2 -2
  86. package/dist/resource/audio/CjsAudioBufferRes.js.map +1 -1
  87. package/dist/resource/audio/CjsAudioRes.js +2 -2
  88. package/dist/resource/audio/CjsAudioRes.js.map +1 -1
  89. package/dist/resource/geometry/TriGeometryRes.js +605 -586
  90. package/dist/resource/geometry/TriGeometryRes.js.map +1 -1
  91. package/dist/resource/geometry/granny/Tr2GrannyStateRes.js +21 -30
  92. package/dist/resource/geometry/granny/Tr2GrannyStateRes.js.map +1 -1
  93. package/dist/resource/geometry/granny/TriGrannyRes.js +21 -30
  94. package/dist/resource/geometry/granny/TriGrannyRes.js.map +1 -1
  95. package/dist/resource/shader/Tr2EffectRes.js +9 -7
  96. package/dist/resource/shader/Tr2EffectRes.js.map +1 -1
  97. package/dist/resource/shader/Tr2MaterialArea.js +5 -3
  98. package/dist/resource/shader/Tr2MaterialArea.js.map +1 -1
  99. package/dist/resource/shader/Tr2MaterialMesh.js +4 -2
  100. package/dist/resource/shader/Tr2MaterialMesh.js.map +1 -1
  101. package/dist/resource/shader/Tr2MaterialRes.js +5 -3
  102. package/dist/resource/shader/Tr2MaterialRes.js.map +1 -1
  103. package/dist/resource/shader/Tr2Shader.js +26 -21
  104. package/dist/resource/shader/Tr2Shader.js.map +1 -1
  105. package/dist/resource/shader/Tr2ShaderPermutation.js +8 -6
  106. package/dist/resource/shader/Tr2ShaderPermutation.js.map +1 -1
  107. package/dist/resource/shader/reflection/Tr2EffectDefine.js +5 -3
  108. package/dist/resource/shader/reflection/Tr2EffectDefine.js.map +1 -1
  109. package/dist/resource/shader/reflection/Tr2EffectDescription.js +5 -3
  110. package/dist/resource/shader/reflection/Tr2EffectDescription.js.map +1 -1
  111. package/dist/resource/shader/reflection/Tr2EffectLibrary.js +17 -15
  112. package/dist/resource/shader/reflection/Tr2EffectLibrary.js.map +1 -1
  113. package/dist/resource/shader/reflection/Tr2EffectParameterAnnotation.js +11 -9
  114. package/dist/resource/shader/reflection/Tr2EffectParameterAnnotation.js.map +1 -1
  115. package/dist/resource/shader/reflection/Tr2EffectResource.js +8 -6
  116. package/dist/resource/shader/reflection/Tr2EffectResource.js.map +1 -1
  117. package/dist/resource/shader/reflection/Tr2EffectStageInput.js +15 -13
  118. package/dist/resource/shader/reflection/Tr2EffectStageInput.js.map +1 -1
  119. package/dist/resource/shader/reflection/Tr2EffectTechnique.js +7 -5
  120. package/dist/resource/shader/reflection/Tr2EffectTechnique.js.map +1 -1
  121. package/dist/resource/shader/reflection/Tr2Pass.js +11 -9
  122. package/dist/resource/shader/reflection/Tr2Pass.js.map +1 -1
  123. package/dist/resource/shader/sampler/Tr2SamplerSetup.js +8 -6
  124. package/dist/resource/shader/sampler/Tr2SamplerSetup.js.map +1 -1
  125. package/dist/resource/texture/CjsTextureArrayRes.js +400 -411
  126. package/dist/resource/texture/CjsTextureArrayRes.js.map +1 -1
  127. package/dist/resource/texture/Tr2ImageRes.js +99 -95
  128. package/dist/resource/texture/Tr2ImageRes.js.map +1 -1
  129. package/dist/resource/texture/TriTextureRes.js +312 -273
  130. package/dist/resource/texture/TriTextureRes.js.map +1 -1
  131. package/docs/README.md +13 -1
  132. package/docs/architecture.md +3 -3
  133. package/docs/concepts/resource-lifecycle.md +9 -2
  134. package/docs/concepts/shader-resource-model.md +114 -0
  135. package/docs/concepts/writing-an-engine-adapter.md +115 -0
  136. package/docs/formats/README.md +24 -1
  137. package/docs/formats/carbon-effect-container.md +452 -0
  138. package/docs/formats/dxbc/reference/classes/README.md +5 -72
  139. package/docs/formats/hlsl/reference/api.md +5 -4
  140. package/docs/formats/hlsl/reference/classes/README.md +6 -11
  141. package/docs/formats/provenance.md +23 -13
  142. package/docs/formats/webgl/reference/classes/README.md +5 -92
  143. package/docs/formats/webgpu/README.md +19 -16
  144. package/docs/formats/webgpu/architecture.md +15 -12
  145. package/docs/formats/webgpu/formats/cewgpu.md +175 -438
  146. package/docs/formats/webgpu/guides/effect-packaging.md +132 -140
  147. package/docs/formats/webgpu/reference/api.md +131 -131
  148. package/docs/formats/webgpu/reference/classes/README.md +5 -62
  149. package/docs/formats/webgpu/reference/wgsl-compatibility.md +146 -45
  150. package/docs/formats/wwise.md +34 -8
  151. package/docs/reference/classes/core.md +80 -0
  152. package/docs/reference/classes/formats.md +18 -28
  153. package/docs/reference/events.md +25 -0
  154. package/docs/reference/motherlode-cache.md +22 -8
  155. package/docs/reference/workers.md +5 -5
  156. package/docs/roadmap.md +61 -41
  157. package/package.json +2 -1
  158. package/dist/formats/webgpu/core/cewgpu/CewgpuPackage.js +0 -415
  159. package/dist/formats/webgpu/core/cewgpu/CewgpuPackage.js.map +0 -1
  160. package/dist/formats/webgpu/core/cewgpu/CewgpuPackageBuilder.js +0 -100
  161. package/dist/formats/webgpu/core/cewgpu/CewgpuPackageBuilder.js.map +0 -1
  162. package/dist/formats/webgpu/core/cewgpu/binary.js +0 -93
  163. package/dist/formats/webgpu/core/cewgpu/binary.js.map +0 -1
  164. package/dist/formats/webgpu/core/cewgpu/tags.js +0 -17
  165. package/dist/formats/webgpu/core/cewgpu/tags.js.map +0 -1
  166. package/dist/formats/webgpu/core/effectPackageValidation.js +0 -1078
  167. package/dist/formats/webgpu/core/effectPackageValidation.js.map +0 -1
  168. package/docs/formats/hlsl/reference/classes/carbon-compatibility.md +0 -66
  169. package/docs/formats/hlsl/reference/classes/public-api.md +0 -26
  170. package/docs/formats/hlsl/reference/classes/tr2-effect-model.md +0 -150
@@ -1 +1 @@
1
- {"version":3,"file":"packageEffect.js","sources":["../../../../../src/formats/webgpu/core/packageEffect.js"],"sourcesContent":["import { readEffectAnalysis } from \"./effectAnalysis.js\";\nimport { EFFECT_INFO_VERSION } from \"./effectPackageValidation.js\";\nimport { buildEffectAnalysis, buildPackage, inspectWithValues } from \"./helpers.js\";\nimport { lowerDxbcToIr } from \"./ir/lowerDxbcToIr.js\";\nimport { buildWgslBindingPlan } from \"./wgsl/buildWgslBindingPlan.js\";\nimport { buildWgsl } from \"./wgsl/emitWgsl.js\";\nimport { buildWgslSet } from \"./wgsl/buildWgslSet.js\";\nimport { buildResourceTransformPlan } from \"./wgsl/buildResourceTransformPlan.js\";\nimport {\n buildEffectPermutationGraph,\n EFFECT_PERMUTATION_GRAPH_CHUNK,\n EFFECT_PERMUTATION_GRAPH_FORMAT,\n EFFECT_PERMUTATION_GRAPH_VERSION\n} from \"../../../format/effect/effectPermutationGraph.js\";\nimport {\n buildCompleteEffectReflection,\n EFFECT_REFLECTION_BLOB_CHUNK,\n EFFECT_REFLECTION_CHUNK\n} from \"../../../format/effect/effectReflectionPackage.js\";\nimport {\n buildEffectBackendBodySet,\n EFFECT_BACKEND_BODY_SET_CHUNK,\n EFFECT_BACKEND_BODY_SET_FORMAT,\n EFFECT_BACKEND_BODY_SET_VERSION\n} from \"./effectBackendBodySet.js\";\nimport {\n DXBC_WGSL_TRANSLATOR_NAME,\n DXBC_WGSL_TRANSLATOR_VERSION,\n FORMAT_WEBGPU_PACKAGE_NAME,\n FORMAT_WEBGPU_PACKAGE_VERSION,\n WEBGPU_BACKEND_NAME\n} from \"./packageMetadata.js\";\nimport { sha256Bytes, sha256Utf8 } from \"../../../format/effect/sha256.js\";\nimport {\n isParticleClearEffectCandidate,\n particleClearEffectProofFor,\n preflightParticleClearEffectProfile\n} from \"./wgsl/lowerParticleClearComputePrograms.js\";\nimport {\n buildWgslSelectionMetadata,\n normalizeEffectPermutation,\n selectEffectStages,\n validateResolvedPermutation\n} from \"./packageEffectSelection.js\";\n\n/**\n * Build one structurally valid CEWGPU package from compiled Tr2 effect bytes.\n *\n * Version-15 packages preserve every unique body's source reflection while\n * resolving one backend body and emitting complete passes within the requested\n * stage selection. Filesystem concerns remain in callers.\n *\n * @param {Uint8Array|ArrayBuffer|ArrayBufferView} input Compiled effect bytes.\n * @param {object} [options] Source, body-mode, permutation, and stage-selection policy.\n * @returns {object} Package bytes plus inspection and provenance documents.\n */\nexport function buildEffectPackage(input, options = {})\n{\n const mode = normalizeMode(options.mode, options.allPermutations);\n const source = normalizeSource(options.source);\n const outputPath = normalizeOptionalString(options.outputPath, \"Effect outputPath\");\n const sourceIdentity = normalizeSourceIdentity(\n options.sourceIdentity,\n source,\n input\n );\n const permutation = normalizeEffectPermutation(options.permutation);\n const selection = normalizeSelection(options.selection);\n const resolved = readEffectAnalysis(input, { source, permutation });\n\n // One INFO version means one contract, and that contract requires complete\n // source reflection, which only version-15 input can supply.\n if (resolved.effectRes?.m_version !== 15)\n {\n throw new Error(\n \"Effect package requires a version-15 compiled effect, got version \"\n + (resolved.effectRes?.m_version ?? \"unknown\")\n );\n }\n\n validateResolvedPermutation(permutation, resolved.selection?.selectedOptions ?? []);\n\n const analysis = buildEffectAnalysis(resolved, {\n source,\n decodeBytecode: false,\n decodeInstructions: false\n });\n const bytecodeByKey = resolved.stageBytecodeByKey;\n const selectedStages = selectEffectStages(analysis.stages, selection);\n const programsByKey = new Map();\n const programForKey = (key) =>\n {\n if (programsByKey.has(key)) return programsByKey.get(key);\n const bytecode = bytecodeByKey.get(key)?.bytes;\n\n if (!bytecode?.length)\n {\n throw new Error(`${key} has no shader bytecode`);\n }\n const program = lowerDxbcToIr(\n bytecode,\n { source: `${source}#${key}` }\n );\n programsByKey.set(key, program);\n return program;\n };\n let effectProfileContext = null;\n if (isParticleClearEffectCandidate(resolved.effectDescription))\n {\n programForKey(\"Main.pass0.compute\");\n programForKey(\"Main.pass1.compute\");\n effectProfileContext = preflightParticleClearEffectProfile(\n resolved.effectDescription,\n programsByKey\n );\n }\n const irEntries = selectedStages.map((stage) => ({\n key: stage.key,\n passKey: `${stage.techniqueName}.pass${stage.passIndex}`,\n ir: programForKey(stage.key),\n semanticBindings: analysis.stages.find((candidate) =>\n candidate.techniqueName === stage.techniqueName\n && candidate.passIndex === stage.passIndex\n && candidate.stageName === stage.stageName)?.bindings || [],\n effectProfileProof: particleClearEffectProofFor(\n effectProfileContext,\n stage.key\n )\n }));\n const programsByPass = new Map();\n\n for (const entry of irEntries)\n {\n if (!programsByPass.has(entry.passKey))\n {\n programsByPass.set(entry.passKey, []);\n }\n\n programsByPass.get(entry.passKey).push(entry);\n }\n\n const resourceTransformPlans = new Map(Array.from(programsByPass, ([ key, entries ]) => [\n key,\n buildResourceTransformPlan(\n entries.map((entry) => ({\n ir: entry.ir,\n semanticBindings: entry.semanticBindings\n })),\n { layoutKey: key }\n )\n ]));\n const plans = new Map(Array.from(programsByPass, ([ key, entries ]) =>\n {\n const proof = entries.find((entry) => entry.effectProfileProof)\n ?.effectProfileProof ?? null;\n const resourceTransformPlan = resourceTransformPlans.get(key);\n return [\n key,\n buildWgslBindingPlan(\n entries.map((entry) => entry.ir),\n {\n ...(options.bindingPolicy ?? {}),\n ...(proof ? { effectProfileProof: proof } : {}),\n ...(resourceTransformPlan ? { resourceTransformPlan } : {})\n }\n )\n ];\n }));\n const shaderEntries = irEntries.map((entry) => ({\n key: entry.key,\n shader: buildWgsl(entry.ir, {\n bindingPlan: plans.get(entry.passKey),\n ...(resourceTransformPlans.get(entry.passKey)\n ? { resourceTransformPlan: resourceTransformPlans.get(entry.passKey) }\n : {}),\n ...(entry.effectProfileProof\n ? { effectProfileProof: entry.effectProfileProof }\n : {})\n })\n }));\n const wgsl = buildWgslSet(shaderEntries);\n const wgslSelection = buildWgslSelectionMetadata(selection, selectedStages);\n const permutationGraph = buildEffectPermutationGraph(resolved.effectRes);\n const effectReflection = resolved.effectRes.m_version === 15\n ? buildCompleteEffectReflection(\n resolved.effectRes,\n permutationGraph,\n { sourceIdentity, sourcePath: source }\n )\n : null;\n if (mode === \"all\" && !effectReflection)\n {\n throw new Error(\n \"Effect package mode all requires complete version-15 source reflection\"\n );\n }\n\n const backendBodySet = mode === \"all\"\n ? buildEffectBackendBodySet(resolved.effectRes, permutationGraph, {\n source,\n selection,\n bindingPolicy: options.bindingPolicy\n })\n : null;\n const completeness = Object.freeze({\n packageValid: true,\n sourceComplete: effectReflection !== null,\n backendComplete: false,\n runtimeComplete: false\n });\n const info = {\n format: \"CEWGPU\",\n formatVersion: EFFECT_INFO_VERSION,\n packageKind: \"tr2-effect-webgpu\",\n sourcePath: source,\n outputPath,\n sourceIdentity,\n targetBackend: WEBGPU_BACKEND_NAME,\n backendPackage: FORMAT_WEBGPU_PACKAGE_NAME,\n backendPackageVersion: FORMAT_WEBGPU_PACKAGE_VERSION,\n translator: DXBC_WGSL_TRANSLATOR_NAME,\n translatorVersion: DXBC_WGSL_TRANSLATOR_VERSION,\n permutationGraph: Object.freeze({\n chunk: EFFECT_PERMUTATION_GRAPH_CHUNK,\n format: EFFECT_PERMUTATION_GRAPH_FORMAT,\n formatVersion: EFFECT_PERMUTATION_GRAPH_VERSION,\n sha256: sha256Utf8(`${JSON.stringify(permutationGraph)}\\n`),\n permutationCount: permutationGraph.variants.length,\n uniqueBodyCount: permutationGraph.bodies.length\n }),\n ...(effectReflection\n ? {\n effectReflection: effectReflection.pointer,\n sourceBodyCoverage: \"all-unique\",\n backendBodyCoverage: backendBodySet\n ? backendBodySet.coverage.bodies\n : \"selected\"\n }\n : {}),\n ...(backendBodySet\n ? {\n backendBodySet: Object.freeze({\n chunk: EFFECT_BACKEND_BODY_SET_CHUNK,\n format: EFFECT_BACKEND_BODY_SET_FORMAT,\n formatVersion: EFFECT_BACKEND_BODY_SET_VERSION,\n sha256: sha256Utf8(`${JSON.stringify(backendBodySet)}\\n`),\n bodyCount: backendBodySet.bodyCount,\n translatedBodyCount: backendBodySet.translatedBodyCount,\n passUnitCount: backendBodySet.passUnitCount\n })\n }\n : {}),\n bodyMode: mode,\n completeness,\n stageCount: analysis.stages.length,\n selectedStageCount: selectedStages.length,\n shaderCount: wgsl.shaders.length,\n layoutCount: wgsl.layouts.length\n };\n const metadata = {\n effectName: analysis.effectName,\n sourcePath: source,\n bodyMode: mode,\n bodyIndex: analysis.bodyIndex,\n selectedOptions: analysis.selectedOptions,\n ...(wgslSelection ? { wgslSelection } : {})\n };\n const bytes = buildPackage([\n [ \"INFO\", info ],\n [ \"META\", metadata ],\n [ EFFECT_PERMUTATION_GRAPH_CHUNK, permutationGraph ],\n ...(effectReflection ? [\n [ EFFECT_REFLECTION_CHUNK, effectReflection.reflection ],\n [ EFFECT_REFLECTION_BLOB_CHUNK, effectReflection.blobBytes ]\n ] : []),\n [ \"ANLS\", analysis ],\n [ \"WGSL\", wgsl ],\n ...(backendBodySet ? [ [ EFFECT_BACKEND_BODY_SET_CHUNK, backendBodySet ] ] : [])\n ]);\n const inspection = inspectWithValues(bytes, {\n source,\n emit: \"json\"\n });\n const qualification = Object.freeze({\n ok: true,\n level: \"structural\",\n validator: \"cewgpu-structural\",\n mode,\n ...completeness,\n selectedStageCount: selectedStages.length,\n shaderCount: wgsl.shaders.length,\n layoutCount: wgsl.layouts.length,\n ...(backendBodySet\n ? {\n backendBodyCount: backendBodySet.bodyCount,\n backendTranslatedBodyCount: backendBodySet.translatedBodyCount,\n backendPassUnitCount: backendBodySet.passUnitCount\n }\n : {}),\n nativeComparison: false\n });\n\n return Object.freeze({\n bytes,\n info: Object.freeze(info),\n metadata: Object.freeze(metadata),\n permutationGraph,\n reflection: effectReflection?.reflection ?? null,\n reflectionBlobs: effectReflection?.blobBytes ?? null,\n analysis,\n wgsl,\n backendBodySet,\n inspection: Object.freeze(inspection),\n qualification\n });\n}\n\nfunction normalizeMode(value, allPermutations)\n{\n if (allPermutations !== undefined && typeof allPermutations !== \"boolean\")\n {\n throw new TypeError(\"Effect allPermutations compatibility option must be boolean\");\n }\n\n const mode = String(allPermutations === true ? \"all\" : value ?? \"selected\").trim();\n\n if (mode !== \"selected\" && mode !== \"all\")\n {\n throw new Error(\n `Effect package mode ${mode || \"<empty>\"} is not supported; `\n + \"supported modes are selected and all\"\n );\n }\n\n return mode;\n}\n\nfunction normalizeSource(value)\n{\n const source = String(value ?? \"memory\").trim();\n\n return source || \"memory\";\n}\n\nfunction normalizeOptionalString(value, name)\n{\n if (value === undefined || value === null)\n {\n return null;\n }\n\n const result = String(value).trim();\n\n if (!result)\n {\n throw new TypeError(`${name} must be a non-empty string or null`);\n }\n\n return result;\n}\n\nfunction normalizeSelection(value)\n{\n if (value === undefined || value === null)\n {\n return null;\n }\n\n if (!value || typeof value !== \"object\" || Array.isArray(value))\n {\n throw new TypeError(\"Effect stage selection must be an object\");\n }\n\n const techniqueName = String(value.techniqueName ?? \"\").trim();\n const passIndex = value.passIndex ?? null;\n const stageNames = value.stageNames ?? [];\n\n if (!techniqueName)\n {\n throw new TypeError(\"Effect stage selection requires techniqueName\");\n }\n\n if (passIndex !== null && (!Number.isSafeInteger(passIndex) || passIndex < 0))\n {\n throw new TypeError(\"Effect stage selection passIndex must be a non-negative integer or null\");\n }\n\n if (!Array.isArray(stageNames)\n || stageNames.some((stageName) => ![ \"vertex\", \"pixel\", \"compute\" ].includes(stageName)))\n {\n throw new TypeError(\"Effect stage selection supports only vertex, pixel, and compute stageNames\");\n }\n\n if (stageNames.length && passIndex === null)\n {\n throw new TypeError(\"Effect stageNames require an exact passIndex\");\n }\n\n return Object.freeze({\n techniqueName,\n passIndex,\n stageNames: Object.freeze([ ...new Set(stageNames) ])\n });\n}\n\nfunction normalizeSourceIdentity(value, source, input)\n{\n if (value !== undefined && value !== null\n && (!value || typeof value !== \"object\" || Array.isArray(value)))\n {\n throw new TypeError(\"Effect sourceIdentity must be an object\");\n }\n\n const bytes = input instanceof Uint8Array\n ? input\n : input instanceof ArrayBuffer\n ? new Uint8Array(input)\n : ArrayBuffer.isView(input)\n ? new Uint8Array(input.buffer, input.byteOffset, input.byteLength)\n : null;\n\n if (!bytes)\n {\n throw new TypeError(\"Effect input must be Uint8Array, ArrayBuffer, or ArrayBufferView bytes\");\n }\n\n const sha256 = sha256Bytes(bytes);\n if (value?.sha256 !== undefined && value?.sha256 !== null\n && value.sha256 !== sha256)\n {\n throw new Error(\n \"Effect sourceIdentity.sha256 does not match the exact effect input bytes\"\n );\n }\n\n return Object.freeze({\n logicalPath: value?.logicalPath ?? source,\n game: value?.game ?? null,\n client: value?.client ?? null,\n build: value?.build === undefined || value?.build === null ? null : String(value.build),\n byteLength: bytes.byteLength,\n md5: value?.md5 ?? null,\n sha256\n });\n}\n"],"names":["buildEffectPackage","input","options","mode","normalizeMode","allPermutations","source","normalizeSource","outputPath","normalizeOptionalString","sourceIdentity","normalizeSourceIdentity","permutation","normalizeEffectPermutation","selection","normalizeSelection","resolved","readEffectAnalysis","effectRes","m_version","Error","validateResolvedPermutation","selectedOptions","analysis","buildEffectAnalysis","decodeBytecode","decodeInstructions","bytecodeByKey","stageBytecodeByKey","selectedStages","selectEffectStages","stages","programsByKey","Map","programForKey","key","has","get","bytecode","bytes","length","program","lowerDxbcToIr","set","effectProfileContext","isParticleClearEffectCandidate","effectDescription","preflightParticleClearEffectProfile","irEntries","map","stage","passKey","techniqueName","passIndex","ir","semanticBindings","find","candidate","stageName","bindings","effectProfileProof","particleClearEffectProofFor","programsByPass","entry","push","resourceTransformPlans","Array","from","entries","buildResourceTransformPlan","layoutKey","plans","proof","resourceTransformPlan","buildWgslBindingPlan","bindingPolicy","shaderEntries","shader","buildWgsl","bindingPlan","wgsl","buildWgslSet","wgslSelection","buildWgslSelectionMetadata","permutationGraph","buildEffectPermutationGraph","effectReflection","buildCompleteEffectReflection","sourcePath","backendBodySet","buildEffectBackendBodySet","completeness","Object","freeze","packageValid","sourceComplete","backendComplete","runtimeComplete","info","format","formatVersion","EFFECT_INFO_VERSION","packageKind","targetBackend","WEBGPU_BACKEND_NAME","backendPackage","FORMAT_WEBGPU_PACKAGE_NAME","backendPackageVersion","FORMAT_WEBGPU_PACKAGE_VERSION","translator","DXBC_WGSL_TRANSLATOR_NAME","translatorVersion","DXBC_WGSL_TRANSLATOR_VERSION","chunk","EFFECT_PERMUTATION_GRAPH_CHUNK","EFFECT_PERMUTATION_GRAPH_FORMAT","EFFECT_PERMUTATION_GRAPH_VERSION","sha256","sha256Utf8","JSON","stringify","permutationCount","variants","uniqueBodyCount","bodies","pointer","sourceBodyCoverage","backendBodyCoverage","coverage","EFFECT_BACKEND_BODY_SET_CHUNK","EFFECT_BACKEND_BODY_SET_FORMAT","EFFECT_BACKEND_BODY_SET_VERSION","bodyCount","translatedBodyCount","passUnitCount","bodyMode","stageCount","selectedStageCount","shaderCount","shaders","layoutCount","layouts","metadata","effectName","bodyIndex","buildPackage","EFFECT_REFLECTION_CHUNK","reflection","EFFECT_REFLECTION_BLOB_CHUNK","blobBytes","inspection","inspectWithValues","qualification","ok","level","validator","backendBodyCount","backendTranslatedBodyCount","backendPassUnitCount","nativeComparison","reflectionBlobs","value","undefined","TypeError","String","trim","name","result","isArray","stageNames","Number","isSafeInteger","some","includes","Set","Uint8Array","ArrayBuffer","isView","buffer","byteOffset","byteLength","sha256Bytes","logicalPath","game","client","build","md5"],"mappings":"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"}
1
+ {"version":3,"file":"packageEffect.js","sources":["../../../../../src/formats/webgpu/core/packageEffect.js"],"sourcesContent":["import { readEffectAnalysis } from \"./effectAnalysis.js\";\nimport { buildEffectAnalysis, inspectWithValues } from \"./helpers.js\";\nimport { buildCarbonEffectContainer } from \"./buildCarbonEffectContainer.js\";\nimport { lowerDxbcToIr } from \"./ir/lowerDxbcToIr.js\";\nimport { buildWgslBindingPlan } from \"./wgsl/buildWgslBindingPlan.js\";\nimport { buildWgsl } from \"./wgsl/emitWgsl.js\";\nimport { buildWgslSet } from \"./wgsl/buildWgslSet.js\";\nimport { buildResourceTransformPlan } from \"./wgsl/buildResourceTransformPlan.js\";\nimport {\n buildEffectPermutationGraph,\n EFFECT_PERMUTATION_GRAPH_CHUNK,\n EFFECT_PERMUTATION_GRAPH_FORMAT,\n EFFECT_PERMUTATION_GRAPH_VERSION\n} from \"../../../format/effect/effectPermutationGraph.js\";\nimport {\n buildCompleteEffectReflection,\n EFFECT_REFLECTION_BLOB_CHUNK,\n EFFECT_REFLECTION_CHUNK\n} from \"../../../format/effect/effectReflectionPackage.js\";\nimport {\n buildEffectBackendBodySet,\n EFFECT_BACKEND_BODY_SET_CHUNK,\n EFFECT_BACKEND_BODY_SET_FORMAT,\n EFFECT_BACKEND_BODY_SET_VERSION\n} from \"./effectBackendBodySet.js\";\nimport {\n DXBC_WGSL_TRANSLATOR_NAME,\n DXBC_WGSL_TRANSLATOR_VERSION,\n EFFECT_INFO_VERSION,\n FORMAT_WEBGPU_PACKAGE_NAME,\n FORMAT_WEBGPU_PACKAGE_VERSION,\n WEBGPU_BACKEND_NAME\n} from \"./packageMetadata.js\";\nimport { sha256Bytes, sha256Utf8 } from \"../../../format/effect/sha256.js\";\nimport {\n isParticleClearEffectCandidate,\n particleClearEffectProofFor,\n preflightParticleClearEffectProfile\n} from \"./wgsl/lowerParticleClearComputePrograms.js\";\nimport {\n buildWgslSelectionMetadata,\n normalizeEffectPermutation,\n selectEffectStages,\n validateResolvedPermutation\n} from \"./packageEffectSelection.js\";\n\n/**\n * Build one structurally valid CEWGPU package from compiled Tr2 effect bytes.\n *\n * The version-15 build result retains every unique body's portable source\n * reflection as in-memory evidence while the emitted Carbon wire stores WGSL\n * or empty program slots plus representable non-program fields. Filesystem\n * concerns remain in callers.\n *\n * @param {Uint8Array|ArrayBuffer|ArrayBufferView} input Compiled effect bytes.\n * @param {object} [options] Source, body-mode, permutation, and stage-selection policy.\n * @returns {object} Package bytes plus inspection and provenance documents.\n */\nexport function buildEffectPackage(input, options = {})\n{\n const mode = normalizeMode(options.mode, options.allPermutations);\n const source = normalizeSource(options.source);\n const outputPath = normalizeOptionalString(options.outputPath, \"Effect outputPath\");\n const sourceIdentity = normalizeSourceIdentity(\n options.sourceIdentity,\n source,\n input\n );\n const permutation = normalizeEffectPermutation(options.permutation);\n const selection = normalizeSelection(options.selection);\n const resolved = readEffectAnalysis(input, { source, permutation });\n\n // One INFO version means one contract, and that contract requires complete\n // source reflection, which only version-15 input can supply.\n if (resolved.effectRes?.m_version !== 15)\n {\n throw new Error(\n \"Effect package requires a version-15 compiled effect, got version \"\n + (resolved.effectRes?.m_version ?? \"unknown\")\n );\n }\n\n validateResolvedPermutation(permutation, resolved.selection?.selectedOptions ?? []);\n\n const analysis = buildEffectAnalysis(resolved, {\n source,\n decodeBytecode: false,\n decodeInstructions: false\n });\n const bytecodeByKey = resolved.stageBytecodeByKey;\n const selectedStages = selectEffectStages(analysis.stages, selection);\n const programsByKey = new Map();\n const programForKey = (key) =>\n {\n if (programsByKey.has(key)) return programsByKey.get(key);\n const bytecode = bytecodeByKey.get(key)?.bytes;\n\n if (!bytecode?.length)\n {\n throw new Error(`${key} has no shader bytecode`);\n }\n const program = lowerDxbcToIr(\n bytecode,\n { source: `${source}#${key}` }\n );\n programsByKey.set(key, program);\n return program;\n };\n let effectProfileContext = null;\n if (isParticleClearEffectCandidate(resolved.effectDescription))\n {\n programForKey(\"Main.pass0.compute\");\n programForKey(\"Main.pass1.compute\");\n effectProfileContext = preflightParticleClearEffectProfile(\n resolved.effectDescription,\n programsByKey\n );\n }\n const irEntries = selectedStages.map((stage) => ({\n key: stage.key,\n passKey: `${stage.techniqueName}.pass${stage.passIndex}`,\n ir: programForKey(stage.key),\n semanticBindings: analysis.stages.find((candidate) =>\n candidate.techniqueName === stage.techniqueName\n && candidate.passIndex === stage.passIndex\n && candidate.stageName === stage.stageName)?.bindings || [],\n effectProfileProof: particleClearEffectProofFor(\n effectProfileContext,\n stage.key\n )\n }));\n const programsByPass = new Map();\n\n for (const entry of irEntries)\n {\n if (!programsByPass.has(entry.passKey))\n {\n programsByPass.set(entry.passKey, []);\n }\n\n programsByPass.get(entry.passKey).push(entry);\n }\n\n const resourceTransformPlans = new Map(Array.from(programsByPass, ([ key, entries ]) => [\n key,\n buildResourceTransformPlan(\n entries.map((entry) => ({\n ir: entry.ir,\n semanticBindings: entry.semanticBindings\n })),\n { layoutKey: key }\n )\n ]));\n const plans = new Map(Array.from(programsByPass, ([ key, entries ]) =>\n {\n const proof = entries.find((entry) => entry.effectProfileProof)\n ?.effectProfileProof ?? null;\n const resourceTransformPlan = resourceTransformPlans.get(key);\n return [\n key,\n buildWgslBindingPlan(\n entries.map((entry) => entry.ir),\n {\n ...(options.bindingPolicy ?? {}),\n ...(proof ? { effectProfileProof: proof } : {}),\n ...(resourceTransformPlan ? { resourceTransformPlan } : {})\n }\n )\n ];\n }));\n const shaderEntries = irEntries.map((entry) => ({\n key: entry.key,\n shader: buildWgsl(entry.ir, {\n bindingPlan: plans.get(entry.passKey),\n ...(resourceTransformPlans.get(entry.passKey)\n ? { resourceTransformPlan: resourceTransformPlans.get(entry.passKey) }\n : {}),\n ...(entry.effectProfileProof\n ? { effectProfileProof: entry.effectProfileProof }\n : {})\n })\n }));\n const wgsl = buildWgslSet(shaderEntries);\n const wgslSelection = buildWgslSelectionMetadata(selection, selectedStages);\n const permutationGraph = buildEffectPermutationGraph(resolved.effectRes);\n const effectReflection = resolved.effectRes.m_version === 15\n ? buildCompleteEffectReflection(\n resolved.effectRes,\n permutationGraph,\n { sourceIdentity, sourcePath: source }\n )\n : null;\n if (mode === \"all\" && !effectReflection)\n {\n throw new Error(\n \"Effect package mode all requires complete version-15 source reflection\"\n );\n }\n\n const backendBodySet = mode === \"all\"\n ? buildEffectBackendBodySet(resolved.effectRes, permutationGraph, {\n source,\n selection,\n bindingPolicy: options.bindingPolicy\n })\n : null;\n const completeness = Object.freeze({\n packageValid: true,\n sourceComplete: effectReflection !== null,\n backendComplete: false,\n runtimeComplete: false\n });\n const info = {\n format: \"CEWGPU\",\n formatVersion: EFFECT_INFO_VERSION,\n packageKind: \"tr2-effect-webgpu\",\n sourcePath: source,\n outputPath,\n sourceIdentity,\n targetBackend: WEBGPU_BACKEND_NAME,\n backendPackage: FORMAT_WEBGPU_PACKAGE_NAME,\n backendPackageVersion: FORMAT_WEBGPU_PACKAGE_VERSION,\n translator: DXBC_WGSL_TRANSLATOR_NAME,\n translatorVersion: DXBC_WGSL_TRANSLATOR_VERSION,\n permutationGraph: Object.freeze({\n chunk: EFFECT_PERMUTATION_GRAPH_CHUNK,\n format: EFFECT_PERMUTATION_GRAPH_FORMAT,\n formatVersion: EFFECT_PERMUTATION_GRAPH_VERSION,\n sha256: sha256Utf8(`${JSON.stringify(permutationGraph)}\\n`),\n permutationCount: permutationGraph.variants.length,\n uniqueBodyCount: permutationGraph.bodies.length\n }),\n ...(effectReflection\n ? {\n effectReflection: effectReflection.pointer,\n sourceBodyCoverage: \"all-unique\",\n backendBodyCoverage: backendBodySet\n ? backendBodySet.coverage.bodies\n : \"selected\"\n }\n : {}),\n ...(backendBodySet\n ? {\n backendBodySet: Object.freeze({\n chunk: EFFECT_BACKEND_BODY_SET_CHUNK,\n format: EFFECT_BACKEND_BODY_SET_FORMAT,\n formatVersion: EFFECT_BACKEND_BODY_SET_VERSION,\n sha256: sha256Utf8(`${JSON.stringify(backendBodySet)}\\n`),\n bodyCount: backendBodySet.bodyCount,\n translatedBodyCount: backendBodySet.translatedBodyCount,\n passUnitCount: backendBodySet.passUnitCount\n })\n }\n : {}),\n bodyMode: mode,\n completeness,\n stageCount: analysis.stages.length,\n selectedStageCount: selectedStages.length,\n shaderCount: wgsl.shaders.length,\n layoutCount: wgsl.layouts.length\n };\n const metadata = {\n effectName: analysis.effectName,\n sourcePath: source,\n bodyMode: mode,\n bodyIndex: analysis.bodyIndex,\n selectedOptions: analysis.selectedOptions,\n ...(wgslSelection ? { wgslSelection } : {})\n };\n // The switchover. Former stored chunks are now compatibility views over the\n // Carbon records: the permutation graph comes from the header and offset\n // table, and a translated pass comes from shaderData plus its trailing\n // block. The description tree retains only representable non-program\n // reflection; full portable source reflection remains in the rich\n // in-memory return value below.\n //\n // The wire no longer stores cross-chunk digests. The rich return value keeps\n // hashes as build evidence; they are not records in the emitted container.\n const emittedBodySet = backendBodySet\n ?? selectedModeBodySet(permutationGraph, wgsl, analysis.bodyIndex);\n const container = buildCarbonEffectContainer(\n resolved.effectRes,\n permutationGraph,\n emittedBodySet,\n { compilerVersion: resolved.effectRes.m_compilerVersionBytes }\n );\n const bytes = container.bytes;\n const inspection = inspectWithValues(bytes, {\n source,\n emit: \"json\"\n });\n const qualification = Object.freeze({\n ok: true,\n level: \"structural\",\n validator: \"cewgpu-structural\",\n mode,\n ...completeness,\n selectedStageCount: selectedStages.length,\n shaderCount: wgsl.shaders.length,\n layoutCount: wgsl.layouts.length,\n ...(backendBodySet\n ? {\n backendBodyCount: backendBodySet.bodyCount,\n backendTranslatedBodyCount: backendBodySet.translatedBodyCount,\n backendPassUnitCount: backendBodySet.passUnitCount\n }\n : {}),\n nativeComparison: false\n });\n\n return Object.freeze({\n bytes,\n info: Object.freeze(info),\n metadata: Object.freeze(metadata),\n permutationGraph,\n reflection: effectReflection?.reflection ?? null,\n reflectionBlobs: effectReflection?.blobBytes ?? null,\n analysis,\n wgsl,\n backendBodySet,\n inspection: Object.freeze(inspection),\n qualification\n });\n}\n\n/**\n * Wraps a selected-mode translation as the body set the container emitter takes.\n *\n * `mode: \"all\"` builds a real body set covering every unique body. `mode:\n * \"selected\"` translates exactly one, and the container still carries every\n * permutation — that asymmetry is the format working as intended rather than a\n * gap. When the container emitter rebuilds an untranslated body, it retains\n * representable non-program description fields and writes zero-length program\n * slots.\n *\n * So this does not translate anything. It reshapes the one translation already\n * performed into the body-set contract, and marks every other body unsupported.\n *\n * @param {object} permutationGraph Validated permutation graph.\n * @param {object} wgsl Emitted WGSL set for the selected body.\n * @param {number} bodyIndex Selected permutation index.\n * @returns {object} Body set covering one translated body.\n */\nfunction selectedModeBodySet(permutationGraph, wgsl, bodyIndex)\n{\n const selectedBodyKey = permutationGraph.variants\n .find((variant) => variant.permutationIndex === bodyIndex)?.bodyKey\n ?? permutationGraph.variants[0]?.bodyKey\n ?? null;\n\n const shadersByPass = new Map();\n for (const shader of wgsl.shaders)\n {\n const passKey = `${shader.techniqueName}.pass${shader.passIndex}`;\n if (!shadersByPass.has(passKey)) shadersByPass.set(passKey, []);\n shadersByPass.get(passKey).push(shader);\n }\n\n const passUnits = [];\n const passes = [];\n for (const [ passKey, shaders ] of shadersByPass)\n {\n const transforms = (wgsl.resourceTransforms ?? [])\n .filter((transform) => transform.layoutKey === passKey);\n const unit = {\n key: `unit${passUnits.length}`,\n wgslSetVersion: wgsl.formatVersion,\n shaders,\n layouts: wgsl.layouts.filter((layout) => layout.key === passKey),\n ...(transforms.length ? { resourceTransforms: transforms } : {})\n };\n passUnits.push(unit);\n passes.push({ passKey, unitKey: unit.key });\n }\n\n const bodies = permutationGraph.bodies.map((body) => (body.key === selectedBodyKey\n ? {\n bodyKey: body.key,\n representativePermutationIndex: bodyIndex,\n status: \"translated\",\n error: null,\n passCount: passes.length,\n passes\n }\n : {\n bodyKey: body.key,\n representativePermutationIndex: permutationGraph.variants\n .find((variant) => variant.bodyKey === body.key)?.permutationIndex ?? 0,\n status: \"unsupported\",\n error: \"not translated in selected mode\",\n passCount: 0,\n passes: []\n }));\n\n return {\n bodyCount: bodies.length,\n translatedBodyCount: 1,\n passUnitCount: passUnits.length,\n passUnits,\n bodies\n };\n}\n\nfunction normalizeMode(value, allPermutations)\n{\n if (allPermutations !== undefined && typeof allPermutations !== \"boolean\")\n {\n throw new TypeError(\"Effect allPermutations compatibility option must be boolean\");\n }\n\n const mode = String(allPermutations === true ? \"all\" : value ?? \"selected\").trim();\n\n if (mode !== \"selected\" && mode !== \"all\")\n {\n throw new Error(\n `Effect package mode ${mode || \"<empty>\"} is not supported; `\n + \"supported modes are selected and all\"\n );\n }\n\n return mode;\n}\n\nfunction normalizeSource(value)\n{\n const source = String(value ?? \"memory\").trim();\n\n return source || \"memory\";\n}\n\nfunction normalizeOptionalString(value, name)\n{\n if (value === undefined || value === null)\n {\n return null;\n }\n\n const result = String(value).trim();\n\n if (!result)\n {\n throw new TypeError(`${name} must be a non-empty string or null`);\n }\n\n return result;\n}\n\nfunction normalizeSelection(value)\n{\n if (value === undefined || value === null)\n {\n return null;\n }\n\n if (!value || typeof value !== \"object\" || Array.isArray(value))\n {\n throw new TypeError(\"Effect stage selection must be an object\");\n }\n\n const techniqueName = String(value.techniqueName ?? \"\").trim();\n const passIndex = value.passIndex ?? null;\n const stageNames = value.stageNames ?? [];\n\n if (!techniqueName)\n {\n throw new TypeError(\"Effect stage selection requires techniqueName\");\n }\n\n if (passIndex !== null && (!Number.isSafeInteger(passIndex) || passIndex < 0))\n {\n throw new TypeError(\"Effect stage selection passIndex must be a non-negative integer or null\");\n }\n\n if (!Array.isArray(stageNames)\n || stageNames.some((stageName) => ![ \"vertex\", \"pixel\", \"compute\" ].includes(stageName)))\n {\n throw new TypeError(\"Effect stage selection supports only vertex, pixel, and compute stageNames\");\n }\n\n if (stageNames.length && passIndex === null)\n {\n throw new TypeError(\"Effect stageNames require an exact passIndex\");\n }\n\n return Object.freeze({\n techniqueName,\n passIndex,\n stageNames: Object.freeze([ ...new Set(stageNames) ])\n });\n}\n\nfunction normalizeSourceIdentity(value, source, input)\n{\n if (value !== undefined && value !== null\n && (!value || typeof value !== \"object\" || Array.isArray(value)))\n {\n throw new TypeError(\"Effect sourceIdentity must be an object\");\n }\n\n const bytes = input instanceof Uint8Array\n ? input\n : input instanceof ArrayBuffer\n ? new Uint8Array(input)\n : ArrayBuffer.isView(input)\n ? new Uint8Array(input.buffer, input.byteOffset, input.byteLength)\n : null;\n\n if (!bytes)\n {\n throw new TypeError(\"Effect input must be Uint8Array, ArrayBuffer, or ArrayBufferView bytes\");\n }\n\n const sha256 = sha256Bytes(bytes);\n if (value?.sha256 !== undefined && value?.sha256 !== null\n && value.sha256 !== sha256)\n {\n throw new Error(\n \"Effect sourceIdentity.sha256 does not match the exact effect input bytes\"\n );\n }\n\n return Object.freeze({\n logicalPath: value?.logicalPath ?? source,\n game: value?.game ?? null,\n client: value?.client ?? null,\n build: value?.build === undefined || value?.build === null ? null : String(value.build),\n byteLength: bytes.byteLength,\n md5: value?.md5 ?? null,\n sha256\n });\n}\n"],"names":["buildEffectPackage","input","options","mode","normalizeMode","allPermutations","source","normalizeSource","outputPath","normalizeOptionalString","sourceIdentity","normalizeSourceIdentity","permutation","normalizeEffectPermutation","selection","normalizeSelection","resolved","readEffectAnalysis","effectRes","m_version","Error","validateResolvedPermutation","selectedOptions","analysis","buildEffectAnalysis","decodeBytecode","decodeInstructions","bytecodeByKey","stageBytecodeByKey","selectedStages","selectEffectStages","stages","programsByKey","Map","programForKey","key","has","get","bytecode","bytes","length","program","lowerDxbcToIr","set","effectProfileContext","isParticleClearEffectCandidate","effectDescription","preflightParticleClearEffectProfile","irEntries","map","stage","passKey","techniqueName","passIndex","ir","semanticBindings","find","candidate","stageName","bindings","effectProfileProof","particleClearEffectProofFor","programsByPass","entry","push","resourceTransformPlans","Array","from","entries","buildResourceTransformPlan","layoutKey","plans","proof","resourceTransformPlan","buildWgslBindingPlan","bindingPolicy","shaderEntries","shader","buildWgsl","bindingPlan","wgsl","buildWgslSet","wgslSelection","buildWgslSelectionMetadata","permutationGraph","buildEffectPermutationGraph","effectReflection","buildCompleteEffectReflection","sourcePath","backendBodySet","buildEffectBackendBodySet","completeness","Object","freeze","packageValid","sourceComplete","backendComplete","runtimeComplete","info","format","formatVersion","EFFECT_INFO_VERSION","packageKind","targetBackend","WEBGPU_BACKEND_NAME","backendPackage","FORMAT_WEBGPU_PACKAGE_NAME","backendPackageVersion","FORMAT_WEBGPU_PACKAGE_VERSION","translator","DXBC_WGSL_TRANSLATOR_NAME","translatorVersion","DXBC_WGSL_TRANSLATOR_VERSION","chunk","EFFECT_PERMUTATION_GRAPH_CHUNK","EFFECT_PERMUTATION_GRAPH_FORMAT","EFFECT_PERMUTATION_GRAPH_VERSION","sha256","sha256Utf8","JSON","stringify","permutationCount","variants","uniqueBodyCount","bodies","pointer","sourceBodyCoverage","backendBodyCoverage","coverage","EFFECT_BACKEND_BODY_SET_CHUNK","EFFECT_BACKEND_BODY_SET_FORMAT","EFFECT_BACKEND_BODY_SET_VERSION","bodyCount","translatedBodyCount","passUnitCount","bodyMode","stageCount","selectedStageCount","shaderCount","shaders","layoutCount","layouts","metadata","effectName","bodyIndex","emittedBodySet","selectedModeBodySet","container","buildCarbonEffectContainer","compilerVersion","m_compilerVersionBytes","inspection","inspectWithValues","emit","qualification","ok","level","validator","backendBodyCount","backendTranslatedBodyCount","backendPassUnitCount","nativeComparison","reflection","reflectionBlobs","blobBytes","selectedBodyKey","variant","permutationIndex","bodyKey","shadersByPass","passUnits","passes","transforms","resourceTransforms","filter","transform","unit","wgslSetVersion","layout","unitKey","body","representativePermutationIndex","status","error","passCount","value","undefined","TypeError","String","trim","name","result","isArray","stageNames","Number","isSafeInteger","some","includes","Set","Uint8Array","ArrayBuffer","isView","buffer","byteOffset","byteLength","sha256Bytes","logicalPath","game","client","build","md5"],"mappings":"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"}
@@ -4,5 +4,14 @@ const WEBGPU_BACKEND_NAME = "webgpu";
4
4
  const DXBC_WGSL_TRANSLATOR_NAME = "dxbc-js-wgsl";
5
5
  const DXBC_WGSL_TRANSLATOR_VERSION = FORMAT_WEBGPU_PACKAGE_VERSION;
6
6
 
7
- export { DXBC_WGSL_TRANSLATOR_NAME, DXBC_WGSL_TRANSLATOR_VERSION, FORMAT_WEBGPU_PACKAGE_NAME, FORMAT_WEBGPU_PACKAGE_VERSION, WEBGPU_BACKEND_NAME };
7
+ /**
8
+ * Version of the `INFO`-shaped summary the package reports.
9
+ *
10
+ * The summary is now a **derived view** rather than a stored chunk, so this
11
+ * versions what callers receive, not what is on the wire. Nothing in the
12
+ * container carries it.
13
+ */
14
+ const EFFECT_INFO_VERSION = 3;
15
+
16
+ export { DXBC_WGSL_TRANSLATOR_NAME, DXBC_WGSL_TRANSLATOR_VERSION, EFFECT_INFO_VERSION, FORMAT_WEBGPU_PACKAGE_NAME, FORMAT_WEBGPU_PACKAGE_VERSION, WEBGPU_BACKEND_NAME };
8
17
  //# sourceMappingURL=packageMetadata.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"packageMetadata.js","sources":["../../../../../src/formats/webgpu/core/packageMetadata.js"],"sourcesContent":["export const FORMAT_WEBGPU_PACKAGE_NAME = \"@carbonenginejs/runtime-resource/formats/webgpu\";\nexport const FORMAT_WEBGPU_PACKAGE_VERSION = \"0.11.1\";\nexport const WEBGPU_BACKEND_NAME = \"webgpu\";\nexport const DXBC_WGSL_TRANSLATOR_NAME = \"dxbc-js-wgsl\";\nexport const DXBC_WGSL_TRANSLATOR_VERSION = FORMAT_WEBGPU_PACKAGE_VERSION;\n"],"names":["FORMAT_WEBGPU_PACKAGE_NAME","FORMAT_WEBGPU_PACKAGE_VERSION","WEBGPU_BACKEND_NAME","DXBC_WGSL_TRANSLATOR_NAME","DXBC_WGSL_TRANSLATOR_VERSION"],"mappings":"AAAO,MAAMA,0BAA0B,GAAG;AACnC,MAAMC,6BAA6B,GAAG;AACtC,MAAMC,mBAAmB,GAAG;AAC5B,MAAMC,yBAAyB,GAAG;AAClC,MAAMC,4BAA4B,GAAGH;;;;"}
1
+ {"version":3,"file":"packageMetadata.js","sources":["../../../../../src/formats/webgpu/core/packageMetadata.js"],"sourcesContent":["export const FORMAT_WEBGPU_PACKAGE_NAME = \"@carbonenginejs/runtime-resource/formats/webgpu\";\nexport const FORMAT_WEBGPU_PACKAGE_VERSION = \"0.11.1\";\nexport const WEBGPU_BACKEND_NAME = \"webgpu\";\nexport const DXBC_WGSL_TRANSLATOR_NAME = \"dxbc-js-wgsl\";\nexport const DXBC_WGSL_TRANSLATOR_VERSION = FORMAT_WEBGPU_PACKAGE_VERSION;\n\n/**\n * Version of the `INFO`-shaped summary the package reports.\n *\n * The summary is now a **derived view** rather than a stored chunk, so this\n * versions what callers receive, not what is on the wire. Nothing in the\n * container carries it.\n */\nexport const EFFECT_INFO_VERSION = 3;\n"],"names":["FORMAT_WEBGPU_PACKAGE_NAME","FORMAT_WEBGPU_PACKAGE_VERSION","WEBGPU_BACKEND_NAME","DXBC_WGSL_TRANSLATOR_NAME","DXBC_WGSL_TRANSLATOR_VERSION","EFFECT_INFO_VERSION"],"mappings":"AAAO,MAAMA,0BAA0B,GAAG;AACnC,MAAMC,6BAA6B,GAAG;AACtC,MAAMC,mBAAmB,GAAG;AAC5B,MAAMC,yBAAyB,GAAG;AAClC,MAAMC,4BAA4B,GAAGH;;AAE5C;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAMI,mBAAmB,GAAG;;;;"}
@@ -1,3 +1,5 @@
1
+ import { compareUtf8 } from '../../../../format/compareUtf8.js';
2
+
1
3
  const RESOURCE_IDENTITY = /^sampled-resource:(\d+):(\d+)$/u;
2
4
  const DETAIL_PARAMETER = /^Detail(\d+)Map$/u;
3
5
  const SAMPLE_OPCODES = new Set(["sample_b"]);
@@ -67,19 +69,19 @@ function normalizeTransform(transform) {
67
69
  };
68
70
  }
69
71
 
70
- /**
71
- * Validates and freezes the compiler-owned resource-transform plan.
72
- *
73
- * @param {object|null|undefined} value Candidate plan.
74
- * @param {string|null} [layoutKey] Optional expected pass layout key.
75
- * @returns {object|null} Canonical frozen plan, or null.
72
+ /**
73
+ * Validates and freezes the compiler-owned resource-transform plan.
74
+ *
75
+ * @param {object|null|undefined} value Candidate plan.
76
+ * @param {string|null} [layoutKey] Optional expected pass layout key.
77
+ * @returns {object|null} Canonical frozen plan, or null.
76
78
  */
77
79
  function normalizeResourceTransformPlan(value, layoutKey = null) {
78
80
  if (value === undefined || value === null) return null;
79
81
  if (value?.format !== "CJS_WGSL_RESOURCE_TRANSFORM_PLAN" || value.formatVersion !== 1 || !Array.isArray(value.resourceTransforms) || !value.resourceTransforms.length) {
80
82
  throw new TypeError("WGSL resource transform plan must be a non-empty version-1 document");
81
83
  }
82
- const resourceTransforms = value.resourceTransforms.map(normalizeTransform).sort((left, right) => left.id.localeCompare(right.id));
84
+ const resourceTransforms = value.resourceTransforms.map(normalizeTransform).sort((left, right) => compareUtf8(left.id, right.id));
83
85
  const ids = new Set();
84
86
  for (const transform of resourceTransforms) {
85
87
  if (ids.has(transform.id)) {
@@ -145,14 +147,14 @@ function rejectCandidate() {
145
147
  return null;
146
148
  }
147
149
 
148
- /**
149
- * Recognizes the exact Carbon Detail-map sample family and builds a late
150
- * physical texture-array overlay. The source IR remains unchanged.
151
- *
152
- * @param {Array<{ir: object, semanticBindings: object[]}>} entries Pass stages.
153
- * @param {object} options Planner options.
154
- * @param {string} options.layoutKey Canonical pass key.
155
- * @returns {object|null} Frozen transform plan, or null when proof is absent.
150
+ /**
151
+ * Recognizes the exact Carbon Detail-map sample family and builds a late
152
+ * physical texture-array overlay. The source IR remains unchanged.
153
+ *
154
+ * @param {Array<{ir: object, semanticBindings: object[]}>} entries Pass stages.
155
+ * @param {object} options Planner options.
156
+ * @param {string} options.layoutKey Canonical pass key.
157
+ * @returns {object|null} Frozen transform plan, or null when proof is absent.
156
158
  */
157
159
  function buildResourceTransformPlan(entries, options = {}) {
158
160
  if (!Array.isArray(entries) || !entries.length) {
@@ -1 +1 @@
1
- {"version":3,"file":"buildResourceTransformPlan.js","sources":["../../../../../../src/formats/webgpu/core/wgsl/buildResourceTransformPlan.js"],"sourcesContent":["const RESOURCE_IDENTITY = /^sampled-resource:(\\d+):(\\d+)$/u;\nconst DETAIL_PARAMETER = /^Detail(\\d+)Map$/u;\nconst SAMPLE_OPCODES = new Set([ \"sample_b\" ]);\n\nfunction deepFreeze(value)\n{\n if (!value || typeof value !== \"object\" || Object.isFrozen(value)) return value;\n for (const entry of Object.values(value)) deepFreeze(entry);\n return Object.freeze(value);\n}\n\nfunction bindingRegister(binding)\n{\n return binding.range?.lowerBound ?? binding.registerIndex;\n}\n\nfunction bindingSpace(binding)\n{\n return binding.range?.registerSpace ?? 0;\n}\n\nfunction bindingIdentity(binding)\n{\n return `${binding.resourceKind}:${bindingSpace(binding)}:${bindingRegister(binding)}`;\n}\n\nfunction scopeIdentity(identity, stage)\n{\n return `${identity}@${stage}`;\n}\n\nfunction normalizeInput(input, transformId, index)\n{\n const parameter = input?.parameter;\n const layer = input?.layer;\n const identity = input?.identity;\n const scoped = input?.scopeIdentity;\n if (typeof parameter !== \"string\" || !parameter\n || !Number.isInteger(layer) || layer !== index\n || typeof identity !== \"string\" || !RESOURCE_IDENTITY.test(identity)\n || scoped !== `${identity}@fragment`)\n {\n throw new Error(`WGSL resource transform ${transformId} has an invalid input at layer ${index}`);\n }\n return { parameter, layer, identity, scopeIdentity: scoped };\n}\n\nfunction normalizeTransform(transform)\n{\n const id = transform?.id;\n if (typeof id !== \"string\" || !id\n || transform.version !== 1\n || transform.kind !== \"texture-2d-array\"\n || typeof transform.layoutKey !== \"string\" || !transform.layoutKey\n || transform.stage !== \"fragment\"\n || !Array.isArray(transform.inputs)\n || transform.inputs.length < 2)\n {\n throw new Error(`WGSL resource transform ${id || \"<unknown>\"} has an invalid texture-array contract`);\n }\n const inputs = transform.inputs.map((input, index) => normalizeInput(input, id, index));\n const inputParameters = new Set(inputs.map((input) => input.parameter));\n const inputIdentities = new Set(inputs.map((input) => input.identity));\n if (inputParameters.size !== inputs.length || inputIdentities.size !== inputs.length)\n {\n throw new Error(`WGSL resource transform ${id} contains duplicate inputs`);\n }\n const output = transform.output;\n if (typeof output?.name !== \"string\" || !output.name\n || output.identity !== inputs[0].identity\n || output.scopeIdentity !== inputs[0].scopeIdentity\n || output.viewDimension !== \"2d-array\"\n || output.layerCount !== inputs.length\n || transform.representation !== \"native-or-rgba8\"\n || transform.missingLayer !== \"reject\")\n {\n throw new Error(`WGSL resource transform ${id} has an invalid output contract`);\n }\n return {\n id,\n version: 1,\n kind: \"texture-2d-array\",\n layoutKey: transform.layoutKey,\n stage: \"fragment\",\n inputs,\n output: {\n name: output.name,\n identity: output.identity,\n scopeIdentity: output.scopeIdentity,\n viewDimension: \"2d-array\",\n layerCount: output.layerCount\n },\n representation: \"native-or-rgba8\",\n missingLayer: \"reject\"\n };\n}\n\n/**\n * Validates and freezes the compiler-owned resource-transform plan.\n *\n * @param {object|null|undefined} value Candidate plan.\n * @param {string|null} [layoutKey] Optional expected pass layout key.\n * @returns {object|null} Canonical frozen plan, or null.\n */\nexport function normalizeResourceTransformPlan(value, layoutKey = null)\n{\n if (value === undefined || value === null) return null;\n if (value?.format !== \"CJS_WGSL_RESOURCE_TRANSFORM_PLAN\"\n || value.formatVersion !== 1\n || !Array.isArray(value.resourceTransforms)\n || !value.resourceTransforms.length)\n {\n throw new TypeError(\"WGSL resource transform plan must be a non-empty version-1 document\");\n }\n const resourceTransforms = value.resourceTransforms.map(normalizeTransform)\n .sort((left, right) => left.id.localeCompare(right.id));\n const ids = new Set();\n for (const transform of resourceTransforms)\n {\n if (ids.has(transform.id))\n {\n throw new Error(`WGSL resource transform plan contains duplicate id ${transform.id}`);\n }\n ids.add(transform.id);\n if (layoutKey !== null && transform.layoutKey !== layoutKey)\n {\n throw new Error(`WGSL resource transform ${transform.id} targets ${transform.layoutKey}, expected ${layoutKey}`);\n }\n }\n return deepFreeze({\n format: \"CJS_WGSL_RESOURCE_TRANSFORM_PLAN\",\n formatVersion: 1,\n resourceTransforms\n });\n}\n\nfunction bindingMatchesForOperand(program, resourceKind, operand)\n{\n const candidates = program.bindings.filter((binding) =>\n binding.resourceKind === resourceKind);\n const rangeId = operand?.resourceReference?.rangeId;\n return Number.isInteger(rangeId)\n ? candidates.filter((binding) => binding.range?.rangeId === rangeId)\n : candidates.filter((binding) => bindingRegister(binding) === operand?.registerIndex);\n}\n\nfunction resolveBindingForOperand(program, resourceKind, operand)\n{\n const matches = bindingMatchesForOperand(program, resourceKind, operand);\n if (matches.length !== 1) return null;\n const binding = matches[0];\n const absolute = operand?.resourceReference?.absoluteIndex;\n if (operand?.typeName !== (resourceKind === \"sampler\" ? \"sampler\" : \"resource\")\n || (operand.modifierName ?? \"none\") !== \"none\"\n || (operand.minPrecisionName ?? \"default\") !== \"default\"\n || operand.nonUniform\n || operand.indices?.some((index) => index?.relative)\n || operand.resourceReference?.nonUniform\n || absolute?.relative\n || (absolute !== undefined\n && (absolute?.values?.length !== 1\n || absolute.values[0] !== bindingRegister(binding))))\n {\n return null;\n }\n return binding;\n}\n\nfunction operandFingerprint(operand)\n{\n return JSON.stringify({\n typeName: operand?.typeName ?? null,\n selectionModeName: operand?.selectionModeName ?? null,\n mask: operand?.mask ?? \"\",\n swizzle: operand?.swizzle ?? \"\",\n selected: operand?.selected ?? \"\",\n modifierName: operand?.modifierName ?? \"none\",\n minPrecisionName: operand?.minPrecisionName ?? \"default\",\n registerIndex: operand?.registerIndex ?? null,\n indices: (operand?.indices || []).map((index) => ({\n values: index?.values || [],\n relative: index?.relative ?? null\n })),\n immediateValues: (operand?.immediateValues || []).map((entry) => entry?.uint32)\n });\n}\n\nfunction semanticResource(binding)\n{\n if (binding?.kind !== \"resource\") return null;\n const parameter = binding.metadataName ?? binding.carbon?.name;\n if (typeof parameter !== \"string\" || !parameter) return null;\n return {\n parameter,\n registerIndex: binding.registerIndex,\n registerSpace: binding.registerSpace ?? 0,\n arrayElements: binding.arrayCount ?? binding.carbon?.arrayElements,\n type: binding.carbon?.type,\n isSRGB: binding.carbon?.isSRGB\n };\n}\n\nfunction rejectCandidate()\n{\n return null;\n}\n\n/**\n * Recognizes the exact Carbon Detail-map sample family and builds a late\n * physical texture-array overlay. The source IR remains unchanged.\n *\n * @param {Array<{ir: object, semanticBindings: object[]}>} entries Pass stages.\n * @param {object} options Planner options.\n * @param {string} options.layoutKey Canonical pass key.\n * @returns {object|null} Frozen transform plan, or null when proof is absent.\n */\nexport function buildResourceTransformPlan(entries, options = {})\n{\n if (!Array.isArray(entries) || !entries.length)\n {\n throw new TypeError(\"WGSL resource transform planning expects pass stage entries\");\n }\n const layoutKey = options.layoutKey;\n if (typeof layoutKey !== \"string\" || !layoutKey)\n {\n throw new TypeError(\"WGSL resource transform planning requires a layoutKey\");\n }\n const fragments = entries.filter((entry) => entry?.ir?.stage === \"pixel\");\n if (fragments.length !== 1) return null;\n const { ir: program } = fragments[0];\n if (program?.format !== \"CJS_SHADER_IR\" || program.formatVersion !== 1\n || !Array.isArray(fragments[0].semanticBindings))\n {\n throw new TypeError(\"WGSL resource transform planning requires version-1 IR and semantic bindings\");\n }\n const semanticResources = fragments[0].semanticBindings.map(semanticResource).filter(Boolean);\n const detailResources = semanticResources.filter((resource) => DETAIL_PARAMETER.test(resource.parameter));\n if (!detailResources.length) return null;\n const byName = new Map();\n for (const resource of detailResources)\n {\n if (byName.has(resource.parameter)) return rejectCandidate();\n byName.set(resource.parameter, resource);\n }\n const hasThird = byName.has(\"Detail3Map\");\n const parameters = hasThird\n ? [ \"Detail1Map\", \"Detail2Map\", \"Detail3Map\" ]\n : [ \"Detail1Map\", \"Detail2Map\" ];\n if (byName.size !== parameters.length\n || parameters.some((parameter) => !byName.has(parameter)))\n {\n return rejectCandidate();\n }\n\n const sources = [];\n for (const parameter of parameters)\n {\n const semantic = byName.get(parameter);\n if (!Number.isInteger(semantic.registerIndex) || semantic.registerIndex < 0\n || !Number.isInteger(semantic.registerSpace) || semantic.registerSpace < 0\n || semantic.arrayElements !== 1\n || semantic.type !== 2\n || semantic.isSRGB !== false)\n {\n return rejectCandidate();\n }\n const matches = program.bindings.filter((binding) =>\n binding.resourceKind === \"sampled-resource\"\n && bindingSpace(binding) === semantic.registerSpace\n && bindingRegister(binding) === semantic.registerIndex);\n if (matches.length !== 1) return rejectCandidate();\n const binding = matches[0];\n const returns = binding.returnType?.returnTypeNames || [];\n if (binding.resourceDimension !== \"texture2d\"\n || binding.structureStride !== null\n || binding.range?.unbounded\n || binding.range?.registerCount !== 1\n || returns.length !== 4\n || returns.some((entry) => entry !== \"float\"))\n {\n return rejectCandidate();\n }\n sources.push({ parameter, semantic, binding, identity: bindingIdentity(binding) });\n }\n if (sources.some((source, index) =>\n index > 0\n && (source.semantic.registerSpace !== sources[0].semantic.registerSpace\n || source.semantic.registerIndex <= sources[index - 1].semantic.registerIndex)))\n {\n return rejectCandidate();\n }\n\n const sourceByIdentity = new Map(sources.map((source) => [ source.identity, source ]));\n const uses = new Map(sources.map((source) => [ source.identity, 0 ]));\n let samplerIdentity = null;\n let biasFingerprint = null;\n for (const instruction of program.instructions)\n {\n for (let operandIndex = 0; operandIndex < instruction.operands.length; operandIndex += 1)\n {\n const operand = instruction.operands[operandIndex];\n if (operand?.typeName !== \"resource\") continue;\n const binding = resolveBindingForOperand(program, \"sampled-resource\", operand);\n if (!binding)\n {\n const unresolvedCandidate = bindingMatchesForOperand(\n program,\n \"sampled-resource\",\n operand\n ).some((candidate) =>\n sourceByIdentity.has(bindingIdentity(candidate)));\n if (unresolvedCandidate) return rejectCandidate();\n continue;\n }\n const identity = bindingIdentity(binding);\n if (!sourceByIdentity.has(identity)) continue;\n if (!SAMPLE_OPCODES.has(instruction.opcodeName)\n || operandIndex !== 2\n || instruction.extensions?.some((extension) =>\n extension.typeName === \"sample_controls\")\n || instruction.operands.length !== 5)\n {\n return rejectCandidate();\n }\n const sampler = resolveBindingForOperand(program, \"sampler\", instruction.operands[3]);\n if (!sampler) return rejectCandidate();\n const currentSamplerIdentity = bindingIdentity(sampler);\n const currentBiasFingerprint = operandFingerprint(instruction.operands[4]);\n if ((samplerIdentity !== null && samplerIdentity !== currentSamplerIdentity)\n || (biasFingerprint !== null && biasFingerprint !== currentBiasFingerprint))\n {\n return rejectCandidate();\n }\n samplerIdentity = currentSamplerIdentity;\n biasFingerprint = currentBiasFingerprint;\n uses.set(identity, uses.get(identity) + 1);\n }\n }\n if (samplerIdentity === null || Array.from(uses.values()).some((count) => count < 1))\n {\n return rejectCandidate();\n }\n\n const inputs = sources.map((source, layer) => ({\n parameter: source.parameter,\n layer,\n identity: source.identity,\n scopeIdentity: scopeIdentity(source.identity, \"fragment\")\n }));\n const first = inputs[0];\n const id = `${layoutKey}:detail-map-array:${first.identity}`;\n return normalizeResourceTransformPlan({\n format: \"CJS_WGSL_RESOURCE_TRANSFORM_PLAN\",\n formatVersion: 1,\n resourceTransforms: [ {\n id,\n version: 1,\n kind: \"texture-2d-array\",\n layoutKey,\n stage: \"fragment\",\n inputs,\n output: {\n name: \"DetailMapArray\",\n identity: first.identity,\n scopeIdentity: first.scopeIdentity,\n viewDimension: \"2d-array\",\n layerCount: inputs.length\n },\n representation: \"native-or-rgba8\",\n missingLayer: \"reject\"\n } ]\n }, layoutKey);\n}\n"],"names":["RESOURCE_IDENTITY","DETAIL_PARAMETER","SAMPLE_OPCODES","Set","deepFreeze","value","Object","isFrozen","entry","values","freeze","bindingRegister","binding","range","lowerBound","registerIndex","bindingSpace","registerSpace","bindingIdentity","resourceKind","scopeIdentity","identity","stage","normalizeInput","input","transformId","index","parameter","layer","scoped","Number","isInteger","test","Error","normalizeTransform","transform","id","version","kind","layoutKey","Array","isArray","inputs","length","map","inputParameters","inputIdentities","size","output","name","viewDimension","layerCount","representation","missingLayer","normalizeResourceTransformPlan","undefined","format","formatVersion","resourceTransforms","TypeError","sort","left","right","localeCompare","ids","has","add","bindingMatchesForOperand","program","operand","candidates","bindings","filter","rangeId","resourceReference","resolveBindingForOperand","matches","absolute","absoluteIndex","typeName","modifierName","minPrecisionName","nonUniform","indices","some","relative","operandFingerprint","JSON","stringify","selectionModeName","mask","swizzle","selected","immediateValues","uint32","semanticResource","metadataName","carbon","arrayElements","arrayCount","type","isSRGB","rejectCandidate","buildResourceTransformPlan","entries","options","fragments","ir","semanticBindings","semanticResources","Boolean","detailResources","resource","byName","Map","set","hasThird","parameters","sources","semantic","get","returns","returnType","returnTypeNames","resourceDimension","structureStride","unbounded","registerCount","push","source","sourceByIdentity","uses","samplerIdentity","biasFingerprint","instruction","instructions","operandIndex","operands","unresolvedCandidate","candidate","opcodeName","extensions","extension","sampler","currentSamplerIdentity","currentBiasFingerprint","from","count","first"],"mappings":"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"}
1
+ {"version":3,"file":"buildResourceTransformPlan.js","sources":["../../../../../../src/formats/webgpu/core/wgsl/buildResourceTransformPlan.js"],"sourcesContent":["import { compareUtf8 } from \"../../../../format/compareUtf8.js\";\r\n\r\nconst RESOURCE_IDENTITY = /^sampled-resource:(\\d+):(\\d+)$/u;\r\nconst DETAIL_PARAMETER = /^Detail(\\d+)Map$/u;\r\nconst SAMPLE_OPCODES = new Set([ \"sample_b\" ]);\r\n\r\nfunction deepFreeze(value)\r\n{\r\n if (!value || typeof value !== \"object\" || Object.isFrozen(value)) return value;\r\n for (const entry of Object.values(value)) deepFreeze(entry);\r\n return Object.freeze(value);\r\n}\r\n\r\nfunction bindingRegister(binding)\r\n{\r\n return binding.range?.lowerBound ?? binding.registerIndex;\r\n}\r\n\r\nfunction bindingSpace(binding)\r\n{\r\n return binding.range?.registerSpace ?? 0;\r\n}\r\n\r\nfunction bindingIdentity(binding)\r\n{\r\n return `${binding.resourceKind}:${bindingSpace(binding)}:${bindingRegister(binding)}`;\r\n}\r\n\r\nfunction scopeIdentity(identity, stage)\r\n{\r\n return `${identity}@${stage}`;\r\n}\r\n\r\nfunction normalizeInput(input, transformId, index)\r\n{\r\n const parameter = input?.parameter;\r\n const layer = input?.layer;\r\n const identity = input?.identity;\r\n const scoped = input?.scopeIdentity;\r\n if (typeof parameter !== \"string\" || !parameter\r\n || !Number.isInteger(layer) || layer !== index\r\n || typeof identity !== \"string\" || !RESOURCE_IDENTITY.test(identity)\r\n || scoped !== `${identity}@fragment`)\r\n {\r\n throw new Error(`WGSL resource transform ${transformId} has an invalid input at layer ${index}`);\r\n }\r\n return { parameter, layer, identity, scopeIdentity: scoped };\r\n}\r\n\r\nfunction normalizeTransform(transform)\r\n{\r\n const id = transform?.id;\r\n if (typeof id !== \"string\" || !id\r\n || transform.version !== 1\r\n || transform.kind !== \"texture-2d-array\"\r\n || typeof transform.layoutKey !== \"string\" || !transform.layoutKey\r\n || transform.stage !== \"fragment\"\r\n || !Array.isArray(transform.inputs)\r\n || transform.inputs.length < 2)\r\n {\r\n throw new Error(`WGSL resource transform ${id || \"<unknown>\"} has an invalid texture-array contract`);\r\n }\r\n const inputs = transform.inputs.map((input, index) => normalizeInput(input, id, index));\r\n const inputParameters = new Set(inputs.map((input) => input.parameter));\r\n const inputIdentities = new Set(inputs.map((input) => input.identity));\r\n if (inputParameters.size !== inputs.length || inputIdentities.size !== inputs.length)\r\n {\r\n throw new Error(`WGSL resource transform ${id} contains duplicate inputs`);\r\n }\r\n const output = transform.output;\r\n if (typeof output?.name !== \"string\" || !output.name\r\n || output.identity !== inputs[0].identity\r\n || output.scopeIdentity !== inputs[0].scopeIdentity\r\n || output.viewDimension !== \"2d-array\"\r\n || output.layerCount !== inputs.length\r\n || transform.representation !== \"native-or-rgba8\"\r\n || transform.missingLayer !== \"reject\")\r\n {\r\n throw new Error(`WGSL resource transform ${id} has an invalid output contract`);\r\n }\r\n return {\r\n id,\r\n version: 1,\r\n kind: \"texture-2d-array\",\r\n layoutKey: transform.layoutKey,\r\n stage: \"fragment\",\r\n inputs,\r\n output: {\r\n name: output.name,\r\n identity: output.identity,\r\n scopeIdentity: output.scopeIdentity,\r\n viewDimension: \"2d-array\",\r\n layerCount: output.layerCount\r\n },\r\n representation: \"native-or-rgba8\",\r\n missingLayer: \"reject\"\r\n };\r\n}\r\n\r\n/**\r\n * Validates and freezes the compiler-owned resource-transform plan.\r\n *\r\n * @param {object|null|undefined} value Candidate plan.\r\n * @param {string|null} [layoutKey] Optional expected pass layout key.\r\n * @returns {object|null} Canonical frozen plan, or null.\r\n */\r\nexport function normalizeResourceTransformPlan(value, layoutKey = null)\r\n{\r\n if (value === undefined || value === null) return null;\r\n if (value?.format !== \"CJS_WGSL_RESOURCE_TRANSFORM_PLAN\"\r\n || value.formatVersion !== 1\r\n || !Array.isArray(value.resourceTransforms)\r\n || !value.resourceTransforms.length)\r\n {\r\n throw new TypeError(\"WGSL resource transform plan must be a non-empty version-1 document\");\r\n }\r\n const resourceTransforms = value.resourceTransforms.map(normalizeTransform)\r\n .sort((left, right) => compareUtf8(left.id, right.id));\r\n const ids = new Set();\r\n for (const transform of resourceTransforms)\r\n {\r\n if (ids.has(transform.id))\r\n {\r\n throw new Error(`WGSL resource transform plan contains duplicate id ${transform.id}`);\r\n }\r\n ids.add(transform.id);\r\n if (layoutKey !== null && transform.layoutKey !== layoutKey)\r\n {\r\n throw new Error(`WGSL resource transform ${transform.id} targets ${transform.layoutKey}, expected ${layoutKey}`);\r\n }\r\n }\r\n return deepFreeze({\r\n format: \"CJS_WGSL_RESOURCE_TRANSFORM_PLAN\",\r\n formatVersion: 1,\r\n resourceTransforms\r\n });\r\n}\r\n\r\nfunction bindingMatchesForOperand(program, resourceKind, operand)\r\n{\r\n const candidates = program.bindings.filter((binding) =>\r\n binding.resourceKind === resourceKind);\r\n const rangeId = operand?.resourceReference?.rangeId;\r\n return Number.isInteger(rangeId)\r\n ? candidates.filter((binding) => binding.range?.rangeId === rangeId)\r\n : candidates.filter((binding) => bindingRegister(binding) === operand?.registerIndex);\r\n}\r\n\r\nfunction resolveBindingForOperand(program, resourceKind, operand)\r\n{\r\n const matches = bindingMatchesForOperand(program, resourceKind, operand);\r\n if (matches.length !== 1) return null;\r\n const binding = matches[0];\r\n const absolute = operand?.resourceReference?.absoluteIndex;\r\n if (operand?.typeName !== (resourceKind === \"sampler\" ? \"sampler\" : \"resource\")\r\n || (operand.modifierName ?? \"none\") !== \"none\"\r\n || (operand.minPrecisionName ?? \"default\") !== \"default\"\r\n || operand.nonUniform\r\n || operand.indices?.some((index) => index?.relative)\r\n || operand.resourceReference?.nonUniform\r\n || absolute?.relative\r\n || (absolute !== undefined\r\n && (absolute?.values?.length !== 1\r\n || absolute.values[0] !== bindingRegister(binding))))\r\n {\r\n return null;\r\n }\r\n return binding;\r\n}\r\n\r\nfunction operandFingerprint(operand)\r\n{\r\n return JSON.stringify({\r\n typeName: operand?.typeName ?? null,\r\n selectionModeName: operand?.selectionModeName ?? null,\r\n mask: operand?.mask ?? \"\",\r\n swizzle: operand?.swizzle ?? \"\",\r\n selected: operand?.selected ?? \"\",\r\n modifierName: operand?.modifierName ?? \"none\",\r\n minPrecisionName: operand?.minPrecisionName ?? \"default\",\r\n registerIndex: operand?.registerIndex ?? null,\r\n indices: (operand?.indices || []).map((index) => ({\r\n values: index?.values || [],\r\n relative: index?.relative ?? null\r\n })),\r\n immediateValues: (operand?.immediateValues || []).map((entry) => entry?.uint32)\r\n });\r\n}\r\n\r\nfunction semanticResource(binding)\r\n{\r\n if (binding?.kind !== \"resource\") return null;\r\n const parameter = binding.metadataName ?? binding.carbon?.name;\r\n if (typeof parameter !== \"string\" || !parameter) return null;\r\n return {\r\n parameter,\r\n registerIndex: binding.registerIndex,\r\n registerSpace: binding.registerSpace ?? 0,\r\n arrayElements: binding.arrayCount ?? binding.carbon?.arrayElements,\r\n type: binding.carbon?.type,\r\n isSRGB: binding.carbon?.isSRGB\r\n };\r\n}\r\n\r\nfunction rejectCandidate()\r\n{\r\n return null;\r\n}\r\n\r\n/**\r\n * Recognizes the exact Carbon Detail-map sample family and builds a late\r\n * physical texture-array overlay. The source IR remains unchanged.\r\n *\r\n * @param {Array<{ir: object, semanticBindings: object[]}>} entries Pass stages.\r\n * @param {object} options Planner options.\r\n * @param {string} options.layoutKey Canonical pass key.\r\n * @returns {object|null} Frozen transform plan, or null when proof is absent.\r\n */\r\nexport function buildResourceTransformPlan(entries, options = {})\r\n{\r\n if (!Array.isArray(entries) || !entries.length)\r\n {\r\n throw new TypeError(\"WGSL resource transform planning expects pass stage entries\");\r\n }\r\n const layoutKey = options.layoutKey;\r\n if (typeof layoutKey !== \"string\" || !layoutKey)\r\n {\r\n throw new TypeError(\"WGSL resource transform planning requires a layoutKey\");\r\n }\r\n const fragments = entries.filter((entry) => entry?.ir?.stage === \"pixel\");\r\n if (fragments.length !== 1) return null;\r\n const { ir: program } = fragments[0];\r\n if (program?.format !== \"CJS_SHADER_IR\" || program.formatVersion !== 1\r\n || !Array.isArray(fragments[0].semanticBindings))\r\n {\r\n throw new TypeError(\"WGSL resource transform planning requires version-1 IR and semantic bindings\");\r\n }\r\n const semanticResources = fragments[0].semanticBindings.map(semanticResource).filter(Boolean);\r\n const detailResources = semanticResources.filter((resource) => DETAIL_PARAMETER.test(resource.parameter));\r\n if (!detailResources.length) return null;\r\n const byName = new Map();\r\n for (const resource of detailResources)\r\n {\r\n if (byName.has(resource.parameter)) return rejectCandidate();\r\n byName.set(resource.parameter, resource);\r\n }\r\n const hasThird = byName.has(\"Detail3Map\");\r\n const parameters = hasThird\r\n ? [ \"Detail1Map\", \"Detail2Map\", \"Detail3Map\" ]\r\n : [ \"Detail1Map\", \"Detail2Map\" ];\r\n if (byName.size !== parameters.length\r\n || parameters.some((parameter) => !byName.has(parameter)))\r\n {\r\n return rejectCandidate();\r\n }\r\n\r\n const sources = [];\r\n for (const parameter of parameters)\r\n {\r\n const semantic = byName.get(parameter);\r\n if (!Number.isInteger(semantic.registerIndex) || semantic.registerIndex < 0\r\n || !Number.isInteger(semantic.registerSpace) || semantic.registerSpace < 0\r\n || semantic.arrayElements !== 1\r\n || semantic.type !== 2\r\n || semantic.isSRGB !== false)\r\n {\r\n return rejectCandidate();\r\n }\r\n const matches = program.bindings.filter((binding) =>\r\n binding.resourceKind === \"sampled-resource\"\r\n && bindingSpace(binding) === semantic.registerSpace\r\n && bindingRegister(binding) === semantic.registerIndex);\r\n if (matches.length !== 1) return rejectCandidate();\r\n const binding = matches[0];\r\n const returns = binding.returnType?.returnTypeNames || [];\r\n if (binding.resourceDimension !== \"texture2d\"\r\n || binding.structureStride !== null\r\n || binding.range?.unbounded\r\n || binding.range?.registerCount !== 1\r\n || returns.length !== 4\r\n || returns.some((entry) => entry !== \"float\"))\r\n {\r\n return rejectCandidate();\r\n }\r\n sources.push({ parameter, semantic, binding, identity: bindingIdentity(binding) });\r\n }\r\n if (sources.some((source, index) =>\r\n index > 0\r\n && (source.semantic.registerSpace !== sources[0].semantic.registerSpace\r\n || source.semantic.registerIndex <= sources[index - 1].semantic.registerIndex)))\r\n {\r\n return rejectCandidate();\r\n }\r\n\r\n const sourceByIdentity = new Map(sources.map((source) => [ source.identity, source ]));\r\n const uses = new Map(sources.map((source) => [ source.identity, 0 ]));\r\n let samplerIdentity = null;\r\n let biasFingerprint = null;\r\n for (const instruction of program.instructions)\r\n {\r\n for (let operandIndex = 0; operandIndex < instruction.operands.length; operandIndex += 1)\r\n {\r\n const operand = instruction.operands[operandIndex];\r\n if (operand?.typeName !== \"resource\") continue;\r\n const binding = resolveBindingForOperand(program, \"sampled-resource\", operand);\r\n if (!binding)\r\n {\r\n const unresolvedCandidate = bindingMatchesForOperand(\r\n program,\r\n \"sampled-resource\",\r\n operand\r\n ).some((candidate) =>\r\n sourceByIdentity.has(bindingIdentity(candidate)));\r\n if (unresolvedCandidate) return rejectCandidate();\r\n continue;\r\n }\r\n const identity = bindingIdentity(binding);\r\n if (!sourceByIdentity.has(identity)) continue;\r\n if (!SAMPLE_OPCODES.has(instruction.opcodeName)\r\n || operandIndex !== 2\r\n || instruction.extensions?.some((extension) =>\r\n extension.typeName === \"sample_controls\")\r\n || instruction.operands.length !== 5)\r\n {\r\n return rejectCandidate();\r\n }\r\n const sampler = resolveBindingForOperand(program, \"sampler\", instruction.operands[3]);\r\n if (!sampler) return rejectCandidate();\r\n const currentSamplerIdentity = bindingIdentity(sampler);\r\n const currentBiasFingerprint = operandFingerprint(instruction.operands[4]);\r\n if ((samplerIdentity !== null && samplerIdentity !== currentSamplerIdentity)\r\n || (biasFingerprint !== null && biasFingerprint !== currentBiasFingerprint))\r\n {\r\n return rejectCandidate();\r\n }\r\n samplerIdentity = currentSamplerIdentity;\r\n biasFingerprint = currentBiasFingerprint;\r\n uses.set(identity, uses.get(identity) + 1);\r\n }\r\n }\r\n if (samplerIdentity === null || Array.from(uses.values()).some((count) => count < 1))\r\n {\r\n return rejectCandidate();\r\n }\r\n\r\n const inputs = sources.map((source, layer) => ({\r\n parameter: source.parameter,\r\n layer,\r\n identity: source.identity,\r\n scopeIdentity: scopeIdentity(source.identity, \"fragment\")\r\n }));\r\n const first = inputs[0];\r\n const id = `${layoutKey}:detail-map-array:${first.identity}`;\r\n return normalizeResourceTransformPlan({\r\n format: \"CJS_WGSL_RESOURCE_TRANSFORM_PLAN\",\r\n formatVersion: 1,\r\n resourceTransforms: [ {\r\n id,\r\n version: 1,\r\n kind: \"texture-2d-array\",\r\n layoutKey,\r\n stage: \"fragment\",\r\n inputs,\r\n output: {\r\n name: \"DetailMapArray\",\r\n identity: first.identity,\r\n scopeIdentity: first.scopeIdentity,\r\n viewDimension: \"2d-array\",\r\n layerCount: inputs.length\r\n },\r\n representation: \"native-or-rgba8\",\r\n missingLayer: \"reject\"\r\n } ]\r\n }, layoutKey);\r\n}\r\n"],"names":["RESOURCE_IDENTITY","DETAIL_PARAMETER","SAMPLE_OPCODES","Set","deepFreeze","value","Object","isFrozen","entry","values","freeze","bindingRegister","binding","range","lowerBound","registerIndex","bindingSpace","registerSpace","bindingIdentity","resourceKind","scopeIdentity","identity","stage","normalizeInput","input","transformId","index","parameter","layer","scoped","Number","isInteger","test","Error","normalizeTransform","transform","id","version","kind","layoutKey","Array","isArray","inputs","length","map","inputParameters","inputIdentities","size","output","name","viewDimension","layerCount","representation","missingLayer","normalizeResourceTransformPlan","undefined","format","formatVersion","resourceTransforms","TypeError","sort","left","right","compareUtf8","ids","has","add","bindingMatchesForOperand","program","operand","candidates","bindings","filter","rangeId","resourceReference","resolveBindingForOperand","matches","absolute","absoluteIndex","typeName","modifierName","minPrecisionName","nonUniform","indices","some","relative","operandFingerprint","JSON","stringify","selectionModeName","mask","swizzle","selected","immediateValues","uint32","semanticResource","metadataName","carbon","arrayElements","arrayCount","type","isSRGB","rejectCandidate","buildResourceTransformPlan","entries","options","fragments","ir","semanticBindings","semanticResources","Boolean","detailResources","resource","byName","Map","set","hasThird","parameters","sources","semantic","get","returns","returnType","returnTypeNames","resourceDimension","structureStride","unbounded","registerCount","push","source","sourceByIdentity","uses","samplerIdentity","biasFingerprint","instruction","instructions","operandIndex","operands","unresolvedCandidate","candidate","opcodeName","extensions","extension","sampler","currentSamplerIdentity","currentBiasFingerprint","from","count","first"],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import { lowerBindingLayout } from './lowerBindingLayout.js';
2
2
  import { normalizeResourceTransformPlan } from './buildResourceTransformPlan.js';
3
+ import { compareUtf8 } from '../../../../format/compareUtf8.js';
3
4
  import { particleClearSignedAtomicLayoutPolicy } from './lowerParticleClearComputePrograms.js';
4
5
  import { particleEmitSignedAtomicLayoutPolicy } from './lowerParticleEmitComputeProgram.js';
5
6
 
@@ -59,17 +60,17 @@ function deepFreeze(value) {
59
60
  return Object.freeze(value);
60
61
  }
61
62
 
62
- /**
63
- * Builds one deterministic numeric binding plan for all shader stages in a
64
- * pass. Unshared D3D tuples remain stage-scoped unless the caller explicitly
65
- * confirms that compatible declarations describe one shared resource.
66
- *
67
- * @param {object[]} programs Complete CJS shader IR stage set for one effect pass.
68
- * @param {object} [options] Explicit pass-level identity policy.
69
- * @param {string[]} [options.sharedIdentities] D3D identities confirmed by
70
- * pass metadata/CjsLibrary to represent one resource across stages.
71
- * @param {object|null} [options.effectProfileProof] Opaque exact-effect proof.
72
- * @returns {object} Frozen pass-global binding plan.
63
+ /**
64
+ * Builds one deterministic numeric binding plan for all shader stages in a
65
+ * pass. Unshared D3D tuples remain stage-scoped unless the caller explicitly
66
+ * confirms that compatible declarations describe one shared resource.
67
+ *
68
+ * @param {object[]} programs Complete CJS shader IR stage set for one effect pass.
69
+ * @param {object} [options] Explicit pass-level identity policy.
70
+ * @param {string[]} [options.sharedIdentities] D3D identities confirmed by
71
+ * pass metadata/CjsLibrary to represent one resource across stages.
72
+ * @param {object|null} [options.effectProfileProof] Opaque exact-effect proof.
73
+ * @returns {object} Frozen pass-global binding plan.
73
74
  */
74
75
  function buildWgslBindingPlan(programs, options = {}) {
75
76
  if (!Array.isArray(programs) || !programs.length) {
@@ -141,7 +142,7 @@ function buildWgslBindingPlan(programs, options = {}) {
141
142
  for (const key of sharedIdentities) {
142
143
  if (!identities.has(key)) throw new Error(`WGSL shared identity ${key} does not occur in the pass`);
143
144
  }
144
- bindings.sort((left, right) => left.registerSpace - right.registerSpace || (KIND_ORDER[left.resourceKind] ?? 99) - (KIND_ORDER[right.resourceKind] ?? 99) || left.registerIndex - right.registerIndex || (STAGE_ORDER[left.stages[0]] ?? 99) - (STAGE_ORDER[right.stages[0]] ?? 99) || left.generatedSymbol.localeCompare(right.generatedSymbol) || left.scopeIdentity.localeCompare(right.scopeIdentity));
145
+ bindings.sort((left, right) => left.registerSpace - right.registerSpace || (KIND_ORDER[left.resourceKind] ?? 99) - (KIND_ORDER[right.resourceKind] ?? 99) || left.registerIndex - right.registerIndex || (STAGE_ORDER[left.stages[0]] ?? 99) - (STAGE_ORDER[right.stages[0]] ?? 99) || compareUtf8(left.generatedSymbol, right.generatedSymbol) || compareUtf8(left.scopeIdentity, right.scopeIdentity));
145
146
  const plannedBindings = bindings.map((binding, bindingIndex) => ({
146
147
  ...binding,
147
148
  group: 0,
@@ -1 +1 @@
1
- {"version":3,"file":"buildWgslBindingPlan.js","sources":["../../../../../../src/formats/webgpu/core/wgsl/buildWgslBindingPlan.js"],"sourcesContent":["import { lowerBindingLayout } from \"./lowerBindingLayout.js\";\nimport { normalizeResourceTransformPlan } from \"./buildResourceTransformPlan.js\";\nimport {\n particleClearSignedAtomicLayoutPolicy\n} from \"./lowerParticleClearComputePrograms.js\";\nimport {\n particleEmitSignedAtomicLayoutPolicy\n} from \"./lowerParticleEmitComputeProgram.js\";\n\nconst KIND_ORDER = Object.freeze({\n \"uniform-buffer\": 0,\n \"sampled-resource\": 1,\n sampler: 2,\n \"storage-resource\": 3\n});\n\nconst STAGE_VISIBILITY = Object.freeze({ vertex: \"vertex\", pixel: \"fragment\", compute: \"compute\" });\nconst STAGE_ORDER = Object.freeze({ vertex: 0, fragment: 1, compute: 2 });\nconst IDENTITY_PATTERN = /^(uniform-buffer|sampled-resource|sampler|storage-resource):\\d+:\\d+$/u;\n\nfunction identity(binding)\n{\n return `${binding.resourceKind}:${binding.registerSpace}:${binding.registerIndex}`;\n}\n\nfunction portableBinding(binding)\n{\n const d3dIdentity = identity(binding);\n return {\n identity: d3dIdentity,\n resourceKind: binding.resourceKind,\n generatedSymbol: binding.generatedSymbol,\n registerSpace: binding.registerSpace,\n registerIndex: binding.registerIndex,\n type: binding.type,\n ...(typeof binding.transformId === \"string\"\n ? {\n transformId: binding.transformId,\n arrayLayerCount: binding.arrayLayerCount\n }\n : {}),\n ...(Number.isInteger(binding.structureStride) ? { structureStride: binding.structureStride } : {}),\n ...(binding.buffer ? { buffer: binding.buffer } : {}),\n ...(binding.texture ? { texture: binding.texture } : {}),\n ...(binding.sampler ? { sampler: binding.sampler } : {})\n };\n}\n\nfunction fingerprint(binding)\n{\n return JSON.stringify(binding);\n}\n\nfunction deepFreeze(value)\n{\n if (!value || typeof value !== \"object\" || Object.isFrozen(value)) return value;\n for (const entry of Object.values(value)) deepFreeze(entry);\n return Object.freeze(value);\n}\n\n/**\n * Builds one deterministic numeric binding plan for all shader stages in a\n * pass. Unshared D3D tuples remain stage-scoped unless the caller explicitly\n * confirms that compatible declarations describe one shared resource.\n *\n * @param {object[]} programs Complete CJS shader IR stage set for one effect pass.\n * @param {object} [options] Explicit pass-level identity policy.\n * @param {string[]} [options.sharedIdentities] D3D identities confirmed by\n * pass metadata/CjsLibrary to represent one resource across stages.\n * @param {object|null} [options.effectProfileProof] Opaque exact-effect proof.\n * @returns {object} Frozen pass-global binding plan.\n */\nexport function buildWgslBindingPlan(programs, options = {})\n{\n if (!Array.isArray(programs) || !programs.length)\n {\n throw new TypeError(\"BuildWgslBindingPlan expects at least one CJS shader IR program\");\n }\n if (!options || typeof options !== \"object\" || Array.isArray(options))\n {\n throw new TypeError(\"BuildWgslBindingPlan options must be an object\");\n }\n const requestedShared = options.sharedIdentities === undefined ? [] : options.sharedIdentities;\n if (!Array.isArray(requestedShared)\n || requestedShared.some((entry) => typeof entry !== \"string\" || !IDENTITY_PATTERN.test(entry))\n || new Set(requestedShared).size !== requestedShared.length)\n {\n throw new TypeError(\"BuildWgslBindingPlan sharedIdentities must contain unique D3D resource identities\");\n }\n const sharedIdentities = new Set(requestedShared);\n const resourceTransformPlan = normalizeResourceTransformPlan(\n options.resourceTransformPlan\n );\n const identities = new Map();\n const programStages = new Set();\n for (const [ index, program ] of programs.entries())\n {\n if (program?.format !== \"CJS_SHADER_IR\" || program.formatVersion !== 1)\n {\n throw new TypeError(`BuildWgslBindingPlan program ${index} is not CJS_SHADER_IR version 1`);\n }\n const stage = STAGE_VISIBILITY[program.stage];\n if (!stage)\n {\n throw new Error(`BuildWgslBindingPlan program ${index} has unsupported stage ${program.stage || \"unknown\"}`);\n }\n if (programStages.has(stage))\n {\n throw new Error(`BuildWgslBindingPlan contains multiple ${stage} programs for one pass`);\n }\n programStages.add(stage);\n const layoutPolicy = particleClearSignedAtomicLayoutPolicy(\n program,\n options.effectProfileProof ?? null\n ) ?? particleEmitSignedAtomicLayoutPolicy(program);\n for (const binding of lowerBindingLayout(\n program,\n null,\n layoutPolicy,\n resourceTransformPlan\n ))\n {\n const key = identity(binding);\n const entry = portableBinding(binding);\n if (!identities.has(key)) identities.set(key, []);\n identities.get(key).push({ binding: entry, stage });\n }\n }\n if (programStages.has(\"compute\") && programStages.size !== 1)\n {\n throw new Error(\"BuildWgslBindingPlan cannot mix compute and render programs in one pass\");\n }\n\n const bindings = [];\n for (const [ key, occurrences ] of identities)\n {\n const stages = occurrences.map((entry) => entry.stage)\n .sort((left, right) => STAGE_ORDER[left] - STAGE_ORDER[right]);\n if (sharedIdentities.has(key))\n {\n if (occurrences.length < 2)\n {\n throw new Error(`WGSL shared identity ${key} does not occur in multiple stages`);\n }\n const expected = fingerprint(occurrences[0].binding);\n if (occurrences.some((entry) => fingerprint(entry.binding) !== expected))\n {\n throw new Error(`WGSL shared identity ${key} has incompatible stage declarations`);\n }\n bindings.push({ ...occurrences[0].binding, scopeIdentity: key, stages });\n continue;\n }\n for (const occurrence of occurrences)\n {\n bindings.push({\n ...occurrence.binding,\n scopeIdentity: `${key}@${occurrence.stage}`,\n stages: [ occurrence.stage ]\n });\n }\n }\n for (const key of sharedIdentities)\n {\n if (!identities.has(key)) throw new Error(`WGSL shared identity ${key} does not occur in the pass`);\n }\n\n bindings.sort((left, right) =>\n left.registerSpace - right.registerSpace\n || (KIND_ORDER[left.resourceKind] ?? 99) - (KIND_ORDER[right.resourceKind] ?? 99)\n || left.registerIndex - right.registerIndex\n || (STAGE_ORDER[left.stages[0]] ?? 99) - (STAGE_ORDER[right.stages[0]] ?? 99)\n || left.generatedSymbol.localeCompare(right.generatedSymbol)\n || left.scopeIdentity.localeCompare(right.scopeIdentity));\n const plannedBindings = bindings\n .map((binding, bindingIndex) => ({ ...binding, group: 0, binding: bindingIndex }));\n\n // WebGPU pipeline creation requires the vertex output and fragment input\n // interpolation attributes at one location to MATCH, and interpolation is\n // declared only on the fragment side in DXBC (dcl_input_ps). Record the\n // non-default modes here so the vertex module can mirror them.\n const varyingInterpolation = {};\n for (const program of programs)\n {\n if (program.stage !== \"pixel\") continue;\n for (const declaration of program.declarations || [])\n {\n if (declaration.opcodeName !== \"dcl_input_ps\") continue;\n if (declaration.data?.interpolationModeName === \"linear_noperspective\")\n {\n varyingInterpolation[declaration.data.registerIndex] = \"linear\";\n }\n }\n }\n\n return deepFreeze({\n format: \"CJS_WGSL_BINDING_PLAN\",\n formatVersion: resourceTransformPlan ? 3 : 2,\n ...(sharedIdentities.size ? { sharedIdentities: Object.freeze([ ...sharedIdentities ].sort()) } : {}),\n ...(Object.keys(varyingInterpolation).length ? { varyingInterpolation } : {}),\n ...(resourceTransformPlan\n ? { resourceTransforms: resourceTransformPlan.resourceTransforms }\n : {}),\n bindings: plannedBindings\n });\n}\n"],"names":["KIND_ORDER","Object","freeze","sampler","STAGE_VISIBILITY","vertex","pixel","compute","STAGE_ORDER","fragment","IDENTITY_PATTERN","identity","binding","resourceKind","registerSpace","registerIndex","portableBinding","d3dIdentity","generatedSymbol","type","transformId","arrayLayerCount","Number","isInteger","structureStride","buffer","texture","fingerprint","JSON","stringify","deepFreeze","value","isFrozen","entry","values","buildWgslBindingPlan","programs","options","Array","isArray","length","TypeError","requestedShared","sharedIdentities","undefined","some","test","Set","size","resourceTransformPlan","normalizeResourceTransformPlan","identities","Map","programStages","index","program","entries","format","formatVersion","stage","Error","has","add","layoutPolicy","particleClearSignedAtomicLayoutPolicy","effectProfileProof","particleEmitSignedAtomicLayoutPolicy","lowerBindingLayout","key","set","get","push","bindings","occurrences","stages","map","sort","left","right","expected","scopeIdentity","occurrence","localeCompare","plannedBindings","bindingIndex","group","varyingInterpolation","declaration","declarations","opcodeName","data","interpolationModeName","keys","resourceTransforms"],"mappings":"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"}
1
+ {"version":3,"file":"buildWgslBindingPlan.js","sources":["../../../../../../src/formats/webgpu/core/wgsl/buildWgslBindingPlan.js"],"sourcesContent":["import { lowerBindingLayout } from \"./lowerBindingLayout.js\";\r\nimport { normalizeResourceTransformPlan } from \"./buildResourceTransformPlan.js\";\r\nimport { compareUtf8 } from \"../../../../format/compareUtf8.js\";\r\nimport {\r\n particleClearSignedAtomicLayoutPolicy\r\n} from \"./lowerParticleClearComputePrograms.js\";\r\nimport {\r\n particleEmitSignedAtomicLayoutPolicy\r\n} from \"./lowerParticleEmitComputeProgram.js\";\r\n\r\nconst KIND_ORDER = Object.freeze({\r\n \"uniform-buffer\": 0,\r\n \"sampled-resource\": 1,\r\n sampler: 2,\r\n \"storage-resource\": 3\r\n});\r\n\r\nconst STAGE_VISIBILITY = Object.freeze({ vertex: \"vertex\", pixel: \"fragment\", compute: \"compute\" });\r\nconst STAGE_ORDER = Object.freeze({ vertex: 0, fragment: 1, compute: 2 });\r\nconst IDENTITY_PATTERN = /^(uniform-buffer|sampled-resource|sampler|storage-resource):\\d+:\\d+$/u;\r\n\r\nfunction identity(binding)\r\n{\r\n return `${binding.resourceKind}:${binding.registerSpace}:${binding.registerIndex}`;\r\n}\r\n\r\nfunction portableBinding(binding)\r\n{\r\n const d3dIdentity = identity(binding);\r\n return {\r\n identity: d3dIdentity,\r\n resourceKind: binding.resourceKind,\r\n generatedSymbol: binding.generatedSymbol,\r\n registerSpace: binding.registerSpace,\r\n registerIndex: binding.registerIndex,\r\n type: binding.type,\r\n ...(typeof binding.transformId === \"string\"\r\n ? {\r\n transformId: binding.transformId,\r\n arrayLayerCount: binding.arrayLayerCount\r\n }\r\n : {}),\r\n ...(Number.isInteger(binding.structureStride) ? { structureStride: binding.structureStride } : {}),\r\n ...(binding.buffer ? { buffer: binding.buffer } : {}),\r\n ...(binding.texture ? { texture: binding.texture } : {}),\r\n ...(binding.sampler ? { sampler: binding.sampler } : {})\r\n };\r\n}\r\n\r\nfunction fingerprint(binding)\r\n{\r\n return JSON.stringify(binding);\r\n}\r\n\r\nfunction deepFreeze(value)\r\n{\r\n if (!value || typeof value !== \"object\" || Object.isFrozen(value)) return value;\r\n for (const entry of Object.values(value)) deepFreeze(entry);\r\n return Object.freeze(value);\r\n}\r\n\r\n/**\r\n * Builds one deterministic numeric binding plan for all shader stages in a\r\n * pass. Unshared D3D tuples remain stage-scoped unless the caller explicitly\r\n * confirms that compatible declarations describe one shared resource.\r\n *\r\n * @param {object[]} programs Complete CJS shader IR stage set for one effect pass.\r\n * @param {object} [options] Explicit pass-level identity policy.\r\n * @param {string[]} [options.sharedIdentities] D3D identities confirmed by\r\n * pass metadata/CjsLibrary to represent one resource across stages.\r\n * @param {object|null} [options.effectProfileProof] Opaque exact-effect proof.\r\n * @returns {object} Frozen pass-global binding plan.\r\n */\r\nexport function buildWgslBindingPlan(programs, options = {})\r\n{\r\n if (!Array.isArray(programs) || !programs.length)\r\n {\r\n throw new TypeError(\"BuildWgslBindingPlan expects at least one CJS shader IR program\");\r\n }\r\n if (!options || typeof options !== \"object\" || Array.isArray(options))\r\n {\r\n throw new TypeError(\"BuildWgslBindingPlan options must be an object\");\r\n }\r\n const requestedShared = options.sharedIdentities === undefined ? [] : options.sharedIdentities;\r\n if (!Array.isArray(requestedShared)\r\n || requestedShared.some((entry) => typeof entry !== \"string\" || !IDENTITY_PATTERN.test(entry))\r\n || new Set(requestedShared).size !== requestedShared.length)\r\n {\r\n throw new TypeError(\"BuildWgslBindingPlan sharedIdentities must contain unique D3D resource identities\");\r\n }\r\n const sharedIdentities = new Set(requestedShared);\r\n const resourceTransformPlan = normalizeResourceTransformPlan(\r\n options.resourceTransformPlan\r\n );\r\n const identities = new Map();\r\n const programStages = new Set();\r\n for (const [ index, program ] of programs.entries())\r\n {\r\n if (program?.format !== \"CJS_SHADER_IR\" || program.formatVersion !== 1)\r\n {\r\n throw new TypeError(`BuildWgslBindingPlan program ${index} is not CJS_SHADER_IR version 1`);\r\n }\r\n const stage = STAGE_VISIBILITY[program.stage];\r\n if (!stage)\r\n {\r\n throw new Error(`BuildWgslBindingPlan program ${index} has unsupported stage ${program.stage || \"unknown\"}`);\r\n }\r\n if (programStages.has(stage))\r\n {\r\n throw new Error(`BuildWgslBindingPlan contains multiple ${stage} programs for one pass`);\r\n }\r\n programStages.add(stage);\r\n const layoutPolicy = particleClearSignedAtomicLayoutPolicy(\r\n program,\r\n options.effectProfileProof ?? null\r\n ) ?? particleEmitSignedAtomicLayoutPolicy(program);\r\n for (const binding of lowerBindingLayout(\r\n program,\r\n null,\r\n layoutPolicy,\r\n resourceTransformPlan\r\n ))\r\n {\r\n const key = identity(binding);\r\n const entry = portableBinding(binding);\r\n if (!identities.has(key)) identities.set(key, []);\r\n identities.get(key).push({ binding: entry, stage });\r\n }\r\n }\r\n if (programStages.has(\"compute\") && programStages.size !== 1)\r\n {\r\n throw new Error(\"BuildWgslBindingPlan cannot mix compute and render programs in one pass\");\r\n }\r\n\r\n const bindings = [];\r\n for (const [ key, occurrences ] of identities)\r\n {\r\n const stages = occurrences.map((entry) => entry.stage)\r\n .sort((left, right) => STAGE_ORDER[left] - STAGE_ORDER[right]);\r\n if (sharedIdentities.has(key))\r\n {\r\n if (occurrences.length < 2)\r\n {\r\n throw new Error(`WGSL shared identity ${key} does not occur in multiple stages`);\r\n }\r\n const expected = fingerprint(occurrences[0].binding);\r\n if (occurrences.some((entry) => fingerprint(entry.binding) !== expected))\r\n {\r\n throw new Error(`WGSL shared identity ${key} has incompatible stage declarations`);\r\n }\r\n bindings.push({ ...occurrences[0].binding, scopeIdentity: key, stages });\r\n continue;\r\n }\r\n for (const occurrence of occurrences)\r\n {\r\n bindings.push({\r\n ...occurrence.binding,\r\n scopeIdentity: `${key}@${occurrence.stage}`,\r\n stages: [ occurrence.stage ]\r\n });\r\n }\r\n }\r\n for (const key of sharedIdentities)\r\n {\r\n if (!identities.has(key)) throw new Error(`WGSL shared identity ${key} does not occur in the pass`);\r\n }\r\n\r\n bindings.sort((left, right) =>\r\n left.registerSpace - right.registerSpace\r\n || (KIND_ORDER[left.resourceKind] ?? 99) - (KIND_ORDER[right.resourceKind] ?? 99)\r\n || left.registerIndex - right.registerIndex\r\n || (STAGE_ORDER[left.stages[0]] ?? 99) - (STAGE_ORDER[right.stages[0]] ?? 99)\r\n || compareUtf8(left.generatedSymbol, right.generatedSymbol)\r\n || compareUtf8(left.scopeIdentity, right.scopeIdentity));\r\n const plannedBindings = bindings\r\n .map((binding, bindingIndex) => ({ ...binding, group: 0, binding: bindingIndex }));\r\n\r\n // WebGPU pipeline creation requires the vertex output and fragment input\r\n // interpolation attributes at one location to MATCH, and interpolation is\r\n // declared only on the fragment side in DXBC (dcl_input_ps). Record the\r\n // non-default modes here so the vertex module can mirror them.\r\n const varyingInterpolation = {};\r\n for (const program of programs)\r\n {\r\n if (program.stage !== \"pixel\") continue;\r\n for (const declaration of program.declarations || [])\r\n {\r\n if (declaration.opcodeName !== \"dcl_input_ps\") continue;\r\n if (declaration.data?.interpolationModeName === \"linear_noperspective\")\r\n {\r\n varyingInterpolation[declaration.data.registerIndex] = \"linear\";\r\n }\r\n }\r\n }\r\n\r\n return deepFreeze({\r\n format: \"CJS_WGSL_BINDING_PLAN\",\r\n formatVersion: resourceTransformPlan ? 3 : 2,\r\n ...(sharedIdentities.size ? { sharedIdentities: Object.freeze([ ...sharedIdentities ].sort()) } : {}),\r\n ...(Object.keys(varyingInterpolation).length ? { varyingInterpolation } : {}),\r\n ...(resourceTransformPlan\r\n ? { resourceTransforms: resourceTransformPlan.resourceTransforms }\r\n : {}),\r\n bindings: plannedBindings\r\n });\r\n}\r\n"],"names":["KIND_ORDER","Object","freeze","sampler","STAGE_VISIBILITY","vertex","pixel","compute","STAGE_ORDER","fragment","IDENTITY_PATTERN","identity","binding","resourceKind","registerSpace","registerIndex","portableBinding","d3dIdentity","generatedSymbol","type","transformId","arrayLayerCount","Number","isInteger","structureStride","buffer","texture","fingerprint","JSON","stringify","deepFreeze","value","isFrozen","entry","values","buildWgslBindingPlan","programs","options","Array","isArray","length","TypeError","requestedShared","sharedIdentities","undefined","some","test","Set","size","resourceTransformPlan","normalizeResourceTransformPlan","identities","Map","programStages","index","program","entries","format","formatVersion","stage","Error","has","add","layoutPolicy","particleClearSignedAtomicLayoutPolicy","effectProfileProof","particleEmitSignedAtomicLayoutPolicy","lowerBindingLayout","key","set","get","push","bindings","occurrences","stages","map","sort","left","right","expected","scopeIdentity","occurrence","compareUtf8","plannedBindings","bindingIndex","group","varyingInterpolation","declaration","declarations","opcodeName","data","interpolationModeName","keys","resourceTransforms"],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import { normalizeResourceTransformPlan } from './buildResourceTransformPlan.js';
2
+ import { compareUtf8 } from '../../../../format/compareUtf8.js';
2
3
 
3
4
  const WGSL_SET_VERSION = 3;
4
5
  const KEY_PATTERN = /^(.*)\.pass([0-9]+)\.(vertex|pixel|compute)$/;
@@ -210,7 +211,7 @@ function buildLayouts(entries) {
210
211
  bindings: bindings.sort((left, right) => left.binding - right.binding)
211
212
  })).sort((left, right) => left.group - right.group)
212
213
  };
213
- }).sort((left, right) => left.techniqueName.localeCompare(right.techniqueName) || left.passIndex - right.passIndex);
214
+ }).sort((left, right) => compareUtf8(left.techniqueName, right.techniqueName) || left.passIndex - right.passIndex);
214
215
  }
215
216
  function validatePassTopologies(entries) {
216
217
  const stagesByPass = new Map();
@@ -277,12 +278,12 @@ function buildResourceTransforms(entries, layouts) {
277
278
  return plan.resourceTransforms;
278
279
  }
279
280
 
280
- /**
281
- * Builds the portable JSON document stored in a CEWGPU `WGSL` chunk.
282
- * Existing numeric bindings are validated and never reassigned.
283
- *
284
- * @param {Array<object>} input Wrapped emitted shader descriptors.
285
- * @returns {object} Frozen CJS_WGSL_SET document.
281
+ /**
282
+ * Builds the portable JSON document stored in a CEWGPU `WGSL` chunk.
283
+ * Existing numeric bindings are validated and never reassigned.
284
+ *
285
+ * @param {Array<object>} input Wrapped emitted shader descriptors.
286
+ * @returns {object} Frozen CJS_WGSL_SET document.
286
287
  */
287
288
  function buildWgslSet(input) {
288
289
  if (!Array.isArray(input) || !input.length) throw new TypeError("BuildWgslSet expects a non-empty shader entry array");
@@ -305,7 +306,7 @@ function buildWgslSet(input) {
305
306
  threadGroupSize: clonePlain(entry.threadGroupSize)
306
307
  } : {})
307
308
  };
308
- }).sort((left, right) => left.techniqueName.localeCompare(right.techniqueName) || left.passIndex - right.passIndex || STAGE_NAME_ORDER.indexOf(left.stageName) - STAGE_NAME_ORDER.indexOf(right.stageName));
309
+ }).sort((left, right) => compareUtf8(left.techniqueName, right.techniqueName) || left.passIndex - right.passIndex || STAGE_NAME_ORDER.indexOf(left.stageName) - STAGE_NAME_ORDER.indexOf(right.stageName));
309
310
  validatePassTopologies(entries);
310
311
  const layouts = buildLayouts(entries);
311
312
  const resourceTransforms = buildResourceTransforms(entries, layouts);