@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,5 +1,6 @@
1
1
  import { fixedSourceLanes } from './sourceLanes.js';
2
2
  import { validateIndexableTempOperand } from './indexableTemps.js';
3
+ import { compareUtf8 } from '../../../../format/compareUtf8.js';
3
4
 
4
5
  const COMPONENTS = ["x", "y", "z", "w"];
5
6
  const REGISTER_FILES = new Set(["temp", "input", "output", "indexable_temp", "input_primitive_id", "output_depth", "output_coverage", "input_control_point", "output_control_point", "input_patch_constant", "input_domain_point", "output_control_point_id", "input_fork_instance_id", "input_join_instance_id", "input_thread_id", "input_thread_group_id", "input_thread_id_in_group", "input_coverage_mask", "input_thread_id_in_group_flattened", "input_gs_instance_id", "output_depth_greater_equal", "output_depth_less_equal"]);
@@ -33,11 +34,11 @@ function registerKey(program, operand, role) {
33
34
  return `${operand.typeName}[${indices.join(",")}]`;
34
35
  }
35
36
 
36
- /**
37
- * Classifies decoded instruction operands as register sources or destinations.
38
- *
39
- * @param {object} instruction Decoded instruction.
40
- * @returns {Array<{operand: object, role: string}>} Ordered operand roles.
37
+ /**
38
+ * Classifies decoded instruction operands as register sources or destinations.
39
+ *
40
+ * @param {object} instruction Decoded instruction.
41
+ * @returns {Array<{operand: object, role: string}>} Ordered operand roles.
41
42
  */
42
43
  function operandRoles(instruction) {
43
44
  const operands = instruction.operands || [];
@@ -201,16 +202,16 @@ function analyzeBlock(program, block, values) {
201
202
  register,
202
203
  component,
203
204
  ref
204
- }))).sort((a, b) => a.register.localeCompare(b.register) || a.component.localeCompare(b.component));
205
+ }))).sort((a, b) => compareUtf8(a.register, b.register) || compareUtf8(a.component, b.component));
205
206
  }
206
207
 
207
- /**
208
- * Adds block-local register versions, masked-write reconstruction records,
209
- * and deterministic block-exit state. A later pass resolves the conservative
210
- * block inputs through CFG predecessors.
211
- *
212
- * @param {object} program Mutable shader IR under construction.
213
- * @returns {object} The same program.
208
+ /**
209
+ * Adds block-local register versions, masked-write reconstruction records,
210
+ * and deterministic block-exit state. A later pass resolves the conservative
211
+ * block inputs through CFG predecessors.
212
+ *
213
+ * @param {object} program Mutable shader IR under construction.
214
+ * @returns {object} The same program.
214
215
  */
215
216
  function analyzeRegisterValues(program) {
216
217
  const values = [];
@@ -1 +1 @@
1
- {"version":3,"file":"analyzeRegisterValues.js","sources":["../../../../../../src/formats/webgpu/core/ir/analyzeRegisterValues.js"],"sourcesContent":["import { fixedSourceLanes } from \"./sourceLanes.js\";\nimport { validateIndexableTempOperand } from \"./indexableTemps.js\";\n\nconst COMPONENTS = [ \"x\", \"y\", \"z\", \"w\" ];\n\nconst REGISTER_FILES = new Set([\n \"temp\", \"input\", \"output\", \"indexable_temp\", \"input_primitive_id\",\n \"output_depth\", \"output_coverage\", \"input_control_point\",\n \"output_control_point\", \"input_patch_constant\", \"input_domain_point\",\n \"output_control_point_id\", \"input_fork_instance_id\", \"input_join_instance_id\",\n \"input_thread_id\", \"input_thread_group_id\", \"input_thread_id_in_group\",\n \"input_coverage_mask\", \"input_thread_id_in_group_flattened\",\n \"input_gs_instance_id\", \"output_depth_greater_equal\", \"output_depth_less_equal\"\n]);\n\nconst WRITABLE_FILES = new Set([\n \"temp\", \"output\", \"indexable_temp\", \"output_depth\", \"output_coverage\",\n \"output_control_point\", \"output_depth_greater_equal\", \"output_depth_less_equal\"\n]);\n\nconst NO_DESTINATION = new Set([\n \"break\", \"breakc\", \"call\", \"callc\", \"case\", \"continue\", \"continuec\",\n \"cut\", \"default\", \"discard\", \"else\", \"emit\", \"emit_then_cut\", \"endif\",\n \"endloop\", \"endswitch\", \"if\", \"label\", \"loop\", \"nop\", \"ret\", \"retc\",\n \"switch\", \"sync\", \"store_uav_typed\", \"store_raw\", \"store_structured\",\n \"atomic_and\", \"atomic_or\", \"atomic_xor\", \"atomic_cmp_store\", \"atomic_iadd\",\n \"atomic_imax\", \"atomic_imin\", \"atomic_umax\", \"atomic_umin\"\n]);\n\nconst DUAL_DESTINATION = new Set([ \"sincos\", \"imul\", \"umul\", \"udiv\", \"swapc\" ]);\nconst FULL_SOURCE_LANES = new Set([\n \"ld\", \"ld_ms\", \"resinfo\"\n]);\n\nfunction operandComponents(operand, destination = false, activeComponents = null)\n{\n if (destination)\n {\n if (operand.mask) return COMPONENTS.filter((component) => operand.mask.includes(component));\n if (operand.componentCount === 1) return [ \"x\" ];\n return COMPONENTS.slice();\n }\n if (operand.swizzle)\n {\n return activeComponents\n ? activeComponents.map((component) => operand.swizzle[COMPONENTS.indexOf(component)])\n : Array.from(operand.swizzle);\n }\n if (operand.selected) return activeComponents ? activeComponents.map(() => operand.selected) : [ operand.selected ];\n if (operand.mask) return COMPONENTS.filter((component) => operand.mask.includes(component));\n if (operand.componentCount === 1) return [ \"x\" ];\n return activeComponents ? activeComponents.slice() : COMPONENTS.slice();\n}\n\nfunction registerKey(program, operand, role)\n{\n if (!REGISTER_FILES.has(operand.typeName)) return null;\n if (operand.typeName === \"indexable_temp\")\n {\n return validateIndexableTempOperand(program, operand, role)?.key || null;\n }\n const indices = (operand.indices || []).map((index) =>\n {\n const immediate = index.values?.join(\":\") || \"\";\n return index.relative ? `${immediate}+relative` : immediate;\n });\n return `${operand.typeName}[${indices.join(\",\")}]`;\n}\n\n/**\n * Classifies decoded instruction operands as register sources or destinations.\n *\n * @param {object} instruction Decoded instruction.\n * @returns {Array<{operand: object, role: string}>} Ordered operand roles.\n */\nexport function operandRoles(instruction)\n{\n const operands = instruction.operands || [];\n if (NO_DESTINATION.has(instruction.opcodeName))\n {\n return operands.map((operand) => ({ operand, role: \"source\" }));\n }\n if (DUAL_DESTINATION.has(instruction.opcodeName))\n {\n return operands.map((operand, index) => ({ operand, role: index < 2 ? \"destination\" : \"source\" }));\n }\n return operands.map((operand, index) => ({\n operand,\n role: index === 0 && WRITABLE_FILES.has(operand.typeName) ? \"destination\" : \"source\"\n }));\n}\n\nfunction valueRef(value, component)\n{\n return { valueId: value.id, component };\n}\n\nfunction ensureComponent(state, values, register, component, blockId)\n{\n let components = state.get(register);\n if (!components)\n {\n components = new Map();\n state.set(register, components);\n }\n if (!components.has(component))\n {\n const value = {\n kind: \"register-value\",\n id: `value${values.length}`,\n origin: \"block-input\",\n blockId,\n instructionIndex: null,\n register,\n writeMask: component,\n previous: null\n };\n values.push(value);\n components.set(component, valueRef(value, component));\n }\n return components.get(component);\n}\n\nfunction analyzeBlock(program, block, values)\n{\n const state = new Map();\n const inputIds = new Set();\n for (const instructionIndex of block.instructionIndices)\n {\n const instruction = program.instructions[instructionIndex];\n const roles = operandRoles(instruction);\n const destinationComponents = Array.from(new Set(roles\n .filter((entry) => entry.role === \"destination\" && entry.operand.typeName !== \"null\")\n .flatMap((entry) => operandComponents(entry.operand, true))));\n const activeSourceComponents = destinationComponents.length && !FULL_SOURCE_LANES.has(instruction.opcodeName)\n ? destinationComponents\n : null;\n const reads = [];\n const writes = [];\n\n for (let operandIndex = 0; operandIndex < roles.length; operandIndex += 1)\n {\n const { operand, role } = roles[operandIndex];\n if (role !== \"source\") continue;\n const register = registerKey(program, operand, \"source\");\n if (!register) continue;\n const components = operandComponents(\n operand,\n false,\n fixedSourceLanes(instruction, operandIndex, program) || activeSourceComponents);\n const refs = components.map((component) => ensureComponent(state, values, register, component, block.id));\n for (const ref of refs)\n {\n const value = values.find((entry) => entry.id === ref.valueId);\n if (value?.origin === \"block-input\") inputIds.add(value.id);\n }\n reads.push({ kind: \"register-read\", operandIndex, register, components, refs });\n }\n\n for (let operandIndex = 0; operandIndex < roles.length; operandIndex += 1)\n {\n const { operand } = roles[operandIndex];\n const indices = operand.indices || [];\n for (let dimension = 0; dimension < indices.length; dimension += 1)\n {\n const relative = indices[dimension].relative;\n if (!relative) continue;\n const register = registerKey(program, relative, \"source\");\n if (!register) throw new Error(\"Shader IR relative index uses an unsupported register file\");\n const components = operandComponents(relative, false);\n if (components.length !== 1) throw new Error(\"Shader IR relative index requires one scalar component\");\n const refs = components.map((component) => ensureComponent(state, values, register, component, block.id));\n for (const ref of refs)\n {\n const value = values.find((entry) => entry.id === ref.valueId);\n if (value?.origin === \"block-input\") inputIds.add(value.id);\n }\n reads.push({ kind: \"index-read\", operandIndex, dimension, register, components, refs });\n }\n }\n\n for (let operandIndex = 0; operandIndex < roles.length; operandIndex += 1)\n {\n const { operand, role } = roles[operandIndex];\n if (role !== \"destination\" || operand.typeName === \"null\") continue;\n const register = registerKey(program, operand, \"destination\");\n if (!register) continue;\n const mask = operandComponents(operand, true);\n const previous = {};\n for (const component of COMPONENTS)\n {\n if (!mask.includes(component))\n {\n previous[component] = ensureComponent(state, values, register, component, block.id);\n }\n }\n const value = {\n kind: \"register-value\",\n id: `value${values.length}`,\n origin: \"instruction-write\",\n blockId: block.id,\n instructionIndex,\n register,\n writeMask: mask.join(\"\"),\n previous: Object.keys(previous).length ? previous : null\n };\n values.push(value);\n let components = state.get(register);\n if (!components)\n {\n components = new Map();\n state.set(register, components);\n }\n for (const component of mask) components.set(component, valueRef(value, component));\n const result = {};\n for (const component of COMPONENTS)\n {\n result[component] = components.get(component) || ensureComponent(state, values, register, component, block.id);\n }\n writes.push({\n kind: \"register-write\",\n operandIndex,\n register,\n mask: mask.join(\"\"),\n valueId: value.id,\n previous: value.previous,\n result\n });\n }\n instruction.dataflow = { reads, writes };\n }\n block.inputValueIds = Array.from(inputIds);\n block.outputValues = Array.from(state.entries())\n .flatMap(([ register, components ]) => Array.from(components.entries())\n .map(([ component, ref ]) => ({ register, component, ref })))\n .sort((a, b) => a.register.localeCompare(b.register) || a.component.localeCompare(b.component));\n}\n\n/**\n * Adds block-local register versions, masked-write reconstruction records,\n * and deterministic block-exit state. A later pass resolves the conservative\n * block inputs through CFG predecessors.\n *\n * @param {object} program Mutable shader IR under construction.\n * @returns {object} The same program.\n */\nexport function analyzeRegisterValues(program)\n{\n const values = [];\n for (const block of program.blocks) analyzeBlock(program, block, values);\n program.values = values;\n return program;\n}\n"],"names":["COMPONENTS","REGISTER_FILES","Set","WRITABLE_FILES","NO_DESTINATION","DUAL_DESTINATION","FULL_SOURCE_LANES","operandComponents","operand","destination","activeComponents","mask","filter","component","includes","componentCount","slice","swizzle","map","indexOf","Array","from","selected","registerKey","program","role","has","typeName","validateIndexableTempOperand","key","indices","index","immediate","values","join","relative","operandRoles","instruction","operands","opcodeName","valueRef","value","valueId","id","ensureComponent","state","register","blockId","components","get","Map","set","kind","length","origin","instructionIndex","writeMask","previous","push","analyzeBlock","block","inputIds","instructionIndices","instructions","roles","destinationComponents","entry","flatMap","activeSourceComponents","reads","writes","operandIndex","fixedSourceLanes","refs","ref","find","add","dimension","Error","Object","keys","result","dataflow","inputValueIds","outputValues","entries","sort","a","b","localeCompare","analyzeRegisterValues","blocks"],"mappings":"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"}
1
+ {"version":3,"file":"analyzeRegisterValues.js","sources":["../../../../../../src/formats/webgpu/core/ir/analyzeRegisterValues.js"],"sourcesContent":["import { fixedSourceLanes } from \"./sourceLanes.js\";\r\nimport { validateIndexableTempOperand } from \"./indexableTemps.js\";\r\nimport { compareUtf8 } from \"../../../../format/compareUtf8.js\";\r\n\r\nconst COMPONENTS = [ \"x\", \"y\", \"z\", \"w\" ];\r\n\r\nconst REGISTER_FILES = new Set([\r\n \"temp\", \"input\", \"output\", \"indexable_temp\", \"input_primitive_id\",\r\n \"output_depth\", \"output_coverage\", \"input_control_point\",\r\n \"output_control_point\", \"input_patch_constant\", \"input_domain_point\",\r\n \"output_control_point_id\", \"input_fork_instance_id\", \"input_join_instance_id\",\r\n \"input_thread_id\", \"input_thread_group_id\", \"input_thread_id_in_group\",\r\n \"input_coverage_mask\", \"input_thread_id_in_group_flattened\",\r\n \"input_gs_instance_id\", \"output_depth_greater_equal\", \"output_depth_less_equal\"\r\n]);\r\n\r\nconst WRITABLE_FILES = new Set([\r\n \"temp\", \"output\", \"indexable_temp\", \"output_depth\", \"output_coverage\",\r\n \"output_control_point\", \"output_depth_greater_equal\", \"output_depth_less_equal\"\r\n]);\r\n\r\nconst NO_DESTINATION = new Set([\r\n \"break\", \"breakc\", \"call\", \"callc\", \"case\", \"continue\", \"continuec\",\r\n \"cut\", \"default\", \"discard\", \"else\", \"emit\", \"emit_then_cut\", \"endif\",\r\n \"endloop\", \"endswitch\", \"if\", \"label\", \"loop\", \"nop\", \"ret\", \"retc\",\r\n \"switch\", \"sync\", \"store_uav_typed\", \"store_raw\", \"store_structured\",\r\n \"atomic_and\", \"atomic_or\", \"atomic_xor\", \"atomic_cmp_store\", \"atomic_iadd\",\r\n \"atomic_imax\", \"atomic_imin\", \"atomic_umax\", \"atomic_umin\"\r\n]);\r\n\r\nconst DUAL_DESTINATION = new Set([ \"sincos\", \"imul\", \"umul\", \"udiv\", \"swapc\" ]);\r\nconst FULL_SOURCE_LANES = new Set([\r\n \"ld\", \"ld_ms\", \"resinfo\"\r\n]);\r\n\r\nfunction operandComponents(operand, destination = false, activeComponents = null)\r\n{\r\n if (destination)\r\n {\r\n if (operand.mask) return COMPONENTS.filter((component) => operand.mask.includes(component));\r\n if (operand.componentCount === 1) return [ \"x\" ];\r\n return COMPONENTS.slice();\r\n }\r\n if (operand.swizzle)\r\n {\r\n return activeComponents\r\n ? activeComponents.map((component) => operand.swizzle[COMPONENTS.indexOf(component)])\r\n : Array.from(operand.swizzle);\r\n }\r\n if (operand.selected) return activeComponents ? activeComponents.map(() => operand.selected) : [ operand.selected ];\r\n if (operand.mask) return COMPONENTS.filter((component) => operand.mask.includes(component));\r\n if (operand.componentCount === 1) return [ \"x\" ];\r\n return activeComponents ? activeComponents.slice() : COMPONENTS.slice();\r\n}\r\n\r\nfunction registerKey(program, operand, role)\r\n{\r\n if (!REGISTER_FILES.has(operand.typeName)) return null;\r\n if (operand.typeName === \"indexable_temp\")\r\n {\r\n return validateIndexableTempOperand(program, operand, role)?.key || null;\r\n }\r\n const indices = (operand.indices || []).map((index) =>\r\n {\r\n const immediate = index.values?.join(\":\") || \"\";\r\n return index.relative ? `${immediate}+relative` : immediate;\r\n });\r\n return `${operand.typeName}[${indices.join(\",\")}]`;\r\n}\r\n\r\n/**\r\n * Classifies decoded instruction operands as register sources or destinations.\r\n *\r\n * @param {object} instruction Decoded instruction.\r\n * @returns {Array<{operand: object, role: string}>} Ordered operand roles.\r\n */\r\nexport function operandRoles(instruction)\r\n{\r\n const operands = instruction.operands || [];\r\n if (NO_DESTINATION.has(instruction.opcodeName))\r\n {\r\n return operands.map((operand) => ({ operand, role: \"source\" }));\r\n }\r\n if (DUAL_DESTINATION.has(instruction.opcodeName))\r\n {\r\n return operands.map((operand, index) => ({ operand, role: index < 2 ? \"destination\" : \"source\" }));\r\n }\r\n return operands.map((operand, index) => ({\r\n operand,\r\n role: index === 0 && WRITABLE_FILES.has(operand.typeName) ? \"destination\" : \"source\"\r\n }));\r\n}\r\n\r\nfunction valueRef(value, component)\r\n{\r\n return { valueId: value.id, component };\r\n}\r\n\r\nfunction ensureComponent(state, values, register, component, blockId)\r\n{\r\n let components = state.get(register);\r\n if (!components)\r\n {\r\n components = new Map();\r\n state.set(register, components);\r\n }\r\n if (!components.has(component))\r\n {\r\n const value = {\r\n kind: \"register-value\",\r\n id: `value${values.length}`,\r\n origin: \"block-input\",\r\n blockId,\r\n instructionIndex: null,\r\n register,\r\n writeMask: component,\r\n previous: null\r\n };\r\n values.push(value);\r\n components.set(component, valueRef(value, component));\r\n }\r\n return components.get(component);\r\n}\r\n\r\nfunction analyzeBlock(program, block, values)\r\n{\r\n const state = new Map();\r\n const inputIds = new Set();\r\n for (const instructionIndex of block.instructionIndices)\r\n {\r\n const instruction = program.instructions[instructionIndex];\r\n const roles = operandRoles(instruction);\r\n const destinationComponents = Array.from(new Set(roles\r\n .filter((entry) => entry.role === \"destination\" && entry.operand.typeName !== \"null\")\r\n .flatMap((entry) => operandComponents(entry.operand, true))));\r\n const activeSourceComponents = destinationComponents.length && !FULL_SOURCE_LANES.has(instruction.opcodeName)\r\n ? destinationComponents\r\n : null;\r\n const reads = [];\r\n const writes = [];\r\n\r\n for (let operandIndex = 0; operandIndex < roles.length; operandIndex += 1)\r\n {\r\n const { operand, role } = roles[operandIndex];\r\n if (role !== \"source\") continue;\r\n const register = registerKey(program, operand, \"source\");\r\n if (!register) continue;\r\n const components = operandComponents(\r\n operand,\r\n false,\r\n fixedSourceLanes(instruction, operandIndex, program) || activeSourceComponents);\r\n const refs = components.map((component) => ensureComponent(state, values, register, component, block.id));\r\n for (const ref of refs)\r\n {\r\n const value = values.find((entry) => entry.id === ref.valueId);\r\n if (value?.origin === \"block-input\") inputIds.add(value.id);\r\n }\r\n reads.push({ kind: \"register-read\", operandIndex, register, components, refs });\r\n }\r\n\r\n for (let operandIndex = 0; operandIndex < roles.length; operandIndex += 1)\r\n {\r\n const { operand } = roles[operandIndex];\r\n const indices = operand.indices || [];\r\n for (let dimension = 0; dimension < indices.length; dimension += 1)\r\n {\r\n const relative = indices[dimension].relative;\r\n if (!relative) continue;\r\n const register = registerKey(program, relative, \"source\");\r\n if (!register) throw new Error(\"Shader IR relative index uses an unsupported register file\");\r\n const components = operandComponents(relative, false);\r\n if (components.length !== 1) throw new Error(\"Shader IR relative index requires one scalar component\");\r\n const refs = components.map((component) => ensureComponent(state, values, register, component, block.id));\r\n for (const ref of refs)\r\n {\r\n const value = values.find((entry) => entry.id === ref.valueId);\r\n if (value?.origin === \"block-input\") inputIds.add(value.id);\r\n }\r\n reads.push({ kind: \"index-read\", operandIndex, dimension, register, components, refs });\r\n }\r\n }\r\n\r\n for (let operandIndex = 0; operandIndex < roles.length; operandIndex += 1)\r\n {\r\n const { operand, role } = roles[operandIndex];\r\n if (role !== \"destination\" || operand.typeName === \"null\") continue;\r\n const register = registerKey(program, operand, \"destination\");\r\n if (!register) continue;\r\n const mask = operandComponents(operand, true);\r\n const previous = {};\r\n for (const component of COMPONENTS)\r\n {\r\n if (!mask.includes(component))\r\n {\r\n previous[component] = ensureComponent(state, values, register, component, block.id);\r\n }\r\n }\r\n const value = {\r\n kind: \"register-value\",\r\n id: `value${values.length}`,\r\n origin: \"instruction-write\",\r\n blockId: block.id,\r\n instructionIndex,\r\n register,\r\n writeMask: mask.join(\"\"),\r\n previous: Object.keys(previous).length ? previous : null\r\n };\r\n values.push(value);\r\n let components = state.get(register);\r\n if (!components)\r\n {\r\n components = new Map();\r\n state.set(register, components);\r\n }\r\n for (const component of mask) components.set(component, valueRef(value, component));\r\n const result = {};\r\n for (const component of COMPONENTS)\r\n {\r\n result[component] = components.get(component) || ensureComponent(state, values, register, component, block.id);\r\n }\r\n writes.push({\r\n kind: \"register-write\",\r\n operandIndex,\r\n register,\r\n mask: mask.join(\"\"),\r\n valueId: value.id,\r\n previous: value.previous,\r\n result\r\n });\r\n }\r\n instruction.dataflow = { reads, writes };\r\n }\r\n block.inputValueIds = Array.from(inputIds);\r\n block.outputValues = Array.from(state.entries())\r\n .flatMap(([ register, components ]) => Array.from(components.entries())\r\n .map(([ component, ref ]) => ({ register, component, ref })))\r\n .sort((a, b) => compareUtf8(a.register, b.register) || compareUtf8(a.component, b.component));\r\n}\r\n\r\n/**\r\n * Adds block-local register versions, masked-write reconstruction records,\r\n * and deterministic block-exit state. A later pass resolves the conservative\r\n * block inputs through CFG predecessors.\r\n *\r\n * @param {object} program Mutable shader IR under construction.\r\n * @returns {object} The same program.\r\n */\r\nexport function analyzeRegisterValues(program)\r\n{\r\n const values = [];\r\n for (const block of program.blocks) analyzeBlock(program, block, values);\r\n program.values = values;\r\n return program;\r\n}\r\n"],"names":["COMPONENTS","REGISTER_FILES","Set","WRITABLE_FILES","NO_DESTINATION","DUAL_DESTINATION","FULL_SOURCE_LANES","operandComponents","operand","destination","activeComponents","mask","filter","component","includes","componentCount","slice","swizzle","map","indexOf","Array","from","selected","registerKey","program","role","has","typeName","validateIndexableTempOperand","key","indices","index","immediate","values","join","relative","operandRoles","instruction","operands","opcodeName","valueRef","value","valueId","id","ensureComponent","state","register","blockId","components","get","Map","set","kind","length","origin","instructionIndex","writeMask","previous","push","analyzeBlock","block","inputIds","instructionIndices","instructions","roles","destinationComponents","entry","flatMap","activeSourceComponents","reads","writes","operandIndex","fixedSourceLanes","refs","ref","find","add","dimension","Error","Object","keys","result","dataflow","inputValueIds","outputValues","entries","sort","a","b","compareUtf8","analyzeRegisterValues","blocks"],"mappings":"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"}
@@ -1,3 +1,5 @@
1
+ import { compareUtf8 } from '../../../../format/compareUtf8.js';
2
+
1
3
  const COMPONENTS = ["x", "y", "z", "w"];
2
4
  const COMPONENT_INDEX = new Map(COMPONENTS.map((component, index) => [component, index]));
3
5
  const SCALAR_TYPES = Object.freeze(["unknown", "float32", "int32", "uint32", "bool", "bitpattern32"]);
@@ -214,13 +216,13 @@ function correspondingRef(refs, index) {
214
216
  return refs.length === 1 ? refs[0] : refs[index % refs.length];
215
217
  }
216
218
 
217
- /**
218
- * Infers component storage types from opcode domains, signatures, moves, and
219
- * SSA merges. Conflicting typeless-register uses become `bitpattern32` and
220
- * receive explicit per-use reinterpret records.
221
- *
222
- * @param {object} program Mutable shader IR under construction.
223
- * @returns {object} The same program.
219
+ /**
220
+ * Infers component storage types from opcode domains, signatures, moves, and
221
+ * SSA merges. Conflicting typeless-register uses become `bitpattern32` and
222
+ * receive explicit per-use reinterpret records.
223
+ *
224
+ * @param {object} program Mutable shader IR under construction.
225
+ * @returns {object} The same program.
224
226
  */
225
227
  function inferValueTypes(program) {
226
228
  const parent = new Map();
@@ -247,7 +249,7 @@ function inferValueTypes(program) {
247
249
  const left = find(ensure(leftRef));
248
250
  const right = find(ensure(rightRef));
249
251
  if (left === right) return;
250
- const [root, child] = left.localeCompare(right) <= 0 ? [left, right] : [right, left];
252
+ const [root, child] = compareUtf8(left, right) <= 0 ? [left, right] : [right, left];
251
253
  parent.set(child, root);
252
254
  for (const type of constraints.get(child)) constraints.get(root).add(type);
253
255
  };
@@ -1 +1 @@
1
- {"version":3,"file":"inferValueTypes.js","sources":["../../../../../../src/formats/webgpu/core/ir/inferValueTypes.js"],"sourcesContent":["const COMPONENTS = [ \"x\", \"y\", \"z\", \"w\" ];\nconst COMPONENT_INDEX = new Map(COMPONENTS.map((component, index) => [ component, index ]));\n\nexport const SCALAR_TYPES = Object.freeze([\n \"unknown\", \"float32\", \"int32\", \"uint32\", \"bool\", \"bitpattern32\"\n]);\n\nconst FLOAT_OPS = new Set([\n \"add\", \"deriv_rtx\", \"deriv_rty\", \"deriv_rtx_coarse\", \"deriv_rtx_fine\",\n \"deriv_rty_coarse\", \"deriv_rty_fine\", \"div\", \"dp2\", \"dp3\", \"dp4\",\n \"exp\", \"frc\", \"log\", \"mad\", \"max\", \"min\", \"mul\", \"rcp\", \"round_ne\",\n \"round_ni\", \"round_pi\", \"round_z\", \"rsq\", \"sqrt\", \"sincos\"\n]);\nconst FLOAT_COMPARE = new Set([ \"eq\", \"ge\", \"lt\", \"ne\" ]);\nconst INT_OPS = new Set([ \"iadd\", \"imad\", \"imax\", \"imin\", \"imul\", \"ineg\", \"ishl\", \"ishr\" ]);\nconst INT_COMPARE = new Set([ \"ieq\", \"ige\", \"ilt\", \"ine\" ]);\nconst UINT_OPS = new Set([\n \"countbits\", \"firstbit_hi\", \"firstbit_lo\", \"firstbit_shi\", \"uaddc\",\n \"ubfe\", \"udiv\", \"umad\", \"umax\", \"umin\", \"umul\", \"ushr\", \"usubb\"\n]);\nconst UINT_COMPARE = new Set([ \"uge\", \"ult\" ]);\nconst BITWISE_OPS = new Set([ \"and\", \"not\", \"or\", \"xor\" ]);\nconst CONTROL_MASK_OPS = new Set([ \"breakc\", \"continuec\", \"discard\", \"if\", \"retc\", \"switch\" ]);\nconst SAMPLE_OPS = new Set([\n \"sample\", \"sample_b\", \"sample_c\", \"sample_c_lz\", \"sample_d\", \"sample_l\"\n]);\n\nfunction bindingResultType(program, instruction, operandTypeName, resourceKind)\n{\n const resource = instruction.operands.find((operand) => operand.typeName === operandTypeName);\n const reference = resource?.resourceReference;\n const binding = program.bindings.find((entry) => entry.resourceKind === resourceKind\n && (reference?.rangeId !== null && reference?.rangeId !== undefined\n ? entry.range.rangeId === reference.rangeId\n : entry.registerIndex === resource?.registerIndex));\n const mapped = (binding?.returnType?.returnTypeNames || []).map((type) => ({\n unorm: \"float32\",\n snorm: \"float32\",\n float: \"float32\",\n sint: \"int32\",\n uint: \"uint32\"\n })[type] || \"unknown\");\n const concrete = mapped.filter((type) => type !== \"unknown\");\n if (!concrete.length) return null;\n return new Set(concrete).size === 1 ? concrete[0] : \"bitpattern32\";\n}\n\nfunction sampleResultType(program, instruction)\n{\n return bindingResultType(program, instruction, \"resource\", \"sampled-resource\");\n}\n\nfunction ruleFor(opcodeName, program, instruction)\n{\n if (FLOAT_OPS.has(opcodeName)) return { name: \"float-arithmetic\", destination: \"float32\", sources: \"float32\" };\n if (FLOAT_COMPARE.has(opcodeName)) return { name: \"float-comparison-mask\", destination: \"uint32\", sources: \"float32\" };\n if (INT_OPS.has(opcodeName)) return { name: \"signed-integer\", destination: \"int32\", sources: \"int32\" };\n if (INT_COMPARE.has(opcodeName)) return { name: \"signed-comparison-mask\", destination: \"uint32\", sources: \"int32\" };\n if (UINT_OPS.has(opcodeName)) return { name: \"unsigned-integer\", destination: \"uint32\", sources: \"uint32\" };\n if (UINT_COMPARE.has(opcodeName)) return { name: \"unsigned-comparison-mask\", destination: \"uint32\", sources: \"uint32\" };\n if (BITWISE_OPS.has(opcodeName)) return { name: \"bitwise\", destination: \"uint32\", sources: \"uint32\" };\n if (CONTROL_MASK_OPS.has(opcodeName)) return { name: \"control-mask\", destination: null, sourceByOperand: { 0: \"uint32\" }, conditionProjection: \"nonzero\" };\n if (SAMPLE_OPS.has(opcodeName))\n {\n const sourceByOperand = { 1: \"float32\" };\n if ([ \"sample_b\", \"sample_c\", \"sample_l\" ].includes(opcodeName)) sourceByOperand[4] = \"float32\";\n if (opcodeName === \"sample_d\") Object.assign(sourceByOperand, { 4: \"float32\", 5: \"float32\" });\n return { name: \"sample-resource\", destination: sampleResultType(program, instruction), sourceByOperand };\n }\n if (opcodeName === \"resinfo\")\n {\n return {\n name: \"resource-info\",\n destination: instruction?.resinfoReturnTypeName === \"uint\" ? \"uint32\" : \"float32\"\n };\n }\n if (opcodeName === \"f16tof32\") return { name: \"half-unpack\", destination: \"float32\", sourceByOperand: { 1: \"uint32\" } };\n if (opcodeName === \"f32tof16\") return { name: \"half-pack\", destination: \"uint32\", sourceByOperand: { 1: \"float32\" } };\n if (opcodeName === \"ld\")\n {\n return {\n name: \"texture-load\",\n destination: sampleResultType(program, instruction),\n sourceByOperand: { 1: \"uint32\" }\n };\n }\n if (opcodeName === \"atomic_iadd\")\n {\n return {\n name: \"atomic-add\",\n destination: null,\n sourceByOperand: { 1: \"uint32\", 2: \"uint32\" }\n };\n }\n if (opcodeName === \"store_uav_typed\")\n {\n return {\n name: \"typed-uav-store\",\n destination: null,\n sourceByOperand: {\n 1: \"uint32\",\n 2: bindingResultType(program, instruction, \"uav\", \"storage-resource\")\n }\n };\n }\n if (opcodeName === \"ld_structured\")\n {\n return {\n name: \"structured-load\",\n destination: null,\n sourceByOperand: { 1: \"uint32\", 2: \"uint32\" }\n };\n }\n if (opcodeName === \"store_structured\")\n {\n return {\n name: \"structured-store\",\n destination: null,\n sourceByOperand: { 1: \"uint32\", 2: \"uint32\" }\n };\n }\n const conversions = {\n ftoi: [ \"int32\", \"float32\" ],\n ftou: [ \"uint32\", \"float32\" ],\n itof: [ \"float32\", \"int32\" ],\n utof: [ \"float32\", \"uint32\" ]\n };\n if (conversions[opcodeName])\n {\n const [ destination, source ] = conversions[opcodeName];\n return { name: \"numeric-conversion\", destination, sourceByOperand: { 1: source }, conversion: { from: source, to: destination } };\n }\n if (opcodeName === \"mov\") return { name: \"move\", destination: null, equalitySources: [ 1 ] };\n if (opcodeName === \"movc\") return { name: \"conditional-move\", destination: null, sourceByOperand: { 1: \"uint32\" }, equalitySources: [ 2, 3 ] };\n return { name: \"untyped\", destination: null };\n}\n\nfunction nodeKey(ref)\n{\n return `${ref.valueId}.${ref.component}`;\n}\n\nfunction valueComponents(value)\n{\n return Array.from(value.writeMask || \"\");\n}\n\nfunction signatureType(program, register, component)\n{\n if ([ \"output_depth\", \"output_depth_greater_equal\", \"output_depth_less_equal\" ].includes(register)) return \"float32\";\n const match = /^(input|output)\\[(\\d+)/.exec(register);\n if (!match) return null;\n const elements = program.signatures?.[match[1]] || [];\n const componentBit = 1 << COMPONENT_INDEX.get(component);\n const element = elements.find((entry) => entry.registerIndex === Number(match[2]) && (entry.mask & componentBit));\n return element && SCALAR_TYPES.includes(element.componentTypeName) ? element.componentTypeName : null;\n}\n\nfunction correspondingRef(refs, index)\n{\n if (!refs.length) return null;\n return refs.length === 1 ? refs[0] : refs[index % refs.length];\n}\n\n/**\n * Infers component storage types from opcode domains, signatures, moves, and\n * SSA merges. Conflicting typeless-register uses become `bitpattern32` and\n * receive explicit per-use reinterpret records.\n *\n * @param {object} program Mutable shader IR under construction.\n * @returns {object} The same program.\n */\nexport function inferValueTypes(program)\n{\n const parent = new Map();\n const constraints = new Map();\n\n const ensure = (ref) =>\n {\n const key = nodeKey(ref);\n if (!parent.has(key))\n {\n parent.set(key, key);\n constraints.set(key, new Set());\n }\n return key;\n };\n const find = (key) =>\n {\n let current = key;\n while (parent.get(current) !== current) current = parent.get(current);\n while (parent.get(key) !== key)\n {\n const next = parent.get(key);\n parent.set(key, current);\n key = next;\n }\n return current;\n };\n const union = (leftRef, rightRef) =>\n {\n const left = find(ensure(leftRef));\n const right = find(ensure(rightRef));\n if (left === right) return;\n const [ root, child ] = left.localeCompare(right) <= 0 ? [ left, right ] : [ right, left ];\n parent.set(child, root);\n for (const type of constraints.get(child)) constraints.get(root).add(type);\n };\n const constrain = (ref, type) =>\n {\n if (!type) return;\n constraints.get(find(ensure(ref))).add(type);\n };\n\n for (const value of program.values)\n {\n for (const component of valueComponents(value)) ensure({ valueId: value.id, component });\n if (value.origin === \"control-flow-merge\")\n {\n const mergeRef = { valueId: value.id, component: value.writeMask };\n for (const incoming of value.incoming) union(mergeRef, incoming);\n }\n }\n\n for (const instruction of program.instructions)\n {\n const rule = ruleFor(instruction.opcodeName, program, instruction);\n const writes = instruction.dataflow.writes;\n for (const sourceOperandIndex of rule.equalitySources || [])\n {\n const read = instruction.dataflow.reads.find((entry) => entry.operandIndex === sourceOperandIndex && entry.kind !== \"index-read\");\n if (!read) continue;\n for (const write of writes)\n {\n Array.from(write.mask).forEach((component, index) =>\n {\n const sourceRef = correspondingRef(read.refs, index);\n if (sourceRef) union({ valueId: write.valueId, component }, sourceRef);\n });\n }\n }\n }\n\n for (const value of program.values)\n {\n for (const component of valueComponents(value))\n {\n const type = signatureType(program, value.register, component);\n if (type) constrain({ valueId: value.id, component }, type);\n }\n }\n for (const instruction of program.instructions)\n {\n const rule = ruleFor(instruction.opcodeName, program, instruction);\n if (rule.destination)\n {\n for (const write of instruction.dataflow.writes)\n {\n for (const component of write.mask) constrain({ valueId: write.valueId, component }, rule.destination);\n }\n }\n for (const read of instruction.dataflow.reads)\n {\n if (read.kind === \"index-read\") continue;\n const expected = rule.sourceByOperand?.[read.operandIndex] ?? rule.sources ?? null;\n for (const ref of read.refs) constrain(ref, expected);\n }\n }\n\n // A live value (read by an instruction or feeding a phi) whose type is\n // otherwise unconstrained — e.g. an immediate `0` that only ever flows\n // through moves and never reaches a typed use — defaults to raw bitpattern32\n // bits so it can be emitted. This covers EVERY lane of a live value, not\n // just the read lane: an emitted multi-lane value needs a type for its dead\n // lanes too (the vector constructor references all of them). Because moves\n // union source and destination, the default propagates consistently across\n // the whole move chain and any phi it feeds. Genuinely dead writes are never\n // read, keep no constraint (stay `unknown`), and are dropped by the lowerers.\n const liveValueIds = new Set();\n for (const instruction of program.instructions)\n {\n for (const read of instruction.dataflow.reads)\n {\n if (read.kind === \"index-read\") continue;\n for (const ref of read.refs) liveValueIds.add(ref.valueId);\n }\n }\n for (const value of program.values)\n {\n for (const incoming of value.incoming || []) liveValueIds.add(incoming.valueId);\n }\n for (const value of program.values)\n {\n if (!liveValueIds.has(value.id)) continue;\n for (const component of valueComponents(value))\n {\n const ref = { valueId: value.id, component };\n if (!constraints.get(find(ensure(ref))).size) constrain(ref, \"bitpattern32\");\n }\n }\n\n const typeForRef = (ref) =>\n {\n const types = Array.from(constraints.get(find(ensure(ref))));\n if (types.length === 0) return \"unknown\";\n return types.length === 1 ? types[0] : \"bitpattern32\";\n };\n\n for (const value of program.values)\n {\n value.componentTypes = {};\n for (const component of valueComponents(value))\n {\n value.componentTypes[component] = typeForRef({ valueId: value.id, component });\n }\n }\n\n for (const instruction of program.instructions)\n {\n const rule = ruleFor(instruction.opcodeName, program, instruction);\n const writes = instruction.dataflow.writes;\n const destinationTypes = writes.flatMap((write) => Array.from(write.mask)\n .map((component) => program.values.find((value) => value.id === write.valueId)?.componentTypes[component]))\n .filter(Boolean);\n const moveType = destinationTypes.length && new Set(destinationTypes).size === 1 ? destinationTypes[0] : null;\n const operandTypes = instruction.operands.map((operand, operandIndex) =>\n {\n let expectedType = rule.sourceByOperand?.[operandIndex] ?? null;\n if (!expectedType && rule.sources && operandIndex > 0) expectedType = rule.sources;\n if (!expectedType && (rule.equalitySources || []).includes(operandIndex)) expectedType = moveType;\n if (instruction.dataflow.writes.some((write) => write.operandIndex === operandIndex)) expectedType = rule.destination ?? moveType;\n return {\n operandIndex,\n role: instruction.dataflow.writes.some((write) => write.operandIndex === operandIndex) ? \"destination\" : \"source\",\n expectedType: expectedType || \"unknown\",\n modifier: operand.modifierName || \"none\",\n minPrecision: operand.minPrecisionName || \"default\",\n immediate: operand.typeName === \"immediate32\"\n ? operand.immediateValues.map((value, component) => ({ component: COMPONENTS[component], uint32: value.uint32, float32: value.float32 }))\n : null\n };\n });\n const bitcasts = [];\n for (const read of instruction.dataflow.reads)\n {\n if (read.kind === \"index-read\") continue;\n let expected = rule.sourceByOperand?.[read.operandIndex] ?? rule.sources ?? null;\n if (!expected && (rule.equalitySources || []).includes(read.operandIndex)) expected = moveType;\n if (!expected || expected === \"unknown\") continue;\n read.refs.forEach((ref, componentIndex) =>\n {\n const storage = typeForRef(ref);\n if (storage !== expected && storage !== \"unknown\")\n {\n bitcasts.push({ kind: \"read-bitcast\", operandIndex: read.operandIndex, componentIndex, valueId: ref.valueId, component: ref.component, from: storage, to: expected });\n }\n });\n }\n for (const write of writes)\n {\n if (!rule.destination) continue;\n Array.from(write.mask).forEach((component) =>\n {\n const storage = typeForRef({ valueId: write.valueId, component });\n if (storage !== rule.destination && storage !== \"unknown\")\n {\n bitcasts.push({ kind: \"result-bitcast\", operandIndex: write.operandIndex, valueId: write.valueId, component, from: rule.destination, to: storage });\n }\n });\n }\n for (const operand of operandTypes)\n {\n if (!operand.immediate || ![ \"float32\", \"int32\" ].includes(operand.expectedType)) continue;\n for (const immediate of operand.immediate)\n {\n bitcasts.push({ kind: \"immediate-bitcast\", operandIndex: operand.operandIndex, component: immediate.component, from: \"uint32\", to: operand.expectedType, uint32: immediate.uint32 });\n }\n }\n instruction.typeInfo = {\n kind: \"instruction-types\",\n rule: rule.name,\n resultType: rule.destination ?? moveType ?? \"unknown\",\n conversion: rule.conversion || null,\n conditionProjection: rule.conditionProjection || null,\n operandTypes,\n bitcasts\n };\n }\n\n program.typeSystem = {\n kind: \"scalar-type-system\",\n scalarTypes: SCALAR_TYPES.slice(),\n comparisonResult: \"uint32-mask\",\n conditionProjection: \"nonzero\",\n registerStorage: \"component-granular\"\n };\n return program;\n}\n"],"names":["COMPONENTS","COMPONENT_INDEX","Map","map","component","index","SCALAR_TYPES","Object","freeze","FLOAT_OPS","Set","FLOAT_COMPARE","INT_OPS","INT_COMPARE","UINT_OPS","UINT_COMPARE","BITWISE_OPS","CONTROL_MASK_OPS","SAMPLE_OPS","bindingResultType","program","instruction","operandTypeName","resourceKind","resource","operands","find","operand","typeName","reference","resourceReference","binding","bindings","entry","rangeId","undefined","range","registerIndex","mapped","returnType","returnTypeNames","type","unorm","snorm","float","sint","uint","concrete","filter","length","size","sampleResultType","ruleFor","opcodeName","has","name","destination","sources","sourceByOperand","conditionProjection","includes","assign","resinfoReturnTypeName","conversions","ftoi","ftou","itof","utof","source","conversion","from","to","equalitySources","nodeKey","ref","valueId","valueComponents","value","Array","writeMask","signatureType","register","match","exec","elements","signatures","componentBit","get","element","Number","mask","componentTypeName","correspondingRef","refs","inferValueTypes","parent","constraints","ensure","key","set","current","next","union","leftRef","rightRef","left","right","root","child","localeCompare","add","constrain","values","id","origin","mergeRef","incoming","instructions","rule","writes","dataflow","sourceOperandIndex","read","reads","operandIndex","kind","write","forEach","sourceRef","expected","liveValueIds","typeForRef","types","componentTypes","destinationTypes","flatMap","Boolean","moveType","operandTypes","expectedType","some","role","modifier","modifierName","minPrecision","minPrecisionName","immediate","immediateValues","uint32","float32","bitcasts","componentIndex","storage","push","typeInfo","resultType","typeSystem","scalarTypes","slice","comparisonResult","registerStorage"],"mappings":"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"}
1
+ {"version":3,"file":"inferValueTypes.js","sources":["../../../../../../src/formats/webgpu/core/ir/inferValueTypes.js"],"sourcesContent":["import { compareUtf8 } from \"../../../../format/compareUtf8.js\";\r\n\r\nconst COMPONENTS = [ \"x\", \"y\", \"z\", \"w\" ];\r\nconst COMPONENT_INDEX = new Map(COMPONENTS.map((component, index) => [ component, index ]));\r\n\r\nexport const SCALAR_TYPES = Object.freeze([\r\n \"unknown\", \"float32\", \"int32\", \"uint32\", \"bool\", \"bitpattern32\"\r\n]);\r\n\r\nconst FLOAT_OPS = new Set([\r\n \"add\", \"deriv_rtx\", \"deriv_rty\", \"deriv_rtx_coarse\", \"deriv_rtx_fine\",\r\n \"deriv_rty_coarse\", \"deriv_rty_fine\", \"div\", \"dp2\", \"dp3\", \"dp4\",\r\n \"exp\", \"frc\", \"log\", \"mad\", \"max\", \"min\", \"mul\", \"rcp\", \"round_ne\",\r\n \"round_ni\", \"round_pi\", \"round_z\", \"rsq\", \"sqrt\", \"sincos\"\r\n]);\r\nconst FLOAT_COMPARE = new Set([ \"eq\", \"ge\", \"lt\", \"ne\" ]);\r\nconst INT_OPS = new Set([ \"iadd\", \"imad\", \"imax\", \"imin\", \"imul\", \"ineg\", \"ishl\", \"ishr\" ]);\r\nconst INT_COMPARE = new Set([ \"ieq\", \"ige\", \"ilt\", \"ine\" ]);\r\nconst UINT_OPS = new Set([\r\n \"countbits\", \"firstbit_hi\", \"firstbit_lo\", \"firstbit_shi\", \"uaddc\",\r\n \"ubfe\", \"udiv\", \"umad\", \"umax\", \"umin\", \"umul\", \"ushr\", \"usubb\"\r\n]);\r\nconst UINT_COMPARE = new Set([ \"uge\", \"ult\" ]);\r\nconst BITWISE_OPS = new Set([ \"and\", \"not\", \"or\", \"xor\" ]);\r\nconst CONTROL_MASK_OPS = new Set([ \"breakc\", \"continuec\", \"discard\", \"if\", \"retc\", \"switch\" ]);\r\nconst SAMPLE_OPS = new Set([\r\n \"sample\", \"sample_b\", \"sample_c\", \"sample_c_lz\", \"sample_d\", \"sample_l\"\r\n]);\r\n\r\nfunction bindingResultType(program, instruction, operandTypeName, resourceKind)\r\n{\r\n const resource = instruction.operands.find((operand) => operand.typeName === operandTypeName);\r\n const reference = resource?.resourceReference;\r\n const binding = program.bindings.find((entry) => entry.resourceKind === resourceKind\r\n && (reference?.rangeId !== null && reference?.rangeId !== undefined\r\n ? entry.range.rangeId === reference.rangeId\r\n : entry.registerIndex === resource?.registerIndex));\r\n const mapped = (binding?.returnType?.returnTypeNames || []).map((type) => ({\r\n unorm: \"float32\",\r\n snorm: \"float32\",\r\n float: \"float32\",\r\n sint: \"int32\",\r\n uint: \"uint32\"\r\n })[type] || \"unknown\");\r\n const concrete = mapped.filter((type) => type !== \"unknown\");\r\n if (!concrete.length) return null;\r\n return new Set(concrete).size === 1 ? concrete[0] : \"bitpattern32\";\r\n}\r\n\r\nfunction sampleResultType(program, instruction)\r\n{\r\n return bindingResultType(program, instruction, \"resource\", \"sampled-resource\");\r\n}\r\n\r\nfunction ruleFor(opcodeName, program, instruction)\r\n{\r\n if (FLOAT_OPS.has(opcodeName)) return { name: \"float-arithmetic\", destination: \"float32\", sources: \"float32\" };\r\n if (FLOAT_COMPARE.has(opcodeName)) return { name: \"float-comparison-mask\", destination: \"uint32\", sources: \"float32\" };\r\n if (INT_OPS.has(opcodeName)) return { name: \"signed-integer\", destination: \"int32\", sources: \"int32\" };\r\n if (INT_COMPARE.has(opcodeName)) return { name: \"signed-comparison-mask\", destination: \"uint32\", sources: \"int32\" };\r\n if (UINT_OPS.has(opcodeName)) return { name: \"unsigned-integer\", destination: \"uint32\", sources: \"uint32\" };\r\n if (UINT_COMPARE.has(opcodeName)) return { name: \"unsigned-comparison-mask\", destination: \"uint32\", sources: \"uint32\" };\r\n if (BITWISE_OPS.has(opcodeName)) return { name: \"bitwise\", destination: \"uint32\", sources: \"uint32\" };\r\n if (CONTROL_MASK_OPS.has(opcodeName)) return { name: \"control-mask\", destination: null, sourceByOperand: { 0: \"uint32\" }, conditionProjection: \"nonzero\" };\r\n if (SAMPLE_OPS.has(opcodeName))\r\n {\r\n const sourceByOperand = { 1: \"float32\" };\r\n if ([ \"sample_b\", \"sample_c\", \"sample_l\" ].includes(opcodeName)) sourceByOperand[4] = \"float32\";\r\n if (opcodeName === \"sample_d\") Object.assign(sourceByOperand, { 4: \"float32\", 5: \"float32\" });\r\n return { name: \"sample-resource\", destination: sampleResultType(program, instruction), sourceByOperand };\r\n }\r\n if (opcodeName === \"resinfo\")\r\n {\r\n return {\r\n name: \"resource-info\",\r\n destination: instruction?.resinfoReturnTypeName === \"uint\" ? \"uint32\" : \"float32\"\r\n };\r\n }\r\n if (opcodeName === \"f16tof32\") return { name: \"half-unpack\", destination: \"float32\", sourceByOperand: { 1: \"uint32\" } };\r\n if (opcodeName === \"f32tof16\") return { name: \"half-pack\", destination: \"uint32\", sourceByOperand: { 1: \"float32\" } };\r\n if (opcodeName === \"ld\")\r\n {\r\n return {\r\n name: \"texture-load\",\r\n destination: sampleResultType(program, instruction),\r\n sourceByOperand: { 1: \"uint32\" }\r\n };\r\n }\r\n if (opcodeName === \"atomic_iadd\")\r\n {\r\n return {\r\n name: \"atomic-add\",\r\n destination: null,\r\n sourceByOperand: { 1: \"uint32\", 2: \"uint32\" }\r\n };\r\n }\r\n if (opcodeName === \"store_uav_typed\")\r\n {\r\n return {\r\n name: \"typed-uav-store\",\r\n destination: null,\r\n sourceByOperand: {\r\n 1: \"uint32\",\r\n 2: bindingResultType(program, instruction, \"uav\", \"storage-resource\")\r\n }\r\n };\r\n }\r\n if (opcodeName === \"ld_structured\")\r\n {\r\n return {\r\n name: \"structured-load\",\r\n destination: null,\r\n sourceByOperand: { 1: \"uint32\", 2: \"uint32\" }\r\n };\r\n }\r\n if (opcodeName === \"store_structured\")\r\n {\r\n return {\r\n name: \"structured-store\",\r\n destination: null,\r\n sourceByOperand: { 1: \"uint32\", 2: \"uint32\" }\r\n };\r\n }\r\n const conversions = {\r\n ftoi: [ \"int32\", \"float32\" ],\r\n ftou: [ \"uint32\", \"float32\" ],\r\n itof: [ \"float32\", \"int32\" ],\r\n utof: [ \"float32\", \"uint32\" ]\r\n };\r\n if (conversions[opcodeName])\r\n {\r\n const [ destination, source ] = conversions[opcodeName];\r\n return { name: \"numeric-conversion\", destination, sourceByOperand: { 1: source }, conversion: { from: source, to: destination } };\r\n }\r\n if (opcodeName === \"mov\") return { name: \"move\", destination: null, equalitySources: [ 1 ] };\r\n if (opcodeName === \"movc\") return { name: \"conditional-move\", destination: null, sourceByOperand: { 1: \"uint32\" }, equalitySources: [ 2, 3 ] };\r\n return { name: \"untyped\", destination: null };\r\n}\r\n\r\nfunction nodeKey(ref)\r\n{\r\n return `${ref.valueId}.${ref.component}`;\r\n}\r\n\r\nfunction valueComponents(value)\r\n{\r\n return Array.from(value.writeMask || \"\");\r\n}\r\n\r\nfunction signatureType(program, register, component)\r\n{\r\n if ([ \"output_depth\", \"output_depth_greater_equal\", \"output_depth_less_equal\" ].includes(register)) return \"float32\";\r\n const match = /^(input|output)\\[(\\d+)/.exec(register);\r\n if (!match) return null;\r\n const elements = program.signatures?.[match[1]] || [];\r\n const componentBit = 1 << COMPONENT_INDEX.get(component);\r\n const element = elements.find((entry) => entry.registerIndex === Number(match[2]) && (entry.mask & componentBit));\r\n return element && SCALAR_TYPES.includes(element.componentTypeName) ? element.componentTypeName : null;\r\n}\r\n\r\nfunction correspondingRef(refs, index)\r\n{\r\n if (!refs.length) return null;\r\n return refs.length === 1 ? refs[0] : refs[index % refs.length];\r\n}\r\n\r\n/**\r\n * Infers component storage types from opcode domains, signatures, moves, and\r\n * SSA merges. Conflicting typeless-register uses become `bitpattern32` and\r\n * receive explicit per-use reinterpret records.\r\n *\r\n * @param {object} program Mutable shader IR under construction.\r\n * @returns {object} The same program.\r\n */\r\nexport function inferValueTypes(program)\r\n{\r\n const parent = new Map();\r\n const constraints = new Map();\r\n\r\n const ensure = (ref) =>\r\n {\r\n const key = nodeKey(ref);\r\n if (!parent.has(key))\r\n {\r\n parent.set(key, key);\r\n constraints.set(key, new Set());\r\n }\r\n return key;\r\n };\r\n const find = (key) =>\r\n {\r\n let current = key;\r\n while (parent.get(current) !== current) current = parent.get(current);\r\n while (parent.get(key) !== key)\r\n {\r\n const next = parent.get(key);\r\n parent.set(key, current);\r\n key = next;\r\n }\r\n return current;\r\n };\r\n const union = (leftRef, rightRef) =>\r\n {\r\n const left = find(ensure(leftRef));\r\n const right = find(ensure(rightRef));\r\n if (left === right) return;\r\n const [ root, child ] = compareUtf8(left, right) <= 0 ? [ left, right ] : [ right, left ];\r\n parent.set(child, root);\r\n for (const type of constraints.get(child)) constraints.get(root).add(type);\r\n };\r\n const constrain = (ref, type) =>\r\n {\r\n if (!type) return;\r\n constraints.get(find(ensure(ref))).add(type);\r\n };\r\n\r\n for (const value of program.values)\r\n {\r\n for (const component of valueComponents(value)) ensure({ valueId: value.id, component });\r\n if (value.origin === \"control-flow-merge\")\r\n {\r\n const mergeRef = { valueId: value.id, component: value.writeMask };\r\n for (const incoming of value.incoming) union(mergeRef, incoming);\r\n }\r\n }\r\n\r\n for (const instruction of program.instructions)\r\n {\r\n const rule = ruleFor(instruction.opcodeName, program, instruction);\r\n const writes = instruction.dataflow.writes;\r\n for (const sourceOperandIndex of rule.equalitySources || [])\r\n {\r\n const read = instruction.dataflow.reads.find((entry) => entry.operandIndex === sourceOperandIndex && entry.kind !== \"index-read\");\r\n if (!read) continue;\r\n for (const write of writes)\r\n {\r\n Array.from(write.mask).forEach((component, index) =>\r\n {\r\n const sourceRef = correspondingRef(read.refs, index);\r\n if (sourceRef) union({ valueId: write.valueId, component }, sourceRef);\r\n });\r\n }\r\n }\r\n }\r\n\r\n for (const value of program.values)\r\n {\r\n for (const component of valueComponents(value))\r\n {\r\n const type = signatureType(program, value.register, component);\r\n if (type) constrain({ valueId: value.id, component }, type);\r\n }\r\n }\r\n for (const instruction of program.instructions)\r\n {\r\n const rule = ruleFor(instruction.opcodeName, program, instruction);\r\n if (rule.destination)\r\n {\r\n for (const write of instruction.dataflow.writes)\r\n {\r\n for (const component of write.mask) constrain({ valueId: write.valueId, component }, rule.destination);\r\n }\r\n }\r\n for (const read of instruction.dataflow.reads)\r\n {\r\n if (read.kind === \"index-read\") continue;\r\n const expected = rule.sourceByOperand?.[read.operandIndex] ?? rule.sources ?? null;\r\n for (const ref of read.refs) constrain(ref, expected);\r\n }\r\n }\r\n\r\n // A live value (read by an instruction or feeding a phi) whose type is\r\n // otherwise unconstrained — e.g. an immediate `0` that only ever flows\r\n // through moves and never reaches a typed use — defaults to raw bitpattern32\r\n // bits so it can be emitted. This covers EVERY lane of a live value, not\r\n // just the read lane: an emitted multi-lane value needs a type for its dead\r\n // lanes too (the vector constructor references all of them). Because moves\r\n // union source and destination, the default propagates consistently across\r\n // the whole move chain and any phi it feeds. Genuinely dead writes are never\r\n // read, keep no constraint (stay `unknown`), and are dropped by the lowerers.\r\n const liveValueIds = new Set();\r\n for (const instruction of program.instructions)\r\n {\r\n for (const read of instruction.dataflow.reads)\r\n {\r\n if (read.kind === \"index-read\") continue;\r\n for (const ref of read.refs) liveValueIds.add(ref.valueId);\r\n }\r\n }\r\n for (const value of program.values)\r\n {\r\n for (const incoming of value.incoming || []) liveValueIds.add(incoming.valueId);\r\n }\r\n for (const value of program.values)\r\n {\r\n if (!liveValueIds.has(value.id)) continue;\r\n for (const component of valueComponents(value))\r\n {\r\n const ref = { valueId: value.id, component };\r\n if (!constraints.get(find(ensure(ref))).size) constrain(ref, \"bitpattern32\");\r\n }\r\n }\r\n\r\n const typeForRef = (ref) =>\r\n {\r\n const types = Array.from(constraints.get(find(ensure(ref))));\r\n if (types.length === 0) return \"unknown\";\r\n return types.length === 1 ? types[0] : \"bitpattern32\";\r\n };\r\n\r\n for (const value of program.values)\r\n {\r\n value.componentTypes = {};\r\n for (const component of valueComponents(value))\r\n {\r\n value.componentTypes[component] = typeForRef({ valueId: value.id, component });\r\n }\r\n }\r\n\r\n for (const instruction of program.instructions)\r\n {\r\n const rule = ruleFor(instruction.opcodeName, program, instruction);\r\n const writes = instruction.dataflow.writes;\r\n const destinationTypes = writes.flatMap((write) => Array.from(write.mask)\r\n .map((component) => program.values.find((value) => value.id === write.valueId)?.componentTypes[component]))\r\n .filter(Boolean);\r\n const moveType = destinationTypes.length && new Set(destinationTypes).size === 1 ? destinationTypes[0] : null;\r\n const operandTypes = instruction.operands.map((operand, operandIndex) =>\r\n {\r\n let expectedType = rule.sourceByOperand?.[operandIndex] ?? null;\r\n if (!expectedType && rule.sources && operandIndex > 0) expectedType = rule.sources;\r\n if (!expectedType && (rule.equalitySources || []).includes(operandIndex)) expectedType = moveType;\r\n if (instruction.dataflow.writes.some((write) => write.operandIndex === operandIndex)) expectedType = rule.destination ?? moveType;\r\n return {\r\n operandIndex,\r\n role: instruction.dataflow.writes.some((write) => write.operandIndex === operandIndex) ? \"destination\" : \"source\",\r\n expectedType: expectedType || \"unknown\",\r\n modifier: operand.modifierName || \"none\",\r\n minPrecision: operand.minPrecisionName || \"default\",\r\n immediate: operand.typeName === \"immediate32\"\r\n ? operand.immediateValues.map((value, component) => ({ component: COMPONENTS[component], uint32: value.uint32, float32: value.float32 }))\r\n : null\r\n };\r\n });\r\n const bitcasts = [];\r\n for (const read of instruction.dataflow.reads)\r\n {\r\n if (read.kind === \"index-read\") continue;\r\n let expected = rule.sourceByOperand?.[read.operandIndex] ?? rule.sources ?? null;\r\n if (!expected && (rule.equalitySources || []).includes(read.operandIndex)) expected = moveType;\r\n if (!expected || expected === \"unknown\") continue;\r\n read.refs.forEach((ref, componentIndex) =>\r\n {\r\n const storage = typeForRef(ref);\r\n if (storage !== expected && storage !== \"unknown\")\r\n {\r\n bitcasts.push({ kind: \"read-bitcast\", operandIndex: read.operandIndex, componentIndex, valueId: ref.valueId, component: ref.component, from: storage, to: expected });\r\n }\r\n });\r\n }\r\n for (const write of writes)\r\n {\r\n if (!rule.destination) continue;\r\n Array.from(write.mask).forEach((component) =>\r\n {\r\n const storage = typeForRef({ valueId: write.valueId, component });\r\n if (storage !== rule.destination && storage !== \"unknown\")\r\n {\r\n bitcasts.push({ kind: \"result-bitcast\", operandIndex: write.operandIndex, valueId: write.valueId, component, from: rule.destination, to: storage });\r\n }\r\n });\r\n }\r\n for (const operand of operandTypes)\r\n {\r\n if (!operand.immediate || ![ \"float32\", \"int32\" ].includes(operand.expectedType)) continue;\r\n for (const immediate of operand.immediate)\r\n {\r\n bitcasts.push({ kind: \"immediate-bitcast\", operandIndex: operand.operandIndex, component: immediate.component, from: \"uint32\", to: operand.expectedType, uint32: immediate.uint32 });\r\n }\r\n }\r\n instruction.typeInfo = {\r\n kind: \"instruction-types\",\r\n rule: rule.name,\r\n resultType: rule.destination ?? moveType ?? \"unknown\",\r\n conversion: rule.conversion || null,\r\n conditionProjection: rule.conditionProjection || null,\r\n operandTypes,\r\n bitcasts\r\n };\r\n }\r\n\r\n program.typeSystem = {\r\n kind: \"scalar-type-system\",\r\n scalarTypes: SCALAR_TYPES.slice(),\r\n comparisonResult: \"uint32-mask\",\r\n conditionProjection: \"nonzero\",\r\n registerStorage: \"component-granular\"\r\n };\r\n return program;\r\n}\r\n"],"names":["COMPONENTS","COMPONENT_INDEX","Map","map","component","index","SCALAR_TYPES","Object","freeze","FLOAT_OPS","Set","FLOAT_COMPARE","INT_OPS","INT_COMPARE","UINT_OPS","UINT_COMPARE","BITWISE_OPS","CONTROL_MASK_OPS","SAMPLE_OPS","bindingResultType","program","instruction","operandTypeName","resourceKind","resource","operands","find","operand","typeName","reference","resourceReference","binding","bindings","entry","rangeId","undefined","range","registerIndex","mapped","returnType","returnTypeNames","type","unorm","snorm","float","sint","uint","concrete","filter","length","size","sampleResultType","ruleFor","opcodeName","has","name","destination","sources","sourceByOperand","conditionProjection","includes","assign","resinfoReturnTypeName","conversions","ftoi","ftou","itof","utof","source","conversion","from","to","equalitySources","nodeKey","ref","valueId","valueComponents","value","Array","writeMask","signatureType","register","match","exec","elements","signatures","componentBit","get","element","Number","mask","componentTypeName","correspondingRef","refs","inferValueTypes","parent","constraints","ensure","key","set","current","next","union","leftRef","rightRef","left","right","root","child","compareUtf8","add","constrain","values","id","origin","mergeRef","incoming","instructions","rule","writes","dataflow","sourceOperandIndex","read","reads","operandIndex","kind","write","forEach","sourceRef","expected","liveValueIds","typeForRef","types","componentTypes","destinationTypes","flatMap","Boolean","moveType","operandTypes","expectedType","some","role","modifier","modifierName","minPrecision","minPrecisionName","immediate","immediateValues","uint32","float32","bitcasts","componentIndex","storage","push","typeInfo","resultType","typeSystem","scalarTypes","slice","comparisonResult","registerStorage"],"mappings":"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"}
@@ -1,15 +1,15 @@
1
1
  import { readEffectAnalysis } from './effectAnalysis.js';
2
- import { EFFECT_INFO_VERSION } from './effectPackageValidation.js';
3
- import { buildEffectAnalysis, buildPackage, inspectWithValues } from './helpers.js';
2
+ import { buildEffectAnalysis, inspectWithValues } from './helpers.js';
3
+ import { buildCarbonEffectContainer } from './buildCarbonEffectContainer.js';
4
4
  import { lowerDxbcToIr } from './ir/lowerDxbcToIr.js';
5
5
  import { buildWgslBindingPlan } from './wgsl/buildWgslBindingPlan.js';
6
6
  import { buildWgsl } from './wgsl/emitWgsl.js';
7
7
  import { buildWgslSet } from './wgsl/buildWgslSet.js';
8
8
  import { buildResourceTransformPlan } from './wgsl/buildResourceTransformPlan.js';
9
9
  import { buildEffectPermutationGraph, EFFECT_PERMUTATION_GRAPH_VERSION, EFFECT_PERMUTATION_GRAPH_FORMAT, EFFECT_PERMUTATION_GRAPH_CHUNK } from '../../../format/effect/effectPermutationGraph.js';
10
- import { buildCompleteEffectReflection, EFFECT_REFLECTION_CHUNK, EFFECT_REFLECTION_BLOB_CHUNK } from '../../../format/effect/effectReflectionPackage.js';
10
+ import { buildCompleteEffectReflection } from '../../../format/effect/effectReflectionPackage.js';
11
11
  import { buildEffectBackendBodySet, EFFECT_BACKEND_BODY_SET_VERSION, EFFECT_BACKEND_BODY_SET_FORMAT, EFFECT_BACKEND_BODY_SET_CHUNK } from './effectBackendBodySet.js';
12
- import { DXBC_WGSL_TRANSLATOR_VERSION, DXBC_WGSL_TRANSLATOR_NAME, FORMAT_WEBGPU_PACKAGE_VERSION, FORMAT_WEBGPU_PACKAGE_NAME, WEBGPU_BACKEND_NAME } from './packageMetadata.js';
12
+ import { DXBC_WGSL_TRANSLATOR_VERSION, DXBC_WGSL_TRANSLATOR_NAME, FORMAT_WEBGPU_PACKAGE_VERSION, FORMAT_WEBGPU_PACKAGE_NAME, WEBGPU_BACKEND_NAME, EFFECT_INFO_VERSION } from './packageMetadata.js';
13
13
  import { sha256Utf8, sha256Bytes } from '../../../format/effect/sha256.js';
14
14
  import { isParticleClearEffectCandidate, preflightParticleClearEffectProfile, particleClearEffectProofFor } from './wgsl/lowerParticleClearComputePrograms.js';
15
15
  import { normalizeEffectPermutation, validateResolvedPermutation, selectEffectStages, buildWgslSelectionMetadata } from './packageEffectSelection.js';
@@ -17,9 +17,10 @@ import { normalizeEffectPermutation, validateResolvedPermutation, selectEffectSt
17
17
  /**
18
18
  * Build one structurally valid CEWGPU package from compiled Tr2 effect bytes.
19
19
  *
20
- * Version-15 packages preserve every unique body's source reflection while
21
- * resolving one backend body and emitting complete passes within the requested
22
- * stage selection. Filesystem concerns remain in callers.
20
+ * The version-15 build result retains every unique body's portable source
21
+ * reflection as in-memory evidence while the emitted Carbon wire stores WGSL
22
+ * or empty program slots plus representable non-program fields. Filesystem
23
+ * concerns remain in callers.
23
24
  *
24
25
  * @param {Uint8Array|ArrayBuffer|ArrayBufferView} input Compiled effect bytes.
25
26
  * @param {object} [options] Source, body-mode, permutation, and stage-selection policy.
@@ -188,9 +189,24 @@ function buildEffectPackage(input, options = {}) {
188
189
  wgslSelection
189
190
  } : {})
190
191
  };
191
- const bytes = buildPackage([["INFO", info], ["META", metadata], [EFFECT_PERMUTATION_GRAPH_CHUNK, permutationGraph], ...(effectReflection ? [[EFFECT_REFLECTION_CHUNK, effectReflection.reflection], [EFFECT_REFLECTION_BLOB_CHUNK, effectReflection.blobBytes]] : []), ["ANLS", analysis], ["WGSL", wgsl], ...(backendBodySet ? [[EFFECT_BACKEND_BODY_SET_CHUNK, backendBodySet]] : [])]);
192
+ // The switchover. Former stored chunks are now compatibility views over the
193
+ // Carbon records: the permutation graph comes from the header and offset
194
+ // table, and a translated pass comes from shaderData plus its trailing
195
+ // block. The description tree retains only representable non-program
196
+ // reflection; full portable source reflection remains in the rich
197
+ // in-memory return value below.
198
+ //
199
+ // The wire no longer stores cross-chunk digests. The rich return value keeps
200
+ // hashes as build evidence; they are not records in the emitted container.
201
+ const emittedBodySet = backendBodySet ?? selectedModeBodySet(permutationGraph, wgsl, analysis.bodyIndex);
202
+ const container = buildCarbonEffectContainer(resolved.effectRes, permutationGraph, emittedBodySet, {
203
+ compilerVersion: resolved.effectRes.m_compilerVersionBytes
204
+ });
205
+ const bytes = container.bytes;
192
206
  const inspection = inspectWithValues(bytes, {
193
- source});
207
+ source,
208
+ emit: "json"
209
+ });
194
210
  const qualification = Object.freeze({
195
211
  ok: true,
196
212
  level: "structural",
@@ -221,6 +237,75 @@ function buildEffectPackage(input, options = {}) {
221
237
  qualification
222
238
  });
223
239
  }
240
+
241
+ /**
242
+ * Wraps a selected-mode translation as the body set the container emitter takes.
243
+ *
244
+ * `mode: "all"` builds a real body set covering every unique body. `mode:
245
+ * "selected"` translates exactly one, and the container still carries every
246
+ * permutation — that asymmetry is the format working as intended rather than a
247
+ * gap. When the container emitter rebuilds an untranslated body, it retains
248
+ * representable non-program description fields and writes zero-length program
249
+ * slots.
250
+ *
251
+ * So this does not translate anything. It reshapes the one translation already
252
+ * performed into the body-set contract, and marks every other body unsupported.
253
+ *
254
+ * @param {object} permutationGraph Validated permutation graph.
255
+ * @param {object} wgsl Emitted WGSL set for the selected body.
256
+ * @param {number} bodyIndex Selected permutation index.
257
+ * @returns {object} Body set covering one translated body.
258
+ */
259
+ function selectedModeBodySet(permutationGraph, wgsl, bodyIndex) {
260
+ const selectedBodyKey = permutationGraph.variants.find(variant => variant.permutationIndex === bodyIndex)?.bodyKey ?? permutationGraph.variants[0]?.bodyKey ?? null;
261
+ const shadersByPass = new Map();
262
+ for (const shader of wgsl.shaders) {
263
+ const passKey = `${shader.techniqueName}.pass${shader.passIndex}`;
264
+ if (!shadersByPass.has(passKey)) shadersByPass.set(passKey, []);
265
+ shadersByPass.get(passKey).push(shader);
266
+ }
267
+ const passUnits = [];
268
+ const passes = [];
269
+ for (const [passKey, shaders] of shadersByPass) {
270
+ const transforms = (wgsl.resourceTransforms ?? []).filter(transform => transform.layoutKey === passKey);
271
+ const unit = {
272
+ key: `unit${passUnits.length}`,
273
+ wgslSetVersion: wgsl.formatVersion,
274
+ shaders,
275
+ layouts: wgsl.layouts.filter(layout => layout.key === passKey),
276
+ ...(transforms.length ? {
277
+ resourceTransforms: transforms
278
+ } : {})
279
+ };
280
+ passUnits.push(unit);
281
+ passes.push({
282
+ passKey,
283
+ unitKey: unit.key
284
+ });
285
+ }
286
+ const bodies = permutationGraph.bodies.map(body => body.key === selectedBodyKey ? {
287
+ bodyKey: body.key,
288
+ representativePermutationIndex: bodyIndex,
289
+ status: "translated",
290
+ error: null,
291
+ passCount: passes.length,
292
+ passes
293
+ } : {
294
+ bodyKey: body.key,
295
+ representativePermutationIndex: permutationGraph.variants.find(variant => variant.bodyKey === body.key)?.permutationIndex ?? 0,
296
+ status: "unsupported",
297
+ error: "not translated in selected mode",
298
+ passCount: 0,
299
+ passes: []
300
+ });
301
+ return {
302
+ bodyCount: bodies.length,
303
+ translatedBodyCount: 1,
304
+ passUnitCount: passUnits.length,
305
+ passUnits,
306
+ bodies
307
+ };
308
+ }
224
309
  function normalizeMode(value, allPermutations) {
225
310
  if (allPermutations !== undefined && typeof allPermutations !== "boolean") {
226
311
  throw new TypeError("Effect allPermutations compatibility option must be boolean");