@forgeax/engine-rhi-debug 0.0.0-dev.8d955ade1c79

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 (237) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +178 -0
  3. package/dist/.tsbuildinfo +1 -0
  4. package/dist/__tests__/bootstrap-integration.test.d.ts +2 -0
  5. package/dist/__tests__/bootstrap-integration.test.d.ts.map +1 -0
  6. package/dist/__tests__/consumer-inventory.unit.test.d.ts +2 -0
  7. package/dist/__tests__/consumer-inventory.unit.test.d.ts.map +1 -0
  8. package/dist/__tests__/copy-src-usage-validity.dawn.test.d.ts +15 -0
  9. package/dist/__tests__/copy-src-usage-validity.dawn.test.d.ts.map +1 -0
  10. package/dist/__tests__/coverage-invariant.test-d.d.ts +2 -0
  11. package/dist/__tests__/coverage-invariant.test-d.d.ts.map +1 -0
  12. package/dist/__tests__/coverage-invariant.unit.test.d.ts +2 -0
  13. package/dist/__tests__/coverage-invariant.unit.test.d.ts.map +1 -0
  14. package/dist/__tests__/e2e.browser.test.d.ts +2 -0
  15. package/dist/__tests__/e2e.browser.test.d.ts.map +1 -0
  16. package/dist/__tests__/error-code-narrowing.test-d.d.ts +2 -0
  17. package/dist/__tests__/error-code-narrowing.test-d.d.ts.map +1 -0
  18. package/dist/__tests__/errors-v7.test-d.d.ts +2 -0
  19. package/dist/__tests__/errors-v7.test-d.d.ts.map +1 -0
  20. package/dist/__tests__/errors-v7.unit.test.d.ts +2 -0
  21. package/dist/__tests__/errors-v7.unit.test.d.ts.map +1 -0
  22. package/dist/__tests__/errors.unit.test.d.ts +2 -0
  23. package/dist/__tests__/errors.unit.test.d.ts.map +1 -0
  24. package/dist/__tests__/event-semantics-coverage.unit.test.d.ts +2 -0
  25. package/dist/__tests__/event-semantics-coverage.unit.test.d.ts.map +1 -0
  26. package/dist/__tests__/format-info.unit.test.d.ts +2 -0
  27. package/dist/__tests__/format-info.unit.test.d.ts.map +1 -0
  28. package/dist/__tests__/frame-model-parity.test-d.d.ts +2 -0
  29. package/dist/__tests__/frame-model-parity.test-d.d.ts.map +1 -0
  30. package/dist/__tests__/frame-model-parity.unit.test.d.ts +2 -0
  31. package/dist/__tests__/frame-model-parity.unit.test.d.ts.map +1 -0
  32. package/dist/__tests__/guard-gates.test.d.ts +2 -0
  33. package/dist/__tests__/guard-gates.test.d.ts.map +1 -0
  34. package/dist/__tests__/public-surface.integration.test.d.ts +2 -0
  35. package/dist/__tests__/public-surface.integration.test.d.ts.map +1 -0
  36. package/dist/__tests__/readback-fault-cleanup.unit.test.d.ts +2 -0
  37. package/dist/__tests__/readback-fault-cleanup.unit.test.d.ts.map +1 -0
  38. package/dist/__tests__/readback-format-matrix.dawn.test.d.ts +2 -0
  39. package/dist/__tests__/readback-format-matrix.dawn.test.d.ts.map +1 -0
  40. package/dist/__tests__/readback-format-matrix.unit.test.d.ts +2 -0
  41. package/dist/__tests__/readback-format-matrix.unit.test.d.ts.map +1 -0
  42. package/dist/__tests__/readback-matrix-fixture.d.ts +32 -0
  43. package/dist/__tests__/readback-matrix-fixture.d.ts.map +1 -0
  44. package/dist/__tests__/recorder-bootstrap.unit.test.d.ts +2 -0
  45. package/dist/__tests__/recorder-bootstrap.unit.test.d.ts.map +1 -0
  46. package/dist/__tests__/recorder-budget.unit.test.d.ts +2 -0
  47. package/dist/__tests__/recorder-budget.unit.test.d.ts.map +1 -0
  48. package/dist/__tests__/recorder-fail-fast.unit.test.d.ts +2 -0
  49. package/dist/__tests__/recorder-fail-fast.unit.test.d.ts.map +1 -0
  50. package/dist/__tests__/recorder-lifecycle.unit.test.d.ts +2 -0
  51. package/dist/__tests__/recorder-lifecycle.unit.test.d.ts.map +1 -0
  52. package/dist/__tests__/recorder-push-event.unit.test.d.ts +2 -0
  53. package/dist/__tests__/recorder-push-event.unit.test.d.ts.map +1 -0
  54. package/dist/__tests__/recorder-session.integration.test.d.ts +2 -0
  55. package/dist/__tests__/recorder-session.integration.test.d.ts.map +1 -0
  56. package/dist/__tests__/recorder-session.unit.test.d.ts +2 -0
  57. package/dist/__tests__/recorder-session.unit.test.d.ts.map +1 -0
  58. package/dist/__tests__/recorder-steady-frame.dawn.test.d.ts +2 -0
  59. package/dist/__tests__/recorder-steady-frame.dawn.test.d.ts.map +1 -0
  60. package/dist/__tests__/replay-fail-fast.unit.test.d.ts +2 -0
  61. package/dist/__tests__/replay-fail-fast.unit.test.d.ts.map +1 -0
  62. package/dist/__tests__/replay-session.dawn.test.d.ts +2 -0
  63. package/dist/__tests__/replay-session.dawn.test.d.ts.map +1 -0
  64. package/dist/__tests__/replay-session.test-d.d.ts +2 -0
  65. package/dist/__tests__/replay-session.test-d.d.ts.map +1 -0
  66. package/dist/__tests__/replay-session.unit.test.d.ts +2 -0
  67. package/dist/__tests__/replay-session.unit.test.d.ts.map +1 -0
  68. package/dist/__tests__/resolve-texture-descriptor.unit.test.d.ts +2 -0
  69. package/dist/__tests__/resolve-texture-descriptor.unit.test.d.ts.map +1 -0
  70. package/dist/__tests__/resource-lifecycle.unit.test.d.ts +2 -0
  71. package/dist/__tests__/resource-lifecycle.unit.test.d.ts.map +1 -0
  72. package/dist/__tests__/rhi-debug-fresh-replay.dawn.test.d.ts +2 -0
  73. package/dist/__tests__/rhi-debug-fresh-replay.dawn.test.d.ts.map +1 -0
  74. package/dist/__tests__/tape-index.unit.test.d.ts +2 -0
  75. package/dist/__tests__/tape-index.unit.test.d.ts.map +1 -0
  76. package/dist/__tests__/tape-v7-invalid.unit.test.d.ts +2 -0
  77. package/dist/__tests__/tape-v7-invalid.unit.test.d.ts.map +1 -0
  78. package/dist/__tests__/tape-v7-roundtrip.unit.test.d.ts +2 -0
  79. package/dist/__tests__/tape-v7-roundtrip.unit.test.d.ts.map +1 -0
  80. package/dist/__tests__/tape-v7-version.unit.test.d.ts +2 -0
  81. package/dist/__tests__/tape-v7-version.unit.test.d.ts.map +1 -0
  82. package/dist/__tests__/tree-shake.unit.test.d.ts +2 -0
  83. package/dist/__tests__/tree-shake.unit.test.d.ts.map +1 -0
  84. package/dist/__tests__/types.test.d.ts +2 -0
  85. package/dist/__tests__/types.test.d.ts.map +1 -0
  86. package/dist/browser.d.ts +45 -0
  87. package/dist/browser.d.ts.map +1 -0
  88. package/dist/browser.mjs +83 -0
  89. package/dist/browser.mjs.map +1 -0
  90. package/dist/errors.d.ts +85 -0
  91. package/dist/errors.d.ts.map +1 -0
  92. package/dist/frame-model.d.ts +158 -0
  93. package/dist/frame-model.d.ts.map +1 -0
  94. package/dist/index.d.ts +17 -0
  95. package/dist/index.d.ts.map +1 -0
  96. package/dist/index.mjs +10415 -0
  97. package/dist/index.mjs.map +1 -0
  98. package/dist/protocol/codec.d.ts +6 -0
  99. package/dist/protocol/codec.d.ts.map +1 -0
  100. package/dist/protocol/event-semantics.d.ts +15 -0
  101. package/dist/protocol/event-semantics.d.ts.map +1 -0
  102. package/dist/protocol/tape-index.d.ts +30 -0
  103. package/dist/protocol/tape-index.d.ts.map +1 -0
  104. package/dist/protocol/types.d.ts +44 -0
  105. package/dist/protocol/types.d.ts.map +1 -0
  106. package/dist/protocol/validation.d.ts +7 -0
  107. package/dist/protocol/validation.d.ts.map +1 -0
  108. package/dist/readback.d.ts +156 -0
  109. package/dist/readback.d.ts.map +1 -0
  110. package/dist/recorder/assemble.d.ts +11 -0
  111. package/dist/recorder/assemble.d.ts.map +1 -0
  112. package/dist/recorder/closure.d.ts +39 -0
  113. package/dist/recorder/closure.d.ts.map +1 -0
  114. package/dist/recorder/core.d.ts +296 -0
  115. package/dist/recorder/core.d.ts.map +1 -0
  116. package/dist/recorder/device.d.ts +4 -0
  117. package/dist/recorder/device.d.ts.map +1 -0
  118. package/dist/recorder/encoder.d.ts +5 -0
  119. package/dist/recorder/encoder.d.ts.map +1 -0
  120. package/dist/recorder/lifecycle.d.ts +20 -0
  121. package/dist/recorder/lifecycle.d.ts.map +1 -0
  122. package/dist/recorder/pass.d.ts +6 -0
  123. package/dist/recorder/pass.d.ts.map +1 -0
  124. package/dist/recorder/proxy.d.ts +19 -0
  125. package/dist/recorder/proxy.d.ts.map +1 -0
  126. package/dist/recorder/queue.d.ts +4 -0
  127. package/dist/recorder/queue.d.ts.map +1 -0
  128. package/dist/recorder/resource-registry.d.ts +15 -0
  129. package/dist/recorder/resource-registry.d.ts.map +1 -0
  130. package/dist/recorder/session.d.ts +25 -0
  131. package/dist/recorder/session.d.ts.map +1 -0
  132. package/dist/recorder/shader.d.ts +3 -0
  133. package/dist/recorder/shader.d.ts.map +1 -0
  134. package/dist/recorder/snapshot.d.ts +10 -0
  135. package/dist/recorder/snapshot.d.ts.map +1 -0
  136. package/dist/recorder/wrap.d.ts +4 -0
  137. package/dist/recorder/wrap.d.ts.map +1 -0
  138. package/dist/recorder.d.ts +7 -0
  139. package/dist/recorder.d.ts.map +1 -0
  140. package/dist/replay/device-request.d.ts +8 -0
  141. package/dist/replay/device-request.d.ts.map +1 -0
  142. package/dist/replay/execute-support.d.ts +33 -0
  143. package/dist/replay/execute-support.d.ts.map +1 -0
  144. package/dist/replay/execute.d.ts +18 -0
  145. package/dist/replay/execute.d.ts.map +1 -0
  146. package/dist/replay/readback.d.ts +32 -0
  147. package/dist/replay/readback.d.ts.map +1 -0
  148. package/dist/replay/resources.d.ts +57 -0
  149. package/dist/replay/resources.d.ts.map +1 -0
  150. package/dist/replay/session.d.ts +49 -0
  151. package/dist/replay/session.d.ts.map +1 -0
  152. package/dist/replay/texture-format.d.ts +21 -0
  153. package/dist/replay/texture-format.d.ts.map +1 -0
  154. package/dist/texel-decode.d.ts +35 -0
  155. package/dist/texel-decode.d.ts.map +1 -0
  156. package/dist/texel-layout.d.ts +76 -0
  157. package/dist/texel-layout.d.ts.map +1 -0
  158. package/dist/types.d.ts +722 -0
  159. package/dist/types.d.ts.map +1 -0
  160. package/package.json +72 -0
  161. package/src/__tests__/bootstrap-integration.test.ts +268 -0
  162. package/src/__tests__/consumer-inventory.unit.test.ts +154 -0
  163. package/src/__tests__/copy-src-usage-validity.dawn.test.ts +117 -0
  164. package/src/__tests__/coverage-invariant.test-d.ts +115 -0
  165. package/src/__tests__/coverage-invariant.unit.test.ts +45 -0
  166. package/src/__tests__/e2e.browser.test.ts +239 -0
  167. package/src/__tests__/error-code-narrowing.test-d.ts +32 -0
  168. package/src/__tests__/errors-v7.test-d.ts +19 -0
  169. package/src/__tests__/errors-v7.unit.test.ts +15 -0
  170. package/src/__tests__/errors.unit.test.ts +83 -0
  171. package/src/__tests__/event-semantics-coverage.unit.test.ts +22 -0
  172. package/src/__tests__/format-info.unit.test.ts +85 -0
  173. package/src/__tests__/frame-model-parity.test-d.ts +20 -0
  174. package/src/__tests__/frame-model-parity.unit.test.ts +285 -0
  175. package/src/__tests__/guard-gates.test.ts +317 -0
  176. package/src/__tests__/public-surface.integration.test.ts +38 -0
  177. package/src/__tests__/readback-fault-cleanup.unit.test.ts +66 -0
  178. package/src/__tests__/readback-format-matrix.dawn.test.ts +378 -0
  179. package/src/__tests__/readback-format-matrix.unit.test.ts +120 -0
  180. package/src/__tests__/readback-matrix-fixture.ts +20 -0
  181. package/src/__tests__/recorder-bootstrap.unit.test.ts +302 -0
  182. package/src/__tests__/recorder-budget.unit.test.ts +42 -0
  183. package/src/__tests__/recorder-fail-fast.unit.test.ts +434 -0
  184. package/src/__tests__/recorder-lifecycle.unit.test.ts +42 -0
  185. package/src/__tests__/recorder-push-event.unit.test.ts +573 -0
  186. package/src/__tests__/recorder-session.integration.test.ts +32 -0
  187. package/src/__tests__/recorder-session.unit.test.ts +63 -0
  188. package/src/__tests__/recorder-steady-frame.dawn.test.ts +52 -0
  189. package/src/__tests__/replay-fail-fast.unit.test.ts +155 -0
  190. package/src/__tests__/replay-session.dawn.test.ts +220 -0
  191. package/src/__tests__/replay-session.test-d.ts +27 -0
  192. package/src/__tests__/replay-session.unit.test.ts +171 -0
  193. package/src/__tests__/resolve-texture-descriptor.unit.test.ts +144 -0
  194. package/src/__tests__/resource-lifecycle.unit.test.ts +114 -0
  195. package/src/__tests__/rhi-debug-fresh-replay.dawn.test.ts +178 -0
  196. package/src/__tests__/tape-index.unit.test.ts +56 -0
  197. package/src/__tests__/tape-v7-invalid.unit.test.ts +45 -0
  198. package/src/__tests__/tape-v7-roundtrip.unit.test.ts +66 -0
  199. package/src/__tests__/tape-v7-version.unit.test.ts +13 -0
  200. package/src/__tests__/tree-shake.unit.test.ts +151 -0
  201. package/src/__tests__/types.test.ts +257 -0
  202. package/src/browser.ts +146 -0
  203. package/src/errors.ts +173 -0
  204. package/src/frame-model.ts +753 -0
  205. package/src/index.ts +92 -0
  206. package/src/pako.d.ts +8 -0
  207. package/src/protocol/codec.ts +220 -0
  208. package/src/protocol/event-semantics.ts +180 -0
  209. package/src/protocol/tape-index.ts +120 -0
  210. package/src/protocol/types.ts +60 -0
  211. package/src/protocol/validation.ts +173 -0
  212. package/src/readback.ts +804 -0
  213. package/src/recorder/assemble.ts +192 -0
  214. package/src/recorder/closure.ts +408 -0
  215. package/src/recorder/core.ts +587 -0
  216. package/src/recorder/device.ts +474 -0
  217. package/src/recorder/encoder.ts +251 -0
  218. package/src/recorder/lifecycle.ts +847 -0
  219. package/src/recorder/pass.ts +241 -0
  220. package/src/recorder/proxy.ts +59 -0
  221. package/src/recorder/queue.ts +109 -0
  222. package/src/recorder/resource-registry.ts +53 -0
  223. package/src/recorder/session.ts +152 -0
  224. package/src/recorder/shader.ts +47 -0
  225. package/src/recorder/snapshot.ts +38 -0
  226. package/src/recorder/wrap.ts +157 -0
  227. package/src/recorder.ts +15 -0
  228. package/src/replay/device-request.ts +38 -0
  229. package/src/replay/execute-support.ts +243 -0
  230. package/src/replay/execute.ts +870 -0
  231. package/src/replay/readback.ts +671 -0
  232. package/src/replay/resources.ts +154 -0
  233. package/src/replay/session.ts +509 -0
  234. package/src/replay/texture-format.ts +99 -0
  235. package/src/texel-decode.ts +289 -0
  236. package/src/texel-layout.ts +324 -0
  237. package/src/types.ts +888 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAcA;;;;;;GAMG;AACH,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC;AAE9B;;;;;;;;GAQG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,YAAY,EAAE,gBAAgB,CAAC;IACxC,QAAQ,CAAC,qBAAqB,EAAE,OAAO,CAAC;IACxC,QAAQ,CAAC,iBAAiB,EAAE,OAAO,CAAC;IACpC,QAAQ,CAAC,oBAAoB,EAAE,OAAO,CAAC;IACvC,QAAQ,CAAC,sBAAsB,EAAE,OAAO,CAAC;IACzC,QAAQ,CAAC,sBAAsB,EAAE,OAAO,CAAC;IACzC,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;IAChC,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC;CAClC;AAMD;;;;;;GAMG;AACH,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAID,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE;QACb,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;QACzB,QAAQ,CAAC,KAAK,EAAE,mBAAmB,CAAC;QACpC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;KACjD,CAAC;CACH;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;IAC/B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,sFAAsF;IACtF,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;IAC1C,QAAQ,CAAC,IAAI,EAAE;QACb,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAC;QACjC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QAC5C,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QAC1C,QAAQ,CAAC,SAAS,CAAC,EAAE,mBAAmB,GAAG,SAAS,CAAC;QACrD,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAC;QAClC,QAAQ,CAAC,KAAK,EAAE,oBAAoB,CAAC;QACrC,QAAQ,CAAC,WAAW,CAAC,EAAE,QAAQ,CAAC,gBAAgB,CAAC,GAAG,SAAS,CAAC;QAC9D,QAAQ,CAAC,2BAA2B,CAAC,EAAE,uBAAuB,GAAG,SAAS,CAAC;KAC5E,CAAC;CACH;AAED,oEAAoE;AACpE,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;IAC/B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;CAC7B;AAED,qEAAqE;AACrE,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;IAChC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;CAC7B;AAED,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,IAAI,EAAE,mBAAmB,CAAC;IACnC,QAAQ,CAAC,cAAc,EAAE,QAAQ,CAAC;IAClC,QAAQ,CAAC,cAAc,EAAE,QAAQ,CAAC;IAClC,QAAQ,CAAC,IAAI,EAAE;QACb,QAAQ,CAAC,MAAM,CAAC,EAAE,gBAAgB,GAAG,SAAS,CAAC;QAC/C,QAAQ,CAAC,SAAS,CAAC,EAAE,uBAAuB,GAAG,SAAS,CAAC;QACzD,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QACpC,QAAQ,CAAC,MAAM,CAAC,EAAE,gBAAgB,GAAG,SAAS,CAAC;QAC/C,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QAC3C,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QAC5C,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QAC7C,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;KAC/C,CAAC;CACH;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;IAC/B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,oBAAoB,CAAC,GAAG,SAAS,CAAC;CAC3D;AAED,MAAM,WAAW,iCAAiC;IAChD,QAAQ,CAAC,IAAI,EAAE,uBAAuB,CAAC;IACvC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE;QACb,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QACpC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,uBAAuB,CAAC,CAAC;KACrD,CAAC;CACH;AAED;;;;;;;;;GASG;AACH,MAAM,MAAM,mBAAmB,GAAG,SAAS,GAAG,QAAQ,GAAG,aAAa,GAAG,iBAAiB,CAAC;AAE3F,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAC;IACjC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,cAAc,EAAE,QAAQ,CAAC;IAClC,QAAQ,CAAC,OAAO,EAAE,SAAS;QACzB,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAC,SAAS,CAAC,CAAC;QAC/C,QAAQ,CAAC,YAAY,EAAE,mBAAmB,CAAC;QAM3C,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;QAC/B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;KAC9B,EAAE,CAAC;IACJ,QAAQ,CAAC,iBAAiB,EAAE,SAAS,QAAQ,EAAE,CAAC;CACjD;AAED,MAAM,WAAW,gCAAgC;IAC/C,QAAQ,CAAC,IAAI,EAAE,sBAAsB,CAAC;IACtC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,YAAY,EAAE,SAAS,QAAQ,EAAE,CAAC;CAC5C;AAED,MAAM,WAAW,gCAAgC;IAC/C,QAAQ,CAAC,IAAI,EAAE,sBAAsB,CAAC;IACtC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE;QACb,mFAAmF;QACnF,QAAQ,CAAC,MAAM,CAAC,EAAE;YAChB,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;YACzC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,qBAAqB,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;YACrE,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;SACzD,CAAC;QACF,QAAQ,CAAC,SAAS,CAAC,EAAE,iBAAiB,GAAG,SAAS,CAAC;QACnD,QAAQ,CAAC,YAAY,CAAC,EAAE,oBAAoB,GAAG,SAAS,CAAC;QACzD,QAAQ,CAAC,WAAW,CAAC,EAAE,mBAAmB,GAAG,SAAS,CAAC;QACvD,mFAAmF;QACnF,QAAQ,CAAC,QAAQ,CAAC,EAAE;YAClB,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;YACzC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,mBAAmB,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;YACnE,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;SACzD,CAAC;KACH,CAAC;IACF,QAAQ,CAAC,cAAc,EAAE,QAAQ,CAAC;IAClC,gFAAgF;IAChF,QAAQ,CAAC,0BAA0B,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC3D,kFAAkF;IAClF,QAAQ,CAAC,4BAA4B,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;CAC9D;AAED,MAAM,WAAW,iCAAiC;IAChD,QAAQ,CAAC,IAAI,EAAE,uBAAuB,CAAC;IACvC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE;QACb,QAAQ,CAAC,OAAO,EAAE,oBAAoB,CAAC;KACxC,CAAC;IACF,QAAQ,CAAC,cAAc,EAAE,QAAQ,CAAC;IAClC,iFAAiF;IACjF,QAAQ,CAAC,2BAA2B,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;CAC7D;AAED,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,CAAC,IAAI,EAAE,oBAAoB,CAAC;IACpC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,gCAAgC;IAC/C,QAAQ,CAAC,IAAI,EAAE,sBAAsB,CAAC;IACtC,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC;IAC/B,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,2BAA2B,CAAC,GAAG,SAAS,CAAC;CAClE;AAID,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAC9B,QAAQ,CAAC,WAAW,EAAE;QACpB,QAAQ,CAAC,eAAe,EAAE,QAAQ,CAAC;QACnC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QACvC,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;QAC1C,QAAQ,CAAC,MAAM,CAAC,EAAE,gBAAgB,GAAG,SAAS,CAAC;KAChD,CAAC;IACF,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,UAAU,EAAE;QACnB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QACrC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QAC1C,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;KAC5C,CAAC;IACF,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAC;CAClC;AAED,MAAM,WAAW,sCAAsC;IACrD,QAAQ,CAAC,IAAI,EAAE,4BAA4B,CAAC;IAC5C,QAAQ,CAAC,MAAM,EAAE;QACf,QAAQ,CAAC,MAAM,CAAC,EAAE,iBAAiB,GAAG,SAAS,CAAC;QAChD,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;KACtC,CAAC;IACF,QAAQ,CAAC,WAAW,EAAE;QACpB,QAAQ,CAAC,eAAe,EAAE,QAAQ,CAAC;QACnC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QACvC,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;QAC1C,QAAQ,CAAC,MAAM,CAAC,EAAE,gBAAgB,GAAG,SAAS,CAAC;QAC/C,QAAQ,CAAC,UAAU,CAAC,EAAE,oBAAoB,GAAG,SAAS,CAAC;QACvD,QAAQ,CAAC,kBAAkB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;KACnD,CAAC;IACF,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAAC;CACtC;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,YAAY,EAAE,SAAS,QAAQ,EAAE,CAAC;CAC5C;AAID,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAC;IACjC,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC;IAC/B,QAAQ,CAAC,YAAY,EAAE,QAAQ,CAAC;IAChC,QAAQ,CAAC,IAAI,EAAE;QACb,iFAAiF;QACjF,QAAQ,CAAC,gBAAgB,EAAE,QAAQ,CAC/B;YACE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;YACvB,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;YACjC,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;SACjC,GACD,IAAI,GACJ,SAAS,CACZ,CAAC;QACF,QAAQ,CAAC,sBAAsB,CAAC,EAC5B;YACE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;YACvB,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;SACjC,GACD,SAAS,CAAC;QACd,QAAQ,CAAC,iBAAiB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;QACjD,QAAQ,CAAC,eAAe,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;QAC/C,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;KAC5C,CAAC;IACF,QAAQ,CAAC,4BAA4B,EAAE,SAAS,CAAC,QAAQ,GAAG,SAAS,CAAC,EAAE,CAAC;IACzE;;;;OAIG;IACH,QAAQ,CAAC,qCAAqC,CAAC,EAAE,SAAS,CAAC,QAAQ,GAAG,SAAS,CAAC,EAAE,CAAC;IACnF,QAAQ,CAAC,wBAAwB,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;CAC1D;AAED,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAC;IAClC,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC;IAC/B,QAAQ,CAAC,YAAY,EAAE,QAAQ,CAAC;IAChC,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,wBAAwB,CAAC,GAAG,SAAS,CAAC;CAC/D;AAED,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,CAAC,IAAI,EAAE,oBAAoB,CAAC;IACpC,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC;IAC/B,QAAQ,CAAC,cAAc,EAAE,QAAQ,CAAC;IAClC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,mBAAmB,EAAE,QAAQ,CAAC;IACvC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,+BAA+B;IAC9C,QAAQ,CAAC,IAAI,EAAE,qBAAqB,CAAC;IACrC,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC;IAC/B,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,sBAAsB,EAAE,QAAQ,CAAC,GAAG;QAAE,QAAQ,CAAC,cAAc,EAAE,QAAQ,CAAA;KAAE,CAAC;IAChG,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC,uBAAuB,EAAE,SAAS,CAAC,GAAG;QAC/D,QAAQ,CAAC,eAAe,EAAE,QAAQ,CAAC;KACpC,CAAC;IACF,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAAC;CACtC;AAED,MAAM,WAAW,+BAA+B;IAC9C,QAAQ,CAAC,IAAI,EAAE,qBAAqB,CAAC;IACrC,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC;IAC/B,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,uBAAuB,EAAE,SAAS,CAAC,GAAG;QAC1D,QAAQ,CAAC,eAAe,EAAE,QAAQ,CAAC;KACpC,CAAC;IACF,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC,sBAAsB,EAAE,QAAQ,CAAC,GAAG;QAC7D,QAAQ,CAAC,cAAc,EAAE,QAAQ,CAAC;KACnC,CAAC;IACF,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAAC;CACtC;AAED,MAAM,WAAW,gCAAgC;IAC/C,QAAQ,CAAC,IAAI,EAAE,sBAAsB,CAAC;IACtC,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC;IAC/B,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,uBAAuB,EAAE,SAAS,CAAC,GAAG;QAC1D,QAAQ,CAAC,eAAe,EAAE,QAAQ,CAAC;KACpC,CAAC;IACF,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC,uBAAuB,EAAE,SAAS,CAAC,GAAG;QAC/D,QAAQ,CAAC,eAAe,EAAE,QAAQ,CAAC;KACpC,CAAC;IACF,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAAC;CACtC;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC;IAC/B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACpC;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;IAChC,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC;IAC/B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;IAC/B,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC;CAChC;AAED,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,IAAI,EAAE,mBAAmB,CAAC;IACnC,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC;IAC/B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC;CAChC;AAID,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,QAAQ,CAAC,YAAY,EAAE,QAAQ,CAAC;IAChC,QAAQ,CAAC,gBAAgB,EAAE,QAAQ,CAAC;CACrC;AAED,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAC;IACjC,QAAQ,CAAC,YAAY,EAAE,QAAQ,CAAC;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,cAAc,EAAE,QAAQ,CAAC;IAClC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACpC;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;IAChC,QAAQ,CAAC,YAAY,EAAE,QAAQ,CAAC;IAChC,QAAQ,CAAC,cAAc,EAAE,QAAQ,CAAC;IAClC,QAAQ,CAAC,MAAM,EAAE,QAAQ,GAAG,QAAQ,CAAC;IACrC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACpC;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAC9B,QAAQ,CAAC,YAAY,EAAE,QAAQ,CAAC;IAChC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,iBAAiB,EAAE,QAAQ,CAAC;IACrC,QAAQ,CAAC,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;CACzD;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,YAAY,EAAE,QAAQ,CAAC;IAChC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;CAChC;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,QAAQ,CAAC,YAAY,EAAE,QAAQ,CAAC;IAChC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;CAChC;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,QAAQ,CAAC,YAAY,EAAE,QAAQ,CAAC;IAChC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;IAChC,QAAQ,CAAC,YAAY,EAAE,QAAQ,CAAC;IAChC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,+BAA+B;IAC9C,QAAQ,CAAC,IAAI,EAAE,qBAAqB,CAAC;IACrC,QAAQ,CAAC,YAAY,EAAE,QAAQ,CAAC;IAChC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;IAC/B,QAAQ,CAAC,YAAY,EAAE,QAAQ,CAAC;CACjC;AAED,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAC;IAClC,QAAQ,CAAC,YAAY,EAAE,QAAQ,CAAC;IAChC,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC;CAC1B;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAC9B,QAAQ,CAAC,YAAY,EAAE,QAAQ,CAAC;IAChC,QAAQ,CAAC,sBAAsB,EAAE,QAAQ,CAAC;IAC1C,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;CACjC;AAED,MAAM,WAAW,+BAA+B;IAC9C,QAAQ,CAAC,IAAI,EAAE,qBAAqB,CAAC;IACrC,QAAQ,CAAC,YAAY,EAAE,QAAQ,CAAC;IAChC,QAAQ,CAAC,sBAAsB,EAAE,QAAQ,CAAC;IAC1C,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;CACjC;AAED,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,CAAC,IAAI,EAAE,oBAAoB,CAAC;IACpC,QAAQ,CAAC,YAAY,EAAE,QAAQ,CAAC;IAChC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,IAAI,EAAE,mBAAmB,CAAC;IACnC,QAAQ,CAAC,YAAY,EAAE,QAAQ,CAAC;CACjC;AAED,MAAM,WAAW,iCAAiC;IAChD,QAAQ,CAAC,IAAI,EAAE,uBAAuB,CAAC;IACvC,QAAQ,CAAC,YAAY,EAAE,QAAQ,CAAC;IAChC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAID,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,CAAC,IAAI,EAAE,oBAAoB,CAAC;IACpC,QAAQ,CAAC,YAAY,EAAE,QAAQ,CAAC;IAChC,QAAQ,CAAC,gBAAgB,EAAE,QAAQ,CAAC;CACrC;AAED,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,CAAC,IAAI,EAAE,oBAAoB,CAAC;IACpC,QAAQ,CAAC,YAAY,EAAE,QAAQ,CAAC;IAChC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,sCAAsC;IACrD,QAAQ,CAAC,IAAI,EAAE,4BAA4B,CAAC;IAC5C,QAAQ,CAAC,YAAY,EAAE,QAAQ,CAAC;IAChC,QAAQ,CAAC,sBAAsB,EAAE,QAAQ,CAAC;IAC1C,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;CACjC;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;IAChC,QAAQ,CAAC,YAAY,EAAE,QAAQ,CAAC;CACjC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED;;;;;;;;;GASG;AACH,MAAM,MAAM,YAAY,GACpB,qBAAqB,GACrB,wBAAwB,GACxB,yBAAyB,GACzB,yBAAyB,GACzB,0BAA0B,GAC1B,6BAA6B,GAC7B,yBAAyB,GACzB,iCAAiC,GACjC,2BAA2B,GAC3B,gCAAgC,GAChC,gCAAgC,GAChC,iCAAiC,GACjC,8BAA8B,GAC9B,gCAAgC,GAChC,uBAAuB,GACvB,wBAAwB,GACxB,sCAAsC,GACtC,kBAAkB,GAClB,2BAA2B,GAC3B,4BAA4B,GAC5B,8BAA8B,GAC9B,+BAA+B,GAC/B,+BAA+B,GAC/B,gCAAgC,GAChC,uBAAuB,GACvB,0BAA0B,GAC1B,yBAAyB,GACzB,6BAA6B,GAC7B,kBAAkB,GAClB,uBAAuB,GACvB,2BAA2B,GAC3B,0BAA0B,GAC1B,wBAAwB,GACxB,gBAAgB,GAChB,uBAAuB,GACvB,uBAAuB,GACvB,0BAA0B,GAC1B,+BAA+B,GAC/B,yBAAyB,GACzB,4BAA4B,GAC5B,wBAAwB,GACxB,+BAA+B,GAC/B,8BAA8B,GAC9B,6BAA6B,GAC7B,iCAAiC,GACjC,8BAA8B,GAC9B,8BAA8B,GAC9B,sCAAsC,GACtC,0BAA0B,GAC1B,uBAAuB,CAAC;AAM5B;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,IAAI;IACnB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,eAAe,EAAE,eAAe,CAAC;IAC1C,QAAQ,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,CAAC;IACzC,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;CACrD;AAMD;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,aAAa,CAAC;CACjE;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,YAAY,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC5C,QAAQ,CAAC,gBAAgB,EAAE,QAAQ,CAAC;IACpC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1C,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5C,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACzC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACxC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACxC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACxC,qFAAqF;IACrF,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1C,yFAAyF;IACzF,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACzC,wFAAwF;IACxF,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5C,wFAAwF;IACxF,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACzC,uGAAuG;IACvG,QAAQ,CAAC,sBAAsB,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;IACvD,gGAAgG;IAChG,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC9C;AAED;;;;;;GAMG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,aAAa,EAAE;QACtB,QAAQ,CAAC,QAAQ,EAAE,oBAAoB,CAAC;QACxC,QAAQ,CAAC,gBAAgB,EAAE,cAAc,GAAG,SAAS,CAAC;KACvD,CAAC;IACF,QAAQ,CAAC,WAAW,EAAE;QACpB,QAAQ,CAAC,OAAO,EAAE,SAAS;YACzB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;YAC7B,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAAC;YACrC,QAAQ,CAAC,UAAU,EAAE,SAAS;gBAC5B,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAC;gBACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;gBACxB,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;aACjC,EAAE,CAAC;SACL,EAAE,CAAC;KACL,CAAC;IACF,QAAQ,CAAC,OAAO,EAAE;QAChB,QAAQ,CAAC,0BAA0B,EAAE,QAAQ,GAAG,SAAS,CAAC;QAC1D,QAAQ,CAAC,4BAA4B,EAAE,QAAQ,GAAG,SAAS,CAAC;QAC5D,+FAA+F;QAC/F,QAAQ,CAAC,gBAAgB,EAAE,MAAM,GAAG,SAAS,CAAC;QAC9C,0GAA0G;QAC1G,QAAQ,CAAC,kBAAkB,EAAE,MAAM,GAAG,SAAS,CAAC;KACjD,CAAC;IACF,QAAQ,CAAC,UAAU,EAAE;QACnB,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC;QAC/B,QAAQ,CAAC,SAAS,EAAE,YAAY,CAAC;KAClC,CAAC;IACF,QAAQ,CAAC,YAAY,EAAE;QACrB,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAC;QAClC,QAAQ,CAAC,iBAAiB,EAAE,OAAO,CAAC;QACpC,QAAQ,CAAC,YAAY,EAAE,kBAAkB,CAAC;QAC1C,QAAQ,CAAC,YAAY,EAAE,WAAW,CAAC,oBAAoB,CAAC,cAAc,CAAC,CAAC,CAAC;QACzE,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC,oBAAoB,CAAC,aAAa,CAAC,CAAC,CAAC;QACvE,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;QACjC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;QAClC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;QAC3B,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;QACrC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;QAChC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;KACnC,CAAC;IACF,QAAQ,CAAC,KAAK,EAAE;QACd,QAAQ,CAAC,YAAY,EAAE,SAAS;YAC9B,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAC;YAClC,QAAQ,CAAC,KAAK,EAAE,iBAAiB,GAAG,SAAS,CAAC;YAC9C,QAAQ,CAAC,KAAK,EAAE,iBAAiB,GAAG,SAAS,CAAC;YAC9C,QAAQ,CAAC,SAAS,EAAE,kBAAkB,CAAC;SACxC,EAAE,CAAC;QACJ,QAAQ,CAAC,aAAa,EAAE,QAAQ,GAAG,SAAS,CAAC;KAC9C,CAAC;IACF,QAAQ,CAAC,WAAW,EAAE;QACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,sBAAsB,EAAE,OAAO,CAAC;KAC1C,CAAC;CACH;AAED;;;;;GAKG;AACH,MAAM,MAAM,gBAAgB,GACxB;IACE,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,mBAAmB,CAAC;CACrC,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;IAC/B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAC;IAClC,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,mBAAmB,CAAC;IACxC,QAAQ,CAAC,KAAK,EAAE,oBAAoB,CAAC;CACtC,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;IAC/B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,oBAAoB,CAAC,GAAG,SAAS,CAAC;CAC1D,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,uBAAuB,CAAC;IACvC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,SAAS,uBAAuB,EAAE,CAAC;CACtD,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,sBAAsB,CAAC;IACtC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,YAAY,EAAE,SAAS,QAAQ,EAAE,CAAC;CAC5C,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,sBAAsB,CAAC;IACtC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,cAAc,GAAG,SAAS,CAAC;IAC5C,QAAQ,CAAC,SAAS,EAAE,iBAAiB,GAAG,SAAS,CAAC;IAClD,QAAQ,CAAC,YAAY,EAAE,oBAAoB,GAAG,SAAS,CAAC;IACxD,QAAQ,CAAC,WAAW,EAAE,mBAAmB,GAAG,SAAS,CAAC;IACtD,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,GAAG,SAAS,CAAC;IAChD,QAAQ,CAAC,cAAc,EAAE,QAAQ,CAAC;IAClC,QAAQ,CAAC,0BAA0B,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC1D,QAAQ,CAAC,4BAA4B,EAAE,QAAQ,GAAG,SAAS,CAAC;CAC7D,GACD;IAAE,QAAQ,CAAC,IAAI,EAAE,oBAAoB,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC;AAEpG;;;;;;GAMG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;CAC7B;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,eAAe,CAAC;AAExD;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,mBAAmB,EAAE,GAAG,SAAS,CAAC;IAC/D,QAAQ,CAAC,QAAQ,CAAC,EAAE,eAAe,GAAG,SAAS,CAAC;IAChD,QAAQ,CAAC,EAAE,CAAC,EAAE,gBAAgB,GAAG,SAAS,CAAC;IAC3C,QAAQ,CAAC,aAAa,CAAC,EAAE,iBAAiB,GAAG,SAAS,CAAC;CACxD;AAED;;;;GAIG;AACH,MAAM,MAAM,aAAa,GAAG,UAAU,GAAG,UAAU,GAAG,IAAI,CAAC;AAE3D;;;;;;;;;;GAUG;AACH,eAAO,MAAM,iBAAiB,aAM5B,CAAC"}
package/package.json ADDED
@@ -0,0 +1,72 @@
1
+ {
2
+ "name": "@forgeax/engine-rhi-debug",
3
+ "version": "0.0.0-dev.8d955ade1c79",
4
+ "private": false,
5
+ "type": "module",
6
+ "license": "Apache-2.0",
7
+ "sideEffects": false,
8
+ "description": "Single-file v7 RHI tape capture, FrameModel projection, deterministic fresh-backend replay, and structured AI-readable inspection for forgeax-engine.",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.mjs"
13
+ },
14
+ "./browser": {
15
+ "types": "./dist/browser.d.ts",
16
+ "import": "./dist/browser.mjs"
17
+ },
18
+ "./package.json": "./package.json"
19
+ },
20
+ "main": "./dist/index.mjs",
21
+ "types": "./dist/index.d.ts",
22
+ "files": [
23
+ "dist",
24
+ "src",
25
+ "README.md",
26
+ "LICENSE"
27
+ ],
28
+ "dependencies": {
29
+ "@forgeax/engine-rhi": "0.0.0-dev.8d955ade1c79",
30
+ "@forgeax/engine-types": "0.0.0-dev.8d955ade1c79",
31
+ "@noble/hashes": "^2.2.0",
32
+ "pako": "^1.0.11"
33
+ },
34
+ "devDependencies": {
35
+ "@forgeax/engine-rhi-null": "0.0.0-dev.8d955ade1c79",
36
+ "@types/node": "^20.14.0",
37
+ "@webgpu/types": "^0.1.71"
38
+ },
39
+ "peerDependencies": {
40
+ "@forgeax/engine-rhi-webgpu": "0.0.0-dev.8d955ade1c79",
41
+ "@forgeax/engine-rhi-wgpu": "0.0.0-dev.8d955ade1c79"
42
+ },
43
+ "forgeax": {
44
+ "metrics": {
45
+ "bundle-size": {
46
+ "enabled": true,
47
+ "path": "dist/index.mjs",
48
+ "compression": "gzip"
49
+ },
50
+ "fps": {
51
+ "enabled": false,
52
+ "reason": "debug instrumentation package, no hot render path"
53
+ },
54
+ "bench": {
55
+ "enabled": false,
56
+ "reason": "instrumentation package; bench focus stays on runtime/rhi"
57
+ },
58
+ "gate": {
59
+ "enabled": false,
60
+ "reason": "r12-lint runs at repo root via root package.json#scripts.r12-lint; not modelled as a per-package metric gate yet"
61
+ },
62
+ "spike-report": {
63
+ "enabled": false,
64
+ "reason": "not a spike package"
65
+ }
66
+ }
67
+ },
68
+ "scripts": {
69
+ "build": "tsup",
70
+ "test": "vitest run"
71
+ }
72
+ }
@@ -0,0 +1,268 @@
1
+ // biome-ignore-all lint/suspicious/noExplicitAny: getTape() returns Tape | RhiDebugError | undefined; existing self-contained tape tests always get Tape back, safe to narrow with any cast
2
+ // biome-ignore-all lint/style/noNonNullAssertion: test assertions on mock stubs verified by parent expect guards
3
+ // m3-3: bootstrap integration test — verify FORGEAX_ENGINE_RHI_DEBUG=1 wiring:
4
+ // wrap -> wrapCreateShaderModule -> onFrameEnd listener register -> draw -> frameMark.
5
+ //
6
+ // Tests the recorder integration at API level without a real GPU context.
7
+ // Uses stubs/mocks for the RHI backend; no real canvas or device.
8
+
9
+ import { describe, expect, it, vi } from 'vitest';
10
+ import { type CreateShaderModuleFn, wrap, wrapCreateShaderModule } from '../recorder';
11
+
12
+ // ---------------------------------------------------------------
13
+ // Minimal Result helpers (same shape as recorder.ts internal)
14
+ // ---------------------------------------------------------------
15
+
16
+ function rOk<T>(value: T) {
17
+ return { ok: true as const, value };
18
+ }
19
+
20
+ // ---------------------------------------------------------------
21
+ // Stub RhiInstance (mimics the shape wrap() expects)
22
+ // ---------------------------------------------------------------
23
+
24
+ function h(): any {
25
+ return {};
26
+ }
27
+
28
+ function stubRhiInstance(): { inst: any; requestAdapterSpy: any; createCmdEncRes: any } {
29
+ const writeBufferSpy = vi.fn(() => rOk(undefined));
30
+ const submitSpy = vi.fn(() => rOk(undefined));
31
+ const createBufferRes = vi.fn(() => rOk(h()));
32
+ const createTextureRes = vi.fn(() => rOk(h()));
33
+ const createTextureViewRes = vi.fn(() => rOk(h()));
34
+ const createSamplerRes = vi.fn(() => rOk(h()));
35
+ const createBGLRes = vi.fn(() => rOk(h()));
36
+ const createBGRes = vi.fn(() => rOk(h()));
37
+ const createLayoutRes = vi.fn(() => rOk(h()));
38
+ const createRPRes = vi.fn(() => rOk(h()));
39
+ const createCPRes = vi.fn(() => rOk(h()));
40
+ const createCmdEncRes = vi.fn(() =>
41
+ rOk({
42
+ beginRenderPass: vi.fn(() => ({
43
+ setPipeline: vi.fn(),
44
+ setVertexBuffer: vi.fn(),
45
+ setIndexBuffer: vi.fn(),
46
+ setBindGroup: vi.fn(),
47
+ draw: vi.fn(),
48
+ drawIndexed: vi.fn(),
49
+ end: vi.fn(),
50
+ setViewport: vi.fn(),
51
+ setScissorRect: vi.fn(),
52
+ setBlendConstant: vi.fn(),
53
+ setStencilReference: vi.fn(),
54
+ pushDebugGroup: vi.fn(),
55
+ popDebugGroup: vi.fn(),
56
+ insertDebugMarker: vi.fn(),
57
+ beginOcclusionQuery: vi.fn(),
58
+ endOcclusionQuery: vi.fn(),
59
+ executeBundles: vi.fn(),
60
+ })),
61
+ beginComputePass: vi.fn(() => ({
62
+ setPipeline: vi.fn(),
63
+ setBindGroup: vi.fn(),
64
+ dispatchWorkgroups: vi.fn(),
65
+ end: vi.fn(),
66
+ })),
67
+ copyBufferToBuffer: vi.fn(),
68
+ copyBufferToTexture: vi.fn(),
69
+ copyTextureToBuffer: vi.fn(),
70
+ copyTextureToTexture: vi.fn(),
71
+ clearBuffer: vi.fn(),
72
+ pushDebugGroup: vi.fn(),
73
+ popDebugGroup: vi.fn(),
74
+ insertDebugMarker: vi.fn(),
75
+ finish: vi.fn(() => rOk(h())),
76
+ resolveQuerySet: vi.fn(() => rOk(undefined)),
77
+ writeTimestamp: vi.fn(),
78
+ }),
79
+ );
80
+
81
+ const device = {
82
+ caps: { rgba16floatRenderable: false },
83
+ features: new Set(),
84
+ limits: {},
85
+ queue: {
86
+ writeBuffer: writeBufferSpy,
87
+ submit: submitSpy,
88
+ writeTexture: vi.fn(() => rOk(undefined)),
89
+ copyExternalImageToTexture: vi.fn(() => rOk(undefined)),
90
+ onSubmittedWorkDone: vi.fn(() => Promise.resolve(undefined)),
91
+ },
92
+ lost: new Promise(() => {}),
93
+ createBuffer: createBufferRes,
94
+ createTexture: createTextureRes,
95
+ createTextureView: createTextureViewRes,
96
+ createSampler: createSamplerRes,
97
+ createBindGroupLayout: createBGLRes,
98
+ createBindGroup: createBGRes,
99
+ createPipelineLayout: createLayoutRes,
100
+ createRenderPipeline: createRPRes,
101
+ createComputePipeline: createCPRes,
102
+ createCommandEncoder: createCmdEncRes,
103
+ createQuerySet: vi.fn(() => rOk(h())),
104
+ destroyBuffer: vi.fn(),
105
+ destroyTexture: vi.fn(),
106
+ };
107
+
108
+ const adapter = {
109
+ features: new Set(),
110
+ limits: {},
111
+ requestDevice: vi.fn(() => Promise.resolve(rOk(device))),
112
+ };
113
+
114
+ const requestAdapterSpy = vi.fn(() => Promise.resolve(rOk(adapter)));
115
+
116
+ return {
117
+ inst: { requestAdapter: requestAdapterSpy },
118
+ requestAdapterSpy,
119
+ createCmdEncRes,
120
+ };
121
+ }
122
+
123
+ describe('bootstrap integration (m3-3)', () => {
124
+ it('wrap -> wrapCreateShaderModule call order is correct', () => {
125
+ const { inst } = stubRhiInstance();
126
+
127
+ // Step 1: wrap(rhiInstance)
128
+ const debugInst = wrap(inst);
129
+
130
+ expect(debugInst.getState()).toBe('idle');
131
+
132
+ // Step 2: wrapCreateShaderModule
133
+ const originalFn: CreateShaderModuleFn = vi.fn((_device: any, _desc: any) =>
134
+ Promise.resolve(rOk(h())),
135
+ ) as unknown as CreateShaderModuleFn;
136
+
137
+ const wrappedFn = wrapCreateShaderModule(originalFn, debugInst);
138
+ expect(wrappedFn).toBeInstanceOf(Function);
139
+ });
140
+
141
+ it('arm + onFrameEnd produces frameMark event', () => {
142
+ const { inst } = stubRhiInstance();
143
+ const debugInst = wrap(inst);
144
+
145
+ // Arm for 1 frame
146
+ const armResult = debugInst.arm(1);
147
+ expect(armResult.ok).toBe(true);
148
+ expect(debugInst.getState()).toBe('armed');
149
+
150
+ // Fire onFrameEnd (simulates renderer._onFrameEnd callback)
151
+ debugInst.onFrameEnd();
152
+ expect(debugInst.getState()).toBe('idle'); // 1 frame complete -> finalizing -> idle
153
+
154
+ // Check tape events
155
+ const tape = debugInst.getTape() as any;
156
+ expect(tape).toBeDefined();
157
+ expect(tape?.events).toHaveLength(1);
158
+ expect(tape?.events[0]?.kind).toBe('frameMark');
159
+ });
160
+
161
+ it('onFrameEnd listener pattern: register -> draw -> fire', () => {
162
+ const { inst } = stubRhiInstance();
163
+ const debugInst = wrap(inst);
164
+
165
+ // Simulate the _onFrameEnd pattern: register a callback,
166
+ // fire it on frame boundary.
167
+ const listeners: Array<() => void> = [];
168
+ const registerOnFrameEnd = (cb: () => void): (() => void) => {
169
+ listeners.push(cb);
170
+ return () => {
171
+ const idx = listeners.indexOf(cb);
172
+ if (idx >= 0) listeners.splice(idx, 1);
173
+ };
174
+ };
175
+
176
+ // Arm the recorder
177
+ debugInst.arm(1);
178
+ expect(debugInst.getState()).toBe('armed');
179
+
180
+ // Register onFrameEnd callback
181
+ const unsub = registerOnFrameEnd(() => debugInst.onFrameEnd());
182
+
183
+ // Simulate draw -> fire onFrameEnd
184
+ for (const fn of listeners) fn();
185
+
186
+ // After frame-end, recorder should have transitioned
187
+ expect(debugInst.getState()).toBe('idle');
188
+
189
+ const tape = debugInst.getTape() as any;
190
+ expect(tape).toBeDefined();
191
+ expect(tape?.events).toHaveLength(1);
192
+ expect(tape?.events[0]?.kind).toBe('frameMark');
193
+
194
+ // Unsubscribe should work
195
+ unsub();
196
+ expect(listeners).toHaveLength(0);
197
+ });
198
+
199
+ it('bootstrap events go into frame-0 before frameMark', () => {
200
+ const { inst } = stubRhiInstance();
201
+ const debugInst = wrap(inst);
202
+
203
+ // Arm for 1 frame
204
+ debugInst.arm(1);
205
+
206
+ // Simulate a bootstrap createBuffer call (via proxy chain)
207
+ // The proxy intercepts at requestAdapter -> requestDevice level,
208
+ // so we simulate by accessing the internal proxy chain.
209
+ // For this test, we verify the frameMark behavior directly.
210
+ debugInst.onFrameEnd();
211
+
212
+ const tape = debugInst.getTape() as any;
213
+ expect(tape).toBeDefined();
214
+
215
+ // frameMark should be the last event (or the only event if no RHI calls)
216
+ const frameMarkEvents = tape!.events.filter((e: any) => e.kind === 'frameMark');
217
+ expect(frameMarkEvents).toHaveLength(1);
218
+ expect(frameMarkEvents[0]!.kind).toBe('frameMark');
219
+ const first = frameMarkEvents[0]!;
220
+ if (first && 'frameIdx' in first) {
221
+ expect(first?.frameIdx).toBe(0);
222
+ }
223
+ });
224
+
225
+ it('_onFrameEnd fires every frame even when not armed (no recording)', () => {
226
+ const { inst } = stubRhiInstance();
227
+ const debugInst = wrap(inst);
228
+
229
+ // Not armed — onFrameEnd should increment frameIdx but not record
230
+ const state1 = debugInst.getState();
231
+ expect(state1).toBe('idle');
232
+
233
+ debugInst.onFrameEnd();
234
+ expect(debugInst.getState()).toBe('idle');
235
+
236
+ // No tape should be produced (nothing recorded)
237
+ const tape = debugInst.getTape() as any;
238
+ expect(tape).toBeUndefined();
239
+ });
240
+
241
+ it('wrap + extras (createShaderModule via Channel-1 pattern)', async () => {
242
+ const { inst } = stubRhiInstance();
243
+ const debugInst = wrap(inst);
244
+
245
+ // Simulate the Channel-1 probe pattern: attach createShaderModule as an extra
246
+ // property on the wrapped instance (as done in createApp m3-1).
247
+ const realCsm: CreateShaderModuleFn = vi.fn((_device: any, _desc: any) =>
248
+ Promise.resolve(rOk(h())),
249
+ ) as unknown as CreateShaderModuleFn;
250
+ const wrappedCsm = wrapCreateShaderModule(realCsm, debugInst);
251
+
252
+ const extras = debugInst as unknown as Record<string, unknown>;
253
+ extras.createShaderModule = wrappedCsm;
254
+
255
+ // Arm the recorder
256
+ debugInst.arm(1);
257
+
258
+ // Call the wrapped createShaderModule (as if from inside createRenderer)
259
+ const result = await wrappedCsm(h() as never, { code: 'fn main() {}', label: 'test' });
260
+ expect(result.ok).toBe(true);
261
+
262
+ // The tape should contain a createShaderModule event
263
+ const tape = debugInst.getTape() as any;
264
+ expect(tape).toBeDefined();
265
+ const csmEvents = tape?.events.filter((e: any) => e.kind === 'createShaderModule');
266
+ expect(csmEvents).toHaveLength(1);
267
+ });
268
+ });
@@ -0,0 +1,154 @@
1
+ import { spawnSync } from 'node:child_process';
2
+ // @perf-budget-skip: intentional repository-wide inventory subprocess gate.
3
+ import { mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from 'node:fs';
4
+ import { tmpdir } from 'node:os';
5
+ import { join, resolve } from 'node:path';
6
+ import { fileURLToPath } from 'node:url';
7
+ import { describe, expect, it } from 'vitest';
8
+
9
+ const repoRoot = resolve(fileURLToPath(new URL('../../../../', import.meta.url)));
10
+ const inventoryScript = join(repoRoot, 'apps/shared/scripts/rhi-debug-consumer-inventory.mjs');
11
+ const oosInventoryScript = join(repoRoot, 'apps/shared/scripts/rhi-debug-oos-inventory.mjs');
12
+
13
+ const deletedFieldConsumers = [
14
+ 'apps/shared/scripts/rhi-debug-browser-admission.mjs',
15
+ 'apps/shared/scripts/rhi-debug-verify.mjs',
16
+ 'apps/learn-render/4.advanced-opengl/5.framebuffers/scripts/smoke-browser-live.mjs',
17
+ 'apps/rhi-debug-viewer/src/viewer-model.ts',
18
+ 'apps/rhi-debug-viewer/scripts/smoke-browser.mjs',
19
+ 'apps/rhi-debug-viewer/scripts/smoke-browser-no-webgpu.mjs',
20
+ 'packages/rhi-debug/src/__tests__/e2e.browser.test.ts',
21
+ ];
22
+
23
+ type ChannelReport = {
24
+ totalMatches: number;
25
+ scannedFileCount: number;
26
+ matchedFileCount: number;
27
+ };
28
+
29
+ type InventoryReport = {
30
+ schemaVersion: number;
31
+ channels: {
32
+ readonly jsonSchema: ChannelReport;
33
+ readonly tsModule: ChannelReport;
34
+ readonly typesErasedScript: ChannelReport;
35
+ };
36
+ baseline: {
37
+ scannedFileCount: number;
38
+ matchedFileCount: number;
39
+ totalMatches: number;
40
+ };
41
+ };
42
+
43
+ function runInventory(root: string): { status: number | null; report: InventoryReport } {
44
+ const result = spawnSync(process.execPath, [inventoryScript, '--root', root, '--json'], {
45
+ encoding: 'utf8',
46
+ });
47
+ return {
48
+ status: result.status,
49
+ report: JSON.parse(result.stdout) as InventoryReport,
50
+ };
51
+ }
52
+
53
+ describe('rhi-debug consumer inventory', () => {
54
+ it('reports all nine OOS boundaries and retained owners as machine-readable pass rows', () => {
55
+ const result = spawnSync(process.execPath, [oosInventoryScript, '--json', '--assert-pass'], {
56
+ cwd: repoRoot,
57
+ encoding: 'utf8',
58
+ });
59
+ expect(result.status).toBe(0);
60
+ const report = JSON.parse(result.stdout) as {
61
+ status: string;
62
+ oos: readonly { id: string; status: string }[];
63
+ retainedCore: readonly { present: boolean }[];
64
+ };
65
+ expect(report.status).toBe('pass');
66
+ expect(report.oos.map((entry) => entry.id)).toEqual([
67
+ 'OOS-1',
68
+ 'OOS-2',
69
+ 'OOS-3',
70
+ 'OOS-4',
71
+ 'OOS-5',
72
+ 'OOS-6',
73
+ 'OOS-7',
74
+ 'OOS-8',
75
+ 'OOS-9',
76
+ ]);
77
+ expect(report.oos.every((entry) => entry.status === 'pass')).toBe(true);
78
+ expect(report.retainedCore.every((entry) => entry.present)).toBe(true);
79
+ });
80
+
81
+ it('enumerates TS, erased-script, and JSON/schema consumer channels', () => {
82
+ const fixture = mkdtempSync(join(tmpdir(), 'forgeax-rhi-debug-consumers-'));
83
+ try {
84
+ mkdirSync(join(fixture, 'packages', 'rhi-debug', 'src'), { recursive: true });
85
+ mkdirSync(join(fixture, 'apps', 'learn-render', 'demo', 'scripts'), { recursive: true });
86
+ mkdirSync(join(fixture, 'apps', 'shared', 'scripts'), { recursive: true });
87
+ mkdirSync(join(fixture, 'apps', 'rhi-debug-viewer', 'fixtures'), { recursive: true });
88
+ writeFileSync(
89
+ join(fixture, 'packages', 'rhi-debug', 'src', 'consumer.ts'),
90
+ `export const ${'draw' + 'Idx'} = 1;\n`,
91
+ );
92
+ writeFileSync(
93
+ join(fixture, 'apps', 'shared', 'scripts', 'rhi-debug-verify.mjs'),
94
+ `const ${'report' + 'Path'} = "${'frame-0.' + 'report.json'}";\n`,
95
+ );
96
+ writeFileSync(
97
+ join(fixture, 'apps', 'rhi-debug-viewer', 'fixtures', 'fixture.mjs'),
98
+ `const ${'tape' + 'Path'} = "frame-0.tape";\n`,
99
+ );
100
+ writeFileSync(
101
+ join(fixture, 'apps', 'learn-render', 'demo', 'scripts', 'smoke-browser-live.mjs'),
102
+ 'const capture = await captureFrame(1);\n',
103
+ );
104
+ writeFileSync(
105
+ join(fixture, 'packages', 'rhi-debug', 'package.json'),
106
+ JSON.stringify({ command: 'capture-' + 'frame', artifactKind: 'paired-' + 'differential' }),
107
+ );
108
+
109
+ const result = runInventory(fixture);
110
+
111
+ expect(result.status).toBe(0);
112
+ expect(Object.keys(result.report.channels ?? {}).sort()).toEqual([
113
+ 'jsonSchema',
114
+ 'tsModule',
115
+ 'typesErasedScript',
116
+ ]);
117
+ expect(result.report.channels.tsModule.totalMatches).toBeGreaterThan(0);
118
+ expect(result.report.channels.typesErasedScript.totalMatches).toBeGreaterThan(0);
119
+ expect(result.report.channels.typesErasedScript.totalMatches).toBeGreaterThan(1);
120
+ expect(result.report.channels.jsonSchema.totalMatches).toBeGreaterThan(0);
121
+ expect(result.report.baseline.totalMatches).toBe(
122
+ result.report.channels.tsModule.totalMatches +
123
+ result.report.channels.typesErasedScript.totalMatches +
124
+ result.report.channels.jsonSchema.totalMatches,
125
+ );
126
+ } finally {
127
+ rmSync(fixture, { recursive: true, force: true });
128
+ }
129
+ });
130
+
131
+ it('reports a self-consistent migration baseline for the current checkout', () => {
132
+ const result = runInventory(repoRoot);
133
+
134
+ expect(result.status).toBe(0);
135
+ expect(result.report.schemaVersion).toBe(1);
136
+ expect(result.report.baseline.scannedFileCount).toBeGreaterThan(0);
137
+ expect(result.report.baseline.totalMatches).toBe(
138
+ Object.values(result.report.channels).reduce(
139
+ (total, channel) => total + channel.totalMatches,
140
+ 0,
141
+ ),
142
+ );
143
+ });
144
+
145
+ it('finds no deleted FrameModel fields across the three consumer channels', () => {
146
+ const deleted =
147
+ /(?:\bmodel\.(?:tree|draws|meta|resourceTable|resourceEntries|totalDraws)|buildTapeIndex)/;
148
+ const matches = deletedFieldConsumers.flatMap((relativePath) => {
149
+ const source = readFileSync(join(repoRoot, relativePath), 'utf8');
150
+ return deleted.test(source) ? [relativePath] : [];
151
+ });
152
+ expect(matches).toEqual([]);
153
+ });
154
+ });
@@ -0,0 +1,117 @@
1
+ /**
2
+ * COPY_SRC usage-validity dawn e2e (M3 / w17).
3
+ *
4
+ * Proves AC-10 / R5: after the recorder proxy promotes COPY_SRC (0x01) onto
5
+ * every createBuffer / createTexture usage (w12), each resource type still
6
+ * creates successfully on a real dawn-node device. This is the usage-validity
7
+ * floor for the full-table frame-header snapshot (snapshotResource needs every
8
+ * resource to be a valid copyBufferToBuffer / copyTextureToBuffer source).
9
+ *
10
+ * Scope per OOS-7: usage-validity only (creation succeeds). Pipeline-specific
11
+ * COPY_SRC side effects (internal layout / alignment shifts) are Phase 2 — not
12
+ * asserted here. Replay pixel output is M4's concern, not this test's.
13
+ */
14
+
15
+ /// <reference types="@webgpu/types" />
16
+
17
+ // biome-ignore-all lint/suspicious/noExplicitAny: dawn-node e2e constructs RHI surfaces (GPU device/buffer/texture brands, WebGPU descriptor types) whose structural shapes require any casts at the test boundary; dawn-node opaque GPU types cannot be imported at the type level
18
+
19
+ import type { RhiDevice, RhiInstance } from '@forgeax/engine-rhi';
20
+ import { describe, expect, it } from 'vitest';
21
+ import { type CreateShaderModuleFn, wrap } from '../recorder';
22
+
23
+ interface DawnPack {
24
+ readonly rhi: RhiInstance;
25
+ readonly createShaderModule: CreateShaderModuleFn;
26
+ }
27
+
28
+ async function loadDawnRhi(): Promise<DawnPack | undefined> {
29
+ try {
30
+ return (await import('@forgeax/engine-rhi-webgpu')) as unknown as DawnPack;
31
+ } catch {
32
+ return undefined;
33
+ }
34
+ }
35
+
36
+ const SKIP_DAWN = process.env.FORGEAX_SKIP_DAWN === '1';
37
+
38
+ async function acquireDevice(pack: DawnPack): Promise<RhiDevice> {
39
+ const debugInst = wrap(pack.rhi);
40
+ const adapterRes = await debugInst.requestAdapter();
41
+ if (!adapterRes.ok) throw new Error('adapter');
42
+ const devRes = await adapterRes.value.requestDevice();
43
+ if (!devRes.ok) throw new Error('device');
44
+ return devRes.value;
45
+ }
46
+
47
+ // GPUBufferUsage.COPY_SRC === GPUTextureUsage.COPY_SRC === 0x01.
48
+ // COPY_SRC has DIFFERENT bit values for buffers vs textures:
49
+ // GPUBufferUsage.COPY_SRC === 0x04 (0x01 is MAP_READ for buffers)
50
+ // GPUTextureUsage.COPY_SRC === 0x01
51
+ const BUFFER_COPY_SRC = 0x04;
52
+ const TEXTURE_COPY_SRC = 0x01;
53
+ // GPUBufferUsage.VERTEX === 0x20; GPUTextureUsage.TEXTURE_BINDING === 0x04.
54
+ const VERTEX = 0x20;
55
+ const TEXTURE_BINDING = 0x04;
56
+
57
+ describe.skipIf(SKIP_DAWN)('COPY_SRC usage-validity (w17, dawn)', () => {
58
+ it('createBuffer with COPY_SRC succeeds', async () => {
59
+ const pack = await loadDawnRhi();
60
+ if (!pack) return;
61
+ const device = await acquireDevice(pack);
62
+
63
+ const res = device.createBuffer({ size: 256, usage: VERTEX | BUFFER_COPY_SRC });
64
+ expect(res.ok).toBe(true);
65
+ if (res.ok) expect(res.value).not.toBeNull();
66
+ });
67
+
68
+ it('createTexture (2D) with COPY_SRC succeeds', async () => {
69
+ const pack = await loadDawnRhi();
70
+ if (!pack) return;
71
+ const device = await acquireDevice(pack);
72
+
73
+ const res = device.createTexture({
74
+ size: { width: 16, height: 16, depthOrArrayLayers: 1 },
75
+ format: 'rgba8unorm' as GPUTextureFormat,
76
+ usage: TEXTURE_BINDING | TEXTURE_COPY_SRC,
77
+ });
78
+ expect(res.ok).toBe(true);
79
+ if (res.ok) expect(res.value).not.toBeNull();
80
+ });
81
+
82
+ it('createTexture (3D, depthOrArrayLayers > 1) with COPY_SRC succeeds', async () => {
83
+ const pack = await loadDawnRhi();
84
+ if (!pack) return;
85
+ const device = await acquireDevice(pack);
86
+
87
+ const res = device.createTexture({
88
+ size: { width: 8, height: 8, depthOrArrayLayers: 4 },
89
+ dimension: '3d' as GPUTextureDimension,
90
+ format: 'rgba8unorm' as GPUTextureFormat,
91
+ usage: TEXTURE_BINDING | TEXTURE_COPY_SRC,
92
+ });
93
+ expect(res.ok).toBe(true);
94
+ if (res.ok) expect(res.value).not.toBeNull();
95
+ });
96
+
97
+ it('the recorder proxy promotes COPY_SRC even when the caller omits it', async () => {
98
+ const pack = await loadDawnRhi();
99
+ if (!pack) return;
100
+ const debugInst = wrap(pack.rhi);
101
+ const adapterRes = await debugInst.requestAdapter();
102
+ if (!adapterRes.ok) throw new Error('adapter');
103
+ const devRes = await adapterRes.value.requestDevice();
104
+ if (!devRes.ok) throw new Error('device');
105
+ const device = devRes.value;
106
+
107
+ // Caller omits COPY_SRC; the proxy must promote it (w12) so the live
108
+ // resource is a valid copy source and the descriptor entry records it.
109
+ const res = device.createBuffer({ size: 128, usage: VERTEX });
110
+ expect(res.ok).toBe(true);
111
+
112
+ const table = debugInst.descriptorTable();
113
+ const entry = [...table.values()][0];
114
+ if (entry === undefined) throw new Error('descriptor entry missing');
115
+ expect((entry.usage & BUFFER_COPY_SRC) !== 0).toBe(true);
116
+ });
117
+ });