@carbonenginejs/runtime-resource 0.10.0 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (254) hide show
  1. package/dist/format/effect/effectPermutationGraph.js +257 -0
  2. package/dist/format/effect/effectPermutationGraph.js.map +1 -0
  3. package/dist/format/effect/effectReflectionPackage.js +636 -0
  4. package/dist/format/effect/effectReflectionPackage.js.map +1 -0
  5. package/dist/format/effect/sha256.js +114 -0
  6. package/dist/format/effect/sha256.js.map +1 -0
  7. package/dist/formats/dxbc/CjsDxbcFormat.js +142 -0
  8. package/dist/formats/dxbc/CjsDxbcFormat.js.map +1 -0
  9. package/dist/formats/dxbc/core/DxbcReader.js +266 -0
  10. package/dist/formats/dxbc/core/DxbcReader.js.map +1 -0
  11. package/dist/formats/dxbc/core/container.js +169 -0
  12. package/dist/formats/dxbc/core/container.js.map +1 -0
  13. package/dist/formats/dxbc/core/decoder.js +789 -0
  14. package/dist/formats/dxbc/core/decoder.js.map +1 -0
  15. package/dist/formats/dxbc/core/errors.js +19 -0
  16. package/dist/formats/dxbc/core/errors.js.map +1 -0
  17. package/dist/formats/dxbc/core/helpers.js +220 -0
  18. package/dist/formats/dxbc/core/helpers.js.map +1 -0
  19. package/dist/formats/dxbc/core/opcodes.js +45 -0
  20. package/dist/formats/dxbc/core/opcodes.js.map +1 -0
  21. package/dist/formats/dxbc/core/program.js +91 -0
  22. package/dist/formats/dxbc/core/program.js.map +1 -0
  23. package/dist/formats/dxbc/core/signature.js +172 -0
  24. package/dist/formats/dxbc/core/signature.js.map +1 -0
  25. package/dist/formats/dxbc/index.js +2 -0
  26. package/dist/formats/dxbc/index.js.map +1 -0
  27. package/dist/formats/hlsl/CjsHlslFormat.js +254 -0
  28. package/dist/formats/hlsl/CjsHlslFormat.js.map +1 -0
  29. package/dist/formats/hlsl/core/HlslBinaryUtils.js +15 -0
  30. package/dist/formats/hlsl/core/HlslBinaryUtils.js.map +1 -0
  31. package/dist/formats/hlsl/core/HlslEffectReadError.js +19 -0
  32. package/dist/formats/hlsl/core/HlslEffectReadError.js.map +1 -0
  33. package/dist/formats/hlsl/core/HlslEffectStateManager.js +130 -0
  34. package/dist/formats/hlsl/core/HlslEffectStateManager.js.map +1 -0
  35. package/dist/formats/hlsl/core/HlslReader.js +266 -0
  36. package/dist/formats/hlsl/core/HlslReader.js.map +1 -0
  37. package/dist/formats/hlsl/core/HlslRenderStateSetup.js +37 -0
  38. package/dist/formats/hlsl/core/HlslRenderStateSetup.js.map +1 -0
  39. package/dist/formats/hlsl/core/HlslResourceSetDescription.js +94 -0
  40. package/dist/formats/hlsl/core/HlslResourceSetDescription.js.map +1 -0
  41. package/dist/formats/hlsl/core/HlslShaderBytecode.js +44 -0
  42. package/dist/formats/hlsl/core/HlslShaderBytecode.js.map +1 -0
  43. package/dist/formats/hlsl/core/analysis.js +51 -0
  44. package/dist/formats/hlsl/core/analysis.js.map +1 -0
  45. package/dist/formats/hlsl/core/helpers.js +270 -0
  46. package/dist/formats/hlsl/core/helpers.js.map +1 -0
  47. package/dist/formats/hlsl/core/json.js +284 -0
  48. package/dist/formats/hlsl/core/json.js.map +1 -0
  49. package/dist/formats/hlsl/core/metadata.js +327 -0
  50. package/dist/formats/hlsl/core/metadata.js.map +1 -0
  51. package/dist/formats/hlsl/core/portableReflection.js +848 -0
  52. package/dist/formats/hlsl/core/portableReflection.js.map +1 -0
  53. package/dist/formats/hlsl/core/render-states.js +280 -0
  54. package/dist/formats/hlsl/core/render-states.js.map +1 -0
  55. package/dist/formats/hlsl/core/tr2/HlslRenderContextEnum.js +43 -0
  56. package/dist/formats/hlsl/core/tr2/HlslRenderContextEnum.js.map +1 -0
  57. package/dist/formats/hlsl/core/tr2/resources/HlslEffectRes.js +294 -0
  58. package/dist/formats/hlsl/core/tr2/resources/HlslEffectRes.js.map +1 -0
  59. package/dist/formats/hlsl/core/tr2/resources/HlslShaderPermutation.js +33 -0
  60. package/dist/formats/hlsl/core/tr2/resources/HlslShaderPermutation.js.map +1 -0
  61. package/dist/formats/hlsl/core/tr2/shader/HlslEffectBindingManifest.js +416 -0
  62. package/dist/formats/hlsl/core/tr2/shader/HlslEffectBindingManifest.js.map +1 -0
  63. package/dist/formats/hlsl/core/tr2/shader/HlslEffectConstant.js +40 -0
  64. package/dist/formats/hlsl/core/tr2/shader/HlslEffectConstant.js.map +1 -0
  65. package/dist/formats/hlsl/core/tr2/shader/HlslEffectDescription.js +742 -0
  66. package/dist/formats/hlsl/core/tr2/shader/HlslEffectDescription.js.map +1 -0
  67. package/dist/formats/hlsl/core/tr2/shader/HlslEffectLibrary.js +52 -0
  68. package/dist/formats/hlsl/core/tr2/shader/HlslEffectLibrary.js.map +1 -0
  69. package/dist/formats/hlsl/core/tr2/shader/HlslEffectParameterAnnotation.js +38 -0
  70. package/dist/formats/hlsl/core/tr2/shader/HlslEffectParameterAnnotation.js.map +1 -0
  71. package/dist/formats/hlsl/core/tr2/shader/HlslEffectResource.js +50 -0
  72. package/dist/formats/hlsl/core/tr2/shader/HlslEffectResource.js.map +1 -0
  73. package/dist/formats/hlsl/core/tr2/shader/HlslEffectStageInput.js +86 -0
  74. package/dist/formats/hlsl/core/tr2/shader/HlslEffectStageInput.js.map +1 -0
  75. package/dist/formats/hlsl/core/tr2/shader/HlslEffectTechnique.js +31 -0
  76. package/dist/formats/hlsl/core/tr2/shader/HlslEffectTechnique.js.map +1 -0
  77. package/dist/formats/hlsl/core/tr2/shader/HlslPass.js +42 -0
  78. package/dist/formats/hlsl/core/tr2/shader/HlslPass.js.map +1 -0
  79. package/dist/formats/hlsl/core/tr2/shader/HlslSamplerDescription.js +55 -0
  80. package/dist/formats/hlsl/core/tr2/shader/HlslSamplerDescription.js.map +1 -0
  81. package/dist/formats/hlsl/core/tr2/shader/HlslSamplerSetup.js +29 -0
  82. package/dist/formats/hlsl/core/tr2/shader/HlslSamplerSetup.js.map +1 -0
  83. package/dist/formats/hlsl/core/tr2/shader/HlslShader.js +220 -0
  84. package/dist/formats/hlsl/core/tr2/shader/HlslShader.js.map +1 -0
  85. package/dist/formats/hlsl/core/tr2/shader/HlslShaderOption.js +30 -0
  86. package/dist/formats/hlsl/core/tr2/shader/HlslShaderOption.js.map +1 -0
  87. package/dist/formats/hlsl/index.js +2 -0
  88. package/dist/formats/hlsl/index.js.map +1 -0
  89. package/dist/formats/hlsl/portable.js +2 -0
  90. package/dist/formats/hlsl/portable.js.map +1 -0
  91. package/dist/formats/index.js +4 -0
  92. package/dist/formats/index.js.map +1 -1
  93. package/dist/formats/webgl/CjsWebglFormat.js +221 -0
  94. package/dist/formats/webgl/CjsWebglFormat.js.map +1 -0
  95. package/dist/formats/webgl/core/cewg/CewgPackage.js +339 -0
  96. package/dist/formats/webgl/core/cewg/CewgPackage.js.map +1 -0
  97. package/dist/formats/webgl/core/cewg/CewgPackageBuilder.js +104 -0
  98. package/dist/formats/webgl/core/cewg/CewgPackageBuilder.js.map +1 -0
  99. package/dist/formats/webgl/core/cewg/binary.js +101 -0
  100. package/dist/formats/webgl/core/cewg/binary.js.map +1 -0
  101. package/dist/formats/webgl/core/cewgCompleteness.js +81 -0
  102. package/dist/formats/webgl/core/cewgCompleteness.js.map +1 -0
  103. package/dist/formats/webgl/core/effectPackage.js +789 -0
  104. package/dist/formats/webgl/core/effectPackage.js.map +1 -0
  105. package/dist/formats/webgl/core/effectPackageValidation.js +331 -0
  106. package/dist/formats/webgl/core/effectPackageValidation.js.map +1 -0
  107. package/dist/formats/webgl/core/errors.js +27 -0
  108. package/dist/formats/webgl/core/errors.js.map +1 -0
  109. package/dist/formats/webgl/core/glsl/DxbcGlslEmitter.js +2678 -0
  110. package/dist/formats/webgl/core/glsl/DxbcGlslEmitter.js.map +1 -0
  111. package/dist/formats/webgl/core/glsl/DxbcGlslHelpers.js +89 -0
  112. package/dist/formats/webgl/core/glsl/DxbcGlslHelpers.js.map +1 -0
  113. package/dist/formats/webgl/core/glsl/DxbcGlslOperandFormatter.js +428 -0
  114. package/dist/formats/webgl/core/glsl/DxbcGlslOperandFormatter.js.map +1 -0
  115. package/dist/formats/webgl/core/helpers.js +306 -0
  116. package/dist/formats/webgl/core/helpers.js.map +1 -0
  117. package/dist/formats/webgl/index.js +2 -0
  118. package/dist/formats/webgl/index.js.map +1 -0
  119. package/dist/formats/webgpu/CjsWebgpuFormat.js +376 -0
  120. package/dist/formats/webgpu/CjsWebgpuFormat.js.map +1 -0
  121. package/dist/formats/webgpu/core/cewgpu/CewgpuPackage.js +415 -0
  122. package/dist/formats/webgpu/core/cewgpu/CewgpuPackage.js.map +1 -0
  123. package/dist/formats/webgpu/core/cewgpu/CewgpuPackageBuilder.js +100 -0
  124. package/dist/formats/webgpu/core/cewgpu/CewgpuPackageBuilder.js.map +1 -0
  125. package/dist/formats/webgpu/core/cewgpu/binary.js +93 -0
  126. package/dist/formats/webgpu/core/cewgpu/binary.js.map +1 -0
  127. package/dist/formats/webgpu/core/cewgpu/tags.js +17 -0
  128. package/dist/formats/webgpu/core/cewgpu/tags.js.map +1 -0
  129. package/dist/formats/webgpu/core/effectAnalysis.js +82 -0
  130. package/dist/formats/webgpu/core/effectAnalysis.js.map +1 -0
  131. package/dist/formats/webgpu/core/effectBackendBodySet.js +305 -0
  132. package/dist/formats/webgpu/core/effectBackendBodySet.js.map +1 -0
  133. package/dist/formats/webgpu/core/effectPackageValidation.js +1078 -0
  134. package/dist/formats/webgpu/core/effectPackageValidation.js.map +1 -0
  135. package/dist/formats/webgpu/core/errors.js +20 -0
  136. package/dist/formats/webgpu/core/errors.js.map +1 -0
  137. package/dist/formats/webgpu/core/helpers.js +448 -0
  138. package/dist/formats/webgpu/core/helpers.js.map +1 -0
  139. package/dist/formats/webgpu/core/ir/analyzeRegisterValues.js +223 -0
  140. package/dist/formats/webgpu/core/ir/analyzeRegisterValues.js.map +1 -0
  141. package/dist/formats/webgpu/core/ir/buildControlFlow.js +220 -0
  142. package/dist/formats/webgpu/core/ir/buildControlFlow.js.map +1 -0
  143. package/dist/formats/webgpu/core/ir/indexableTemps.js +137 -0
  144. package/dist/formats/webgpu/core/ir/indexableTemps.js.map +1 -0
  145. package/dist/formats/webgpu/core/ir/inferValueTypes.js +454 -0
  146. package/dist/formats/webgpu/core/ir/inferValueTypes.js.map +1 -0
  147. package/dist/formats/webgpu/core/ir/lowerDxbcToIr.js +494 -0
  148. package/dist/formats/webgpu/core/ir/lowerDxbcToIr.js.map +1 -0
  149. package/dist/formats/webgpu/core/ir/resolveRegisterFlow.js +177 -0
  150. package/dist/formats/webgpu/core/ir/resolveRegisterFlow.js.map +1 -0
  151. package/dist/formats/webgpu/core/ir/sourceLanes.js +61 -0
  152. package/dist/formats/webgpu/core/ir/sourceLanes.js.map +1 -0
  153. package/dist/formats/webgpu/core/packageEffect.js +300 -0
  154. package/dist/formats/webgpu/core/packageEffect.js.map +1 -0
  155. package/dist/formats/webgpu/core/packageEffectSelection.js +164 -0
  156. package/dist/formats/webgpu/core/packageEffectSelection.js.map +1 -0
  157. package/dist/formats/webgpu/core/packageMetadata.js +8 -0
  158. package/dist/formats/webgpu/core/packageMetadata.js.map +1 -0
  159. package/dist/formats/webgpu/core/schema.js +4 -0
  160. package/dist/formats/webgpu/core/schema.js.map +1 -0
  161. package/dist/formats/webgpu/core/wgsl/buildResourceTransformPlan.js +275 -0
  162. package/dist/formats/webgpu/core/wgsl/buildResourceTransformPlan.js.map +1 -0
  163. package/dist/formats/webgpu/core/wgsl/buildWgslBindingPlan.js +182 -0
  164. package/dist/formats/webgpu/core/wgsl/buildWgslBindingPlan.js.map +1 -0
  165. package/dist/formats/webgpu/core/wgsl/buildWgslSet.js +324 -0
  166. package/dist/formats/webgpu/core/wgsl/buildWgslSet.js.map +1 -0
  167. package/dist/formats/webgpu/core/wgsl/emitWgsl.js +356 -0
  168. package/dist/formats/webgpu/core/wgsl/emitWgsl.js.map +1 -0
  169. package/dist/formats/webgpu/core/wgsl/hoistEscapingValues.js +77 -0
  170. package/dist/formats/webgpu/core/wgsl/hoistEscapingValues.js.map +1 -0
  171. package/dist/formats/webgpu/core/wgsl/lowerBindingLayout.js +451 -0
  172. package/dist/formats/webgpu/core/wgsl/lowerBindingLayout.js.map +1 -0
  173. package/dist/formats/webgpu/core/wgsl/lowerComputeProgram.js +754 -0
  174. package/dist/formats/webgpu/core/wgsl/lowerComputeProgram.js.map +1 -0
  175. package/dist/formats/webgpu/core/wgsl/lowerCreateHistogramsComputeProgram.js +457 -0
  176. package/dist/formats/webgpu/core/wgsl/lowerCreateHistogramsComputeProgram.js.map +1 -0
  177. package/dist/formats/webgpu/core/wgsl/lowerFragmentProgram.js +1572 -0
  178. package/dist/formats/webgpu/core/wgsl/lowerFragmentProgram.js.map +1 -0
  179. package/dist/formats/webgpu/core/wgsl/lowerMergeHistogramsComputeProgram.js +659 -0
  180. package/dist/formats/webgpu/core/wgsl/lowerMergeHistogramsComputeProgram.js.map +1 -0
  181. package/dist/formats/webgpu/core/wgsl/lowerParticleClearComputePrograms.js +734 -0
  182. package/dist/formats/webgpu/core/wgsl/lowerParticleClearComputePrograms.js.map +1 -0
  183. package/dist/formats/webgpu/core/wgsl/lowerParticleEmitComputeProgram.js +583 -0
  184. package/dist/formats/webgpu/core/wgsl/lowerParticleEmitComputeProgram.js.map +1 -0
  185. package/dist/formats/webgpu/core/wgsl/lowerSkinVerticesComputeProgram.js +621 -0
  186. package/dist/formats/webgpu/core/wgsl/lowerSkinVerticesComputeProgram.js.map +1 -0
  187. package/dist/formats/webgpu/core/wgsl/lowerSortComputeProgram.js +824 -0
  188. package/dist/formats/webgpu/core/wgsl/lowerSortComputeProgram.js.map +1 -0
  189. package/dist/formats/webgpu/core/wgsl/lowerSortInnerComputeProgram.js +697 -0
  190. package/dist/formats/webgpu/core/wgsl/lowerSortInnerComputeProgram.js.map +1 -0
  191. package/dist/formats/webgpu/core/wgsl/lowerSortStepComputeProgram.js +559 -0
  192. package/dist/formats/webgpu/core/wgsl/lowerSortStepComputeProgram.js.map +1 -0
  193. package/dist/formats/webgpu/core/wgsl/lowerVertexProgram.js +1328 -0
  194. package/dist/formats/webgpu/core/wgsl/lowerVertexProgram.js.map +1 -0
  195. package/dist/formats/webgpu/core/wgsl/particleEmitSemanticDigest.js +110 -0
  196. package/dist/formats/webgpu/core/wgsl/particleEmitSemanticDigest.js.map +1 -0
  197. package/dist/formats/webgpu/core/wgsl/precisionControls.js +55 -0
  198. package/dist/formats/webgpu/core/wgsl/precisionControls.js.map +1 -0
  199. package/dist/formats/webgpu/core/wgsl/selectionPlans.js +758 -0
  200. package/dist/formats/webgpu/core/wgsl/selectionPlans.js.map +1 -0
  201. package/dist/formats/webgpu/core/wgsl/uniformity.js +78 -0
  202. package/dist/formats/webgpu/core/wgsl/uniformity.js.map +1 -0
  203. package/dist/formats/webgpu/core/wgsl/validateExactComputeIr.js +196 -0
  204. package/dist/formats/webgpu/core/wgsl/validateExactComputeIr.js.map +1 -0
  205. package/dist/formats/webgpu/core/wgsl/validateHandleOperand.js +37 -0
  206. package/dist/formats/webgpu/core/wgsl/validateHandleOperand.js.map +1 -0
  207. package/dist/formats/webgpu/index.js +2 -0
  208. package/dist/formats/webgpu/index.js.map +1 -0
  209. package/dist/resource/shader/Tr2EffectRes.js +159 -150
  210. package/dist/resource/shader/Tr2EffectRes.js.map +1 -1
  211. package/dist/resource/shader/Tr2MaterialArea.js +23 -28
  212. package/dist/resource/shader/Tr2MaterialArea.js.map +1 -1
  213. package/dist/resource/shader/Tr2MaterialMesh.js +21 -27
  214. package/dist/resource/shader/Tr2MaterialMesh.js.map +1 -1
  215. package/dist/resource/shader/Tr2MaterialRes.js +24 -29
  216. package/dist/resource/shader/Tr2MaterialRes.js.map +1 -1
  217. package/dist/resource/shader/Tr2Shader.js +45 -39
  218. package/dist/resource/shader/Tr2Shader.js.map +1 -1
  219. package/dist/resource/shader/Tr2ShaderPermutation.js +30 -32
  220. package/dist/resource/shader/Tr2ShaderPermutation.js.map +1 -1
  221. package/dist/resource/shader/reflection/Tr2EffectConstant.js +113 -78
  222. package/dist/resource/shader/reflection/Tr2EffectConstant.js.map +1 -1
  223. package/dist/resource/shader/reflection/Tr2EffectDefine.js +17 -23
  224. package/dist/resource/shader/reflection/Tr2EffectDefine.js.map +1 -1
  225. package/dist/resource/shader/reflection/Tr2EffectDescription.js +23 -29
  226. package/dist/resource/shader/reflection/Tr2EffectDescription.js.map +1 -1
  227. package/dist/resource/shader/reflection/Tr2EffectLibrary.js +44 -40
  228. package/dist/resource/shader/reflection/Tr2EffectLibrary.js.map +1 -1
  229. package/dist/resource/shader/reflection/Tr2EffectParameterAnnotation.js +82 -86
  230. package/dist/resource/shader/reflection/Tr2EffectParameterAnnotation.js.map +1 -1
  231. package/dist/resource/shader/reflection/Tr2EffectResource.js +55 -61
  232. package/dist/resource/shader/reflection/Tr2EffectResource.js.map +1 -1
  233. package/dist/resource/shader/reflection/Tr2EffectStageInput.js +49 -45
  234. package/dist/resource/shader/reflection/Tr2EffectStageInput.js.map +1 -1
  235. package/dist/resource/shader/reflection/Tr2EffectTechnique.js +25 -30
  236. package/dist/resource/shader/reflection/Tr2EffectTechnique.js.map +1 -1
  237. package/dist/resource/shader/reflection/Tr2Pass.js +30 -32
  238. package/dist/resource/shader/reflection/Tr2Pass.js.map +1 -1
  239. package/dist/resource/shader/sampler/Tr2SamplerSetup.js +21 -26
  240. package/dist/resource/shader/sampler/Tr2SamplerSetup.js.map +1 -1
  241. package/docs/formats/README.md +4 -0
  242. package/docs/formats/provenance.md +11 -3
  243. package/docs/reference/classes/formats.md +440 -0
  244. package/format-notices/dxbc/LICENSE +21 -0
  245. package/format-notices/dxbc/NOTICE +20 -0
  246. package/format-notices/hlsl/LICENSE +21 -0
  247. package/format-notices/hlsl/NOTICE +25 -0
  248. package/format-notices/webgl/LICENSE +21 -0
  249. package/format-notices/webgl/NOTICE +35 -0
  250. package/format-notices/webgpu/LICENSE +21 -0
  251. package/format-notices/webgpu/NOTICE +31 -0
  252. package/package.json +6 -1
  253. package/dist/resource/shader/portableValidation.js +0 -461
  254. package/dist/resource/shader/portableValidation.js.map +0 -1
@@ -0,0 +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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"}
@@ -0,0 +1,494 @@
1
+ import { CjsDxbcFormat } from '../../../dxbc/CjsDxbcFormat.js';
2
+ import { analyzeRegisterValues, operandRoles } from './analyzeRegisterValues.js';
3
+ import { buildControlFlow } from './buildControlFlow.js';
4
+ import { resolveRegisterFlow } from './resolveRegisterFlow.js';
5
+ import { inferValueTypes, SCALAR_TYPES } from './inferValueTypes.js';
6
+
7
+ const SHADER_IR_FORMAT = "CJS_SHADER_IR";
8
+ const SHADER_IR_VERSION = 1;
9
+ const PRECISE_MASK = /^x?y?z?w?$/u;
10
+ const BINDING_KINDS = Object.freeze({
11
+ dcl_constant_buffer: "uniform-buffer",
12
+ dcl_sampler: "sampler",
13
+ dcl_resource: "sampled-resource",
14
+ dcl_resource_raw: "sampled-resource",
15
+ dcl_resource_structured: "sampled-resource",
16
+ dcl_unordered_access_view_typed: "storage-resource",
17
+ dcl_unordered_access_view_raw: "storage-resource",
18
+ dcl_unordered_access_view_structured: "storage-resource"
19
+ });
20
+ const BLOCK_BEFORE = new Set(["loop", "else", "endif", "endloop", "case", "default", "endswitch"]);
21
+ const BLOCK_AFTER = new Set(["if", "loop", "switch", "break", "breakc", "continue", "continuec", "ret", "retc", "discard", "else", "endif", "endloop", "case", "default", "endswitch"]);
22
+ function clonePlain(value) {
23
+ if (value === null || value === undefined) return value ?? null;
24
+ if (ArrayBuffer.isView(value)) return Array.from(value);
25
+ if (Array.isArray(value)) return value.map(clonePlain);
26
+ if (typeof value === "object") {
27
+ const out = {};
28
+ for (const [key, entry] of Object.entries(value)) out[key] = clonePlain(entry);
29
+ return out;
30
+ }
31
+ return value;
32
+ }
33
+ function readDecoded(input, options) {
34
+ if (input instanceof Uint8Array || input instanceof ArrayBuffer || ArrayBuffer.isView(input)) {
35
+ const raw = CjsDxbcFormat.read(input, {
36
+ emit: CjsDxbcFormat.OUTPUT_RAW,
37
+ source: options.source || "memory",
38
+ decodeInstructions: true
39
+ });
40
+ return {
41
+ program: raw.program,
42
+ instructions: raw.decoder?.instructions || [],
43
+ signatures: {
44
+ input: raw.inputSignature?.elements || [],
45
+ output: raw.outputSignature?.elements || [],
46
+ patch: raw.patchSignature?.elements || []
47
+ }
48
+ };
49
+ }
50
+ if (input?.program && input?.decoder) {
51
+ return {
52
+ program: input.program,
53
+ instructions: input.decoder.instructions || [],
54
+ signatures: {
55
+ input: input.inputSignature?.elements || input.signatures?.input || [],
56
+ output: input.outputSignature?.elements || input.signatures?.output || [],
57
+ patch: input.patchSignature?.elements || input.signatures?.patch || []
58
+ }
59
+ };
60
+ }
61
+ if (input?.program && Array.isArray(input.instructions)) {
62
+ return {
63
+ program: input.program,
64
+ instructions: input.instructions,
65
+ signatures: input.signatures || {}
66
+ };
67
+ }
68
+ throw new TypeError("CjsWebgpuFormat.BuildShaderIr: expected DXBC bytes or decoded program/instructions");
69
+ }
70
+ function normalizedRange(declaration) {
71
+ if (declaration.bindingRange) return clonePlain(declaration.bindingRange);
72
+ const registerIndex = declaration.registerIndex ?? null;
73
+ return {
74
+ bindingModel: "sm5.0-register",
75
+ rangeId: null,
76
+ lowerBound: registerIndex,
77
+ upperBound: registerIndex,
78
+ unbounded: false,
79
+ registerCount: registerIndex === null ? 0 : 1,
80
+ registerSpace: 0
81
+ };
82
+ }
83
+ function buildBinding(instruction) {
84
+ const resourceKind = BINDING_KINDS[instruction.opcodeName];
85
+ if (!resourceKind) return null;
86
+ const declaration = instruction.declaration || {};
87
+ const range = normalizedRange(declaration);
88
+ return {
89
+ kind: "binding",
90
+ id: `${resourceKind}:space${range.registerSpace}:range${range.rangeId ?? range.lowerBound}`,
91
+ resourceKind,
92
+ operandType: instruction.operands?.[0]?.typeName || null,
93
+ declarationOffset: instruction.offset,
94
+ registerIndex: declaration.registerIndex ?? range.lowerBound,
95
+ range,
96
+ accessPattern: declaration.accessPattern || null,
97
+ resourceDimension: declaration.resourceDimensionName || null,
98
+ structureStride: declaration.structureStride ?? null,
99
+ returnType: clonePlain(declaration.returnType || null)
100
+ };
101
+ }
102
+ function controlKind(opcodeName) {
103
+ if (["if", "else", "endif"].includes(opcodeName)) return "selection";
104
+ if (["loop", "endloop", "break", "breakc", "continue", "continuec"].includes(opcodeName)) return "loop";
105
+ if (["switch", "case", "default", "endswitch"].includes(opcodeName)) return "switch";
106
+ if (["ret", "retc", "discard", "abort"].includes(opcodeName)) return "termination";
107
+ return null;
108
+ }
109
+ const COMPONENT_ORDER = ["x", "y", "z", "w"];
110
+ const FLOAT_VIEW = new DataView(new ArrayBuffer(4));
111
+ function immediateRecord(value) {
112
+ const bits = (value?.uint32 ?? 0) >>> 0;
113
+ FLOAT_VIEW.setUint32(0, bits);
114
+ return {
115
+ uint32: bits,
116
+ float32: FLOAT_VIEW.getFloat32(0)
117
+ };
118
+ }
119
+
120
+ /**
121
+ * Recognizes indexable temps that are immutable constant tables: every write
122
+ * is a straight-line pre-control-flow `mov x#[slot].mask, l(...)` immediate,
123
+ * and at least one access uses relative addressing. Such registers lower to a
124
+ * module-scope WGSL `const` array (the same shape as the DXBC icb), so their
125
+ * dynamic reads never need mutable-register SSA. Any relative indexable-temp
126
+ * usage that does not fit this shape fails closed here with a diagnostic.
127
+ *
128
+ * @param {object[]} declarationInstructions Decoded declaration instructions.
129
+ * @param {object[]} executable Decoded executable instructions.
130
+ * @returns {{tables: object[]|null, removed: Set<number>|null}} Tables and initializer indices.
131
+ */
132
+ function extractConstTables(declarationInstructions, executable) {
133
+ const declared = new Map();
134
+ const duplicateDeclarations = new Set();
135
+ for (const declaration of declarationInstructions) {
136
+ if (declaration.opcodeName !== "dcl_indexable_temp") continue;
137
+ const data = declaration.declaration || {};
138
+ if (declared.has(data.registerIndex)) duplicateDeclarations.add(data.registerIndex);
139
+ declared.set(data.registerIndex, {
140
+ slotCount: data.registerCount,
141
+ componentCount: data.componentCount
142
+ });
143
+ }
144
+ const touched = new Map();
145
+ const entryFor = registerIndex => {
146
+ let entry = touched.get(registerIndex);
147
+ if (!entry) {
148
+ entry = {
149
+ writes: [],
150
+ hasRelative: false,
151
+ invalid: null
152
+ };
153
+ touched.set(registerIndex, entry);
154
+ }
155
+ return entry;
156
+ };
157
+ const invalidate = (entry, reason) => {
158
+ if (!entry.invalid) entry.invalid = reason;
159
+ };
160
+ let firstControl = executable.findIndex(instruction => controlKind(instruction.opcodeName) !== null);
161
+ if (firstControl < 0) firstControl = executable.length;
162
+ executable.forEach((instruction, instructionIndex) => {
163
+ operandRoles(instruction).forEach(({
164
+ operand,
165
+ role
166
+ }, operandIndex) => {
167
+ if (operand.typeName !== "indexable_temp") return;
168
+ const indices = operand.indices || [];
169
+ const registerIndex = indices[0]?.values?.[0];
170
+ const entry = entryFor(registerIndex);
171
+ if (indices.length !== 2 || indices[0]?.relative || indices[0]?.values?.length !== 1 || !Number.isInteger(registerIndex) || registerIndex < 0 || operand.registerIndex !== registerIndex) {
172
+ return invalidate(entry, "requires one consistent fixed register identity and [register][slot] addressing");
173
+ }
174
+ if (indices[1]?.relative) entry.hasRelative = true;
175
+ if (role === "source") {
176
+ const lanes = operand.selected ? [operand.selected] : operand.swizzle ? Array.from(new Set(operand.swizzle)) : COMPONENT_ORDER.slice();
177
+ entry.reads = entry.reads || [];
178
+ entry.reads.push({
179
+ instructionIndex,
180
+ lanes
181
+ });
182
+ return;
183
+ }
184
+
185
+ // Destination use: only straight-line immediate table initializers
186
+ // are representable; anything else is a mutable indexable temp.
187
+ const source = instruction.operands?.[1];
188
+ const slot = indices[1]?.values?.[0];
189
+ if (instruction.opcodeName !== "mov" || instruction.saturate) {
190
+ return invalidate(entry, "is only writable by non-saturating mov initializers");
191
+ }
192
+ if (instructionIndex >= firstControl) {
193
+ return invalidate(entry, "initializers must precede all control flow");
194
+ }
195
+ if (indices[1]?.relative || indices[1]?.values?.length !== 1 || !Number.isInteger(slot) || slot < 0) {
196
+ return invalidate(entry, "initializers require an immediate slot index");
197
+ }
198
+ if (source?.typeName !== "immediate32" || (source.modifierName || "none") !== "none" || ![1, 4].includes(source.immediateValues?.length ?? 0)) {
199
+ return invalidate(entry, "initializers require immediate32 sources");
200
+ }
201
+ if ((operand.modifierName || "none") !== "none" || (operand.minPrecisionName || "default") !== "default" || (source.minPrecisionName || "default") !== "default" || instruction.extensions?.length) {
202
+ return invalidate(entry, "initializers require canonical default-precision mov operands");
203
+ }
204
+ if (!operand.mask || operand.swizzle || operand.selected || source.mask || source.swizzle && source.selected || source.selected && !COMPONENT_ORDER.includes(source.selected) || source.swizzle && (source.swizzle.length !== 4 || Array.from(source.swizzle).some(lane => !COMPONENT_ORDER.includes(lane)))) {
205
+ return invalidate(entry, "initializers require canonical destination and source component selection");
206
+ }
207
+ const valuesByLane = {};
208
+ for (const lane of operand.mask) {
209
+ const destinationLane = COMPONENT_ORDER.indexOf(lane);
210
+ const sourceLane = source.selected || source.swizzle?.[destinationLane] || lane;
211
+ const sourceLaneIndex = COMPONENT_ORDER.indexOf(sourceLane);
212
+ const value = source.immediateValues.length === 1 ? source.immediateValues[0] : source.immediateValues[sourceLaneIndex];
213
+ if (!value) {
214
+ return invalidate(entry, "an initializer selects an unavailable immediate lane");
215
+ }
216
+ valuesByLane[lane] = value;
217
+ }
218
+ entry.writes.push({
219
+ instructionIndex,
220
+ slot,
221
+ mask: operand.mask,
222
+ valuesByLane
223
+ });
224
+ });
225
+ });
226
+ const tables = [];
227
+ const removed = new Set();
228
+ for (const [registerIndex, entry] of touched) {
229
+ if (!entry.hasRelative) continue;
230
+ const declaration = declared.get(registerIndex);
231
+ const describe = reason => new Error(`Shader IR indexable temp x${registerIndex} relative addressing is not supported: ${reason}`);
232
+ if (entry.invalid) throw describe(entry.invalid);
233
+ if (duplicateDeclarations.has(registerIndex)) throw describe("it has duplicate declarations");
234
+ if (!declaration || !Number.isInteger(declaration.slotCount) || declaration.slotCount < 1) {
235
+ throw describe("it has no usable declaration");
236
+ }
237
+ if (!Number.isInteger(declaration.componentCount) || declaration.componentCount < 1 || declaration.componentCount > 4) {
238
+ throw describe("it has an invalid component count");
239
+ }
240
+ const lastWrite = Math.max(...entry.writes.map(write => write.instructionIndex));
241
+ const firstRead = Math.min(...(entry.reads || []).map(read => read.instructionIndex));
242
+ if (lastWrite >= firstRead) {
243
+ throw describe("all initializers must precede every read");
244
+ }
245
+ const laneMask = entry.writes[0]?.mask;
246
+ if (Array.from(laneMask || "").some(lane => COMPONENT_ORDER.indexOf(lane) >= declaration.componentCount)) {
247
+ throw describe("an initializer writes outside the declared component range");
248
+ }
249
+ const rows = Array.from({
250
+ length: declaration.slotCount
251
+ }, () => COMPONENT_ORDER.map(() => null));
252
+ for (const write of entry.writes) {
253
+ if (write.mask !== laneMask) throw describe("initializers must share one write mask");
254
+ if (write.slot < 0 || write.slot >= declaration.slotCount) {
255
+ throw describe("an initializer writes outside the declared range");
256
+ }
257
+ for (const lane of write.mask) {
258
+ const laneIndex = COMPONENT_ORDER.indexOf(lane);
259
+ if (rows[write.slot][laneIndex] !== null) throw describe("a slot lane is written twice");
260
+ rows[write.slot][laneIndex] = immediateRecord(write.valuesByLane[lane]);
261
+ }
262
+ removed.add(write.instructionIndex);
263
+ }
264
+ for (const [slot, row] of rows.entries()) {
265
+ for (const lane of laneMask || "") {
266
+ if (row[COMPONENT_ORDER.indexOf(lane)] === null) {
267
+ throw describe(`slot ${slot} is never fully written`);
268
+ }
269
+ }
270
+ }
271
+ for (const read of entry.reads || []) {
272
+ if (read.lanes.some(lane => !(laneMask || "").includes(lane))) {
273
+ throw describe("a read selects lanes the table never writes");
274
+ }
275
+ }
276
+ tables.push(Object.freeze({
277
+ kind: "const-table",
278
+ registerIndex,
279
+ symbol: `xt${registerIndex}`,
280
+ slotCount: declaration.slotCount,
281
+ laneMask: laneMask || "",
282
+ rows: rows.map(row => row.map(value => value ?? {
283
+ uint32: 0,
284
+ float32: 0
285
+ }))
286
+ }));
287
+ }
288
+ return tables.length ? {
289
+ tables,
290
+ removed
291
+ } : {
292
+ tables: null,
293
+ removed: null
294
+ };
295
+ }
296
+ function buildInstruction(instruction, index) {
297
+ return {
298
+ kind: "instruction",
299
+ index,
300
+ dxbcOffset: instruction.offset,
301
+ opcode: instruction.opcode,
302
+ opcodeName: instruction.opcodeName,
303
+ controlKind: controlKind(instruction.opcodeName),
304
+ testBoolean: instruction.testBoolean || null,
305
+ saturate: !!instruction.saturate,
306
+ preciseMask: instruction.preciseMask || "",
307
+ ...(instruction.opcodeName === "resinfo" ? {
308
+ resinfoReturnTypeName: instruction.resinfoReturnTypeName || "float"
309
+ } : {}),
310
+ ...(instruction.opcodeName === "sync" ? {
311
+ syncFlags: Number.isInteger(instruction.syncFlags) ? instruction.syncFlags : null,
312
+ syncFlagNames: Array.isArray(instruction.syncFlagNames) ? clonePlain(instruction.syncFlagNames) : null
313
+ } : {}),
314
+ ...(instruction.extensions?.length ? {
315
+ extensions: clonePlain(instruction.extensions)
316
+ } : {}),
317
+ ...(instruction.tailTokens?.length ? {
318
+ tailTokens: clonePlain(instruction.tailTokens)
319
+ } : {}),
320
+ operands: clonePlain(instruction.operands || [])
321
+ };
322
+ }
323
+ function buildBlocks(instructions) {
324
+ if (instructions.length === 0) return [];
325
+ const leaders = new Set([0]);
326
+ for (let index = 0; index < instructions.length; index += 1) {
327
+ if (BLOCK_BEFORE.has(instructions[index].opcodeName)) leaders.add(index);
328
+ if (BLOCK_AFTER.has(instructions[index].opcodeName) && index + 1 < instructions.length) leaders.add(index + 1);
329
+ }
330
+ const starts = Array.from(leaders).sort((a, b) => a - b);
331
+ return starts.map((start, blockIndex) => {
332
+ const end = (starts[blockIndex + 1] ?? instructions.length) - 1;
333
+ const last = instructions[end];
334
+ return {
335
+ kind: "basic-block",
336
+ id: `block${blockIndex}`,
337
+ index: blockIndex,
338
+ startInstruction: start,
339
+ endInstruction: end,
340
+ startDxbcOffset: instructions[start].dxbcOffset,
341
+ endDxbcOffset: last.dxbcOffset,
342
+ instructionIndices: Array.from({
343
+ length: end - start + 1
344
+ }, (_, offset) => start + offset),
345
+ terminator: last.controlKind ? last.opcodeName : null
346
+ };
347
+ });
348
+ }
349
+ function validateProgram(program) {
350
+ if (!program.stage || !Number.isInteger(program.shaderModel.major)) {
351
+ throw new Error("Invalid shader IR program identity");
352
+ }
353
+ for (let index = 1; index < program.instructions.length; index += 1) {
354
+ if (program.instructions[index].dxbcOffset <= program.instructions[index - 1].dxbcOffset) {
355
+ throw new Error("Shader IR instruction offsets must be strictly increasing");
356
+ }
357
+ }
358
+ const covered = program.blocks.flatMap(block => block.instructionIndices);
359
+ if (covered.length !== program.instructions.length || covered.some((value, index) => value !== index)) {
360
+ throw new Error("Shader IR basic blocks must cover every executable instruction exactly once");
361
+ }
362
+ const blockIds = new Set(program.blocks.map(block => block.id));
363
+ for (const block of program.blocks) {
364
+ if (block.successors.some(edge => !blockIds.has(edge.blockId))) {
365
+ throw new Error("Shader IR control-flow edge references an unknown block");
366
+ }
367
+ for (const edge of block.successors) {
368
+ const successor = program.blocks.find(entry => entry.id === edge.blockId);
369
+ if (!successor.predecessors.some(entry => entry.blockId === block.id && entry.kind === edge.kind)) {
370
+ throw new Error("Shader IR control-flow successor/predecessor edges must be symmetric");
371
+ }
372
+ }
373
+ }
374
+ const bindingIds = new Set();
375
+ for (const binding of program.bindings) {
376
+ if (bindingIds.has(binding.id)) throw new Error(`Duplicate shader IR binding ${binding.id}`);
377
+ bindingIds.add(binding.id);
378
+ }
379
+ const valueIds = new Set(program.values.map(value => value.id));
380
+ const valuesById = new Map(program.values.map(value => [value.id, value]));
381
+ if (valueIds.size !== program.values.length) throw new Error("Shader IR register value ids must be unique");
382
+ for (const block of program.blocks) {
383
+ if (block.inputValueIds.some(id => !valueIds.has(id))) {
384
+ throw new Error("Shader IR block input references an unknown value");
385
+ }
386
+ if (block.outputValues.some(output => !valueIds.has(output.ref.valueId))) {
387
+ throw new Error("Shader IR block output references an unknown value");
388
+ }
389
+ if (block.mergeSite?.valueIds?.some(id => !valueIds.has(id) || valuesById.get(id).origin !== "control-flow-merge" || valuesById.get(id).blockId !== block.id)) {
390
+ throw new Error("Shader IR merge site references an invalid merge value");
391
+ }
392
+ }
393
+ for (const instruction of program.instructions) {
394
+ if (!instruction.dataflow) throw new Error("Shader IR instruction is missing register dataflow");
395
+ const refs = [...instruction.dataflow.reads.flatMap(read => read.refs), ...instruction.dataflow.writes.flatMap(write => [{
396
+ valueId: write.valueId
397
+ }, ...Object.values(write.previous || {}), ...Object.values(write.result || {})])];
398
+ if (refs.some(ref => !valueIds.has(ref.valueId))) {
399
+ throw new Error("Shader IR register dataflow references an unknown value");
400
+ }
401
+ }
402
+ for (const value of program.values) {
403
+ if (value.origin === "block-input") throw new Error("Shader IR contains an unresolved block input");
404
+ if (value.origin === "control-flow-merge") {
405
+ if (value.incoming.length < 2) throw new Error("Shader IR merge value must have at least two incoming values");
406
+ if (value.incoming.some(incoming => !valueIds.has(incoming.valueId))) {
407
+ throw new Error("Shader IR merge value references an unknown incoming value");
408
+ }
409
+ if (value.incoming.some(incoming => incoming.component !== value.writeMask || valuesById.get(incoming.valueId).register !== value.register)) {
410
+ throw new Error("Shader IR merge value has an incompatible incoming register component");
411
+ }
412
+ }
413
+ if (!value.componentTypes || Object.values(value.componentTypes).some(type => !SCALAR_TYPES.includes(type))) {
414
+ throw new Error("Shader IR register value has an invalid component type");
415
+ }
416
+ }
417
+ for (const instruction of program.instructions) {
418
+ if (!instruction.typeInfo) throw new Error("Shader IR instruction is missing type information");
419
+ if (typeof instruction.preciseMask !== "string" || !PRECISE_MASK.test(instruction.preciseMask)) {
420
+ throw new Error(`Shader IR instruction ${instruction.index} has an invalid precise component mask`);
421
+ }
422
+ if (instruction.typeInfo.bitcasts.some(bitcast => !SCALAR_TYPES.includes(bitcast.from) || !SCALAR_TYPES.includes(bitcast.to))) {
423
+ throw new Error("Shader IR instruction has an invalid bitcast type");
424
+ }
425
+ }
426
+ }
427
+ function deepFreeze(value) {
428
+ if (!value || typeof value !== "object" || Object.isFrozen(value)) return value;
429
+ for (const entry of Object.values(value)) deepFreeze(entry);
430
+ return Object.freeze(value);
431
+ }
432
+
433
+ /**
434
+ * Lowers decoded DXBC framing into the stable front-end shader IR.
435
+ * Type inference and SSA value reconstruction are later passes.
436
+ *
437
+ * @param {Uint8Array|ArrayBuffer|ArrayBufferView|object} input DXBC bytes or decoded result.
438
+ * @param {object} [options] IR provenance options.
439
+ * @returns {object} Frozen, validated shader IR program.
440
+ */
441
+ function lowerDxbcToIr(input, options = {}) {
442
+ const decoded = readDecoded(input, options);
443
+ if (!decoded.program) throw new Error("DXBC input has no shader program");
444
+ const declarationInstructions = decoded.instructions.filter(instruction => instruction.isDeclaration);
445
+ let executable = decoded.instructions.filter(instruction => !instruction.isDeclaration);
446
+ const constTableExtraction = extractConstTables(declarationInstructions, executable);
447
+ if (constTableExtraction.removed) {
448
+ executable = executable.filter((_, index) => !constTableExtraction.removed.has(index));
449
+ }
450
+ const instructions = executable.map(buildInstruction);
451
+ const icbInstruction = declarationInstructions.find(instruction => instruction.customData?.immediateConstantBuffer);
452
+ const immediateConstantBuffer = icbInstruction ? clonePlain(icbInstruction.customData.immediateConstantBuffer) : null;
453
+ const program = {
454
+ kind: "shader-program",
455
+ format: SHADER_IR_FORMAT,
456
+ formatVersion: SHADER_IR_VERSION,
457
+ source: options.source || decoded.program.source || "memory",
458
+ stage: decoded.program.programTypeName,
459
+ programType: decoded.program.programType,
460
+ shaderModel: {
461
+ major: decoded.program.majorVersion,
462
+ minor: decoded.program.minorVersion
463
+ },
464
+ signatures: {
465
+ input: clonePlain(decoded.signatures?.input || []),
466
+ output: clonePlain(decoded.signatures?.output || []),
467
+ patch: clonePlain(decoded.signatures?.patch || [])
468
+ },
469
+ declarations: declarationInstructions.map(instruction => ({
470
+ kind: "declaration",
471
+ dxbcOffset: instruction.offset,
472
+ opcodeName: instruction.opcodeName,
473
+ data: clonePlain(instruction.declaration),
474
+ operands: clonePlain(instruction.operands || []),
475
+ ...(instruction.tailTokens?.length ? {
476
+ tailTokens: clonePlain(instruction.tailTokens)
477
+ } : {})
478
+ })),
479
+ bindings: declarationInstructions.map(buildBinding).filter(Boolean),
480
+ immediateConstantBuffer,
481
+ constTables: constTableExtraction.tables,
482
+ instructions,
483
+ blocks: buildBlocks(instructions)
484
+ };
485
+ buildControlFlow(program);
486
+ analyzeRegisterValues(program);
487
+ resolveRegisterFlow(program);
488
+ inferValueTypes(program);
489
+ validateProgram(program);
490
+ return deepFreeze(program);
491
+ }
492
+
493
+ export { SHADER_IR_FORMAT, SHADER_IR_VERSION, lowerDxbcToIr };
494
+ //# sourceMappingURL=lowerDxbcToIr.js.map