@forgeax/engine-rhi-debug 0.1.2

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 (231) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +139 -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__/recorder-bootstrap.unit.test.d.ts +2 -0
  43. package/dist/__tests__/recorder-bootstrap.unit.test.d.ts.map +1 -0
  44. package/dist/__tests__/recorder-budget.unit.test.d.ts +2 -0
  45. package/dist/__tests__/recorder-budget.unit.test.d.ts.map +1 -0
  46. package/dist/__tests__/recorder-fail-fast.unit.test.d.ts +2 -0
  47. package/dist/__tests__/recorder-fail-fast.unit.test.d.ts.map +1 -0
  48. package/dist/__tests__/recorder-lifecycle.unit.test.d.ts +2 -0
  49. package/dist/__tests__/recorder-lifecycle.unit.test.d.ts.map +1 -0
  50. package/dist/__tests__/recorder-push-event.unit.test.d.ts +2 -0
  51. package/dist/__tests__/recorder-push-event.unit.test.d.ts.map +1 -0
  52. package/dist/__tests__/recorder-session.integration.test.d.ts +2 -0
  53. package/dist/__tests__/recorder-session.integration.test.d.ts.map +1 -0
  54. package/dist/__tests__/recorder-session.unit.test.d.ts +2 -0
  55. package/dist/__tests__/recorder-session.unit.test.d.ts.map +1 -0
  56. package/dist/__tests__/recorder-steady-frame.dawn.test.d.ts +2 -0
  57. package/dist/__tests__/recorder-steady-frame.dawn.test.d.ts.map +1 -0
  58. package/dist/__tests__/replay-fail-fast.unit.test.d.ts +2 -0
  59. package/dist/__tests__/replay-fail-fast.unit.test.d.ts.map +1 -0
  60. package/dist/__tests__/replay-session.dawn.test.d.ts +2 -0
  61. package/dist/__tests__/replay-session.dawn.test.d.ts.map +1 -0
  62. package/dist/__tests__/replay-session.test-d.d.ts +2 -0
  63. package/dist/__tests__/replay-session.test-d.d.ts.map +1 -0
  64. package/dist/__tests__/replay-session.unit.test.d.ts +2 -0
  65. package/dist/__tests__/replay-session.unit.test.d.ts.map +1 -0
  66. package/dist/__tests__/resolve-texture-descriptor.unit.test.d.ts +2 -0
  67. package/dist/__tests__/resolve-texture-descriptor.unit.test.d.ts.map +1 -0
  68. package/dist/__tests__/resource-lifecycle.unit.test.d.ts +2 -0
  69. package/dist/__tests__/resource-lifecycle.unit.test.d.ts.map +1 -0
  70. package/dist/__tests__/rhi-debug-fresh-replay.dawn.test.d.ts +2 -0
  71. package/dist/__tests__/rhi-debug-fresh-replay.dawn.test.d.ts.map +1 -0
  72. package/dist/__tests__/tape-index.unit.test.d.ts +2 -0
  73. package/dist/__tests__/tape-index.unit.test.d.ts.map +1 -0
  74. package/dist/__tests__/tape-v7-invalid.unit.test.d.ts +2 -0
  75. package/dist/__tests__/tape-v7-invalid.unit.test.d.ts.map +1 -0
  76. package/dist/__tests__/tape-v7-roundtrip.unit.test.d.ts +2 -0
  77. package/dist/__tests__/tape-v7-roundtrip.unit.test.d.ts.map +1 -0
  78. package/dist/__tests__/tape-v7-version.unit.test.d.ts +2 -0
  79. package/dist/__tests__/tape-v7-version.unit.test.d.ts.map +1 -0
  80. package/dist/__tests__/tree-shake.unit.test.d.ts +2 -0
  81. package/dist/__tests__/tree-shake.unit.test.d.ts.map +1 -0
  82. package/dist/__tests__/types.test.d.ts +2 -0
  83. package/dist/__tests__/types.test.d.ts.map +1 -0
  84. package/dist/browser.d.ts +45 -0
  85. package/dist/browser.d.ts.map +1 -0
  86. package/dist/browser.mjs +83 -0
  87. package/dist/browser.mjs.map +1 -0
  88. package/dist/errors.d.ts +85 -0
  89. package/dist/errors.d.ts.map +1 -0
  90. package/dist/frame-model.d.ts +126 -0
  91. package/dist/frame-model.d.ts.map +1 -0
  92. package/dist/index.d.ts +16 -0
  93. package/dist/index.d.ts.map +1 -0
  94. package/dist/index.mjs +5810 -0
  95. package/dist/index.mjs.map +1 -0
  96. package/dist/protocol/codec.d.ts +6 -0
  97. package/dist/protocol/codec.d.ts.map +1 -0
  98. package/dist/protocol/event-semantics.d.ts +15 -0
  99. package/dist/protocol/event-semantics.d.ts.map +1 -0
  100. package/dist/protocol/tape-index.d.ts +30 -0
  101. package/dist/protocol/tape-index.d.ts.map +1 -0
  102. package/dist/protocol/types.d.ts +44 -0
  103. package/dist/protocol/types.d.ts.map +1 -0
  104. package/dist/protocol/validation.d.ts +7 -0
  105. package/dist/protocol/validation.d.ts.map +1 -0
  106. package/dist/readback.d.ts +156 -0
  107. package/dist/readback.d.ts.map +1 -0
  108. package/dist/recorder/assemble.d.ts +11 -0
  109. package/dist/recorder/assemble.d.ts.map +1 -0
  110. package/dist/recorder/closure.d.ts +39 -0
  111. package/dist/recorder/closure.d.ts.map +1 -0
  112. package/dist/recorder/core.d.ts +296 -0
  113. package/dist/recorder/core.d.ts.map +1 -0
  114. package/dist/recorder/device.d.ts +4 -0
  115. package/dist/recorder/device.d.ts.map +1 -0
  116. package/dist/recorder/encoder.d.ts +5 -0
  117. package/dist/recorder/encoder.d.ts.map +1 -0
  118. package/dist/recorder/lifecycle.d.ts +20 -0
  119. package/dist/recorder/lifecycle.d.ts.map +1 -0
  120. package/dist/recorder/pass.d.ts +6 -0
  121. package/dist/recorder/pass.d.ts.map +1 -0
  122. package/dist/recorder/proxy.d.ts +19 -0
  123. package/dist/recorder/proxy.d.ts.map +1 -0
  124. package/dist/recorder/queue.d.ts +4 -0
  125. package/dist/recorder/queue.d.ts.map +1 -0
  126. package/dist/recorder/resource-registry.d.ts +15 -0
  127. package/dist/recorder/resource-registry.d.ts.map +1 -0
  128. package/dist/recorder/session.d.ts +25 -0
  129. package/dist/recorder/session.d.ts.map +1 -0
  130. package/dist/recorder/shader.d.ts +3 -0
  131. package/dist/recorder/shader.d.ts.map +1 -0
  132. package/dist/recorder/snapshot.d.ts +10 -0
  133. package/dist/recorder/snapshot.d.ts.map +1 -0
  134. package/dist/recorder/wrap.d.ts +4 -0
  135. package/dist/recorder/wrap.d.ts.map +1 -0
  136. package/dist/recorder.d.ts +7 -0
  137. package/dist/recorder.d.ts.map +1 -0
  138. package/dist/replay/execute-support.d.ts +33 -0
  139. package/dist/replay/execute-support.d.ts.map +1 -0
  140. package/dist/replay/execute.d.ts +18 -0
  141. package/dist/replay/execute.d.ts.map +1 -0
  142. package/dist/replay/readback.d.ts +25 -0
  143. package/dist/replay/readback.d.ts.map +1 -0
  144. package/dist/replay/resources.d.ts +57 -0
  145. package/dist/replay/resources.d.ts.map +1 -0
  146. package/dist/replay/session.d.ts +32 -0
  147. package/dist/replay/session.d.ts.map +1 -0
  148. package/dist/replay/texture-format.d.ts +21 -0
  149. package/dist/replay/texture-format.d.ts.map +1 -0
  150. package/dist/texel-decode.d.ts +34 -0
  151. package/dist/texel-decode.d.ts.map +1 -0
  152. package/dist/texel-layout.d.ts +76 -0
  153. package/dist/texel-layout.d.ts.map +1 -0
  154. package/dist/types.d.ts +704 -0
  155. package/dist/types.d.ts.map +1 -0
  156. package/package.json +72 -0
  157. package/src/__tests__/bootstrap-integration.test.ts +268 -0
  158. package/src/__tests__/consumer-inventory.unit.test.ts +106 -0
  159. package/src/__tests__/copy-src-usage-validity.dawn.test.ts +117 -0
  160. package/src/__tests__/coverage-invariant.test-d.ts +115 -0
  161. package/src/__tests__/coverage-invariant.unit.test.ts +45 -0
  162. package/src/__tests__/e2e.browser.test.ts +234 -0
  163. package/src/__tests__/error-code-narrowing.test-d.ts +32 -0
  164. package/src/__tests__/errors-v7.test-d.ts +19 -0
  165. package/src/__tests__/errors-v7.unit.test.ts +15 -0
  166. package/src/__tests__/errors.unit.test.ts +83 -0
  167. package/src/__tests__/event-semantics-coverage.unit.test.ts +22 -0
  168. package/src/__tests__/format-info.unit.test.ts +85 -0
  169. package/src/__tests__/frame-model-parity.test-d.ts +8 -0
  170. package/src/__tests__/frame-model-parity.unit.test.ts +38 -0
  171. package/src/__tests__/guard-gates.test.ts +144 -0
  172. package/src/__tests__/public-surface.integration.test.ts +30 -0
  173. package/src/__tests__/readback-fault-cleanup.unit.test.ts +66 -0
  174. package/src/__tests__/readback-format-matrix.dawn.test.ts +155 -0
  175. package/src/__tests__/readback-format-matrix.unit.test.ts +96 -0
  176. package/src/__tests__/recorder-bootstrap.unit.test.ts +302 -0
  177. package/src/__tests__/recorder-budget.unit.test.ts +42 -0
  178. package/src/__tests__/recorder-fail-fast.unit.test.ts +434 -0
  179. package/src/__tests__/recorder-lifecycle.unit.test.ts +42 -0
  180. package/src/__tests__/recorder-push-event.unit.test.ts +573 -0
  181. package/src/__tests__/recorder-session.integration.test.ts +32 -0
  182. package/src/__tests__/recorder-session.unit.test.ts +63 -0
  183. package/src/__tests__/recorder-steady-frame.dawn.test.ts +52 -0
  184. package/src/__tests__/replay-fail-fast.unit.test.ts +143 -0
  185. package/src/__tests__/replay-session.dawn.test.ts +217 -0
  186. package/src/__tests__/replay-session.test-d.ts +21 -0
  187. package/src/__tests__/replay-session.unit.test.ts +155 -0
  188. package/src/__tests__/resolve-texture-descriptor.unit.test.ts +144 -0
  189. package/src/__tests__/resource-lifecycle.unit.test.ts +114 -0
  190. package/src/__tests__/rhi-debug-fresh-replay.dawn.test.ts +176 -0
  191. package/src/__tests__/tape-index.unit.test.ts +53 -0
  192. package/src/__tests__/tape-v7-invalid.unit.test.ts +45 -0
  193. package/src/__tests__/tape-v7-roundtrip.unit.test.ts +66 -0
  194. package/src/__tests__/tape-v7-version.unit.test.ts +13 -0
  195. package/src/__tests__/tree-shake.unit.test.ts +127 -0
  196. package/src/__tests__/types.test.ts +257 -0
  197. package/src/browser.ts +146 -0
  198. package/src/errors.ts +173 -0
  199. package/src/frame-model.ts +455 -0
  200. package/src/index.ts +85 -0
  201. package/src/pako.d.ts +8 -0
  202. package/src/protocol/codec.ts +220 -0
  203. package/src/protocol/event-semantics.ts +180 -0
  204. package/src/protocol/tape-index.ts +120 -0
  205. package/src/protocol/types.ts +60 -0
  206. package/src/protocol/validation.ts +173 -0
  207. package/src/readback.ts +804 -0
  208. package/src/recorder/assemble.ts +192 -0
  209. package/src/recorder/closure.ts +408 -0
  210. package/src/recorder/core.ts +587 -0
  211. package/src/recorder/device.ts +456 -0
  212. package/src/recorder/encoder.ts +234 -0
  213. package/src/recorder/lifecycle.ts +847 -0
  214. package/src/recorder/pass.ts +241 -0
  215. package/src/recorder/proxy.ts +59 -0
  216. package/src/recorder/queue.ts +109 -0
  217. package/src/recorder/resource-registry.ts +53 -0
  218. package/src/recorder/session.ts +152 -0
  219. package/src/recorder/shader.ts +47 -0
  220. package/src/recorder/snapshot.ts +38 -0
  221. package/src/recorder/wrap.ts +157 -0
  222. package/src/recorder.ts +15 -0
  223. package/src/replay/execute-support.ts +243 -0
  224. package/src/replay/execute.ts +870 -0
  225. package/src/replay/readback.ts +583 -0
  226. package/src/replay/resources.ts +154 -0
  227. package/src/replay/session.ts +464 -0
  228. package/src/replay/texture-format.ts +99 -0
  229. package/src/texel-decode.ts +255 -0
  230. package/src/texel-layout.ts +324 -0
  231. package/src/types.ts +864 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/errors.ts","../src/protocol/event-semantics.ts","../src/protocol/tape-index.ts","../src/texel-layout.ts","../src/frame-model.ts","../src/protocol/types.ts","../src/protocol/validation.ts","../src/protocol/codec.ts","../src/readback.ts","../src/recorder/assemble.ts","../src/recorder/closure.ts","../src/recorder/core.ts","../src/recorder/shader.ts","../src/recorder/pass.ts","../src/recorder/encoder.ts","../src/recorder/queue.ts","../src/recorder/device.ts","../src/recorder/lifecycle.ts","../src/recorder/wrap.ts","../src/recorder/proxy.ts","../src/recorder/resource-registry.ts","../src/recorder/snapshot.ts","../src/recorder/session.ts","../src/replay/execute-support.ts","../src/replay/texture-format.ts","../src/replay/execute.ts","../src/replay/readback.ts","../src/replay/resources.ts","../src/replay/session.ts","../src/texel-decode.ts"],"names":["blob","ok","err","result","bytesToHex","sha256","makeErr","makeOk","estimateBytes","bytesPerTexel","COPY_DST_MAP_READ","createShaderModule","stringField","bytes","index"],"mappings":"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","file":"index.mjs","sourcesContent":["// @forgeax/engine-rhi-debug/src/errors -- one closed core error union.\n\n/// <reference types=\"@webgpu/types\" />\n\n/** The only error vocabulary crossing the RHI-debug core boundary. */\nexport type RhiDebugErrorCode =\n | 'capture-unavailable'\n | 'capture-busy'\n | 'capture-snapshot-failed'\n | 'capture-timeout'\n | 'tape-invalid'\n | 'tape-version-unsupported'\n | 'replay-capability-mismatch'\n | 'replay-event-failed'\n | 'replay-position-invalid'\n | 'readback-failed'\n | 'readback-unsupported';\n\nexport type CaptureStage = 'capture' | 'snapshot';\n\nexport interface CaptureFailureDetail {\n readonly stage: CaptureStage;\n readonly cause: string;\n readonly handleId?: string;\n readonly resourceKind?: 'buffer' | 'texture';\n}\n\nexport interface CaptureTimeoutDetail {\n readonly stage: 'snapshot';\n readonly cause: string;\n readonly timeoutMs: number;\n readonly progress?: {\n readonly snapshotStage: 'queue-drain' | 'resource-readback';\n readonly totalResources: number;\n readonly completedResources: number;\n readonly skippedResources: number;\n readonly currentHandleId: string | null;\n readonly currentKind: 'buffer' | 'texture' | null;\n readonly currentSizeBytes: number | null;\n readonly elapsedMs: number;\n };\n}\n\nexport interface TapeFailureDetail {\n readonly stage: 'decode' | 'validate';\n readonly cause: string;\n readonly handleId?: string;\n readonly eventIndex?: number;\n}\n\nexport interface TapeVersionDetail {\n readonly foundVersion: number;\n readonly expectedVersion: number;\n}\n\nexport interface ReplayCapabilityFailureDetail {\n readonly stage: 'replay';\n readonly cause: string;\n}\n\nexport interface ReplayEventFailureDetail {\n readonly eventIndex: number;\n readonly kind: string;\n readonly stage: string;\n readonly cause: string;\n}\n\nexport interface ReplayPositionDetail {\n readonly requested: number;\n readonly available: number;\n}\n\nexport interface ReadbackFailureDetail {\n readonly stage: 'readback';\n readonly cause: string;\n readonly phase?: 'copy' | 'map';\n}\n\nexport interface ReadbackUnsupportedDetail {\n readonly stage: 'readback';\n readonly resourceId?: string;\n readonly format?: string;\n readonly reason: string;\n}\n\ntype RhiDebugDetailByCode = {\n 'capture-unavailable': CaptureFailureDetail;\n 'capture-busy': CaptureFailureDetail;\n 'capture-snapshot-failed': CaptureFailureDetail;\n 'capture-timeout': CaptureTimeoutDetail;\n 'tape-invalid': TapeFailureDetail;\n 'tape-version-unsupported': TapeVersionDetail;\n 'replay-capability-mismatch': ReplayCapabilityFailureDetail;\n 'replay-event-failed': ReplayEventFailureDetail;\n 'replay-position-invalid': ReplayPositionDetail;\n 'readback-failed': ReadbackFailureDetail;\n 'readback-unsupported': ReadbackUnsupportedDetail;\n};\n\nexport type RhiDebugErrorDetail = RhiDebugDetailByCode[RhiDebugErrorCode];\n\nexport type RhiDebugErrorFor<C extends RhiDebugErrorCode> = {\n readonly code: C;\n readonly expected: string;\n readonly hint: string;\n readonly detail: RhiDebugDetailByCode[C];\n};\n\nexport type RhiDebugError = {\n [C in RhiDebugErrorCode]: RhiDebugErrorFor<C>;\n}[RhiDebugErrorCode];\n\nconst VERSION_HINT =\n 'use the source revision/tool that produced this tape, or capture again on the current revision';\n\nexport function createRhiDebugError<C extends RhiDebugErrorCode>(\n code: C,\n detail: RhiDebugDetailByCode[C],\n): RhiDebugErrorFor<C> {\n return {\n code,\n expected: expectedFor(code),\n hint: recoveryHint(code),\n detail,\n };\n}\n\nfunction expectedFor(code: RhiDebugErrorCode): string {\n switch (code) {\n case 'capture-unavailable':\n case 'capture-busy':\n case 'capture-snapshot-failed':\n case 'capture-timeout':\n return 'a capture capability that can complete one bounded frame';\n case 'tape-invalid':\n case 'tape-version-unsupported':\n return 'a valid v7 RHI debug tape';\n case 'replay-capability-mismatch':\n case 'replay-event-failed':\n case 'replay-position-invalid':\n return 'a fresh replay session with a valid workIndex';\n case 'readback-failed':\n case 'readback-unsupported':\n return 'a supported readback target';\n }\n}\n\nfunction recoveryHint(code: RhiDebugErrorCode): string {\n switch (code) {\n case 'capture-unavailable':\n return 'enable the single RHI capture capability and retry';\n case 'capture-busy':\n return 'wait for the active capture to finish, then issue one new request';\n case 'capture-snapshot-failed':\n return 'inspect the snapshot stage and capture again after fixing the resource';\n case 'capture-timeout':\n return 'increase the bounded timeout or capture again after the device becomes idle';\n case 'tape-invalid':\n return 'obtain complete bytes and retry strict decoding; do not continue to replay';\n case 'tape-version-unsupported':\n return VERSION_HINT;\n case 'replay-capability-mismatch':\n return 'use a fresh device satisfying the recorded RHI capabilities';\n case 'replay-event-failed':\n return 'inspect eventIndex, kind, stage, and cause; later work is not valid';\n case 'replay-position-invalid':\n return 'choose a workIndex present in FrameModel.works';\n case 'readback-failed':\n return 'inspect the readback cause and retry on a live fresh replay session';\n case 'readback-unsupported':\n return 'inspect the descriptor or use a backend with the requested readback support';\n }\n}\n","import type { EventKind, ResourceKind, RhiCallEvent } from './types';\n\nexport type EventCategory = 'resource' | 'pass' | 'state' | 'work' | 'copy' | 'submit' | 'marker';\n\nexport interface EventSemantics {\n readonly category: EventCategory;\n readonly created: (event: RhiCallEvent) => readonly string[];\n readonly read: (event: RhiCallEvent) => readonly string[];\n readonly written: (event: RhiCallEvent) => readonly string[];\n readonly destroyed: (event: RhiCallEvent) => readonly string[];\n}\n\nexport const eventKinds = [\n 'frameMark',\n 'createBuffer',\n 'createTexture',\n 'destroyBuffer',\n 'destroyTexture',\n 'createTextureView',\n 'createSampler',\n 'createBindGroupLayout',\n 'createBindGroup',\n 'createPipelineLayout',\n 'createRenderPipeline',\n 'createComputePipeline',\n 'createShaderModule',\n 'createCommandEncoder',\n 'writeBuffer',\n 'writeTexture',\n 'copyExternalImageToTexture',\n 'submit',\n 'beginRenderPass',\n 'beginComputePass',\n 'copyBufferToBuffer',\n 'copyBufferToTexture',\n 'copyTextureToBuffer',\n 'copyTextureToTexture',\n 'clearBuffer',\n 'pushDebugGroup',\n 'popDebugGroup',\n 'insertDebugMarker',\n 'finish',\n 'setPipeline',\n 'setVertexBuffer',\n 'setIndexBuffer',\n 'setBindGroup',\n 'draw',\n 'drawIndexed',\n 'setViewport',\n 'setScissorRect',\n 'setStencilReference',\n 'endRenderPass',\n 'setBlendConstant',\n 'drawIndirect',\n 'drawIndexedIndirect',\n 'passPushDebugGroup',\n 'passPopDebugGroup',\n 'passInsertDebugMarker',\n 'setComputePipeline',\n 'dispatchWorkgroups',\n 'dispatchWorkgroupsIndirect',\n 'endComputePass',\n 'initialData',\n] as const satisfies readonly EventKind[];\n\nexport const workEventKinds = [\n 'draw',\n 'drawIndexed',\n 'drawIndirect',\n 'drawIndexedIndirect',\n 'dispatchWorkgroups',\n 'dispatchWorkgroupsIndirect',\n] as const satisfies readonly EventKind[];\n\nexport function isWorkEvent(kind: EventKind): boolean {\n return (workEventKinds as readonly string[]).includes(kind);\n}\n\nexport const EVENT_SEMANTICS: Readonly<Record<EventKind, EventSemantics>> = Object.fromEntries(\n eventKinds.map((kind) => [kind, semanticsFor(kind)]),\n) as Record<EventKind, EventSemantics>;\n\nexport function resourceKindForEvent(kind: EventKind): ResourceKind | undefined {\n switch (kind) {\n case 'createBuffer':\n return 'buffer';\n case 'createTexture':\n return 'texture';\n case 'createTextureView':\n return 'texture-view';\n case 'createSampler':\n return 'sampler';\n case 'createShaderModule':\n return 'shader-module';\n case 'createRenderPipeline':\n case 'createComputePipeline':\n return 'pipeline';\n case 'createBindGroup':\n case 'createBindGroupLayout':\n case 'createPipelineLayout':\n return 'binding';\n case 'createCommandEncoder':\n return 'encoder';\n default:\n return undefined;\n }\n}\n\nfunction semanticsFor(kind: EventKind): EventSemantics {\n const category = categoryFor(kind);\n return {\n category,\n created: (event) => createdHandles(event),\n read: (event) => referencedHandles(event),\n written: (event) => writtenHandles(event),\n destroyed: (event) =>\n event.kind === 'destroyBuffer' || event.kind === 'destroyTexture'\n ? stringField(event, 'handleId')\n : [],\n };\n}\n\nfunction categoryFor(kind: EventKind): EventCategory {\n if (isWorkEvent(kind)) return 'work';\n if (kind.startsWith('create') || kind.startsWith('destroy') || kind === 'initialData')\n return 'resource';\n if (kind.includes('Pass')) return 'pass';\n if (kind.startsWith('copy') || kind === 'clearBuffer' || kind.startsWith('write')) return 'copy';\n if (kind === 'submit' || kind === 'finish') return 'submit';\n if (kind.includes('Debug')) return 'marker';\n return 'state';\n}\n\nfunction createdHandles(event: RhiCallEvent): readonly string[] {\n if (event.kind === 'createTextureView') return [event.resultHandleId];\n if (event.kind === 'createCommandEncoder') return [event.cmdHandleId];\n if (resourceKindForEvent(event.kind) !== undefined) return stringField(event, 'handleId');\n return [];\n}\n\nfunction referencedHandles(event: RhiCallEvent): readonly string[] {\n const keys = [\n 'sourceHandleId',\n 'layoutHandleId',\n 'vertexShaderModuleHandleId',\n 'fragmentShaderModuleHandleId',\n 'computeShaderModuleHandleId',\n 'handleId',\n 'bufferHandleId',\n 'textureHandleId',\n 'source',\n 'destination',\n 'resourceHandleIds',\n 'bindGroupHandleId',\n 'pipelineHandleId',\n 'indexBufferHandleId',\n 'vertexBufferHandleId',\n ];\n return keys.flatMap((key) => stringField(event, key));\n}\n\nfunction writtenHandles(event: RhiCallEvent): readonly string[] {\n if (event.kind === 'writeBuffer' || event.kind === 'writeTexture')\n return stringField(event, 'handleId');\n if (\n event.kind === 'copyBufferToBuffer' ||\n event.kind === 'copyBufferToTexture' ||\n event.kind === 'copyTextureToBuffer' ||\n event.kind === 'copyTextureToTexture'\n )\n return stringField(event, 'destination');\n return [];\n}\n\nfunction stringField(event: object, key: string): readonly string[] {\n const value = (event as Record<string, unknown>)[key];\n if (typeof value === 'string') return [value];\n if (Array.isArray(value)) return value.filter((item): item is string => typeof item === 'string');\n return [];\n}\n","import { EVENT_SEMANTICS, eventKinds, isWorkEvent, resourceKindForEvent } from './event-semantics';\nimport type { EventKind, ResourceKind, Tape } from './types';\n\nexport interface TapePassEntry {\n readonly passIndex: number;\n readonly kind: 'render' | 'compute';\n readonly beginEventIndex: number;\n readonly endEventIndex: number | undefined;\n readonly workIndices: readonly number[];\n}\n\nexport interface TapeWorkEntry {\n readonly workIndex: number;\n readonly eventIndex: number;\n readonly passIndex: number;\n readonly kind: Extract<\n EventKind,\n | 'draw'\n | 'drawIndexed'\n | 'drawIndirect'\n | 'drawIndexedIndirect'\n | 'dispatchWorkgroups'\n | 'dispatchWorkgroupsIndirect'\n >;\n}\n\nexport interface TapeResourceEntry {\n readonly resourceId: string;\n readonly kind: ResourceKind;\n readonly origin: 'bootstrap' | 'frame';\n readonly createEventIndex: number | undefined;\n readonly destroyEventIndex: number | undefined;\n}\n\nexport interface TapeIndex {\n readonly passes: readonly TapePassEntry[];\n readonly works: readonly TapeWorkEntry[];\n readonly resources: readonly TapeResourceEntry[];\n readonly eventKinds: readonly EventKind[];\n readonly passIndexByEvent: readonly number[];\n}\n\nexport function buildTapeIndex(tape: Tape): TapeIndex {\n const passes: TapePassEntry[] = [];\n const works: TapeWorkEntry[] = [];\n const resources = new Map<string, TapeResourceEntry>();\n const passIndexByEvent: number[] = [];\n let passIndex = -1;\n let currentPass:\n | { kind: 'render' | 'compute'; beginEventIndex: number; workIndices: number[] }\n | undefined;\n for (const [eventIndex, event] of tape.events.entries()) {\n passIndexByEvent[eventIndex] = passIndex;\n const semantics = EVENT_SEMANTICS[event.kind];\n if (event.kind === 'beginRenderPass' || event.kind === 'beginComputePass') {\n passIndex++;\n passIndexByEvent[eventIndex] = passIndex;\n currentPass = {\n kind: event.kind === 'beginRenderPass' ? 'render' : 'compute',\n beginEventIndex: eventIndex,\n workIndices: [],\n };\n }\n if (isWorkEvent(event.kind)) {\n const workIndex = works.length;\n works.push({ workIndex, eventIndex, passIndex, kind: event.kind as TapeWorkEntry['kind'] });\n currentPass?.workIndices.push(workIndex);\n }\n if (event.kind === 'endRenderPass' || event.kind === 'endComputePass') {\n if (currentPass) {\n passes.push({\n passIndex,\n kind: currentPass.kind,\n beginEventIndex: currentPass.beginEventIndex,\n endEventIndex: eventIndex,\n workIndices: currentPass.workIndices,\n });\n currentPass = undefined;\n }\n }\n const kind = resourceKindForEvent(event.kind);\n for (const resourceId of semantics.created(event)) {\n if (kind)\n resources.set(resourceId, {\n resourceId,\n kind,\n origin: 'frame',\n createEventIndex: eventIndex,\n destroyEventIndex: undefined,\n });\n }\n for (const resourceId of semantics.destroyed(event)) {\n const previous = resources.get(resourceId);\n if (previous) resources.set(resourceId, { ...previous, destroyEventIndex: eventIndex });\n }\n }\n if (currentPass)\n passes.push({\n passIndex,\n kind: currentPass.kind,\n beginEventIndex: currentPass.beginEventIndex,\n endEventIndex: undefined,\n workIndices: currentPass.workIndices,\n });\n for (const resource of tape.bootstrap)\n resources.set(resource.handleId, {\n resourceId: resource.handleId,\n kind: resource.kind,\n origin: 'bootstrap',\n createEventIndex: undefined,\n destroyEventIndex: undefined,\n });\n return {\n passes,\n works,\n resources: [...resources.values()],\n eventKinds: [...eventKinds],\n passIndexByEvent,\n };\n}\n","/// <reference types=\"@webgpu/types\" />\n// @forgeax/engine-rhi-debug/texel-layout -- SSOT for how a color texture's GPU\n// bytes are laid out, shared by the snapshot readback (recorder) and the seed\n// write-back (replayer) so both agree on byte layout without duplicating it in\n// the tape (architecture-principles #1 SSOT / #2 Derive: format + size +\n// mipLevelCount already live in the createTexture event; layout is derived, not\n// re-stored in the initialData event).\n//\n// Why this exists: the original frame-header snapshot hardcoded bytesPerRow =\n// width*4, depthOrArrayLayers = 1, mipLevel = 0 -- correct only for a single-mip\n// single-layer 4-byte texture (rgba8). IBL resources break all three: the\n// irradiance/prefilter cubemaps are rgba16float (8 B/texel), 6 array layers, and\n// the prefilter map has a 5-mip roughness chain. Snapshotting them with the old\n// assumptions either skipped them (-> replay renders unlit/black) or would have\n// seeded corrupt bytes. This module computes the real per-subresource layout so a\n// full snapshot + faithful seed round-trips each color format with a known texel\n// block footprint, including block-compressed formats.\n\n/**\n * Bytes per texel for uncompressed color formats. Block-compressed formats use\n * {@link textureBlockLayout} because their bytes are addressed by blocks.\n */\nexport function bytesPerTexel(format: GPUTextureFormat | undefined): number | undefined {\n if (format === undefined) return undefined;\n return TEXEL_BYTES[format];\n}\n\n// Uncompressed color formats only. Keyed to the W3C WebGPU GPUTextureFormat\n// names. Depth/stencil and block-compressed formats are deliberately absent.\nconst TEXEL_BYTES: Partial<Record<GPUTextureFormat, number>> = {\n // 8-bit channels\n r8unorm: 1,\n r8snorm: 1,\n r8uint: 1,\n r8sint: 1,\n rg8unorm: 2,\n rg8snorm: 2,\n rg8uint: 2,\n rg8sint: 2,\n rgba8unorm: 4,\n 'rgba8unorm-srgb': 4,\n rgba8snorm: 4,\n rgba8uint: 4,\n rgba8sint: 4,\n bgra8unorm: 4,\n 'bgra8unorm-srgb': 4,\n // 16-bit channels\n r16uint: 2,\n r16sint: 2,\n r16float: 2,\n rg16uint: 4,\n rg16sint: 4,\n rg16float: 4,\n rgba16uint: 8,\n rgba16sint: 8,\n rgba16float: 8,\n // 32-bit channels\n r32uint: 4,\n r32sint: 4,\n r32float: 4,\n rg32uint: 8,\n rg32sint: 8,\n rg32float: 8,\n rgba32uint: 16,\n rgba32sint: 16,\n rgba32float: 16,\n // packed\n rgb10a2unorm: 4,\n rg11b10ufloat: 4,\n};\n\nexport interface TextureBlockLayout {\n readonly blockWidth: number;\n readonly blockHeight: number;\n readonly bytesPerBlock: number;\n}\n\nconst COMPRESSED_BLOCKS: Partial<Record<GPUTextureFormat, TextureBlockLayout>> = {\n // BCn: all formats use 4x4 blocks; BC1/BC4 are 8 bytes, the rest 16.\n 'bc1-rgba-unorm': { blockWidth: 4, blockHeight: 4, bytesPerBlock: 8 },\n 'bc1-rgba-unorm-srgb': { blockWidth: 4, blockHeight: 4, bytesPerBlock: 8 },\n 'bc2-rgba-unorm': { blockWidth: 4, blockHeight: 4, bytesPerBlock: 16 },\n 'bc2-rgba-unorm-srgb': { blockWidth: 4, blockHeight: 4, bytesPerBlock: 16 },\n 'bc3-rgba-unorm': { blockWidth: 4, blockHeight: 4, bytesPerBlock: 16 },\n 'bc3-rgba-unorm-srgb': { blockWidth: 4, blockHeight: 4, bytesPerBlock: 16 },\n 'bc4-r-unorm': { blockWidth: 4, blockHeight: 4, bytesPerBlock: 8 },\n 'bc4-r-snorm': { blockWidth: 4, blockHeight: 4, bytesPerBlock: 8 },\n 'bc5-rg-unorm': { blockWidth: 4, blockHeight: 4, bytesPerBlock: 16 },\n 'bc5-rg-snorm': { blockWidth: 4, blockHeight: 4, bytesPerBlock: 16 },\n 'bc6h-rgb-ufloat': { blockWidth: 4, blockHeight: 4, bytesPerBlock: 16 },\n 'bc6h-rgb-float': { blockWidth: 4, blockHeight: 4, bytesPerBlock: 16 },\n 'bc7-rgba-unorm': { blockWidth: 4, blockHeight: 4, bytesPerBlock: 16 },\n 'bc7-rgba-unorm-srgb': { blockWidth: 4, blockHeight: 4, bytesPerBlock: 16 },\n // ETC2/EAC: all formats use 4x4 blocks; one or two 64-bit blocks.\n 'etc2-rgb8unorm': { blockWidth: 4, blockHeight: 4, bytesPerBlock: 8 },\n 'etc2-rgb8unorm-srgb': { blockWidth: 4, blockHeight: 4, bytesPerBlock: 8 },\n 'etc2-rgb8a1unorm': { blockWidth: 4, blockHeight: 4, bytesPerBlock: 8 },\n 'etc2-rgb8a1unorm-srgb': { blockWidth: 4, blockHeight: 4, bytesPerBlock: 8 },\n 'etc2-rgba8unorm': { blockWidth: 4, blockHeight: 4, bytesPerBlock: 16 },\n 'etc2-rgba8unorm-srgb': { blockWidth: 4, blockHeight: 4, bytesPerBlock: 16 },\n 'eac-r11unorm': { blockWidth: 4, blockHeight: 4, bytesPerBlock: 8 },\n 'eac-r11snorm': { blockWidth: 4, blockHeight: 4, bytesPerBlock: 8 },\n 'eac-rg11unorm': { blockWidth: 4, blockHeight: 4, bytesPerBlock: 16 },\n 'eac-rg11snorm': { blockWidth: 4, blockHeight: 4, bytesPerBlock: 16 },\n // ASTC uses 16-byte blocks with a format-specific footprint.\n 'astc-4x4-unorm': { blockWidth: 4, blockHeight: 4, bytesPerBlock: 16 },\n 'astc-4x4-unorm-srgb': { blockWidth: 4, blockHeight: 4, bytesPerBlock: 16 },\n 'astc-5x4-unorm': { blockWidth: 5, blockHeight: 4, bytesPerBlock: 16 },\n 'astc-5x4-unorm-srgb': { blockWidth: 5, blockHeight: 4, bytesPerBlock: 16 },\n 'astc-5x5-unorm': { blockWidth: 5, blockHeight: 5, bytesPerBlock: 16 },\n 'astc-5x5-unorm-srgb': { blockWidth: 5, blockHeight: 5, bytesPerBlock: 16 },\n 'astc-6x5-unorm': { blockWidth: 6, blockHeight: 5, bytesPerBlock: 16 },\n 'astc-6x5-unorm-srgb': { blockWidth: 6, blockHeight: 5, bytesPerBlock: 16 },\n 'astc-6x6-unorm': { blockWidth: 6, blockHeight: 6, bytesPerBlock: 16 },\n 'astc-6x6-unorm-srgb': { blockWidth: 6, blockHeight: 6, bytesPerBlock: 16 },\n 'astc-8x5-unorm': { blockWidth: 8, blockHeight: 5, bytesPerBlock: 16 },\n 'astc-8x5-unorm-srgb': { blockWidth: 8, blockHeight: 5, bytesPerBlock: 16 },\n 'astc-8x6-unorm': { blockWidth: 8, blockHeight: 6, bytesPerBlock: 16 },\n 'astc-8x6-unorm-srgb': { blockWidth: 8, blockHeight: 6, bytesPerBlock: 16 },\n 'astc-8x8-unorm': { blockWidth: 8, blockHeight: 8, bytesPerBlock: 16 },\n 'astc-8x8-unorm-srgb': { blockWidth: 8, blockHeight: 8, bytesPerBlock: 16 },\n 'astc-10x5-unorm': { blockWidth: 10, blockHeight: 5, bytesPerBlock: 16 },\n 'astc-10x5-unorm-srgb': { blockWidth: 10, blockHeight: 5, bytesPerBlock: 16 },\n 'astc-10x6-unorm': { blockWidth: 10, blockHeight: 6, bytesPerBlock: 16 },\n 'astc-10x6-unorm-srgb': { blockWidth: 10, blockHeight: 6, bytesPerBlock: 16 },\n 'astc-10x8-unorm': { blockWidth: 10, blockHeight: 8, bytesPerBlock: 16 },\n 'astc-10x8-unorm-srgb': { blockWidth: 10, blockHeight: 8, bytesPerBlock: 16 },\n 'astc-10x10-unorm': { blockWidth: 10, blockHeight: 10, bytesPerBlock: 16 },\n 'astc-10x10-unorm-srgb': { blockWidth: 10, blockHeight: 10, bytesPerBlock: 16 },\n 'astc-12x10-unorm': { blockWidth: 12, blockHeight: 10, bytesPerBlock: 16 },\n 'astc-12x10-unorm-srgb': { blockWidth: 12, blockHeight: 10, bytesPerBlock: 16 },\n 'astc-12x12-unorm': { blockWidth: 12, blockHeight: 12, bytesPerBlock: 16 },\n 'astc-12x12-unorm-srgb': { blockWidth: 12, blockHeight: 12, bytesPerBlock: 16 },\n};\n\n/** Return the WebGPU texel-block footprint for each supported color format. */\nexport function textureBlockLayout(\n format: GPUTextureFormat | undefined,\n): TextureBlockLayout | undefined {\n if (format === undefined) return undefined;\n return (\n COMPRESSED_BLOCKS[format] ??\n (TEXEL_BYTES[format] === undefined\n ? undefined\n : { blockWidth: 1, blockHeight: 1, bytesPerBlock: TEXEL_BYTES[format] })\n );\n}\n\n// ============================================================================\n// formatInfo -- per-channel semantics for CPU-side decode (viewer preview)\n// ============================================================================\n\n/** How a channel's bits are interpreted (drives the host-side decode-to-RGBA8). */\nexport type ChannelType = 'unorm' | 'snorm' | 'uint' | 'sint' | 'float' | 'ufloat';\n\n/**\n * Per-channel layout of an uncompressed color format, enough to decode its raw\n * GPU bytes into displayable RGBA8 on the host (no GPU). Sits beside\n * {@link bytesPerTexel} (which stays the SSOT for total texel size); the\n * per-channel byte width is derived as `bytesPerTexel / channels` for plain\n * formats, so no byte count is re-stored here. `packed` formats pack all\n * channels into a single 4-byte word (channels read by bit-field, not by a\n * uniform per-channel width).\n */\nexport interface FormatInfo {\n readonly channels: 1 | 2 | 3 | 4;\n readonly channelType: ChannelType;\n /** Channels stored blue-first in memory (swizzle B<->R when decoding). */\n readonly bgra?: boolean;\n /** Bit-packed layout (channels share one 32-bit word) needing special unpack. */\n readonly packed?: 'rgb10a2unorm' | 'rg11b10ufloat';\n}\n\n// Keyed to the same uncompressed color formats as TEXEL_BYTES. Depth/stencil and\n// block-compressed formats are absent (return undefined -> caller falls back).\nconst FORMAT_INFO: Partial<Record<GPUTextureFormat, FormatInfo>> = {\n // 8-bit channels\n r8unorm: { channels: 1, channelType: 'unorm' },\n r8snorm: { channels: 1, channelType: 'snorm' },\n r8uint: { channels: 1, channelType: 'uint' },\n r8sint: { channels: 1, channelType: 'sint' },\n rg8unorm: { channels: 2, channelType: 'unorm' },\n rg8snorm: { channels: 2, channelType: 'snorm' },\n rg8uint: { channels: 2, channelType: 'uint' },\n rg8sint: { channels: 2, channelType: 'sint' },\n rgba8unorm: { channels: 4, channelType: 'unorm' },\n 'rgba8unorm-srgb': { channels: 4, channelType: 'unorm' },\n rgba8snorm: { channels: 4, channelType: 'snorm' },\n rgba8uint: { channels: 4, channelType: 'uint' },\n rgba8sint: { channels: 4, channelType: 'sint' },\n bgra8unorm: { channels: 4, channelType: 'unorm', bgra: true },\n 'bgra8unorm-srgb': { channels: 4, channelType: 'unorm', bgra: true },\n // 16-bit channels\n r16uint: { channels: 1, channelType: 'uint' },\n r16sint: { channels: 1, channelType: 'sint' },\n r16float: { channels: 1, channelType: 'float' },\n rg16uint: { channels: 2, channelType: 'uint' },\n rg16sint: { channels: 2, channelType: 'sint' },\n rg16float: { channels: 2, channelType: 'float' },\n rgba16uint: { channels: 4, channelType: 'uint' },\n rgba16sint: { channels: 4, channelType: 'sint' },\n rgba16float: { channels: 4, channelType: 'float' },\n // 32-bit channels\n r32uint: { channels: 1, channelType: 'uint' },\n r32sint: { channels: 1, channelType: 'sint' },\n r32float: { channels: 1, channelType: 'float' },\n rg32uint: { channels: 2, channelType: 'uint' },\n rg32sint: { channels: 2, channelType: 'sint' },\n rg32float: { channels: 2, channelType: 'float' },\n rgba32uint: { channels: 4, channelType: 'uint' },\n rgba32sint: { channels: 4, channelType: 'sint' },\n rgba32float: { channels: 4, channelType: 'float' },\n // packed (channels share one 32-bit word; decoded by bit-field)\n rgb10a2unorm: { channels: 4, channelType: 'unorm', packed: 'rgb10a2unorm' },\n rg11b10ufloat: { channels: 3, channelType: 'ufloat', packed: 'rg11b10ufloat' },\n};\n\n/**\n * Per-channel layout of an uncompressed color format for host-side decode.\n * Returns `undefined` for depth/stencil, block-compressed, or unknown formats\n * (the viewer's preview path treats `undefined` as \"not directly previewable\").\n */\nexport function formatInfo(format: GPUTextureFormat | string | undefined): FormatInfo | undefined {\n if (format === undefined) return undefined;\n return FORMAT_INFO[format as GPUTextureFormat];\n}\n\n/** One mip level of one array layer: its extent + where its tight bytes live in the blob. */\nexport interface SubresourceSlice {\n readonly layer: number;\n readonly mip: number;\n readonly width: number;\n readonly height: number;\n readonly byteOffset: number;\n readonly byteLength: number;\n}\n\n/** Full subresource layout of a texture snapshot blob. */\nexport interface TextureLayout {\n readonly blockWidth: number;\n readonly blockHeight: number;\n readonly bytesPerBlock: number;\n readonly layerCount: number;\n readonly mipLevelCount: number;\n readonly slices: readonly SubresourceSlice[];\n /** Total tight byte length across every subresource (the blob size). */\n readonly totalBytes: number;\n}\n\nexport interface TextureExtent {\n readonly width: number;\n readonly height: number;\n readonly layerCount: number;\n}\n\n/** Project a serialized GPU texture extent onto the dimensions used by snapshots. */\nexport function projectTextureExtent(size: unknown): TextureExtent {\n if (typeof size === 'number') return { width: size, height: 1, layerCount: 1 };\n if (Array.isArray(size)) {\n const width = typeof size[0] === 'number' ? size[0] : 1;\n const height = typeof size[1] === 'number' ? size[1] : width;\n const layerCount = typeof size[2] === 'number' ? size[2] : 1;\n return { width, height, layerCount };\n }\n if (size !== null && typeof size === 'object') {\n const record = size as {\n readonly width?: unknown;\n readonly height?: unknown;\n readonly depthOrArrayLayers?: unknown;\n };\n const width = typeof record.width === 'number' ? record.width : 1;\n const height = typeof record.height === 'number' ? record.height : width;\n const layerCount =\n typeof record.depthOrArrayLayers === 'number' ? record.depthOrArrayLayers : 1;\n return { width, height, layerCount };\n }\n return { width: 1, height: 1, layerCount: 1 };\n}\n\n/**\n * Compute the canonical tight byte layout for a texture snapshot: every array\n * layer, every mip level, packed in layer-major then mip-minor order with no row\n * padding (tight bytesPerRow = blockCountX * bytesPerBlock). Mip dimensions halve\n * per level (floor, min 1), matching the WebGPU mip size rule.\n *\n * Returns `undefined` when the format has no known block footprint. The\n * recorder reads each slice into this exact offset; the replayer reads each\n * slice back out and writeTexture's it to (layer, mip).\n */\nexport function computeTextureLayout(\n format: GPUTextureFormat | undefined,\n width: number,\n height: number,\n layerCount: number,\n mipLevelCount: number,\n): TextureLayout | undefined {\n const block = textureBlockLayout(format);\n if (block === undefined) return undefined;\n\n const layers = Math.max(1, layerCount);\n const mips = Math.max(1, mipLevelCount);\n const slices: SubresourceSlice[] = [];\n let offset = 0;\n for (let layer = 0; layer < layers; layer++) {\n for (let mip = 0; mip < mips; mip++) {\n const mw = Math.max(1, width >> mip);\n const mh = Math.max(1, height >> mip);\n const blockCountX = Math.ceil(mw / block.blockWidth);\n const blockCountY = Math.ceil(mh / block.blockHeight);\n const byteLength = blockCountX * blockCountY * block.bytesPerBlock;\n slices.push({ layer, mip, width: mw, height: mh, byteOffset: offset, byteLength });\n offset += byteLength;\n }\n }\n return {\n blockWidth: block.blockWidth,\n blockHeight: block.blockHeight,\n bytesPerBlock: block.bytesPerBlock,\n layerCount: layers,\n mipLevelCount: mips,\n slices,\n totalBytes: offset,\n };\n}\n","// @forgeax/engine-rhi-debug/src/frame-model -- v7 structural tape projection.\n\n/// <reference types=\"@webgpu/types\" />\n\nimport { isWorkEvent } from './protocol/event-semantics';\nimport type { TapePassEntry, TapeResourceEntry } from './protocol/tape-index';\nimport { buildTapeIndex } from './protocol/tape-index';\nimport type { Tape as V7Tape } from './protocol/types';\nimport { computeTextureLayout } from './texel-layout';\nimport type {\n CreateDescriptor,\n DrawPipelineState,\n HandleId,\n InspectBindingEntry,\n InspectDrawCall,\n RhiCallEvent,\n} from './types';\n\nexport type { CreateDescriptor, DrawPipelineState } from './types';\n\nexport interface PassDrawItem {\n readonly workIndex: number;\n readonly eventKind:\n | 'draw'\n | 'drawIndexed'\n | 'dispatchWorkgroups'\n | 'dispatchWorkgroupsIndirect'\n | 'drawIndirect'\n | 'drawIndexedIndirect';\n}\n\nexport interface PassNode {\n readonly kind: 'render' | 'compute';\n readonly passIdx: number;\n readonly draws: readonly PassDrawItem[];\n}\n\nexport interface DrawEntry {\n readonly frameIdx: number;\n readonly passIdx: number;\n readonly bindings: readonly InspectBindingEntry[];\n readonly drawCall: InspectDrawCall;\n readonly colorAttachmentHandleId: string | undefined;\n readonly pipelineState: DrawPipelineState;\n readonly vertexBuffers: ReadonlyMap<\n number,\n { readonly handleId: HandleId; readonly offset: number; readonly size: number }\n >;\n readonly indexBuffer?: { handleId: HandleId; format: GPUIndexFormat; offset: number } | undefined;\n readonly depthStencil: DrawDepthStencil;\n}\n\nexport interface DrawDepthStencil {\n readonly depthStencilViewHandleId: HandleId | undefined;\n readonly depthStencilAttachment: GPURenderPassDepthStencilAttachment | undefined;\n}\n\nexport interface CommandEntry {\n readonly passIdx: number;\n readonly eventIdx: number;\n readonly isDraw: boolean;\n readonly kind: string;\n readonly groupLabel: string | undefined;\n readonly markerLabel: string | undefined;\n}\n\nexport interface FrameModelMeta {\n readonly totalDraws: number;\n readonly totalPasses: number;\n readonly hasCompute: boolean;\n}\n\nexport interface WorkEntry {\n readonly workIndex: number;\n readonly eventIndex: number;\n readonly passIndex: number;\n readonly kind: string;\n}\n\nexport interface FrameModel {\n readonly tree: readonly PassNode[];\n readonly draws: readonly DrawEntry[];\n readonly meta: FrameModelMeta;\n readonly commands: readonly CommandEntry[];\n readonly resources: ReadonlyMap<HandleId, CreateDescriptor>;\n readonly resourceLifecycle: ResourceLifecycleSummary;\n readonly works: readonly WorkEntry[];\n readonly passes: readonly TapePassEntry[];\n readonly resourceEntries: readonly TapeResourceEntry[];\n}\n\nexport function buildFrameModel(tape: V7Tape): FrameModel {\n const index = buildTapeIndex(tape);\n const works = index.works;\n return {\n tree: [],\n draws: [],\n meta: {\n totalDraws: works.length,\n totalPasses: index.passes.length,\n hasCompute: works.some((work) => work.kind.startsWith('dispatch')),\n },\n commands: tape.events.map((event, eventIndex) => ({\n passIdx: index.passIndexByEvent[eventIndex] ?? -1,\n eventIdx: eventIndex,\n isDraw: isWorkEvent(event.kind),\n kind: event.kind,\n groupLabel: undefined,\n markerLabel: undefined,\n })),\n resources: new Map(),\n resourceLifecycle: buildResourceLifecycle(tape.events),\n works,\n passes: index.passes,\n resourceEntries: index.resources,\n };\n}\n\n/** A byte estimate that distinguishes known descriptor size from unavailable GPU facts. */\nexport type ResourceByteEstimate =\n | {\n readonly status: 'known';\n readonly bytes: number;\n readonly basis: 'buffer-descriptor' | 'texture-tight-layout';\n }\n | {\n readonly status: 'unavailable';\n readonly reason:\n | 'non-memory-resource'\n | 'unsupported-texture-dimension'\n | 'unsupported-texture-format'\n | 'invalid-texture-size';\n };\n\nexport type ResourceKind =\n | 'buffer'\n | 'texture'\n | 'texture-view'\n | 'sampler'\n | 'bind-group-layout'\n | 'bind-group'\n | 'pipeline-layout'\n | 'render-pipeline'\n | 'compute-pipeline'\n | 'shader-module';\n\nexport type ResourceOrigin = 'engine' | 'swapchain';\n\nexport interface ResourceLifecycleEntry {\n readonly handleId: HandleId;\n readonly kind: ResourceKind;\n readonly origin: ResourceOrigin;\n readonly state: 'live' | 'destroyed';\n readonly createdEventIndex: number;\n readonly destroyedEventIndex?: number;\n readonly byteEstimate: ResourceByteEstimate;\n}\n\nexport interface ResourceLifecycleSummary {\n /** This is the resource closure represented by the tape, not the whole device heap. */\n readonly scope: 'captured-tape-resource-closure';\n readonly counts: {\n readonly created: number;\n readonly destroyed: number;\n readonly live: number;\n readonly destroyEvents: number;\n readonly unknownDestroyEvents: number;\n };\n readonly bytes: {\n readonly knownCreated: number;\n readonly knownDestroyed: number;\n readonly knownLive: number;\n readonly unavailableCreated: number;\n readonly unavailableDestroyed: number;\n readonly unavailableLive: number;\n };\n readonly originBreakdown: Readonly<\n Record<\n ResourceOrigin,\n {\n readonly created: number;\n readonly destroyed: number;\n readonly live: number;\n readonly knownCreated: number;\n readonly knownDestroyed: number;\n readonly knownLive: number;\n readonly unavailableCreated: number;\n readonly unavailableDestroyed: number;\n readonly unavailableLive: number;\n }\n >\n >;\n readonly availability: {\n readonly destroy: 'observed-buffer-texture';\n readonly retire: 'unavailable';\n readonly driverAllocation: 'unavailable';\n };\n readonly resources: readonly ResourceLifecycleEntry[];\n}\n\nfunction asPositiveInteger(value: unknown): number | undefined {\n return typeof value === 'number' && Number.isInteger(value) && value > 0 ? value : undefined;\n}\n\nfunction normalizeTextureSize(\n size: unknown,\n):\n | { readonly width: number; readonly height: number; readonly depthOrArrayLayers: number }\n | undefined {\n if (typeof size === 'number') {\n const width = asPositiveInteger(size);\n return width === undefined ? undefined : { width, height: 1, depthOrArrayLayers: 1 };\n }\n if (Array.isArray(size)) {\n const width = asPositiveInteger(size[0]);\n const height = asPositiveInteger(size[1] ?? 1);\n const depthOrArrayLayers = asPositiveInteger(size[2] ?? 1);\n return width === undefined || height === undefined || depthOrArrayLayers === undefined\n ? undefined\n : { width, height, depthOrArrayLayers };\n }\n if (size !== null && typeof size === 'object') {\n const raw = size as {\n readonly width?: unknown;\n readonly height?: unknown;\n readonly depthOrArrayLayers?: unknown;\n };\n const width = asPositiveInteger(raw.width);\n const height = asPositiveInteger(raw.height ?? 1);\n const depthOrArrayLayers = asPositiveInteger(raw.depthOrArrayLayers ?? 1);\n return width === undefined || height === undefined || depthOrArrayLayers === undefined\n ? undefined\n : { width, height, depthOrArrayLayers };\n }\n return undefined;\n}\n\nfunction estimateBytes(event: RhiCallEvent): ResourceByteEstimate {\n if (event.kind === 'createBuffer') {\n return { status: 'known', bytes: event.desc.size, basis: 'buffer-descriptor' };\n }\n if (event.kind !== 'createTexture') {\n return { status: 'unavailable', reason: 'non-memory-resource' };\n }\n\n const dimension = event.desc.dimension ?? '2d';\n if (dimension === '3d') {\n return { status: 'unavailable', reason: 'unsupported-texture-dimension' };\n }\n const size = normalizeTextureSize(event.desc.size);\n if (size === undefined) return { status: 'unavailable', reason: 'invalid-texture-size' };\n const layers = dimension === '1d' ? 1 : size.depthOrArrayLayers;\n const layout = computeTextureLayout(\n event.desc.format,\n size.width,\n size.height,\n layers,\n event.desc.mipLevelCount ?? 1,\n );\n if (layout === undefined) return { status: 'unavailable', reason: 'unsupported-texture-format' };\n return {\n status: 'known',\n bytes: layout.totalBytes * (event.desc.sampleCount ?? 1),\n basis: 'texture-tight-layout',\n };\n}\n\nfunction resourceIdentity(\n event: RhiCallEvent,\n): { readonly kind: ResourceKind; readonly handleId: HandleId } | undefined {\n switch (event.kind) {\n case 'createBuffer':\n return { kind: 'buffer', handleId: event.handleId };\n case 'createTexture':\n return { kind: 'texture', handleId: event.handleId };\n case 'createTextureView':\n return { kind: 'texture-view', handleId: event.resultHandleId };\n case 'createSampler':\n return { kind: 'sampler', handleId: event.handleId };\n case 'createBindGroupLayout':\n return { kind: 'bind-group-layout', handleId: event.handleId };\n case 'createBindGroup':\n return { kind: 'bind-group', handleId: event.handleId };\n case 'createPipelineLayout':\n return { kind: 'pipeline-layout', handleId: event.handleId };\n case 'createRenderPipeline':\n return { kind: 'render-pipeline', handleId: event.handleId };\n case 'createComputePipeline':\n return { kind: 'compute-pipeline', handleId: event.handleId };\n case 'createShaderModule':\n return { kind: 'shader-module', handleId: event.handleId };\n default:\n return undefined;\n }\n}\n\nfunction addBytes(\n bytes: { known: number; unavailable: number },\n estimate: ResourceByteEstimate,\n): void {\n if (estimate.status === 'known') bytes.known += estimate.bytes;\n else bytes.unavailable++;\n}\n\n/** Build a pure lifecycle ledger from the ordered tape events. */\nexport function buildResourceLifecycle(events: readonly RhiCallEvent[]): ResourceLifecycleSummary {\n const records = new Map<\n HandleId,\n {\n readonly kind: ResourceKind;\n readonly origin: ResourceOrigin;\n readonly createdEventIndex: number;\n readonly byteEstimate: ResourceByteEstimate;\n destroyedEventIndex?: number;\n }\n >();\n const origins = new Map<HandleId, ResourceOrigin>();\n let destroyEvents = 0;\n let unknownDestroyEvents = 0;\n\n for (let eventIndex = 0; eventIndex < events.length; eventIndex++) {\n const event = events[eventIndex];\n if (event === undefined) continue;\n const identity = resourceIdentity(event);\n if (identity !== undefined) {\n const origin: ResourceOrigin =\n event.kind === 'createTexture' && event.origin === 'swapchain'\n ? 'swapchain'\n : event.kind === 'createTextureView'\n ? (origins.get(event.sourceHandleId) ?? 'engine')\n : 'engine';\n origins.set(identity.handleId, origin);\n records.set(identity.handleId, {\n kind: identity.kind,\n origin,\n createdEventIndex: eventIndex,\n byteEstimate: estimateBytes(event),\n });\n continue;\n }\n if (event.kind !== 'destroyBuffer' && event.kind !== 'destroyTexture') continue;\n destroyEvents++;\n const record = records.get(event.handleId);\n const expectedKind = event.kind === 'destroyBuffer' ? 'buffer' : 'texture';\n if (\n record === undefined ||\n record.kind !== expectedKind ||\n record.destroyedEventIndex !== undefined\n ) {\n unknownDestroyEvents++;\n continue;\n }\n record.destroyedEventIndex = eventIndex;\n }\n\n const resources: ResourceLifecycleEntry[] = [];\n const createdBytes = { known: 0, unavailable: 0 };\n const destroyedBytes = { known: 0, unavailable: 0 };\n const liveBytes = { known: 0, unavailable: 0 };\n const originBreakdown: Record<\n ResourceOrigin,\n {\n created: number;\n destroyed: number;\n live: number;\n knownCreated: number;\n knownDestroyed: number;\n knownLive: number;\n unavailableCreated: number;\n unavailableDestroyed: number;\n unavailableLive: number;\n }\n > = {\n engine: {\n created: 0,\n destroyed: 0,\n live: 0,\n knownCreated: 0,\n knownDestroyed: 0,\n knownLive: 0,\n unavailableCreated: 0,\n unavailableDestroyed: 0,\n unavailableLive: 0,\n },\n swapchain: {\n created: 0,\n destroyed: 0,\n live: 0,\n knownCreated: 0,\n knownDestroyed: 0,\n knownLive: 0,\n unavailableCreated: 0,\n unavailableDestroyed: 0,\n unavailableLive: 0,\n },\n };\n let destroyed = 0;\n\n for (const [handleId, record] of records) {\n const state = record.destroyedEventIndex === undefined ? 'live' : 'destroyed';\n if (state === 'destroyed') destroyed++;\n addBytes(createdBytes, record.byteEstimate);\n addBytes(state === 'live' ? liveBytes : destroyedBytes, record.byteEstimate);\n const byOrigin = originBreakdown[record.origin];\n byOrigin.created++;\n if (state === 'destroyed') byOrigin.destroyed++;\n else byOrigin.live++;\n if (record.byteEstimate.status === 'known') {\n byOrigin.knownCreated += record.byteEstimate.bytes;\n if (state === 'destroyed') byOrigin.knownDestroyed += record.byteEstimate.bytes;\n else byOrigin.knownLive += record.byteEstimate.bytes;\n } else {\n byOrigin.unavailableCreated++;\n if (state === 'destroyed') byOrigin.unavailableDestroyed++;\n else byOrigin.unavailableLive++;\n }\n resources.push({\n handleId,\n kind: record.kind,\n origin: record.origin,\n state,\n createdEventIndex: record.createdEventIndex,\n ...(record.destroyedEventIndex === undefined\n ? {}\n : { destroyedEventIndex: record.destroyedEventIndex }),\n byteEstimate: record.byteEstimate,\n });\n }\n\n return {\n scope: 'captured-tape-resource-closure',\n counts: {\n created: resources.length,\n destroyed,\n live: resources.length - destroyed,\n destroyEvents,\n unknownDestroyEvents,\n },\n bytes: {\n knownCreated: createdBytes.known,\n knownDestroyed: destroyedBytes.known,\n knownLive: liveBytes.known,\n unavailableCreated: createdBytes.unavailable,\n unavailableDestroyed: destroyedBytes.unavailable,\n unavailableLive: liveBytes.unavailable,\n },\n originBreakdown,\n availability: {\n destroy: 'observed-buffer-texture',\n retire: 'unavailable',\n driverAllocation: 'unavailable',\n },\n resources,\n };\n}\n","import type { Result } from '@forgeax/engine-types';\nimport type { RhiDebugError } from '../errors';\nimport type { RhiCallEvent as LegacyRhiCallEvent } from '../types';\n\nexport const TAPE_FORMAT_VERSION = 7 as const;\nexport const TAPE_MAGIC = 'RHITAPE' as const;\n\nexport type RhiCallEvent = LegacyRhiCallEvent;\nexport type EventKind = RhiCallEvent['kind'];\nexport type TapeBlobCompression = 'none' | 'gzip';\nexport type ResourceKind =\n | 'buffer'\n | 'texture'\n | 'texture-view'\n | 'sampler'\n | 'shader-module'\n | 'pipeline'\n | 'binding'\n | 'encoder';\n\nexport interface RhiCapsRecorded {\n readonly [key: string]: boolean | number | string | null;\n}\n\nexport interface InitialDataSlice {\n readonly hash: string;\n readonly byteOffset: number;\n readonly byteLength: number;\n}\n\nexport interface BootstrapResource {\n readonly handleId: string;\n readonly kind: ResourceKind;\n readonly create: Record<string, unknown>;\n readonly initialData: readonly InitialDataSlice[];\n}\n\nexport interface TapeBlob {\n readonly hash: string;\n readonly bytes: Uint8Array;\n readonly compression: TapeBlobCompression;\n}\n\nexport interface Tape {\n readonly header: {\n readonly formatVersion: typeof TAPE_FORMAT_VERSION;\n readonly rhiCaps: RhiCapsRecorded;\n readonly eventCount: number;\n readonly blobCount: number;\n };\n readonly bootstrap: readonly BootstrapResource[];\n readonly events: readonly RhiCallEvent[];\n readonly blobs: readonly TapeBlob[];\n}\n\nexport interface TapeEncodeOptions {\n readonly compression?: TapeBlobCompression;\n}\n\nexport type RhiDebugResult<T> = Result<T, RhiDebugError>;\n","import { err, ok, type Result } from '@forgeax/engine-types';\nimport { createRhiDebugError } from '../errors';\nimport { eventKinds } from './event-semantics';\nimport { type ResourceKind, type RhiCallEvent, TAPE_FORMAT_VERSION, type Tape } from './types';\n\ntype TapeValidation = ReturnType<typeof createRhiDebugError<'tape-invalid'>>;\n\nexport function validateTape(tape: Tape): Result<Tape, TapeValidation> {\n if (tape.header.formatVersion !== TAPE_FORMAT_VERSION)\n return err(\n createRhiDebugError('tape-invalid', { stage: 'validate', cause: 'format version is not 7' }),\n );\n if (tape.header.eventCount !== tape.events.length || tape.header.blobCount !== tape.blobs.length)\n return err(\n createRhiDebugError('tape-invalid', {\n stage: 'validate',\n cause: 'header counts do not match payload counts',\n }),\n );\n const declared = new Set<string>();\n for (const resource of tape.bootstrap) {\n if (declared.has(resource.handleId))\n return err(\n createRhiDebugError('tape-invalid', {\n stage: 'validate',\n cause: `duplicate bootstrap handle ${resource.handleId}`,\n }),\n );\n if (!isResourceKind(resource.kind))\n return err(\n createRhiDebugError('tape-invalid', {\n stage: 'validate',\n cause: `unknown resource kind ${resource.kind}`,\n }),\n );\n declared.add(resource.handleId);\n }\n const hashes = new Set<string>();\n for (const blob of tape.blobs) {\n if (hashes.has(blob.hash))\n return err(\n createRhiDebugError('tape-invalid', {\n stage: 'validate',\n cause: `duplicate blob hash ${blob.hash}`,\n }),\n );\n hashes.add(blob.hash);\n }\n for (let eventIndex = 0; eventIndex < tape.events.length; eventIndex++) {\n const event = tape.events[eventIndex];\n if (!event || !eventKinds.includes(event.kind))\n return err(\n createRhiDebugError('tape-invalid', {\n stage: 'validate',\n cause: `unknown event kind at ${eventIndex}`,\n }),\n );\n const semantics = eventResources(event);\n for (const created of semantics.created) {\n if (declared.has(created))\n return err(\n createRhiDebugError('tape-invalid', {\n stage: 'validate',\n cause: `duplicate handle ${created}`,\n }),\n );\n declared.add(created);\n }\n for (const read of semantics.reads) {\n if (!declared.has(read))\n return err(\n createRhiDebugError('tape-invalid', {\n stage: 'validate',\n cause: `create-before-use violated for ${read} at ${eventIndex}`,\n }),\n );\n }\n for (const destroyed of semantics.destroyed) {\n if (!declared.has(destroyed))\n return err(\n createRhiDebugError('tape-invalid', {\n stage: 'validate',\n cause: `destroy-before-use violated for ${destroyed} at ${eventIndex}`,\n }),\n );\n declared.delete(destroyed);\n }\n }\n return ok(tape);\n}\n\nfunction isResourceKind(value: string): value is ResourceKind {\n return [\n 'buffer',\n 'texture',\n 'texture-view',\n 'sampler',\n 'shader-module',\n 'pipeline',\n 'binding',\n 'encoder',\n ].includes(value);\n}\n\ninterface EventResources {\n readonly created: readonly string[];\n readonly reads: readonly string[];\n readonly destroyed: readonly string[];\n}\n\nfunction eventResources(event: RhiCallEvent): EventResources {\n switch (event.kind) {\n case 'createBuffer':\n case 'createTexture':\n case 'createSampler':\n case 'createBindGroupLayout':\n case 'createBindGroup':\n case 'createPipelineLayout':\n case 'createRenderPipeline':\n case 'createComputePipeline':\n case 'createShaderModule':\n return {\n created: [event.handleId],\n reads: handleRefs(event, [\n 'layoutHandleId',\n 'vertexShaderModuleHandleId',\n 'fragmentShaderModuleHandleId',\n 'computeShaderModuleHandleId',\n ]),\n destroyed: [],\n };\n case 'createTextureView':\n return { created: [event.resultHandleId], reads: [event.sourceHandleId], destroyed: [] };\n case 'createCommandEncoder':\n return { created: [event.cmdHandleId], reads: [], destroyed: [] };\n case 'destroyBuffer':\n case 'destroyTexture':\n return { created: [], reads: [event.handleId], destroyed: [event.handleId] };\n case 'writeBuffer':\n case 'writeTexture':\n return { created: [], reads: handleRefs(event, ['handleId', 'destination']), destroyed: [] };\n case 'copyBufferToBuffer':\n case 'copyBufferToTexture':\n case 'copyTextureToBuffer':\n case 'copyTextureToTexture':\n case 'clearBuffer':\n return {\n created: [],\n reads: handleRefs(event, [\n 'source',\n 'destination',\n 'sourceHandleId',\n 'destinationHandleId',\n 'bufferHandleId',\n 'textureHandleId',\n ]),\n destroyed: [],\n };\n default:\n return { created: [], reads: [], destroyed: [] };\n }\n}\n\nfunction handleRefs(event: object, keys: readonly string[]): string[] {\n const refs: string[] = [];\n for (const key of keys) {\n const value = (event as Record<string, unknown>)[key];\n if (typeof value === 'string') refs.push(value);\n if (Array.isArray(value))\n refs.push(...value.filter((item): item is string => typeof item === 'string'));\n }\n return refs;\n}\n","import { err, ok, type Result } from '@forgeax/engine-types';\nimport { sha256 } from '@noble/hashes/sha2.js';\nimport { bytesToHex } from '@noble/hashes/utils.js';\nimport pako from 'pako';\nimport { createRhiDebugError } from '../errors';\nimport {\n type RhiCallEvent,\n TAPE_FORMAT_VERSION,\n TAPE_MAGIC,\n type Tape,\n type TapeBlobCompression,\n type TapeEncodeOptions,\n} from './types';\nimport { validateTape } from './validation';\n\nconst MAGIC_BYTES = new TextEncoder().encode(TAPE_MAGIC);\nconst HEADER_BYTES = MAGIC_BYTES.byteLength + 12;\n\ninterface WireBlob {\n readonly hash: string;\n readonly offset: number;\n readonly length: number;\n readonly compression: TapeBlobCompression;\n readonly digest: string;\n}\n\ninterface WireTape {\n readonly header: Tape['header'];\n readonly bootstrap: Tape['bootstrap'];\n readonly events: readonly RhiCallEvent[];\n readonly blobs: readonly WireBlob[];\n}\n\nexport function encodeTape(\n tape: Tape,\n options: TapeEncodeOptions = {},\n): Result<Uint8Array, ReturnType<typeof createRhiDebugError<'tape-invalid'>>> {\n const validation = validateTape(tape);\n if (!validation.ok) return validation;\n const compression = options.compression ?? tape.blobs[0]?.compression ?? 'none';\n const payloads: Uint8Array[] = [];\n const blobs: WireBlob[] = [];\n let offset = 0;\n for (const blob of tape.blobs) {\n const raw = new Uint8Array(blob.bytes);\n const payload = compression === 'gzip' ? pako.gzip(raw) : raw;\n payloads.push(payload);\n blobs.push({\n hash: blob.hash,\n offset,\n length: payload.byteLength,\n compression,\n digest: digestBytes(payload),\n });\n offset += payload.byteLength;\n }\n const wire: WireTape = {\n header: { ...tape.header, blobCount: blobs.length },\n bootstrap: tape.bootstrap,\n events: tape.events,\n blobs,\n };\n const json = canonicalJson(wire);\n const jsonBytes = new TextEncoder().encode(json);\n const output = new Uint8Array(HEADER_BYTES + jsonBytes.byteLength + offset);\n output.set(MAGIC_BYTES, 0);\n const view = new DataView(output.buffer);\n view.setUint32(MAGIC_BYTES.byteLength, TAPE_FORMAT_VERSION, true);\n view.setUint32(MAGIC_BYTES.byteLength + 4, jsonBytes.byteLength, true);\n view.setUint32(MAGIC_BYTES.byteLength + 8, offset, true);\n output.set(jsonBytes, HEADER_BYTES);\n let cursor = HEADER_BYTES + jsonBytes.byteLength;\n for (const payload of payloads) {\n output.set(payload, cursor);\n cursor += payload.byteLength;\n }\n return ok(output);\n}\n\nexport function decodeTape(\n bytes: Uint8Array,\n): Result<\n Tape,\n | ReturnType<typeof createRhiDebugError<'tape-invalid'>>\n | ReturnType<typeof createRhiDebugError<'tape-version-unsupported'>>\n> {\n const legacy = decodeLegacyVersion(bytes);\n if (legacy !== undefined)\n return err(\n createRhiDebugError('tape-version-unsupported', { foundVersion: legacy, expectedVersion: 7 }),\n );\n if (bytes.byteLength < HEADER_BYTES)\n return err(\n createRhiDebugError('tape-invalid', { stage: 'decode', cause: 'container is truncated' }),\n );\n for (let i = 0; i < MAGIC_BYTES.byteLength; i++) {\n if (bytes[i] !== MAGIC_BYTES[i])\n return err(\n createRhiDebugError('tape-invalid', {\n stage: 'decode',\n cause: 'magic does not match RHITAPE',\n }),\n );\n }\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const version = view.getUint32(MAGIC_BYTES.byteLength, true);\n if (version !== TAPE_FORMAT_VERSION)\n return err(\n createRhiDebugError('tape-version-unsupported', {\n foundVersion: version,\n expectedVersion: 7,\n }),\n );\n const jsonLength = view.getUint32(MAGIC_BYTES.byteLength + 4, true);\n const payloadLength = view.getUint32(MAGIC_BYTES.byteLength + 8, true);\n const payloadStart = HEADER_BYTES + jsonLength;\n if (payloadStart > bytes.byteLength || payloadStart + payloadLength !== bytes.byteLength) {\n return err(\n createRhiDebugError('tape-invalid', {\n stage: 'decode',\n cause: 'container length is out of bounds',\n }),\n );\n }\n let wire: WireTape;\n try {\n wire = JSON.parse(\n new TextDecoder().decode(bytes.subarray(HEADER_BYTES, payloadStart)),\n ) as WireTape;\n } catch {\n return err(\n createRhiDebugError('tape-invalid', { stage: 'decode', cause: 'canonical JSON is invalid' }),\n );\n }\n if (\n wire.header?.formatVersion !== TAPE_FORMAT_VERSION ||\n !Array.isArray(wire.events) ||\n !Array.isArray(wire.blobs)\n ) {\n return err(\n createRhiDebugError('tape-invalid', {\n stage: 'validate',\n cause: 'required v7 fields are missing',\n }),\n );\n }\n const payload = bytes.subarray(payloadStart);\n const decodedBlobs = [];\n for (const blob of wire.blobs) {\n if (\n !Number.isInteger(blob.offset) ||\n !Number.isInteger(blob.length) ||\n blob.offset < 0 ||\n blob.length < 0 ||\n blob.offset + blob.length > payload.byteLength\n ) {\n return err(\n createRhiDebugError('tape-invalid', {\n stage: 'validate',\n cause: 'blob table entry is out of bounds',\n }),\n );\n }\n const stored = payload.slice(blob.offset, blob.offset + blob.length);\n if (digestBytes(stored) !== blob.digest)\n return err(\n createRhiDebugError('tape-invalid', {\n stage: 'validate',\n cause: `blob digest mismatch for ${blob.hash}`,\n }),\n );\n let raw: Uint8Array;\n try {\n raw = blob.compression === 'gzip' ? new Uint8Array(pako.ungzip(stored)) : stored;\n } catch {\n return err(\n createRhiDebugError('tape-invalid', {\n stage: 'decode',\n cause: `blob decompression failed for ${blob.hash}`,\n }),\n );\n }\n decodedBlobs.push({ hash: blob.hash, bytes: raw, compression: blob.compression });\n }\n const tape: Tape = {\n header: { ...wire.header, formatVersion: TAPE_FORMAT_VERSION, blobCount: decodedBlobs.length },\n bootstrap: wire.bootstrap ?? [],\n events: wire.events,\n blobs: decodedBlobs,\n };\n const validation = validateTape(tape);\n if (!validation.ok) return validation;\n return ok(tape);\n}\n\nfunction decodeLegacyVersion(bytes: Uint8Array): number | undefined {\n if (bytes.length === 0 || bytes[0] !== 123) return undefined;\n try {\n const parsed = JSON.parse(new TextDecoder().decode(bytes)) as { formatVersion?: unknown };\n return typeof parsed.formatVersion === 'number' && parsed.formatVersion !== 7\n ? parsed.formatVersion\n : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction canonicalJson(value: unknown): string {\n if (value === null || typeof value !== 'object') return JSON.stringify(value);\n if (Array.isArray(value)) return `[${value.map(canonicalJson).join(',')}]`;\n const object = value as Record<string, unknown>;\n return `{${Object.keys(object)\n .sort()\n .map((key) => `${JSON.stringify(key)}:${canonicalJson(object[key])}`)\n .join(',')}}`;\n}\n\nfunction digestBytes(bytes: Uint8Array): string {\n return `sha256:${bytesToHex(sha256(bytes))}`;\n}\n","// @forgeax/engine-rhi-debug/src/readback — shared GPU texture→host readback utilities.\n//\n// Extracted from inspector.ts (round 1 fix-up 34be40d6, I-7) for reuse by\n// replayer.readbackRt() (m5b-1) and e2e.dawn.test.ts (m5b-3).\n//\n// Related: plan-strategy §5.3.1; m5b-1 / m5b-3.\n\n/// <reference types=\"@webgpu/types\" />\n\nimport type {\n Buffer,\n MappedBuffer,\n RhiCommandEncoder,\n RhiDevice,\n RhiQueue,\n} from '@forgeax/engine-rhi';\nimport type { Result } from '@forgeax/engine-types';\nimport { err, ok } from '@forgeax/engine-types';\nimport { createRhiDebugError, type RhiDebugError } from './errors';\nimport type { RhiCallEvent } from './types';\n\n// GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ = 8 | 1 = 9.\nconst COPY_DST_MAP_READ = 9;\nconst TEXTURE_READBACK_USAGE = COPY_DST_MAP_READ;\n\n// ============================================================================\n// resolveTextureDescriptor — tape handle -> source texture descriptor (SSOT)\n// ============================================================================\n\n/** Resolved descriptor for a texture (or texture-view) handle from the tape. */\nexport interface ResolvedTextureDescriptor {\n /** The source GPUTexture handleId (copyTextureToBuffer needs a texture, not a view). */\n readonly handleId: string;\n readonly width: number;\n readonly height: number;\n readonly format: string;\n /** The view's dimension ('2d' | 'cube' | '2d-array' | '3d' | ...); '2d' when no view event. */\n readonly dimension: string;\n /** The source texture's depthOrArrayLayers (slice count); 1 for a plain 2D texture. */\n readonly arrayLayers: number;\n}\n\n/**\n * Walk the tape events to resolve a view-or-texture handleId to its source\n * GPUTexture descriptor (handleId, real dimensions, format, view dimension).\n *\n * The single source of truth for \"tape handle -> texture descriptor\": both the\n * color-attachment RT path (resolveAttachmentSize / readbackDrawRt) and the\n * viewer's depth + bound-texture preview paths resolve handles this way —\n * createTextureView.resultHandleId -> sourceHandleId -> createTexture, falling\n * back to the id itself when it is a direct texture handle (no view event).\n *\n * Size is read from the raw createTexture event. Returns null when no\n * createTexture event declares the resolved handle.\n */\nexport function resolveTextureDescriptor(\n events: readonly RhiCallEvent[],\n viewOrTextureHandleId: string,\n): ResolvedTextureDescriptor | null {\n // Step 1: resolve texture view -> source texture handleId + capture view dimension.\n let sourceTextureHandleId: string | undefined;\n let viewDimension: string | undefined;\n for (const ev of events) {\n if (ev.kind === 'createTextureView' && ev.resultHandleId === viewOrTextureHandleId) {\n sourceTextureHandleId = ev.sourceHandleId;\n viewDimension = ev.desc.dimension;\n break;\n }\n }\n // Some handles are texture handles directly (no view event).\n const targetHandleId = sourceTextureHandleId ?? viewOrTextureHandleId;\n\n // Step 2: find the createTexture event for the resolved texture handleId.\n for (const ev of events) {\n if (ev.kind === 'createTexture' && ev.handleId === targetHandleId) {\n const sz = ev.desc.size;\n let width: number;\n let height: number;\n let arrayLayers: number;\n // GPUExtent3DStrict: { width, height?, depthOrArrayLayers? } or [w, h?, d?]\n if (Array.isArray(sz)) {\n width = typeof sz[0] === 'number' ? sz[0] : 512;\n height = typeof sz[1] === 'number' ? sz[1] : width;\n arrayLayers = typeof sz[2] === 'number' ? sz[2] : 1;\n } else {\n const obj = sz as { width: number; height?: number; depthOrArrayLayers?: number };\n width = typeof obj.width === 'number' ? obj.width : 512;\n height = typeof obj.height === 'number' ? obj.height : width;\n arrayLayers = typeof obj.depthOrArrayLayers === 'number' ? obj.depthOrArrayLayers : 1;\n }\n return {\n handleId: targetHandleId,\n width,\n height,\n format: ev.desc.format,\n // View dimension wins; else the texture's own dimension; else '2d'.\n dimension: viewDimension ?? ev.desc.dimension ?? '2d',\n arrayLayers,\n };\n }\n }\n\n return null;\n}\n\n// ============================================================================\n// resolveAttachmentSize — walk tape events to find texture dimensions\n// ============================================================================\n\n/**\n * Walk the tape events to find the real texture dimensions for a given\n * color attachment view/target handleId. Avoids hard-coding 512×512.\n *\n * Thin wrapper over {@link resolveTextureDescriptor}; returns\n * { width: 512, height: 512 } as a conservative fallback when no createTexture\n * event is found (should not happen for a real frame).\n */\nexport function resolveAttachmentSize(\n events: readonly RhiCallEvent[],\n attachmentViewHandleId: string,\n): { readonly width: number; readonly height: number } {\n const desc = resolveTextureDescriptor(events, attachmentViewHandleId);\n if (desc === null) return { width: 512, height: 512 };\n return { width: desc.width, height: desc.height };\n}\n\n// ============================================================================\n// readbackTexturePixels — copyTextureToBuffer + mapAsync + getMappedRange\n// ============================================================================\n\n/**\n * Read back raw RGBA8 pixels from a GPU texture into a host-side Uint8Array.\n *\n * Steps:\n * 1. Create a staging buffer (COPY_DST | MAP_READ) sized to aligned rows.\n * 2. Create a command encoder + copyTextureToBuffer.\n * 3. Finish + submit + await onSubmittedWorkDone.\n * 4. mapAsync(READ) + getMappedRange() → new Uint8Array(slice).\n * 5. Unmap + destroy staging buffer.\n *\n * The returned Uint8Array has length = texWidth * texHeight * 4 (tight;\n * alignment padding is stripped). The buffer alignment is WebGPU 256-byte\n * row requirement.\n *\n * @param device - The RHI device that owns the texture.\n * @param texture - The texture to read back (opaque branded handle at the boundary).\n * @param texWidth - Texture width in pixels.\n * @param texHeight - Texture height in pixels.\n */\nexport async function readbackTexturePixels(\n device: RhiDevice,\n texture: unknown,\n texWidth: number,\n texHeight: number,\n opts?: {\n /** Bytes in one uncompressed texel; retained for depth/color callers. */\n bytesPerTexel?: number;\n /** Compressed-format footprint; defaults to bytesPerTexel with a 1x1 block. */\n bytesPerBlock?: number;\n blockWidth?: number;\n blockHeight?: number;\n mipLevel?: number;\n baseArrayLayer?: number;\n aspect?: 'all' | 'depth-only' | 'stencil-only';\n },\n): Promise<Uint8Array> {\n const bytesPerBlock = opts?.bytesPerBlock ?? opts?.bytesPerTexel ?? 4;\n const blockWidth = opts?.blockWidth ?? 1;\n const blockHeight = opts?.blockHeight ?? 1;\n const blockCountX = Math.ceil(texWidth / blockWidth);\n const blockCountY = Math.ceil(texHeight / blockHeight);\n const copyWidth = blockCountX * blockWidth;\n const copyHeight = blockCountY * blockHeight;\n const mipLevel = opts?.mipLevel ?? 0;\n const baseArrayLayer = opts?.baseArrayLayer ?? 0;\n const aspect = opts?.aspect;\n const rowBytes = blockCountX * bytesPerBlock;\n const alignedRowBytes = Math.ceil(rowBytes / 256) * 256; // WebGPU alignment\n const bufferSize = alignedRowBytes * blockCountY;\n\n const readbackBufferResult = device.createBuffer({\n size: bufferSize,\n usage: COPY_DST_MAP_READ,\n });\n if (!readbackBufferResult.ok) {\n throw new Error(`createBuffer for readback failed: ${readbackBufferResult.error.code}`);\n }\n const readbackBuffer = readbackBufferResult.value;\n\n const encoderResult = device.createCommandEncoder({});\n if (!encoderResult.ok) {\n device.destroyBuffer(readbackBuffer);\n throw new Error(`createCommandEncoder for readback failed: ${encoderResult.error.code}`);\n }\n const encoder = encoderResult.value;\n\n try {\n encoder.copyTextureToBuffer(\n {\n texture,\n mipLevel,\n origin: { x: 0, y: 0, z: baseArrayLayer },\n // aspect selects depth vs stencil plane on combined depth-stencil\n // textures. stencil-only IS copyable on depth24plus-stencil8 (the\n // depth plane is not). Omitted -> backend default ('all').\n ...(aspect !== undefined ? { aspect } : {}),\n } as unknown as never,\n {\n buffer: readbackBuffer,\n offset: 0,\n bytesPerRow: alignedRowBytes,\n rowsPerImage: blockCountY,\n } as unknown as never,\n { width: copyWidth, height: copyHeight, depthOrArrayLayers: 1 },\n );\n } catch {\n device.destroyBuffer(readbackBuffer);\n throw new Error('copyTextureToBuffer failed');\n }\n\n const finishResult = encoder.finish();\n if (!finishResult.ok) {\n device.destroyBuffer(readbackBuffer);\n throw new Error(`encoder.finish failed: ${finishResult.error.code}`);\n }\n\n const queue: RhiQueue = device.queue;\n queue.submit([finishResult.value as unknown as never] as unknown as readonly never[]);\n await queue.onSubmittedWorkDone();\n\n // RHI Buffer.mapAsync / MappedBuffer.getMappedRange return Result wrappers, not\n // the raw spec void / ArrayBuffer. The previous `as unknown as { ... }` casts\n // hid that: mapAsync was called with mode=2 (which is GPUMapMode.WRITE, not\n // READ=0x1) and getMappedRange's Result object was fed straight into\n // `new Uint8Array(...)`, yielding a zero-length array — every RT readback came\n // back all-zero (transparent black), which the e2e delta check missed because\n // baseline and replay were equally empty (empty-vs-empty trap).\n const buffer = readbackBuffer as unknown as Buffer;\n // GPUMapMode.READ = 0x1\n const mapResult = await buffer.mapAsync(0x1);\n if (!mapResult.ok) {\n device.destroyBuffer(readbackBuffer);\n throw new Error(`mapAsync(READ) failed: ${mapResult.error.code}`);\n }\n const mapped: MappedBuffer = mapResult.value;\n\n const rangeResult = mapped.getMappedRange();\n if (!rangeResult.ok) {\n mapped.unmap();\n device.destroyBuffer(readbackBuffer);\n throw new Error(`getMappedRange failed: ${rangeResult.error.code}`);\n }\n const fullPixels = new Uint8Array(rangeResult.value);\n\n // Extract tight pixels (strip alignment padding)\n const tightPixels = new Uint8Array(blockCountX * blockCountY * bytesPerBlock);\n for (let y = 0; y < blockCountY; y++) {\n const srcOffset = y * alignedRowBytes;\n const dstOffset = y * rowBytes;\n for (let x = 0; x < rowBytes; x++) {\n tightPixels[dstOffset + x] = fullPixels[srcOffset + x] ?? 0;\n }\n }\n\n // Cleanup\n mapped.unmap();\n device.destroyBuffer(readbackBuffer);\n\n return tightPixels;\n}\n\n// ============================================================================\n// readbackBufferBytes — copyBufferToBuffer + mapAsync + getMappedRange (D-7)\n// ============================================================================\n\n/**\n * Read back the raw bytes of a GPU buffer into a host-side ArrayBuffer.\n *\n * Sibling of readbackTexturePixels under the single \"GPU byte readback\"\n * responsibility unit (plan-strategy D-7) — snapshotResource calls this to\n * capture a buffer's initial GPU bytes at frame-header time.\n *\n * Steps:\n * 1. Create a staging buffer (COPY_DST | MAP_READ) sized to `size`.\n * 2. Create a command encoder + copyBufferToBuffer(src, 0, staging, 0, size).\n * 3. Finish + submit + await onSubmittedWorkDone.\n * 4. mapAsync(READ=0x1) + getMappedRange() -> sliced ArrayBuffer copy.\n * 5. Unmap + destroy staging buffer.\n *\n * Returns Ok(ArrayBuffer) (a detached copy independent of the mapped range)\n * or Err(readback-failed) with `.detail.phase` narrowing\n * the failure point (copy / map). The buffer is passed opaque (`unknown`)\n * because RHI handles are branded; the caller resolved it from the descriptor\n * registry. The caller (snapshotResource) holds the handleId and maps this\n * readback error to the capture-snapshot-failed boundary.\n *\n * Reuses the M0-fixed mapAsync(0x1) + Result-unwrap pattern from\n * readbackTexturePixels (never the all-zero mode=2 bug).\n *\n * @param device - The RHI device that owns the buffer.\n * @param buffer - The source buffer (opaque branded handle) to read back.\n * @param size - Number of bytes to read back (the buffer's recorded size).\n */\nexport async function readbackBufferBytes(\n device: RhiDevice,\n buffer: unknown,\n size: number,\n): Promise<Result<ArrayBuffer, RhiDebugError>> {\n const fail = (phase: 'copy' | 'map', cause: string): Result<ArrayBuffer, RhiDebugError> =>\n err(createRhiDebugError('readback-failed', { stage: 'readback', phase, cause }));\n\n const readbackBufferResult = device.createBuffer({ size, usage: COPY_DST_MAP_READ });\n if (!readbackBufferResult.ok) {\n return fail('copy', `staging buffer creation failed: ${readbackBufferResult.error.code}`);\n }\n const readbackBuffer = readbackBufferResult.value;\n\n const encoderResult = device.createCommandEncoder({});\n if (!encoderResult.ok) {\n device.destroyBuffer(readbackBuffer);\n return fail('copy', `command encoder creation failed: ${encoderResult.error.code}`);\n }\n const encoder = encoderResult.value;\n\n try {\n encoder.copyBufferToBuffer(buffer as Buffer, 0, readbackBuffer, 0, size);\n } catch (e) {\n device.destroyBuffer(readbackBuffer);\n return fail('copy', `copyBufferToBuffer failed: ${String(e)}`);\n }\n\n const finishResult = encoder.finish();\n if (!finishResult.ok) {\n device.destroyBuffer(readbackBuffer);\n return fail('copy', `encoder.finish failed: ${finishResult.error.code}`);\n }\n\n const queue: RhiQueue = device.queue;\n queue.submit([finishResult.value as unknown as never] as unknown as readonly never[]);\n await queue.onSubmittedWorkDone();\n\n const stagingBuffer = readbackBuffer as unknown as Buffer;\n // GPUMapMode.READ = 0x1\n const mapResult = await stagingBuffer.mapAsync(0x1);\n if (!mapResult.ok) {\n device.destroyBuffer(readbackBuffer);\n return fail('map', `mapAsync(READ) failed: ${mapResult.error.code}`);\n }\n const mapped: MappedBuffer = mapResult.value;\n\n const rangeResult = mapped.getMappedRange();\n if (!rangeResult.ok) {\n mapped.unmap();\n device.destroyBuffer(readbackBuffer);\n return fail('map', `getMappedRange failed: ${rangeResult.error.code}`);\n }\n\n // Copy the mapped bytes into a standalone ArrayBuffer before unmap — the\n // mapped range is invalidated on unmap.\n const bytes = new Uint8Array(rangeResult.value).slice();\n\n mapped.unmap();\n device.destroyBuffer(readbackBuffer);\n\n return ok(bytes.buffer as ArrayBuffer);\n}\n\n/** A load-time buffer that can be read back as part of one GPU submission. */\nexport interface BufferReadbackBatchRequest {\n readonly handleId: string;\n readonly buffer: unknown;\n readonly size: number;\n}\n\nexport interface BufferReadbackBatchCallbacks {\n readonly onResourceStart?: (handleId: string) => void;\n readonly onResourceComplete?: (handleId: string) => void;\n /** Return true when the owning snapshot generation has been invalidated. */\n readonly isCancelled?: () => boolean;\n}\n\nasync function raceCancellation<T>(\n work: Promise<T>,\n isCancelled: (() => boolean) | undefined,\n): Promise<{ readonly cancelled: true } | { readonly cancelled: false; readonly value: T }> {\n if (isCancelled === undefined) return { cancelled: false, value: await work };\n if (isCancelled()) return { cancelled: true };\n\n let timer: ReturnType<typeof setInterval> | undefined;\n const cancelled = new Promise<{ readonly cancelled: true }>((resolve) => {\n timer = setInterval(() => {\n if (isCancelled()) resolve({ cancelled: true });\n }, 1);\n });\n try {\n return await Promise.race([\n work.then((value) => ({ cancelled: false as const, value })),\n cancelled,\n ]);\n } finally {\n if (timer !== undefined) clearInterval(timer);\n }\n}\n\n/**\n * Read back multiple buffers with one command submission and one queue drain.\n *\n * Prism City exposed the cost of the old one-buffer helper: every resource\n * submitted and awaited independently, so thousands of small buffers spent\n * most of capture time in synchronization rather than byte transfer. The\n * batch keeps each staging buffer isolated but submits all copies together;\n * mapping remains per-resource so a timeout can still identify the current\n * handle and the caller can preserve the original initialData event order.\n */\nexport async function readbackBufferBytesBatch(\n device: RhiDevice,\n requests: readonly BufferReadbackBatchRequest[],\n callbacks: BufferReadbackBatchCallbacks = {},\n): Promise<Result<ReadonlyMap<string, ArrayBuffer>, RhiDebugError>> {\n if (requests.length === 0) return ok(new Map());\n const firstRequest = requests[0];\n if (firstRequest === undefined) return ok(new Map());\n\n const fail = (handleId: string, phase: 'copy' | 'map', cause: string) =>\n err(\n createRhiDebugError('readback-failed', {\n stage: 'readback',\n phase,\n cause: `${handleId}: ${cause}`,\n }),\n );\n const staging: Array<{ readonly request: BufferReadbackBatchRequest; readonly buffer: Buffer }> =\n [];\n const mapped = new Map<Buffer, MappedBuffer>();\n const cleaned = new Set<Buffer>();\n const cleanup = () => {\n for (const mappedBuffer of mapped.values()) mappedBuffer.unmap();\n for (const item of staging) {\n if (!cleaned.has(item.buffer)) {\n device.destroyBuffer(item.buffer);\n cleaned.add(item.buffer);\n }\n }\n };\n\n let encoder: RhiCommandEncoder;\n try {\n const encoderResult = device.createCommandEncoder({});\n if (!encoderResult.ok)\n return fail(\n firstRequest.handleId,\n 'copy',\n `command encoder creation failed: ${encoderResult.error.code}`,\n );\n encoder = encoderResult.value;\n for (const request of requests) {\n const stagingResult = device.createBuffer({ size: request.size, usage: COPY_DST_MAP_READ });\n if (!stagingResult.ok) {\n cleanup();\n return fail(\n request.handleId,\n 'copy',\n `staging buffer creation failed: ${stagingResult.error.code}`,\n );\n }\n const stagingBuffer = stagingResult.value;\n staging.push({ request, buffer: stagingBuffer });\n try {\n encoder.copyBufferToBuffer(request.buffer as Buffer, 0, stagingBuffer, 0, request.size);\n } catch (error) {\n cleanup();\n return fail(request.handleId, 'copy', `copyBufferToBuffer failed: ${String(error)}`);\n }\n }\n const finishResult = encoder.finish();\n if (!finishResult.ok) {\n cleanup();\n return fail(\n firstRequest.handleId,\n 'copy',\n `encoder.finish failed: ${finishResult.error.code}`,\n );\n }\n device.queue.submit([finishResult.value as unknown as never] as unknown as readonly never[]);\n await device.queue.onSubmittedWorkDone();\n\n // Start every mapAsync together. The GPU work has already been submitted\n // and drained; awaiting each map before starting the next one recreates a\n // per-resource synchronization wall even after batching the copies.\n const mapResultsPromise = Promise.all(\n staging.map(async (item) => {\n callbacks.onResourceStart?.(item.request.handleId);\n try {\n const result = await item.buffer.mapAsync(0x1);\n if (result.ok) {\n if (callbacks.isCancelled?.()) result.value.unmap();\n else mapped.set(item.buffer, result.value);\n }\n return { item, result };\n } catch (error) {\n return { item, error };\n }\n }),\n );\n const mapResults = await raceCancellation(mapResultsPromise, callbacks.isCancelled);\n if (mapResults.cancelled) {\n cleanup();\n return fail(\n firstRequest.handleId,\n 'map',\n 'buffer batch readback cancelled after the snapshot generation was invalidated',\n );\n }\n const result = new Map<string, ArrayBuffer>();\n for (const mappedResult of mapResults.value) {\n if ('error' in mappedResult) {\n cleanup();\n return fail(\n mappedResult.item.request.handleId,\n 'map',\n `mapAsync(READ) failed: ${String(mappedResult.error)}`,\n );\n }\n if (!mappedResult.result.ok) {\n cleanup();\n return fail(\n mappedResult.item.request.handleId,\n 'map',\n `mapAsync(READ) failed: ${mappedResult.result.error.code}`,\n );\n }\n const mappedBuffer = mappedResult.result.value;\n const item = mappedResult.item;\n const rangeResult = mappedBuffer.getMappedRange();\n if (!rangeResult.ok) {\n cleanup();\n return fail(\n item.request.handleId,\n 'map',\n `getMappedRange failed: ${rangeResult.error.code}`,\n );\n }\n result.set(\n item.request.handleId,\n new Uint8Array(rangeResult.value).slice().buffer as ArrayBuffer,\n );\n mappedBuffer.unmap();\n mapped.delete(item.buffer);\n device.destroyBuffer(item.buffer);\n cleaned.add(item.buffer);\n callbacks.onResourceComplete?.(item.request.handleId);\n }\n return ok(result);\n } catch (error) {\n cleanup();\n return fail(firstRequest.handleId, 'map', `buffer batch readback failed: ${String(error)}`);\n }\n}\n\n/** One (layer, mip) copy contributing to a complete texture snapshot blob. */\nexport interface TextureReadbackBatchSlice {\n readonly layer: number;\n readonly mip: number;\n readonly width: number;\n readonly height: number;\n readonly byteOffset: number;\n readonly byteLength: number;\n}\n\n/** A complete texture whose subresources are copied in one bounded batch. */\nexport interface TextureReadbackBatchRequest {\n readonly handleId: string;\n readonly texture: unknown;\n readonly bytesPerBlock: number;\n readonly blockWidth: number;\n readonly blockHeight: number;\n readonly totalBytes: number;\n readonly slices: readonly TextureReadbackBatchSlice[];\n}\n\nexport interface TextureReadbackBatchCallbacks {\n readonly onResourceStart?: (handleId: string) => void;\n readonly onResourceComplete?: (handleId: string) => void;\n /** Return true when the owning snapshot generation has been invalidated. */\n readonly isCancelled?: () => boolean;\n}\n\n/**\n * Read complete texture snapshots with one submission and drain per bounded\n * resource batch. Each subresource retains its own staging buffer, so mip and\n * array-layer bytes are copied without padding or ordering loss.\n */\nexport async function readbackTexturePixelsBatch(\n device: RhiDevice,\n requests: readonly TextureReadbackBatchRequest[],\n callbacks: TextureReadbackBatchCallbacks = {},\n): Promise<Result<ReadonlyMap<string, ArrayBuffer>, RhiDebugError>> {\n if (requests.length === 0) return ok(new Map());\n const firstRequest = requests[0];\n if (firstRequest === undefined) return ok(new Map());\n\n const fail = (handleId: string, phase: 'copy' | 'map', cause: string) =>\n err(\n createRhiDebugError('readback-failed', {\n stage: 'readback',\n phase,\n cause: `${handleId}: ${cause}`,\n }),\n );\n const staging: Array<{\n readonly request: TextureReadbackBatchRequest;\n readonly slice: TextureReadbackBatchSlice;\n readonly buffer: Buffer;\n readonly bytesPerBlock: number;\n readonly blockWidth: number;\n readonly blockHeight: number;\n }> = [];\n const mapped = new Map<Buffer, MappedBuffer>();\n const cleaned = new Set<Buffer>();\n const cleanup = () => {\n for (const mappedBuffer of mapped.values()) mappedBuffer.unmap();\n for (const item of staging) {\n if (!cleaned.has(item.buffer)) {\n device.destroyBuffer(item.buffer);\n cleaned.add(item.buffer);\n }\n }\n };\n\n let encoder: RhiCommandEncoder;\n try {\n const encoderResult = device.createCommandEncoder({});\n if (!encoderResult.ok)\n return fail(\n firstRequest.handleId,\n 'copy',\n `command encoder creation failed: ${encoderResult.error.code}`,\n );\n encoder = encoderResult.value;\n for (const request of requests) {\n for (const slice of request.slices) {\n const blockCountX = Math.ceil(slice.width / request.blockWidth);\n const blockCountY = Math.ceil(slice.height / request.blockHeight);\n const rowBytes = blockCountX * request.bytesPerBlock;\n const alignedRowBytes = Math.ceil(rowBytes / 256) * 256;\n const stagingResult = device.createBuffer({\n size: alignedRowBytes * blockCountY,\n usage: TEXTURE_READBACK_USAGE,\n });\n if (!stagingResult.ok) {\n cleanup();\n return fail(\n request.handleId,\n 'copy',\n `staging buffer creation failed: ${stagingResult.error.code}`,\n );\n }\n const stagingBuffer = stagingResult.value;\n staging.push({\n request,\n slice,\n buffer: stagingBuffer,\n bytesPerBlock: request.bytesPerBlock,\n blockWidth: request.blockWidth,\n blockHeight: request.blockHeight,\n });\n try {\n encoder.copyTextureToBuffer(\n {\n texture: request.texture,\n mipLevel: slice.mip,\n origin: { x: 0, y: 0, z: slice.layer },\n } as unknown as never,\n {\n buffer: stagingBuffer,\n offset: 0,\n bytesPerRow: alignedRowBytes,\n rowsPerImage: blockCountY,\n } as unknown as never,\n {\n width: blockCountX * request.blockWidth,\n height: blockCountY * request.blockHeight,\n depthOrArrayLayers: 1,\n },\n );\n } catch (error) {\n cleanup();\n return fail(request.handleId, 'copy', `copyTextureToBuffer failed: ${String(error)}`);\n }\n }\n }\n const finishResult = encoder.finish();\n if (!finishResult.ok) {\n cleanup();\n return fail(\n firstRequest.handleId,\n 'copy',\n `encoder.finish failed: ${finishResult.error.code}`,\n );\n }\n device.queue.submit([finishResult.value as unknown as never] as unknown as readonly never[]);\n const drain = raceCancellation(device.queue.onSubmittedWorkDone(), callbacks.isCancelled);\n const drainResult = await drain;\n if (drainResult.cancelled) {\n cleanup();\n return fail(\n firstRequest.handleId,\n 'map',\n 'texture batch readback cancelled after the snapshot generation was invalidated',\n );\n }\n\n for (const request of requests) callbacks.onResourceStart?.(request.handleId);\n const mapResultsPromise = Promise.all(\n staging.map(async (item) => {\n try {\n const result = await item.buffer.mapAsync(0x1);\n if (result.ok) {\n if (callbacks.isCancelled?.()) result.value.unmap();\n else mapped.set(item.buffer, result.value);\n }\n return { item, result };\n } catch (error) {\n return { item, error };\n }\n }),\n );\n const mapResults = await raceCancellation(mapResultsPromise, callbacks.isCancelled);\n if (mapResults.cancelled) {\n cleanup();\n return fail(\n firstRequest.handleId,\n 'map',\n 'texture batch readback cancelled after the snapshot generation was invalidated',\n );\n }\n\n const bytesByHandle = new Map<string, Uint8Array>();\n for (const request of requests)\n bytesByHandle.set(request.handleId, new Uint8Array(request.totalBytes));\n for (const mappedResult of mapResults.value) {\n if ('error' in mappedResult) {\n cleanup();\n return fail(\n mappedResult.item.request.handleId,\n 'map',\n `mapAsync(READ) failed: ${String(mappedResult.error)}`,\n );\n }\n if (!mappedResult.result.ok) {\n cleanup();\n return fail(\n mappedResult.item.request.handleId,\n 'map',\n `mapAsync(READ) failed: ${mappedResult.result.error.code}`,\n );\n }\n const item = mappedResult.item;\n const mappedBuffer = mappedResult.result.value;\n const rangeResult = mappedBuffer.getMappedRange();\n if (!rangeResult.ok) {\n cleanup();\n return fail(\n item.request.handleId,\n 'map',\n `getMappedRange failed: ${rangeResult.error.code}`,\n );\n }\n const fullBytes = new Uint8Array(rangeResult.value);\n const blockCountX = Math.ceil(item.slice.width / item.blockWidth);\n const blockCountY = Math.ceil(item.slice.height / item.blockHeight);\n const rowBytes = blockCountX * item.bytesPerBlock;\n const alignedRowBytes = Math.ceil(rowBytes / 256) * 256;\n const output = bytesByHandle.get(item.request.handleId);\n if (output === undefined) {\n cleanup();\n return fail(item.request.handleId, 'map', 'texture batch returned an unknown handle');\n }\n for (let y = 0; y < blockCountY; y++) {\n const srcOffset = y * alignedRowBytes;\n const dstOffset = item.slice.byteOffset + y * rowBytes;\n for (let x = 0; x < rowBytes; x++) output[dstOffset + x] = fullBytes[srcOffset + x] ?? 0;\n }\n mappedBuffer.unmap();\n mapped.delete(item.buffer);\n device.destroyBuffer(item.buffer);\n cleaned.add(item.buffer);\n }\n const result = new Map<string, ArrayBuffer>();\n for (const request of requests) {\n const bytes = bytesByHandle.get(request.handleId);\n if (bytes === undefined) {\n cleanup();\n return fail(request.handleId, 'map', 'texture batch returned no bytes for a live texture');\n }\n result.set(request.handleId, bytes.buffer as ArrayBuffer);\n callbacks.onResourceComplete?.(request.handleId);\n }\n return ok(result);\n } catch (error) {\n cleanup();\n return fail(firstRequest.handleId, 'map', `texture batch readback failed: ${String(error)}`);\n }\n}\n","import { err, ok, type Result } from '@forgeax/engine-types';\nimport { sha256 } from '@noble/hashes/sha2.js';\nimport { bytesToHex } from '@noble/hashes/utils.js';\nimport { createRhiDebugError, type RhiDebugError } from '../errors';\nimport { encodeTape } from '../protocol/codec';\nimport type { BootstrapResource, Tape as V7Tape } from '../protocol/types';\nimport type { DebugRhiInstance } from '../recorder';\nimport type { HandleId, Tape as LegacyTape, RhiCallEvent } from '../types';\n\nexport interface EncodedTape {\n readonly bytes: Uint8Array;\n readonly digest: string;\n readonly tape: V7Tape;\n}\n\nexport function assembleTape(recorder: DebugRhiInstance): Result<EncodedTape, RhiDebugError> {\n const legacy = recorder.getTape();\n if (legacy === undefined) {\n return err(\n createRhiDebugError('capture-snapshot-failed', {\n stage: 'snapshot',\n cause: 'the recorder finalized without a frame event',\n }),\n );\n }\n if ('code' in legacy) {\n return err(legacy);\n }\n const tape = toV7Tape(legacy, new Set(recorder.bootstrapEvents()));\n const encoded = encodeTape(tape);\n if (!encoded.ok) return err(encoded.error);\n return ok({\n bytes: encoded.value,\n digest: `sha256:${bytesToHex(sha256(encoded.value))}`,\n tape,\n });\n}\n\nfunction toV7Tape(legacy: LegacyTape, bootstrapEvents: ReadonlySet<RhiCallEvent>): V7Tape {\n const firstFrame = legacy.events.findIndex((event) => event.kind === 'frameMark');\n const boundary = firstFrame < 0 ? legacy.events.length : firstFrame;\n const bootstrap: BootstrapResource[] = [];\n const bootstrapIds = new Set<HandleId>();\n const initialData = new Map<HandleId, string[]>();\n for (const event of legacy.events.slice(0, boundary)) {\n if (event.kind === 'initialData') {\n const hashes = initialData.get(event.handleId) ?? [];\n hashes.push(event.dataHash);\n initialData.set(event.handleId, hashes);\n continue;\n }\n if (!bootstrapEvents.has(event)) continue;\n const handleId = createdHandleId(event);\n const kind = resourceKind(event);\n if (handleId === undefined || kind === undefined || bootstrapIds.has(handleId)) continue;\n bootstrapIds.add(handleId);\n bootstrap.push({\n handleId,\n kind,\n create: toJsonRecord(event),\n initialData: [],\n });\n }\n const allBlobs = Array.from(legacy.blobPool, ([hash, data]) => ({\n hash,\n bytes: new Uint8Array(data),\n compression: 'none' as const,\n }));\n const referenced = collectReferencedHandleIds(legacy.events, bootstrapEvents);\n const closure = collectBootstrapClosure(referenced, bootstrap);\n const keptBootstrap = bootstrap\n .filter((resource) => closure.has(resource.handleId))\n .map((resource) => {\n const hashes = initialData.get(resource.handleId) ?? [];\n const slices = hashes.flatMap((hash) => {\n const blob = legacy.blobPool.get(hash);\n return blob === undefined ? [] : [{ hash, byteOffset: 0, byteLength: blob.byteLength }];\n });\n return { ...resource, initialData: slices };\n });\n const events = legacy.events\n .filter((event) => event.kind !== 'initialData' && !bootstrapEvents.has(event))\n .map(toJsonSafe);\n const keptHashes = new Set(\n keptBootstrap.flatMap((resource) => resource.initialData.map((slice) => slice.hash)),\n );\n for (const event of events) {\n if ('dataHash' in event && typeof event.dataHash === 'string') keptHashes.add(event.dataHash);\n }\n const blobs = allBlobs.filter((blob) => keptHashes.has(blob.hash));\n return {\n header: {\n formatVersion: 7,\n rhiCaps: { ...legacy.rhiCapsRecorded },\n eventCount: events.length,\n blobCount: blobs.length,\n },\n bootstrap: keptBootstrap,\n events,\n blobs,\n };\n}\n\nfunction collectReferencedHandleIds(\n events: readonly RhiCallEvent[],\n bootstrapEvents: ReadonlySet<RhiCallEvent>,\n): Set<HandleId> {\n const ids = new Set<HandleId>();\n for (const event of events) {\n if (event.kind === 'initialData' || bootstrapEvents.has(event)) continue;\n collectHandleStrings(event, ids);\n }\n return ids;\n}\n\nfunction collectHandleStrings(value: unknown, ids: Set<HandleId>): void {\n if (typeof value === 'string' && /^[a-zA-Z][a-zA-Z-]*:\\S+$/.test(value)) {\n ids.add(value);\n return;\n }\n if (Array.isArray(value)) {\n for (const entry of value) collectHandleStrings(entry, ids);\n return;\n }\n if (value !== null && typeof value === 'object') {\n for (const entry of Object.values(value)) collectHandleStrings(entry, ids);\n }\n}\n\nfunction collectBootstrapClosure(\n referenced: ReadonlySet<HandleId>,\n resources: readonly BootstrapResource[],\n): Set<HandleId> {\n const byId = new Map(resources.map((resource) => [resource.handleId, resource]));\n const closure = new Set<HandleId>();\n const pending = [...referenced];\n while (pending.length > 0) {\n const handleId = pending.pop();\n if (handleId === undefined || closure.has(handleId)) continue;\n const resource = byId.get(handleId);\n if (resource === undefined) continue;\n closure.add(handleId);\n const dependencies = new Set<HandleId>();\n collectHandleStrings(resource.create, dependencies);\n pending.push(...dependencies);\n }\n return closure;\n}\n\nfunction toJsonSafe(event: RhiCallEvent): RhiCallEvent {\n return JSON.parse(JSON.stringify(event)) as RhiCallEvent;\n}\n\nfunction toJsonRecord(event: RhiCallEvent): Record<string, unknown> {\n return JSON.parse(JSON.stringify(event));\n}\n\nfunction createdHandleId(event: RhiCallEvent): HandleId | undefined {\n if (event.kind === 'createTextureView') return event.resultHandleId;\n if (event.kind === 'createCommandEncoder') return event.cmdHandleId;\n if (event.kind === 'beginRenderPass' || event.kind === 'beginComputePass') {\n return event.passHandleId;\n }\n if (event.kind.startsWith('create') && 'handleId' in event) return event.handleId;\n return undefined;\n}\n\nfunction resourceKind(event: RhiCallEvent): BootstrapResource['kind'] | undefined {\n switch (event.kind) {\n case 'createBuffer':\n return 'buffer';\n case 'createTexture':\n return 'texture';\n case 'createTextureView':\n return 'texture-view';\n case 'createSampler':\n return 'sampler';\n case 'createShaderModule':\n return 'shader-module';\n case 'createRenderPipeline':\n case 'createComputePipeline':\n return 'pipeline';\n case 'createBindGroup':\n case 'createBindGroupLayout':\n case 'createPipelineLayout':\n return 'binding';\n case 'createCommandEncoder':\n return 'encoder';\n default:\n return undefined;\n }\n}\n","// @forgeax/engine-rhi-debug/src/recorder/closure -- transitive handle closure owner.\n\nimport type { HandleId, RhiCallEvent } from '../types';\n\nexport function _collectFrameReferencedHandleIds(events: readonly RhiCallEvent[]): Set<HandleId> {\n const refs = new Set<HandleId>();\n for (const e of events) {\n switch (e.kind) {\n case 'writeBuffer':\n case 'clearBuffer':\n // initialData seeds a pre-arm resource's bytes; its handleId must be\n // prefix-pulled so the resource's create* event lands in the bootstrap\n // closure (otherwise the tape references a handle with no create event ->\n // tape-invalid on deserialize).\n case 'initialData': {\n const we = e as { handleId: HandleId };\n refs.add(we.handleId);\n break;\n }\n case 'setVertexBuffer': {\n const we = e as { passHandleId: HandleId; bufferHandleId: HandleId };\n refs.add(we.passHandleId);\n refs.add(we.bufferHandleId);\n break;\n }\n case 'setIndexBuffer': {\n const we = e as { passHandleId: HandleId; bufferHandleId: HandleId };\n refs.add(we.passHandleId);\n refs.add(we.bufferHandleId);\n break;\n }\n case 'setPipeline': {\n const we = e as { passHandleId: HandleId; pipelineHandleId: HandleId };\n refs.add(we.passHandleId);\n refs.add(we.pipelineHandleId);\n break;\n }\n case 'setComputePipeline': {\n const we = e as { passHandleId: HandleId; pipelineHandleId: HandleId };\n refs.add(we.passHandleId);\n refs.add(we.pipelineHandleId);\n break;\n }\n case 'setBindGroup': {\n const we = e as { passHandleId: HandleId; bindGroupHandleId: HandleId };\n refs.add(we.passHandleId);\n refs.add(we.bindGroupHandleId);\n break;\n }\n case 'draw': {\n const we = e as { passHandleId: HandleId };\n refs.add(we.passHandleId);\n break;\n }\n case 'drawIndexed': {\n const we = e as { passHandleId: HandleId };\n refs.add(we.passHandleId);\n break;\n }\n case 'setViewport': {\n const we = e as { passHandleId: HandleId };\n refs.add(we.passHandleId);\n break;\n }\n case 'setScissorRect': {\n const we = e as { passHandleId: HandleId };\n refs.add(we.passHandleId);\n break;\n }\n case 'setBlendConstant': {\n const we = e as { passHandleId: HandleId };\n refs.add(we.passHandleId);\n break;\n }\n case 'setStencilReference': {\n const we = e as { passHandleId: HandleId };\n refs.add(we.passHandleId);\n break;\n }\n case 'drawIndirect': {\n const we = e as { passHandleId: HandleId; indirectBufferHandleId: HandleId };\n refs.add(we.passHandleId);\n refs.add(we.indirectBufferHandleId);\n break;\n }\n case 'drawIndexedIndirect': {\n const we = e as { passHandleId: HandleId; indirectBufferHandleId: HandleId };\n refs.add(we.passHandleId);\n refs.add(we.indirectBufferHandleId);\n break;\n }\n case 'passPushDebugGroup': {\n const we = e as { passHandleId: HandleId };\n refs.add(we.passHandleId);\n break;\n }\n case 'passPopDebugGroup': {\n const we = e as { passHandleId: HandleId };\n refs.add(we.passHandleId);\n break;\n }\n case 'passInsertDebugMarker': {\n const we = e as { passHandleId: HandleId };\n refs.add(we.passHandleId);\n break;\n }\n case 'endRenderPass': {\n const we = e as { passHandleId: HandleId };\n refs.add(we.passHandleId);\n break;\n }\n case 'dispatchWorkgroups': {\n const we = e as { passHandleId: HandleId };\n refs.add(we.passHandleId);\n break;\n }\n case 'dispatchWorkgroupsIndirect': {\n const we = e as { passHandleId: HandleId; indirectBufferHandleId: HandleId };\n refs.add(we.passHandleId);\n refs.add(we.indirectBufferHandleId);\n break;\n }\n case 'endComputePass': {\n const we = e as { passHandleId: HandleId };\n refs.add(we.passHandleId);\n break;\n }\n case 'submit': {\n const we = e as { cmdHandleIds: readonly HandleId[] };\n for (const id of we.cmdHandleIds) refs.add(id);\n break;\n }\n case 'beginRenderPass': {\n const we = e as {\n cmdHandleId: HandleId;\n colorAttachmentViewHandleIds: readonly (HandleId | undefined)[];\n depthStencilViewHandleId?: HandleId;\n };\n refs.add(we.cmdHandleId);\n for (const vhId of we.colorAttachmentViewHandleIds) {\n if (vhId !== undefined) refs.add(vhId);\n }\n if (we.depthStencilViewHandleId !== undefined) refs.add(we.depthStencilViewHandleId);\n break;\n }\n case 'beginComputePass': {\n const we = e as { cmdHandleId: HandleId };\n refs.add(we.cmdHandleId);\n break;\n }\n case 'finish': {\n const we = e as { cmdHandleId: HandleId };\n refs.add(we.cmdHandleId);\n break;\n }\n case 'pushDebugGroup':\n case 'popDebugGroup':\n case 'insertDebugMarker': {\n const we = e as { cmdHandleId: HandleId };\n refs.add(we.cmdHandleId);\n break;\n }\n case 'writeTexture': {\n const we = e as { destination: { textureHandleId: HandleId } };\n refs.add(we.destination.textureHandleId);\n break;\n }\n case 'copyExternalImageToTexture': {\n const we = e as { destination: { textureHandleId: HandleId } };\n refs.add(we.destination.textureHandleId);\n break;\n }\n case 'copyBufferToBuffer': {\n const we = e as { sourceHandleId: HandleId; destinationHandleId: HandleId };\n refs.add(we.sourceHandleId);\n refs.add(we.destinationHandleId);\n break;\n }\n case 'copyBufferToTexture': {\n const we = e as {\n source: { bufferHandleId: HandleId };\n destination: { textureHandleId: HandleId };\n };\n refs.add(we.source.bufferHandleId);\n refs.add(we.destination.textureHandleId);\n break;\n }\n case 'copyTextureToBuffer': {\n const we = e as {\n source: { textureHandleId: HandleId };\n destination: { bufferHandleId: HandleId };\n };\n refs.add(we.source.textureHandleId);\n refs.add(we.destination.bufferHandleId);\n break;\n }\n case 'copyTextureToTexture': {\n const we = e as {\n source: { textureHandleId: HandleId };\n destination: { textureHandleId: HandleId };\n };\n refs.add(we.source.textureHandleId);\n refs.add(we.destination.textureHandleId);\n break;\n }\n case 'createBindGroup':\n case 'createPipelineLayout':\n case 'createRenderPipeline':\n case 'createComputePipeline':\n case 'createTextureView': {\n // An in-frame-created resource may reference a PRE-ARM resource via its\n // backward edges (e.g. a composite/FXAA bind group built mid-frame that\n // samples a scratch TextureView created at setup; or an in-frame\n // createTextureView of a pre-arm texture). Those pre-arm handles are\n // reachable ONLY through this create* event's backward refs — no usage\n // event names them directly — so without collecting them here they never\n // become prefix seeds and the tape deserializes as non-self-contained\n // (tape-invalid). Collect the edges; getTape's prefixSeedIds\n // filter then drops entries that are themselves in-frame declared, leaving\n // only the genuinely pre-arm dependencies to seed the bootstrap closure.\n for (const ref of _getCreateEventReferencedHandleIds(e)) refs.add(ref);\n break;\n }\n case 'destroyBuffer':\n case 'destroyTexture':\n refs.add(e.handleId);\n break;\n case 'frameMark':\n case 'createBuffer':\n case 'createTexture':\n case 'createSampler':\n case 'createBindGroupLayout':\n case 'createShaderModule':\n case 'createCommandEncoder':\n // Leaf declaration events — no backward references to collect.\n break;\n default: {\n // Exhaustiveness guard: if a new RhiCallEvent member is added to the\n // union without a corresponding handle-collection case, tsc fails here.\n // This prevents silent omission of handle references (tape-invalid).\n const _exhaustive: never = e;\n void _exhaustive;\n break;\n }\n }\n }\n return refs;\n}\n\n/**\n * @internal\n * Return handleIds referenced by a create* event for transitive closure traversal.\n *\n * The edge set follows D-3 (plan-strategy 2):\n * - createBindGroup → layoutHandleId + resourceHandleIds\n * - createPipelineLayout → bglHandleIds\n * - createRenderPipeline → layoutHandleId (if != 'layout:auto') + vertex/fragmentShaderModuleHandleId (R-1)\n * - createComputePipeline → layoutHandleId (if != 'layout:auto') + computeShaderModuleHandleId (R-1)\n * - createTextureView → sourceHandleId\n * Leaf resources (buffer / texture / sampler / BGL / shaderModule) return empty.\n */\nexport function _getCreateEventReferencedHandleIds(event: RhiCallEvent): HandleId[] {\n switch (event.kind) {\n case 'createBindGroup': {\n const e = event as { layoutHandleId: HandleId; resourceHandleIds: readonly HandleId[] };\n return [e.layoutHandleId, ...e.resourceHandleIds];\n }\n case 'createPipelineLayout': {\n const e = event as { bglHandleIds: readonly HandleId[] };\n return [...e.bglHandleIds];\n }\n case 'createRenderPipeline': {\n const e = event as {\n layoutHandleId: HandleId;\n vertexShaderModuleHandleId?: HandleId;\n fragmentShaderModuleHandleId?: HandleId;\n };\n const refs: HandleId[] = [];\n if (e.layoutHandleId !== 'layout:auto') refs.push(e.layoutHandleId);\n if (e.vertexShaderModuleHandleId !== undefined) refs.push(e.vertexShaderModuleHandleId);\n if (e.fragmentShaderModuleHandleId !== undefined) refs.push(e.fragmentShaderModuleHandleId);\n return refs;\n }\n case 'createComputePipeline': {\n const e = event as { layoutHandleId: HandleId; computeShaderModuleHandleId?: HandleId };\n const refs: HandleId[] = [];\n if (e.layoutHandleId !== 'layout:auto') refs.push(e.layoutHandleId);\n if (e.computeShaderModuleHandleId !== undefined) refs.push(e.computeShaderModuleHandleId);\n return refs;\n }\n case 'createTextureView': {\n const e = event as { sourceHandleId: HandleId };\n return [e.sourceHandleId];\n }\n case 'createBuffer':\n case 'createTexture':\n case 'createSampler':\n case 'createBindGroupLayout':\n case 'createShaderModule':\n case 'createCommandEncoder':\n return [];\n default:\n return [];\n }\n}\n\n/**\n * @internal\n * Compute the transitive closure of handleIds from bootstrapCreates.\n *\n * Starting from the given seed set, recursively walks all referenced handleIds\n * via _getCreateEventReferencedHandleIds. Returns the set of all handleIds\n * whose create events must be included in the tape prefix for self-containment.\n *\n * If a referenced handleId is not found in bootstrapCreates, returns\n * `null` for that id — the caller should produce a structured tape error.\n */\nexport function _computeClosure(\n seedHandleIds: Set<HandleId>,\n bootstrapCreates: Map<HandleId, RhiCallEvent>,\n inFrameHandleIds: Set<HandleId>,\n): { closure: Set<HandleId>; missing: HandleId | null } {\n const closure = new Set(seedHandleIds);\n const queue = [...seedHandleIds];\n\n while (queue.length > 0) {\n const current: HandleId | undefined = queue.shift();\n if (current === undefined) break;\n const createEvent = bootstrapCreates.get(current);\n if (createEvent === undefined) {\n // The handle is not in bootstrapCreates. If it is declared in\n // s.events (e.g. swapchain textures from getCurrentTexture), treat it\n // as a leaf — no further expansion needed.\n if (inFrameHandleIds.has(current)) continue;\n return { closure, missing: current };\n }\n const edges = _getCreateEventReferencedHandleIds(createEvent);\n for (const target of edges) {\n if (!closure.has(target)) {\n closure.add(target);\n queue.push(target);\n }\n }\n }\n return { closure, missing: null };\n}\n\n/**\n * @internal\n * Topologically sort the closure set so that dependencies appear before dependents.\n *\n * Builds a dep-graph: if event A references handleId of event B, then B must\n * appear before A. Uses Kahn's algorithm.\n */\nexport function _topoSortClosure(\n closure: Set<HandleId>,\n bootstrapCreates: Map<HandleId, RhiCallEvent>,\n): RhiCallEvent[] {\n const inDegree = new Map<HandleId, number>();\n const dependents = new Map<HandleId, HandleId[]>();\n\n for (const hId of closure) {\n inDegree.set(hId, 0);\n dependents.set(hId, []);\n }\n\n for (const hId of closure) {\n const event = bootstrapCreates.get(hId);\n if (event === undefined) continue;\n const edges = _getCreateEventReferencedHandleIds(event);\n for (const target of edges) {\n if (closure.has(target)) {\n // hId depends on target\n const current = dependents.get(target);\n if (current !== undefined) current.push(hId);\n inDegree.set(hId, (inDegree.get(hId) ?? 0) + 1);\n }\n }\n }\n\n const queue: HandleId[] = [];\n for (const [hId, deg] of inDegree) {\n if (deg === 0) queue.push(hId);\n }\n\n const sorted: RhiCallEvent[] = [];\n while (queue.length > 0) {\n const current: HandleId | undefined = queue.shift();\n if (current === undefined) break;\n const event = bootstrapCreates.get(current);\n if (event !== undefined) sorted.push(event);\n\n const deps = dependents.get(current);\n if (deps !== undefined) {\n for (const dep of deps) {\n const newDeg = (inDegree.get(dep) ?? 1) - 1;\n inDegree.set(dep, newDeg);\n if (newDeg === 0) queue.push(dep);\n }\n }\n }\n\n return sorted;\n}\n\n// ============================================================================\n// DebugRhiInstance — public interface\n// ============================================================================\n","// @forgeax/engine-rhi-debug/src/recorder/core -- recorder state and event ownership.\n\n/// <reference types=\"@webgpu/types\" />\n\nimport type {\n Result,\n RhiDevice,\n RhiInstance,\n ShaderModule,\n TextureView,\n} from '@forgeax/engine-rhi';\nimport { createRhiDebugError, type RhiDebugError } from '../errors';\nimport { textureBlockLayout } from '../texel-layout';\nimport type { HandleId, RhiCallEvent, RhiCapsRecorded, Tape } from '../types';\nimport { _getCreateEventReferencedHandleIds } from './closure';\n\nconst SNAPSHOT_TIMEOUT_MS = 30_000;\n\n// Result factories `makeOk` / `makeErr` re-import the canonical\n// `ok` / `err` from `@forgeax/engine-types` (architecture-principles #1\n// SSOT — same shape, same factory, no inline duplicate). Aliased on\n// import to avoid a free-form rename diff in this file's existing\n// `makeOk(...)` / `makeErr(...)` call sites; semantics identical.\n\n// ============================================================================\n// Constants\n// ============================================================================\n\nexport const PER_EVENT_OVERHEAD = 192 as const;\n\n// COPY_SRC promotion bit values (D-5). GPUBufferUsage and GPUTextureUsage have\n// DIFFERENT bit layouts — COPY_SRC is 0x04 for buffers but 0x01 for textures:\n// GPUBufferUsage: MAP_READ=0x01 MAP_WRITE=0x02 COPY_SRC=0x04 COPY_DST=0x08 ...\n// GPUTextureUsage: COPY_SRC=0x01 COPY_DST=0x02 TEXTURE_BINDING=0x04 ...\n// A buffer carrying MAP_READ / MAP_WRITE cannot also carry COPY_SRC (WebGPU\n// validation: a mappable buffer's only other allowed usage is the matching\n// COPY_DST / COPY_SRC), so promotion is skipped for mappable buffers — those\n// are staging buffers, never frame-header snapshot targets.\nconst BUFFER_USAGE_COPY_SRC = 0x04;\nconst BUFFER_USAGE_MAP_READ = 0x01;\nconst BUFFER_USAGE_MAP_WRITE = 0x02;\nconst TEXTURE_USAGE_COPY_SRC = 0x01;\nconst TEXTURE_USAGE_COPY_DST = 0x02;\nconst TEXTURE_USAGE_BINDING = 0x04;\n/** Bound staging allocation, command submission, and map concurrency per batch. */\nexport const SNAPSHOT_RESOURCE_BATCH_SIZE = 32;\n\n/**\n * True for each depth / stencil texture format. Their content is render-pass\n * output (shadow maps, z-buffers), never an uploaded byte payload, and\n * queue.writeTexture rejects them (no CopyDst), so the frame-header snapshot\n * loop skips them rather than emitting an un-seedable initialData event.\n */\nfunction isDepthOrStencilFormat(format: GPUTextureFormat | undefined): boolean {\n return format !== undefined && (format.startsWith('depth') || format.startsWith('stencil'));\n}\n\n/**\n * True for a texture the frame-header snapshot can read back AND re-seed\n * faithfully: each color format with a known texel-block footprint, at each\n * array-layer count and each mip count. The readback + seed path\n * (readbackTexturePixels + computeTextureLayout + replayInitialData) walks\n * every (layer, mip) subresource with block-aware bytesPerRow, so ordinary\n * texels and BC/ETC/ASTC compressed assets share one round-trip contract.\n *\n * Still skipped (no faithful path today, Fail Fast rather than corrupt seed):\n * - depth/stencil formats: queue.writeTexture rejects them (no CopyDst seed).\n * - multisample (sampleCount > 1): writeTexture rejects an MSAA target. MSAA\n * attachments are transient (resolved into a single-sample texture that IS\n * snapshottable), so skipping loses no seed.\n */\nfunction isSnapshottableColorTexture(\n format: GPUTextureFormat | undefined,\n _size: number | GPUExtent3DStrict | undefined,\n sampleCount?: number,\n): boolean {\n if (isDepthOrStencilFormat(format)) return false;\n // Multisample textures reject queue.writeTexture; skip (resolved target seeds).\n if (sampleCount !== undefined && sampleCount > 1) return false;\n // Round-trippable iff its texel-block footprint is known.\n return textureBlockLayout(format) !== undefined;\n}\n\n/** Add COPY_SRC to a buffer usage unless it is a mappable (MAP_READ/WRITE) buffer. */\nfunction promoteBufferUsage(usage: number): number {\n if ((usage & (BUFFER_USAGE_MAP_READ | BUFFER_USAGE_MAP_WRITE)) !== 0) return usage;\n return usage | BUFFER_USAGE_COPY_SRC;\n}\n\n/**\n * True for a mappable (MAP_READ / MAP_WRITE) buffer. These are staging buffers\n * (e.g. shadow-probe-staging): promoteBufferUsage deliberately does NOT add\n * COPY_SRC to them (MAP_READ|COPY_SRC is an invalid WebGPU usage combo), so they\n * cannot be a copyBufferToBuffer source. The frame-header snapshot loop must skip\n * them — driving readbackBufferBytes on one throws \"usage doesn't include\n * CopySrc\". Their bytes are transient readback scratch, never seed payload, so\n * losing them is correct (mirrors promoteBufferUsage's own exclusion).\n */\nfunction isMappableBuffer(usage: number): boolean {\n return (usage & (BUFFER_USAGE_MAP_READ | BUFFER_USAGE_MAP_WRITE)) !== 0;\n}\n\nexport { TAPE_FORMAT_VERSION } from '../protocol/types';\n\n// ============================================================================\n// State machine\n// ============================================================================\n\nenum RecorderState {\n Idle = 'idle',\n Armed = 'armed',\n Snapshotting = 'snapshotting',\n Recording = 'recording',\n Finalizing = 'finalizing',\n Error = 'error',\n}\n\n// ============================================================================\n// Hash utility for blob dedup\n// ============================================================================\n\n/** @internal */\nlet _nextHandleId = 0;\n\nfunction allocHandleId(kind: string): HandleId {\n return `${kind}:${++_nextHandleId}`;\n}\n\nfunction fastHash(data: ArrayBuffer): string {\n const view = new Uint8Array(data);\n let hash = 5381;\n for (let i = 0; i < view.length; i++) {\n hash = ((hash << 5) + hash + (view[i] ?? 0)) | 0;\n }\n return (hash >>> 0).toString(16);\n}\n\nfunction storeBlob(state: RecorderInternal, data: ArrayBuffer): string {\n const hash = fastHash(data);\n if (!state.blobPool.has(hash)) {\n state.blobPool.set(hash, data.slice(0) as ArrayBuffer);\n }\n return hash;\n}\n\n/**\n * Narrow a readbackBufferBytes failure to the snapshot stage.\n * readbackBufferBytes already tags `.detail.phase` with 'copy' | 'map'; carry\n * it through so the re-wrapped error preserves the failure point. Falls back to\n * 'copy' when the inner error lacks a snapshot detail.\n */\nfunction snapshotStageOf(error: RhiDebugError): 'copy' | 'map' | 'store' {\n const d = error.detail;\n if ('phase' in d && d.phase !== undefined) return d.phase;\n return 'copy';\n}\n\n// ============================================================================\n// Internal recorder state\n// ============================================================================\n\ntype SnapshotProgress = {\n readonly startedAt: number;\n readonly stage: 'queue-drain' | 'resource-readback';\n readonly totalResources: number;\n readonly completedResources: number;\n readonly skippedResources: number;\n readonly currentHandleId: string | null;\n readonly currentKind: 'buffer' | 'texture' | null;\n readonly currentSizeBytes: number | null;\n};\n\ninterface RecorderInternal {\n state: RecorderState;\n requestedFrames: number;\n recordedFrames: number;\n events: RhiCallEvent[];\n blobPool: Map<string, ArrayBuffer>;\n handleMap: WeakMap<object, HandleId>;\n textureViewHandleMap: WeakMap<TextureView, HandleId>;\n /**\n * @internal\n * Bootstrap create-event table. Populated by registerHandle when called\n * with a create event payload — records every create* (buffer, texture,\n * pipeline, bindGroup, shaderModule, …) from the moment wrap() is called,\n * independent of the recorder state machine (Idle / Armed / Recording).\n * Preserved across arm() cycles (SSOT for closure computation in getTape).\n */\n bootstrapCreates: Map<HandleId, RhiCallEvent>;\n /** Handles whose initialData event was emitted by the current capture. */\n snapshotSeededHandles: Set<HandleId>;\n /** Generation token invalidating async snapshot work after timeout/error. */\n snapshotGeneration: number;\n /** Last observable progress of the current/most recent resource snapshot. */\n snapshotProgress: SnapshotProgress | undefined;\n /**\n * @internal\n * Descriptor registry of currently-live resources. Written by createBuffer /\n * createTexture (after registerHandle) and cleared by destroyBuffer /\n * destroyTexture. Distinct from handleMap (WeakMap, handle object -> handleId\n * identity, one-way): descriptorTable carries the descriptor *content* (kind /\n * size / format / usage) AND the resource object keyed by handleId, so\n * snapshotResource can both determine a resource's shape and reach the object\n * for readback at frame-header time without re-scanning the event stream or\n * reverse-walking the WeakMap (which cannot be iterated). destroy* removes the\n * entry so the live-resource set never grows unbounded (AC-09). One registry,\n * one delete on destroy — shape and object share the same lifecycle (SSOT).\n */\n descriptorTable: Map<\n HandleId,\n {\n kind: 'buffer' | 'texture';\n size?: number | GPUExtent3DStrict;\n format?: GPUTextureFormat;\n sampleCount?: number;\n mipLevelCount?: number;\n usage: number;\n resource: object;\n }\n >;\n /** @internal */\n _skipRecord: boolean;\n frameIdx: number;\n bootstrap: boolean;\n recordedCaps: RhiCapsRecorded | undefined;\n onFrameEndUnsubscribe?: (() => void) | undefined;\n /** true when the current recording is valid. */\n valid: boolean;\n /**\n * @internal\n * Most recent live RhiDevice produced by `requestAdapter().requestDevice()`\n * via the recorder proxy chain. Captured so the adapter (I-2 fix) can\n * reach the same device for replay without forcing the host to expose\n * a separate channel.\n */\n capturedDevice: RhiDevice | undefined;\n}\n\nfunction snapshotTimeoutDetail(\n progress: SnapshotProgress | undefined,\n timeoutMs: number,\n): import('../errors').CaptureTimeoutDetail {\n const current = progress ?? {\n startedAt: Date.now(),\n stage: 'queue-drain' as const,\n totalResources: 0,\n completedResources: 0,\n skippedResources: 0,\n currentHandleId: null,\n currentKind: null,\n currentSizeBytes: null,\n };\n return {\n stage: 'snapshot',\n cause: 'GPU readback did not complete before the bounded snapshot timeout',\n timeoutMs,\n progress: {\n snapshotStage: current.stage,\n totalResources: current.totalResources,\n completedResources: current.completedResources,\n skippedResources: current.skippedResources,\n currentHandleId: current.currentHandleId,\n currentKind: current.currentKind,\n currentSizeBytes: current.currentSizeBytes,\n elapsedMs: Math.max(0, Date.now() - current.startedAt),\n },\n };\n}\n\n/**\n * @internal\n * True while the recorder is in a state that appends normal RHI events to the\n * tape: Armed / Recording. Snapshotting is deliberately excluded: the async\n * frame-header seed phase must not fold live viewport frames into the capture.\n * This is the SSOT recording predicate —\n * `pushEvent` gates on it, and the proxy fast-path (writeBuffer / writeTexture /\n * createCommandEncoder) short-circuits when it is false so an idle recorder\n * (FORGEAX_ENGINE_RHI_DEBUG=1 but no capture in flight) pays no per-call\n * event-object allocation, no storeBlob hash+copy, and no proxy-encoder wrapping.\n *\n * Deliberately ignores `_skipRecord`: that flag suppresses recorder-internal\n * RHI calls (such as snapshot readback staging) during either capture phase.\n * `shouldRecord` folds it in for the normal pushEvent gate.\n */\nfunction isRecordingActive(s: RecorderInternal): boolean {\n return s.state === RecorderState.Armed || s.state === RecorderState.Recording;\n}\n\n/**\n * A frame-header snapshot is not a normal render-recording phase, but it can\n * already have copied a live resource and still need that resource's create\n * event when it appends `initialData`. Keep bootstrap ownership through that\n * async window: per-frame feature resources may be released while readback is\n * awaiting GPU completion.\n */\nfunction retainsCaptureBootstrap(s: RecorderInternal): boolean {\n return isRecordingActive(s) || s.state === RecorderState.Snapshotting;\n}\n\n/**\n * @internal\n * The exact pushEvent gate as a predicate: record iff not suppressed AND in an\n * active recording state. Proxy methods that do pre-pushEvent work (storeBlob,\n * event-object construction) check this first to skip that work when it would\n * be discarded — same-condition-as-pushEvent guarantees no behavioural drift\n * (a call that would record still does all its work).\n */\nfunction shouldRecord(s: RecorderInternal): boolean {\n return !s._skipRecord && isRecordingActive(s);\n}\n\nfunction pushEvent(s: RecorderInternal, event: RhiCallEvent): void {\n if (!shouldRecord(s)) return;\n s.events.push(event);\n}\n\n/**\n * Append a frame-header seed without reopening the normal RHI event gate.\n * Snapshotting is not a render-recording state, but its async readback still\n * needs to emit initialData events for the resources that seed replay.\n */\nfunction pushSnapshotEvent(s: RecorderInternal, event: RhiCallEvent): void {\n if (s._skipRecord || (!isRecordingActive(s) && s.state !== RecorderState.Snapshotting)) {\n return;\n }\n s.events.push(event);\n}\n\nfunction registerHandle(\n s: RecorderInternal,\n handle: object,\n kind: string,\n createEvent?: RhiCallEvent,\n): HandleId {\n const hId = allocHandleId(kind);\n s.handleMap.set(handle, hId);\n if (createEvent !== undefined) {\n if ('handleId' in createEvent) Object.assign(createEvent, { handleId: hId });\n s.bootstrapCreates.set(hId, createEvent);\n }\n return hId;\n}\n\nfunction ensureTextureCreateEvent(\n s: RecorderInternal,\n texture: object,\n textureId: HandleId,\n viewFormat?: GPUTextureFormat,\n): RhiDebugError | undefined {\n const existing = s.bootstrapCreates.get(textureId);\n if (existing !== undefined) {\n if (\n viewFormat !== undefined &&\n existing.kind === 'createTexture' &&\n existing.origin === 'swapchain'\n ) {\n addSwapchainViewFormat(existing, viewFormat);\n }\n return undefined;\n }\n\n const raw = texture as Record<string, unknown>;\n const width = raw.width as number | undefined;\n const height = raw.height as number | undefined;\n const depthOrArrayLayers = (raw.depthOrArrayLayers as number | undefined) ?? 1;\n const format = raw.format as string | undefined;\n const rawUsage = raw.usage as number | undefined;\n\n if (\n width === undefined ||\n height === undefined ||\n format === undefined ||\n rawUsage === undefined\n ) {\n return createRhiDebugError('tape-invalid', {\n stage: 'validate',\n cause: `swapchain texture '${textureId}' has unreadable dimensions (width=${width}, height=${height}, format=${format}, usage=${rawUsage})`,\n handleId: textureId,\n eventIndex: -1,\n });\n }\n\n const event: RhiCallEvent = {\n kind: 'createTexture',\n handleId: textureId,\n origin: 'swapchain',\n desc: {\n size: { width, height, depthOrArrayLayers },\n format: format as GPUTextureFormat,\n usage: (rawUsage | TEXTURE_USAGE_COPY_SRC | TEXTURE_USAGE_COPY_DST) as GPUTextureUsageFlags,\n ...(viewFormat === undefined ? {} : { viewFormats: [viewFormat] }),\n },\n };\n s.bootstrapCreates.set(textureId, event);\n pushEvent(s, event);\n return undefined;\n}\n\nfunction addSwapchainViewFormat(\n texture: Extract<RhiCallEvent, { kind: 'createTexture' }>,\n viewFormat: GPUTextureFormat,\n): void {\n if (texture.desc.format === viewFormat || texture.origin !== 'swapchain') return;\n const viewFormats = new Set(texture.desc.viewFormats ?? []);\n viewFormats.add(viewFormat);\n (texture as { desc: typeof texture.desc }).desc = {\n ...texture.desc,\n viewFormats: [...viewFormats],\n };\n}\n\nfunction reconcileSwapchainViewFormats(s: RecorderInternal): void {\n const events = [...s.events, ...s.bootstrapCreates.values()];\n for (const event of events) {\n if (event.kind !== 'createTextureView' || event.desc.format === undefined) continue;\n const source = s.bootstrapCreates.get(event.sourceHandleId);\n if (source?.kind === 'createTexture' && source.origin === 'swapchain') {\n addSwapchainViewFormat(source, event.desc.format);\n }\n }\n}\n\nfunction hasBootstrapDependency(s: RecorderInternal, handleId: HandleId): boolean {\n for (const event of s.bootstrapCreates.values()) {\n if (_getCreateEventReferencedHandleIds(event).includes(handleId)) return true;\n }\n return false;\n}\n\nfunction getHandleId(s: RecorderInternal, handle: object, kind: string): HandleId {\n const id = s.handleMap.get(handle);\n if (id !== undefined) return id;\n const newId = registerHandle(s, handle, kind);\n if (kind === 'texture') ensureTextureCreateEvent(s, handle, newId);\n return newId;\n}\n\n// ============================================================================\n// Transitive closure — bootstrapCreates → self-contained tape prefix\n// ============================================================================\n\n/**\n * @internal\n * Collect all handleIds referenced by frame events in `s.events`.\n *\n * Scans events for ALL fields that reference resources — mirrors\n * the reference categories checked by findDanglingHandleId in\n * tape-format.ts to achieve producer/consumer convergence (D-2).\n *\n * Includes: buffer/texture/pipeline/bindGroup/sampler/textureView/\n * shaderModule handles (persistent), plus passHandleId and cmdHandleId\n * from pass/encoder events (per-frame transient). Transient handles\n * that are declared in-frame are excluded later by the inFrameHandleIds\n * filter in getTape().\n */\n\nexport interface DebugRhiInstance extends RhiInstance {\n arm(frames: number): Result<void, RhiDebugError>;\n onFrameEnd(): void;\n getTape(): Tape | RhiDebugError | undefined;\n getState(): string;\n getEvents(): readonly RhiCallEvent[];\n getBlobPool(): ReadonlyMap<string, ArrayBuffer>;\n /** Transition to error state (e.g. on device.lost). Tape data preserved but valid=false. */\n transitionToError(): void;\n /** Clear error state to idle, allowing re-arm. */\n disposeError(): void;\n /**\n * Snapshot a resource's GPU bytes into the tape as an initialData event.\n *\n * Reads the resource descriptor from the internal registry, copies the\n * resource's bytes via copyToBuffer/mapAsync, stores the bytes into the\n * blobPool (djb2 hash-dedup), and pushes an RhiCallEventInitialData into\n * the event stream. Returns Result with {handleId, dataHash} on success,\n * or capture-snapshot-failed on a readback/storeBlob failure.\n *\n * Async: the GPU readback chain (copyToBuffer -> submit ->\n * onSubmittedWorkDone -> mapAsync) is inherently asynchronous.\n */\n snapshotResource(\n handleId: HandleId,\n ): Promise<Result<{ handleId: HandleId; dataHash: string }, RhiDebugError>>;\n /**\n * Frame-header snapshot loop: awaits all submitted GPU work, then snapshots\n * every live resource in the descriptor registry (full-table dump, no\n * trimming). Advances the recorder Armed -> Snapshotting -> Recording on\n * success. Returns the first snapshot failure as a Result so the caller can\n * fail fast rather than record a partial seed set.\n */\n snapshotAllLiveResources(timeoutMs?: number): Promise<Result<void, RhiDebugError>>;\n /**\n * @internal\n * Append an event from a standalone wrapper (e.g. `wrapCreateShaderModule`)\n * through the same `_skipRecord` + state-machine guard that the proxy\n * methods use. This exists so external wrappers cannot bypass recursion\n * protection (I-12, round 1 implement-review). Not part of the AI-user\n * contract — `wrap*` helpers in this package are the only callers.\n */\n pushExternalEvent(event: RhiCallEvent): void;\n /**\n * @internal\n * Register a shader module object in the recorder's handleMap so\n * downstream pipeline events can look up its handleId via getHandleId.\n */\n registerShaderModule(handle: ShaderModule, handleId: HandleId): void;\n /**\n * @internal\n * Route a create event through registerHandle (alloc id + write bootstrapCreates)\n * and pushEvent in a single call. For standalone wrappers that cannot access\n * the internal registerHandle/pushEvent functions directly.\n * Returns the allocated HandleId so the caller can use it for downstream\n * registration (e.g. shaderModule → handleMap).\n */\n pushExternalCreateEvent(handle: object, kind: string, event: RhiCallEvent): HandleId;\n /**\n * @internal\n * Drop all device-bound recorder state after the host observes a real\n * device loss. A tape recorded against the lost device cannot seed a fresh\n * device, so the next capture must start from the rebuilt resource graph.\n */\n resetForDeviceLoss(): void;\n /** @internal Return whether the current capture is valid. */\n valid(): boolean;\n /**\n * @internal\n * Return the number of entries in bootstrapCreates. Test-only accessor\n * so unit tests can verify bootstrapCreates write/retain semantics\n * without going through getTape() closure computation (M2).\n */\n bootstrapCreatesSize(): number;\n /** @internal Return the create-event identities owned by the bootstrap registry. */\n bootstrapEvents(): readonly RhiCallEvent[];\n /**\n * @internal\n * Read-only view of the descriptor registry keyed by handleId. Test-only\n * accessor so unit tests can verify create* register / destroy* remove\n * semantics (AC-09) without reaching into the closed-over recorder state.\n */\n descriptorTable(): ReadonlyMap<\n HandleId,\n {\n kind: 'buffer' | 'texture';\n size?: number | GPUExtent3DStrict;\n format?: GPUTextureFormat;\n usage: number;\n resource: object;\n }\n >;\n}\n\n// ============================================================================\n// Type for standalone createShaderModule function (from rhi-webgpu)\n// ============================================================================\n\nexport type CreateShaderModuleFn = (\n device: RhiDevice,\n desc: { code: string; label?: string | undefined },\n) => Promise<Result<ShaderModule, import('@forgeax/engine-rhi').RhiError>>;\n\nexport type { RecorderInternal, SnapshotProgress };\nexport {\n addSwapchainViewFormat,\n allocHandleId,\n ensureTextureCreateEvent,\n fastHash,\n getHandleId,\n hasBootstrapDependency,\n isDepthOrStencilFormat,\n isMappableBuffer,\n isRecordingActive,\n isSnapshottableColorTexture,\n promoteBufferUsage,\n pushEvent,\n pushSnapshotEvent,\n RecorderState,\n reconcileSwapchainViewFormats,\n registerHandle,\n retainsCaptureBootstrap,\n SNAPSHOT_TIMEOUT_MS,\n shouldRecord,\n snapshotStageOf,\n snapshotTimeoutDetail,\n storeBlob,\n TEXTURE_USAGE_BINDING,\n TEXTURE_USAGE_COPY_DST,\n TEXTURE_USAGE_COPY_SRC,\n};\n","// @forgeax/engine-rhi-debug/src/recorder/shader -- standalone shader factory proxy.\n\nimport type { Result, RhiDevice, ShaderModule } from '@forgeax/engine-rhi';\nimport type { HandleId } from '../types';\nimport type { CreateShaderModuleFn, DebugRhiInstance } from './core';\n\nexport function wrapCreateShaderModule(\n originalFn: CreateShaderModuleFn,\n debugInst: DebugRhiInstance,\n): CreateShaderModuleFn {\n return async function wrappedCreateShaderModule(\n device: RhiDevice,\n desc: { code: string; label?: string | undefined },\n ): Promise<Result<ShaderModule, import('@forgeax/engine-rhi').RhiError>> {\n // The renderer threads the proxied RhiDevice (from proxyDevice()) here, but\n // engine-rhi-webgpu's createShaderModule reverse-looks-up the GPUDevice via\n // a WeakMap keyed on the RhiDevice that makeRhiDevice registered. The proxy\n // is a different JS object, so WeakMap.get(proxy) is undefined and the real\n // fn returns shader-compile-failed (\"unregistered RhiDevice\"). Unwrap the\n // proxy to the registered device via the _realDevice escape hatch that\n // proxyDevice exposes for exactly this purpose.\n const realDevice = (device as RhiDevice & { _realDevice?: RhiDevice })._realDevice ?? device;\n const result = await originalFn(realDevice, desc);\n if (!result.ok) return result;\n\n // I-12 (round 1 implement-review) fix: route the createShaderModule\n // event through the same `pushExternalEvent` helper that wraps the\n // internal `pushEvent` (and therefore the `_skipRecord` + state-machine\n // guard). The previous `(events as RhiCallEvent[]).push(...)` cast\n // bypassed those guards — recorder-internal RHI calls during shader\n // construction would have self-polluted the tape.\n const hId = debugInst.pushExternalCreateEvent(result.value, 'shaderModule', {\n kind: 'createShaderModule',\n handleId: '' as HandleId,\n wgslCode: desc.code,\n });\n // Register the shader module handle in the recorder's handleMap so\n // downstream pipeline events (createRenderPipeline / createComputePipeline)\n // can resolve the handleId via getHandleId. Required for cross-device\n // replay: the tape's pipeline desc carries live GPU module objects which\n // are device-bound, so the replayer must swap them with re-created shader\n // modules from the handleMap using the handleId.\n debugInst.registerShaderModule(result.value, hId);\n\n return result;\n };\n}\n","// @forgeax/engine-rhi-debug/src/recorder/pass -- render/compute pass proxy owners.\n\nimport type {\n ComputePipeline,\n RenderPipeline,\n RhiComputePassEncoder,\n RhiRenderPassEncoder,\n} from '@forgeax/engine-rhi';\nimport type { HandleId } from '../types';\nimport type { RecorderInternal } from './core';\nimport { getHandleId, pushEvent } from './core';\n\nexport function createRenderPassProxy(\n s: RecorderInternal,\n realPass: RhiRenderPassEncoder,\n passHId: HandleId,\n): RhiRenderPassEncoder {\n return {\n setPipeline(pipeline: RenderPipeline) {\n const pid = getHandleId(s, pipeline as object, 'renderPipeline');\n pushEvent(s, { kind: 'setPipeline', passHandleId: passHId, pipelineHandleId: pid });\n realPass.setPipeline(pipeline);\n },\n setVertexBuffer(slot, buffer, offset, size) {\n const bid = getHandleId(s, buffer as object, 'buffer');\n pushEvent(s, {\n kind: 'setVertexBuffer',\n passHandleId: passHId,\n slot,\n bufferHandleId: bid,\n offset,\n size,\n });\n realPass.setVertexBuffer(slot, buffer, offset, size);\n },\n setIndexBuffer(buffer, format, offset, size) {\n const bid = getHandleId(s, buffer as object, 'buffer');\n pushEvent(s, {\n kind: 'setIndexBuffer',\n passHandleId: passHId,\n bufferHandleId: bid,\n format,\n offset,\n size,\n });\n realPass.setIndexBuffer(buffer, format, offset, size);\n },\n setBindGroup(index, bindGroup, ...rest: unknown[]) {\n const bgid = getHandleId(s, bindGroup as object, 'bindGroup');\n let dynOffsets: readonly number[] | undefined;\n if (rest[0] instanceof Uint32Array) {\n dynOffsets = Array.from(rest[0] as Uint32Array);\n (realPass.setBindGroup as (...args: unknown[]) => void)(index, bindGroup, ...rest);\n } else {\n const offsets = rest[0] as readonly number[] | undefined;\n dynOffsets = offsets === undefined ? undefined : Array.from(offsets);\n realPass.setBindGroup(index, bindGroup, offsets);\n }\n pushEvent(s, {\n kind: 'setBindGroup',\n passHandleId: passHId,\n index,\n bindGroupHandleId: bgid,\n dynamicOffsets: dynOffsets,\n });\n },\n draw(vertexCount, instanceCount, firstVertex, firstInstance) {\n pushEvent(s, {\n kind: 'draw',\n passHandleId: passHId,\n vertexCount,\n instanceCount: instanceCount ?? 1,\n firstVertex: firstVertex ?? 0,\n firstInstance: firstInstance ?? 0,\n });\n realPass.draw(vertexCount, instanceCount, firstVertex, firstInstance);\n },\n drawIndexed(indexCount, instanceCount, firstIndex, baseVertex, firstInstance) {\n pushEvent(s, {\n kind: 'drawIndexed',\n passHandleId: passHId,\n indexCount,\n instanceCount: instanceCount ?? 1,\n firstIndex: firstIndex ?? 0,\n baseVertex: baseVertex ?? 0,\n firstInstance: firstInstance ?? 0,\n });\n realPass.drawIndexed(indexCount, instanceCount, firstIndex, baseVertex, firstInstance);\n },\n\n // Pass-through methods (not in v1 event set, but must not break the proxy)\n setViewport(x, y, w, h, minDepth, maxDepth) {\n pushEvent(s, {\n kind: 'setViewport',\n passHandleId: passHId,\n x,\n y,\n w,\n h,\n minDepth: minDepth ?? 0,\n maxDepth: maxDepth ?? 1,\n });\n realPass.setViewport(x, y, w, h, minDepth, maxDepth);\n },\n setScissorRect(x, y, w, h) {\n pushEvent(s, {\n kind: 'setScissorRect',\n passHandleId: passHId,\n x,\n y,\n w,\n h,\n });\n realPass.setScissorRect(x, y, w, h);\n },\n setBlendConstant(color) {\n pushEvent(s, {\n kind: 'setBlendConstant',\n passHandleId: passHId,\n color,\n });\n realPass.setBlendConstant(color);\n },\n setStencilReference(reference) {\n // Recorded (not a no-op pass-through): stencil pipelines compare against\n // this dynamic reference, so without it replay defaults ref=0 and a\n // not-equal/equal stencil test (e.g. the 4.2 stencil-testing outline\n // pass) silently breaks -- the outline vanishes on replay.\n pushEvent(s, {\n kind: 'setStencilReference',\n passHandleId: passHId,\n reference,\n });\n realPass.setStencilReference(reference);\n },\n drawIndirect(indirectBuffer, indirectOffset) {\n const ibId = getHandleId(s, indirectBuffer as object, 'buffer');\n pushEvent(s, {\n kind: 'drawIndirect',\n passHandleId: passHId,\n indirectBufferHandleId: ibId,\n indirectOffset,\n });\n realPass.drawIndirect(indirectBuffer, indirectOffset);\n },\n drawIndexedIndirect(indirectBuffer, indirectOffset) {\n const ibId = getHandleId(s, indirectBuffer as object, 'buffer');\n pushEvent(s, {\n kind: 'drawIndexedIndirect',\n passHandleId: passHId,\n indirectBufferHandleId: ibId,\n indirectOffset,\n });\n realPass.drawIndexedIndirect(indirectBuffer, indirectOffset);\n },\n pushDebugGroup(groupLabel) {\n pushEvent(s, {\n kind: 'passPushDebugGroup',\n passHandleId: passHId,\n groupLabel,\n });\n realPass.pushDebugGroup(groupLabel);\n },\n popDebugGroup() {\n pushEvent(s, { kind: 'passPopDebugGroup', passHandleId: passHId });\n realPass.popDebugGroup();\n },\n insertDebugMarker(markerLabel) {\n pushEvent(s, {\n kind: 'passInsertDebugMarker',\n passHandleId: passHId,\n markerLabel,\n });\n realPass.insertDebugMarker(markerLabel);\n },\n executeBundles(bundles) {\n return realPass.executeBundles(bundles);\n },\n beginOcclusionQuery(queryIndex) {\n return realPass.beginOcclusionQuery(queryIndex);\n },\n endOcclusionQuery() {\n return realPass.endOcclusionQuery();\n },\n end() {\n pushEvent(s, { kind: 'endRenderPass', passHandleId: passHId });\n realPass.end();\n },\n };\n}\n\nexport function createComputePassProxy(\n s: RecorderInternal,\n realPass: RhiComputePassEncoder,\n passHId: HandleId,\n): RhiComputePassEncoder {\n return {\n setPipeline(pipeline: ComputePipeline) {\n const pid = getHandleId(s, pipeline as object, 'computePipeline');\n pushEvent(s, { kind: 'setComputePipeline', passHandleId: passHId, pipelineHandleId: pid });\n realPass.setPipeline(pipeline);\n },\n setBindGroup(index, bindGroup, dynamicOffsets) {\n const bgid = getHandleId(s, bindGroup as object, 'bindGroup');\n const recordedDynamicOffsets =\n dynamicOffsets === undefined ? undefined : Array.from(dynamicOffsets);\n pushEvent(s, {\n kind: 'setBindGroup',\n passHandleId: passHId,\n index,\n bindGroupHandleId: bgid,\n dynamicOffsets: recordedDynamicOffsets,\n });\n realPass.setBindGroup(index, bindGroup, dynamicOffsets);\n },\n dispatchWorkgroups(x, y, z) {\n pushEvent(s, {\n kind: 'dispatchWorkgroups',\n passHandleId: passHId,\n x,\n y: y ?? 1,\n z: z ?? 1,\n });\n realPass.dispatchWorkgroups(x, y, z);\n },\n dispatchWorkgroupsIndirect(indirectBuffer, indirectOffset) {\n const bufferHandleId = getHandleId(s, indirectBuffer as object, 'buffer');\n pushEvent(s, {\n kind: 'dispatchWorkgroupsIndirect',\n passHandleId: passHId,\n indirectBufferHandleId: bufferHandleId,\n indirectOffset,\n });\n realPass.dispatchWorkgroupsIndirect(indirectBuffer, indirectOffset);\n },\n end() {\n pushEvent(s, { kind: 'endComputePass', passHandleId: passHId });\n realPass.end();\n },\n };\n}\n","// @forgeax/engine-rhi-debug/src/recorder/encoder -- command encoder proxy owner.\n\nimport type { Buffer, ComputePassDescriptor, RhiCommandEncoder } from '@forgeax/engine-rhi';\nimport type { HandleId } from '../types';\nimport type { RecorderInternal } from './core';\nimport { allocHandleId, getHandleId, pushEvent } from './core';\nimport { createComputePassProxy, createRenderPassProxy } from './pass';\n\nexport function createCommandEncoderProxy(\n s: RecorderInternal,\n realEnc: RhiCommandEncoder,\n cmdHId: HandleId,\n): RhiCommandEncoder {\n return {\n beginRenderPass(desc: GPURenderPassDescriptor) {\n const passHId = allocHandleId('renderPass');\n // I-2 fix-up (round 1, dawn smoke): walk colorAttachments +\n // depthStencilAttachment to extract the textureView handleIds\n // recorded under createTextureView. Without this the replayer\n // would dereference the original GPUTextureView brand directly,\n // which fails on a fresh device (cross-device GPU object reuse).\n const colorAttachmentViewHandleIds: (HandleId | undefined)[] = [];\n const colorAttachmentResolveTargetHandleIds: (HandleId | undefined)[] = [];\n for (const att of desc.colorAttachments) {\n if (att === null || att === undefined) {\n colorAttachmentViewHandleIds.push(undefined);\n colorAttachmentResolveTargetHandleIds.push(undefined);\n } else {\n const view = (att as GPURenderPassColorAttachment).view;\n const id =\n view !== undefined && view !== null ? s.handleMap.get(view as object) : undefined;\n colorAttachmentViewHandleIds.push(id);\n const resolveTarget = (att as GPURenderPassColorAttachment).resolveTarget;\n const resolveTargetId =\n resolveTarget !== undefined && resolveTarget !== null\n ? s.handleMap.get(resolveTarget as object)\n : undefined;\n colorAttachmentResolveTargetHandleIds.push(resolveTargetId);\n }\n }\n let depthStencilViewHandleId: HandleId | undefined;\n if (desc.depthStencilAttachment !== undefined) {\n const dsView = desc.depthStencilAttachment.view;\n if (dsView !== undefined && dsView !== null) {\n depthStencilViewHandleId = s.handleMap.get(dsView as object);\n }\n }\n pushEvent(s, {\n kind: 'beginRenderPass',\n cmdHandleId: cmdHId,\n passHandleId: passHId,\n desc: desc as Omit<GPURenderPassDescriptor, 'label'>,\n colorAttachmentViewHandleIds,\n colorAttachmentResolveTargetHandleIds,\n depthStencilViewHandleId,\n });\n const realPass = realEnc.beginRenderPass(desc);\n return createRenderPassProxy(s, realPass, passHId);\n },\n beginComputePass(desc?: ComputePassDescriptor | undefined) {\n const passHId = allocHandleId('computePass');\n pushEvent(s, {\n kind: 'beginComputePass',\n cmdHandleId: cmdHId,\n passHandleId: passHId,\n desc: desc as Partial<GPUComputePassDescriptor> | undefined,\n });\n const realPass = realEnc.beginComputePass(desc);\n return createComputePassProxy(s, realPass, passHId);\n },\n // Passthrough copy/clear methods (event recording added where types permit)\n copyBufferToBuffer(...args: unknown[]) {\n // Overloaded: 3-arg or 5-arg\n if (typeof args[1] === 'number') {\n // 5-arg form: (source, sourceOffset, destination, destinationOffset, size)\n const sourceId = getHandleId(s, args[0] as object, 'buffer');\n const destinationId = getHandleId(s, args[2] as object, 'buffer');\n pushEvent(s, {\n kind: 'copyBufferToBuffer',\n cmdHandleId: cmdHId,\n sourceHandleId: sourceId,\n sourceOffset: args[1] as number,\n destinationHandleId: destinationId,\n destinationOffset: args[3] as number,\n size: args[4] as number,\n });\n (realEnc.copyBufferToBuffer as (...args: unknown[]) => void)(...args);\n } else {\n // 3-arg form: (source, destination, size?)\n const sourceId = getHandleId(s, args[0] as object, 'buffer');\n const destinationId = getHandleId(s, args[1] as object, 'buffer');\n const size = args[2] as number | undefined;\n pushEvent(s, {\n kind: 'copyBufferToBuffer',\n cmdHandleId: cmdHId,\n sourceHandleId: sourceId,\n sourceOffset: 0,\n destinationHandleId: destinationId,\n destinationOffset: 0,\n size: (size ?? 0) as number,\n });\n realEnc.copyBufferToBuffer(args[0] as Buffer, args[1] as Buffer, size);\n }\n },\n copyBufferToTexture(source, destination, copySize) {\n const bufId = getHandleId(s, (source as { buffer: object }).buffer as object, 'buffer');\n const texId = getHandleId(\n s,\n (destination as { texture: object }).texture as object,\n 'texture',\n );\n const dstPayload: Record<string, unknown> = { textureHandleId: texId };\n if (destination.mipLevel !== undefined) dstPayload.mipLevel = destination.mipLevel;\n if (destination.origin !== undefined) dstPayload.origin = destination.origin;\n if (destination.aspect !== undefined) dstPayload.aspect = destination.aspect;\n pushEvent(s, {\n kind: 'copyBufferToTexture',\n cmdHandleId: cmdHId,\n source: {\n bufferHandleId: bufId,\n offset: source.offset ?? 0,\n bytesPerRow: source.bytesPerRow ?? 0,\n rowsPerImage: source.rowsPerImage ?? 0,\n },\n destination: dstPayload as Omit<GPUTexelCopyTextureInfo, 'texture'> & {\n readonly textureHandleId: HandleId;\n },\n copySize,\n });\n realEnc.copyBufferToTexture(source, destination, copySize);\n },\n copyTextureToBuffer(source, destination, copySize) {\n const texId = getHandleId(s, (source as { texture: object }).texture as object, 'texture');\n const bufId = getHandleId(s, (destination as { buffer: object }).buffer as object, 'buffer');\n const srcPayload: Record<string, unknown> = { textureHandleId: texId };\n if (source.mipLevel !== undefined) srcPayload.mipLevel = source.mipLevel;\n if (source.origin !== undefined) srcPayload.origin = source.origin;\n if (source.aspect !== undefined) srcPayload.aspect = source.aspect;\n pushEvent(s, {\n kind: 'copyTextureToBuffer',\n cmdHandleId: cmdHId,\n source: srcPayload as Omit<GPUTexelCopyTextureInfo, 'texture'> & {\n readonly textureHandleId: HandleId;\n },\n destination: {\n bufferHandleId: bufId,\n offset: destination.offset ?? 0,\n bytesPerRow: destination.bytesPerRow ?? 0,\n rowsPerImage: destination.rowsPerImage ?? 0,\n },\n copySize,\n });\n realEnc.copyTextureToBuffer(source, destination, copySize);\n },\n copyTextureToTexture(source, destination, copySize) {\n const srcTexId = getHandleId(s, (source as { texture: object }).texture as object, 'texture');\n const dstTexId = getHandleId(\n s,\n (destination as { texture: object }).texture as object,\n 'texture',\n );\n const srcPayload: Record<string, unknown> = { textureHandleId: srcTexId };\n if (source.mipLevel !== undefined) srcPayload.mipLevel = source.mipLevel;\n if (source.origin !== undefined) srcPayload.origin = source.origin;\n if (source.aspect !== undefined) srcPayload.aspect = source.aspect;\n const dstPayload: Record<string, unknown> = { textureHandleId: dstTexId };\n if (destination.mipLevel !== undefined) dstPayload.mipLevel = destination.mipLevel;\n if (destination.origin !== undefined) dstPayload.origin = destination.origin;\n if (destination.aspect !== undefined) dstPayload.aspect = destination.aspect;\n pushEvent(s, {\n kind: 'copyTextureToTexture',\n cmdHandleId: cmdHId,\n source: srcPayload as Omit<GPUTexelCopyTextureInfo, 'texture'> & {\n readonly textureHandleId: HandleId;\n },\n destination: dstPayload as Omit<GPUTexelCopyTextureInfo, 'texture'> & {\n readonly textureHandleId: HandleId;\n },\n copySize,\n });\n realEnc.copyTextureToTexture(source, destination, copySize);\n },\n clearBuffer(buffer, offset, size) {\n const bufId = getHandleId(s, buffer as object, 'buffer');\n pushEvent(s, {\n kind: 'clearBuffer',\n cmdHandleId: cmdHId,\n handleId: bufId,\n offset,\n size,\n });\n realEnc.clearBuffer(buffer, offset, size);\n },\n resolveQuerySet(querySet, firstQuery, queryCount, destination, destinationOffset) {\n return realEnc.resolveQuerySet(\n querySet,\n firstQuery,\n queryCount,\n destination,\n destinationOffset,\n );\n },\n writeTimestamp(querySet, queryIndex) {\n realEnc.writeTimestamp(querySet, queryIndex);\n },\n pushDebugGroup(groupLabel) {\n pushEvent(s, { kind: 'pushDebugGroup', cmdHandleId: cmdHId, groupLabel });\n realEnc.pushDebugGroup(groupLabel);\n },\n popDebugGroup() {\n pushEvent(s, { kind: 'popDebugGroup', cmdHandleId: cmdHId });\n realEnc.popDebugGroup();\n },\n insertDebugMarker(markerLabel) {\n pushEvent(s, { kind: 'insertDebugMarker', cmdHandleId: cmdHId, markerLabel });\n realEnc.insertDebugMarker(markerLabel);\n },\n finish() {\n pushEvent(s, { kind: 'finish', cmdHandleId: cmdHId });\n const res = realEnc.finish();\n // I-2 fix-up (round 1, dawn smoke handle-graph integrity):\n // alias the resulting CommandBuffer object to the encoder's\n // cmdHandleId so subsequent queue.submit() handle lookups resolve\n // to the SAME id that the createCommandEncoder/finish event pair\n // declared. Without this, submit would register a fresh handleId\n // for the CommandBuffer object and the tape's handle graph\n // integrity check would reject the tape on deserialize.\n if (res.ok) {\n s.handleMap.set(res.value as object, cmdHId);\n }\n return res;\n },\n };\n}\n","// @forgeax/engine-rhi-debug/src/recorder/queue -- queue proxy owner.\n\nimport type { Buffer, CommandBuffer, RhiQueue } from '@forgeax/engine-rhi';\nimport type { RhiCallEventWriteTexture } from '../types';\nimport type { RecorderInternal } from './core';\nimport { getHandleId, pushEvent, shouldRecord, storeBlob } from './core';\n\nexport function createQueueProxy(s: RecorderInternal, realQueue: RhiQueue): RhiQueue {\n return {\n writeBuffer(\n buffer: Buffer,\n bufferOffset: number,\n data: ArrayBufferView | ArrayBuffer,\n dataOffset?: number,\n size?: number,\n ) {\n // Idle fast-path: when not recording, skip getHandleId + slice + the\n // storeBlob hash-and-double-copy entirely (they would only feed a\n // pushEvent that the state gate drops, and blobPool is reset on arm()).\n // Same-condition-as-pushEvent, so a recording call still records.\n if (!shouldRecord(s)) {\n return realQueue.writeBuffer(buffer, bufferOffset, data, dataOffset, size);\n }\n const hId = getHandleId(s, buffer as object, 'buffer');\n const raw = ArrayBuffer.isView(data)\n ? new Uint8Array(data.buffer, data.byteOffset, data.byteLength)\n : new Uint8Array(data as ArrayBuffer);\n const sz = size ?? raw.byteLength - (dataOffset ?? 0);\n const slice = raw.slice(dataOffset ?? 0, (dataOffset ?? 0) + sz);\n const dataHash = storeBlob(s, slice.buffer as ArrayBuffer);\n\n pushEvent(s, {\n kind: 'writeBuffer',\n handleId: hId,\n bufferOffset,\n dataHash,\n size: sz,\n });\n return realQueue.writeBuffer(buffer, bufferOffset, data, dataOffset, size);\n },\n\n writeTexture(destination, data, dataLayout, copySize) {\n // Idle fast-path (see writeBuffer): skip storeBlob hash+copy when the\n // recorded event would be dropped anyway.\n if (!shouldRecord(s)) {\n return realQueue.writeTexture(destination, data, dataLayout, copySize);\n }\n const hId = getHandleId(s, destination.texture as object, 'texture');\n const raw = ArrayBuffer.isView(data)\n ? new Uint8Array(data.buffer, data.byteOffset, data.byteLength)\n : new Uint8Array(data as ArrayBuffer);\n const dataHash = storeBlob(s, raw.buffer as ArrayBuffer);\n\n pushEvent(s, {\n kind: 'writeTexture',\n destination: {\n textureHandleId: hId,\n mipLevel: destination.mipLevel,\n origin: destination.origin,\n aspect: destination.aspect,\n },\n dataHash,\n dataLayout: {\n offset: dataLayout.offset,\n bytesPerRow: dataLayout.bytesPerRow,\n rowsPerImage: dataLayout.rowsPerImage,\n },\n size: copySize,\n } as RhiCallEventWriteTexture);\n return realQueue.writeTexture(destination, data, dataLayout, copySize);\n },\n\n copyExternalImageToTexture(source, destination, copySize) {\n if (!shouldRecord(s)) {\n return realQueue.copyExternalImageToTexture(source, destination, copySize);\n }\n const hId = getHandleId(s, destination.texture as object, 'texture');\n pushEvent(s, {\n kind: 'copyExternalImageToTexture',\n source: { origin: source.origin, flipY: source.flipY },\n destination: {\n textureHandleId: hId,\n mipLevel: destination.mipLevel,\n origin: destination.origin,\n aspect: destination.aspect,\n colorSpace: destination.colorSpace,\n premultipliedAlpha: destination.premultipliedAlpha,\n },\n copySize,\n });\n return realQueue.copyExternalImageToTexture(source, destination, copySize);\n },\n\n submit(commandBuffers: readonly CommandBuffer[]) {\n if (!shouldRecord(s)) {\n return realQueue.submit(commandBuffers);\n }\n const cmdHandleIds = commandBuffers.map((cb) =>\n getHandleId(s, cb as object, 'commandBuffer'),\n );\n pushEvent(s, { kind: 'submit', cmdHandleIds });\n return realQueue.submit(commandBuffers);\n },\n\n onSubmittedWorkDone() {\n return realQueue.onSubmittedWorkDone();\n },\n };\n}\n","// @forgeax/engine-rhi-debug/src/recorder/device -- device proxy owner.\n\n/// <reference types=\"@webgpu/types\" />\n\nimport type {\n BindGroupDescriptor,\n BindGroupLayoutDescriptor,\n Buffer,\n BufferDescriptor,\n CommandEncoderDescriptor,\n ComputePipelineDescriptor,\n PipelineLayoutDescriptor,\n QuerySet,\n QuerySetDescriptor,\n RenderPipelineDescriptor,\n RhiCommandEncoder,\n RhiDevice,\n SamplerDescriptor,\n Texture,\n TextureDescriptor,\n TextureViewDescriptor,\n} from '@forgeax/engine-rhi';\nimport { RhiError } from '@forgeax/engine-rhi';\nimport { err as makeErr, ok as makeOk, type Result } from '@forgeax/engine-types';\nimport type { HandleId, RhiBindResourceKind, RhiCallEvent } from '../types';\nimport type { RecorderInternal } from './core';\nimport {\n allocHandleId,\n ensureTextureCreateEvent,\n getHandleId,\n hasBootstrapDependency,\n isDepthOrStencilFormat,\n promoteBufferUsage,\n pushEvent,\n registerHandle,\n retainsCaptureBootstrap,\n shouldRecord,\n TEXTURE_USAGE_BINDING,\n TEXTURE_USAGE_COPY_DST,\n TEXTURE_USAGE_COPY_SRC,\n} from './core';\nimport { createCommandEncoderProxy } from './encoder';\nimport { createQueueProxy } from './queue';\n\nexport function createDeviceProxy(s: RecorderInternal, realDevice: RhiDevice): RhiDevice {\n const proxiedQueue = createQueueProxy(s, realDevice.queue);\n\n // Expose the real RhiDevice for standalone createShaderModule calls.\n // engine-rhi-webgpu's createShaderModule uses RAW_DEVICE_MAP (WeakMap)\n // to reverse-lookup the GPUDevice. The proxy is a different JS object\n // from the RhiDevice that makeRhiDevice registered, so WeakMap.get(proxy)\n // returns undefined and createShaderModule returns shader-compile-failed.\n // The _realDevice property lets callers pass the real RhiDevice directly.\n type RhiDeviceWithReal = RhiDevice & { _realDevice: RhiDevice };\n\n const d: RhiDeviceWithReal = {\n _realDevice: realDevice,\n\n get caps() {\n return realDevice.caps;\n },\n get features() {\n return realDevice.features;\n },\n get limits() {\n return realDevice.limits;\n },\n get queue() {\n return proxiedQueue;\n },\n get lost() {\n return realDevice.lost;\n },\n\n createBuffer(desc: BufferDescriptor) {\n // COPY_SRC promotion (D-5): every recorded resource must be readable\n // back via copyBufferToBuffer so snapshotResource can capture its GPU\n // bytes at frame-header time. Promote the live resource's usage too,\n // not just the recorded event — a buffer created without COPY_SRC is\n // an invalid copy source on the real device. Mappable buffers are\n // skipped (MAP_READ|COPY_SRC is invalid) — they are staging buffers,\n // never snapshot targets.\n const promotedUsage = promoteBufferUsage(desc.usage ?? 0);\n const res = realDevice.createBuffer({ ...desc, usage: promotedUsage });\n if (!res.ok) return res;\n const event: RhiCallEvent = {\n kind: 'createBuffer',\n handleId: '' as HandleId,\n desc: {\n size: desc.size ?? 0,\n usage: promotedUsage,\n mappedAtCreation: desc.mappedAtCreation,\n },\n };\n const bufResource = res.value as object;\n const bufHandleId = registerHandle(s, bufResource, 'buffer', event);\n s.descriptorTable.set(bufHandleId, {\n kind: 'buffer',\n size: desc.size ?? 0,\n usage: promotedUsage,\n resource: bufResource,\n });\n pushEvent(s, event);\n return res;\n },\n\n createTexture(desc: TextureDescriptor) {\n // Snapshot promotion (D-5): a texture needs COPY_SRC for GPU readback\n // and COPY_DST for queue.writeTexture bootstrap seeding. Promote the\n // live resource's usage as well as the recorded event's so replay can\n // restore the captured color bytes on a fresh device.\n const promotedUsage =\n (desc.usage ?? 0) |\n TEXTURE_USAGE_COPY_SRC |\n TEXTURE_USAGE_COPY_DST |\n (isDepthOrStencilFormat(desc.format) ? TEXTURE_USAGE_BINDING : 0);\n const res = realDevice.createTexture({ ...desc, usage: promotedUsage });\n if (!res.ok) return res;\n const event: RhiCallEvent = {\n kind: 'createTexture',\n handleId: '' as HandleId,\n desc: {\n size: desc.size ?? { width: 1, height: 1 },\n mipLevelCount: desc.mipLevelCount,\n sampleCount: desc.sampleCount,\n dimension: desc.dimension,\n format: desc.format ?? ('bgra8unorm' as GPUTextureFormat),\n usage: promotedUsage,\n viewFormats: desc.viewFormats,\n textureBindingViewDimension: desc.textureBindingViewDimension,\n },\n };\n const texResource = res.value as object;\n const texHandleId = registerHandle(s, texResource, 'texture', event);\n s.descriptorTable.set(texHandleId, {\n kind: 'texture',\n size: desc.size ?? { width: 1, height: 1 },\n format: desc.format ?? ('bgra8unorm' as GPUTextureFormat),\n ...(desc.sampleCount !== undefined ? { sampleCount: desc.sampleCount } : {}),\n ...(desc.mipLevelCount !== undefined ? { mipLevelCount: desc.mipLevelCount } : {}),\n usage: promotedUsage,\n resource: texResource,\n });\n pushEvent(s, event);\n return res;\n },\n\n createTextureView(texture: Texture, desc: TextureViewDescriptor) {\n const res = realDevice.createTextureView(texture, desc);\n if (!res.ok) return res;\n const srcId = getHandleId(s, texture as object, 'texture');\n const textureError = ensureTextureCreateEvent(s, texture as object, srcId, desc.format);\n if (textureError !== undefined) {\n return makeErr(\n new RhiError({\n code: 'webgpu-runtime-error',\n expected: 'texture-view creation to remain representable in the capture graph',\n hint: textureError.hint,\n detail: {\n error: {\n code: textureError.code,\n message: textureError.hint,\n name: 'RhiDebugError',\n },\n },\n }),\n );\n }\n const viewId = registerHandle(s, res.value as object, 'textureView');\n s.textureViewHandleMap.set(res.value, viewId);\n\n const event: RhiCallEvent = {\n kind: 'createTextureView',\n sourceHandleId: srcId,\n resultHandleId: viewId,\n desc: {\n format: desc.format,\n dimension: desc.dimension,\n usage: desc.usage,\n aspect: desc.aspect,\n baseMipLevel: desc.baseMipLevel,\n mipLevelCount: desc.mipLevelCount,\n baseArrayLayer: desc.baseArrayLayer,\n arrayLayerCount: desc.arrayLayerCount,\n },\n };\n s.bootstrapCreates.set(viewId, event);\n pushEvent(s, event);\n return res;\n },\n\n createSampler(desc?: SamplerDescriptor | undefined) {\n const res = realDevice.createSampler(desc);\n if (!res.ok) return res;\n const event: RhiCallEvent = {\n kind: 'createSampler',\n handleId: '' as HandleId,\n desc: desc as Partial<GPUSamplerDescriptor> | undefined,\n };\n registerHandle(s, res.value as object, 'sampler', event);\n pushEvent(s, event);\n return res;\n },\n\n createBindGroupLayout(desc: BindGroupLayoutDescriptor) {\n const res = realDevice.createBindGroupLayout(desc);\n if (!res.ok) return res;\n const event: RhiCallEvent = {\n kind: 'createBindGroupLayout',\n handleId: '' as HandleId,\n desc: { label: desc.label, entries: desc.entries ?? [] },\n };\n registerHandle(s, res.value as object, 'bindGroupLayout', event);\n pushEvent(s, event);\n return res;\n },\n\n createBindGroup(desc: BindGroupDescriptor) {\n const res = realDevice.createBindGroup(desc);\n if (!res.ok) return res;\n const layoutId = getHandleId(s, desc.layout as object, 'bindGroupLayout');\n const entries = Array.from(desc.entries);\n const resourceKinds: RhiBindResourceKind[] = entries.map((e) => e.resource.kind);\n const resourceHandleIds: HandleId[] = entries.map((e) => {\n const r = e.resource;\n switch (r.kind) {\n case 'sampler':\n return getHandleId(s, r.value as object, 'sampler');\n case 'buffer':\n return getHandleId(s, r.value.buffer as object, 'buffer');\n case 'textureView':\n return getHandleId(s, r.value as object, 'textureView');\n case 'externalTexture':\n return 'externalTexture:unknown';\n }\n return 'externalTexture:unknown' as HandleId;\n });\n const event: RhiCallEvent = {\n kind: 'createBindGroup',\n handleId: '' as HandleId,\n layoutHandleId: layoutId,\n entries: entries.map((e, idx) => {\n const entry: {\n binding: number;\n resourceKind: RhiBindResourceKind;\n bufferOffset?: number;\n bufferSize?: number;\n } = {\n binding: e.binding,\n resourceKind: resourceKinds[idx] as RhiBindResourceKind,\n };\n // Capture the bound sub-range for buffer entries so a\n // dynamic-offset slice (e.g. a 256 B view of a 256 KiB pool)\n // replays as that slice, not the whole buffer.\n if (e.resource.kind === 'buffer') {\n const { offset, size } = e.resource.value;\n if (offset !== undefined) entry.bufferOffset = offset;\n if (size !== undefined) entry.bufferSize = size;\n }\n return entry;\n }),\n resourceHandleIds,\n };\n registerHandle(s, res.value as object, 'bindGroup', event);\n pushEvent(s, event);\n return res;\n },\n\n createPipelineLayout(desc: PipelineLayoutDescriptor) {\n const res = realDevice.createPipelineLayout(desc);\n if (!res.ok) return res;\n const bglIds = Array.from(desc.bindGroupLayouts).map((bgl) =>\n getHandleId(s, bgl as object, 'bindGroupLayout'),\n );\n const event: RhiCallEvent = {\n kind: 'createPipelineLayout',\n handleId: '' as HandleId,\n bglHandleIds: bglIds,\n };\n registerHandle(s, res.value as object, 'pipelineLayout', event);\n pushEvent(s, event);\n return res;\n },\n\n createRenderPipeline(desc: RenderPipelineDescriptor) {\n const res = realDevice.createRenderPipeline(desc);\n if (!res.ok) return res;\n let layoutId: HandleId;\n if (typeof desc.layout === 'string') {\n layoutId = 'layout:auto';\n } else {\n layoutId = getHandleId(s, desc.layout as object, 'pipelineLayout');\n }\n let vertexShaderModuleHandleId: HandleId | undefined;\n if (desc.vertex !== undefined) {\n vertexShaderModuleHandleId = getHandleId(s, desc.vertex.module as object, 'shaderModule');\n }\n let fragmentShaderModuleHandleId: HandleId | undefined;\n if (desc.fragment !== undefined) {\n fragmentShaderModuleHandleId = getHandleId(\n s,\n desc.fragment.module as object,\n 'shaderModule',\n );\n }\n const event: RhiCallEvent = {\n kind: 'createRenderPipeline',\n handleId: '' as HandleId,\n desc: {\n vertex: desc.vertex,\n primitive: desc.primitive,\n depthStencil: desc.depthStencil,\n multisample: desc.multisample,\n fragment: desc.fragment,\n },\n layoutHandleId: layoutId,\n vertexShaderModuleHandleId,\n fragmentShaderModuleHandleId,\n };\n registerHandle(s, res.value as object, 'renderPipeline', event);\n pushEvent(s, event);\n return res;\n },\n\n createComputePipeline(desc: ComputePipelineDescriptor) {\n const res = realDevice.createComputePipeline(desc);\n if (!res.ok) return res;\n let layoutId: HandleId;\n if (typeof desc.layout === 'string') {\n layoutId = 'layout:auto';\n } else {\n layoutId = getHandleId(s, desc.layout as object, 'pipelineLayout');\n }\n const computeShaderModuleHandleId = getHandleId(\n s,\n desc.compute.module as object,\n 'shaderModule',\n );\n const event: RhiCallEvent = {\n kind: 'createComputePipeline',\n handleId: '' as HandleId,\n desc: { compute: JSON.parse(JSON.stringify(desc.compute)) },\n layoutHandleId: layoutId,\n computeShaderModuleHandleId,\n };\n registerHandle(s, res.value as object, 'computePipeline', event);\n pushEvent(s, event);\n return res;\n },\n\n createQuerySet(desc: QuerySetDescriptor) {\n return realDevice.createQuerySet(desc);\n },\n\n destroyBuffer(buf: Buffer) {\n const hId = s.handleMap.get(buf as object);\n const res = realDevice.destroyBuffer(buf);\n if (!res.ok) return res;\n if (hId !== undefined) {\n s.descriptorTable.delete(hId);\n // Bound bootstrapCreates growth: an idle-destroyed resource can never\n // be referenced by a future frame's events, so drop its create event.\n // Only when NOT recording — mid-capture, an earlier frame event may\n // still reference this handle, and the tape prefix needs its create\n // event to stay self-contained (tape-invalid otherwise).\n //\n // Known bounded residual: a resource destroyed DURING a capture keeps\n // its bootstrapCreates entry forever — the entry is only ever revisited\n // by another destroy* of the SAME handle, which can't recur after the\n // resource is gone. This leaks one create event per resource that is\n // both created and destroyed inside a recording window (a narrow set;\n // most resources are long-lived). Fixing it needs a defer-delete list\n // swept at the next arm() — deliberately not added: the extra state\n // costs more than the leak it plugs (see PR discussion).\n //\n // Separate, wider residual: bootstrapCreates entries for\n // textureView / bindGroup / pipeline / sampler are NEVER pruned,\n // because RhiDevice exposes destroy only for buffer / texture -- a\n // faithful mirror of WebGPU, whose spec puts .destroy() solely on\n // GPUBuffer / GPUTexture (the objects holding large, eagerly-freeable\n // backing memory); views / bind groups / pipelines / samplers are\n // lightweight reference objects left to GC. So there is no destroy\n // signal to hook for them. An app that rebuilds these per frame grows\n // bootstrapCreates under a long idle run. The GC-aligned fix is a\n // WeakRef + FinalizationRegistry over the create-event objects (same\n // spirit as handleMap's WeakMap, but keyed by handleId so it needs the\n // WeakRef wrapper) -- a finalization-semantics change, out of scope here.\n if (\n !retainsCaptureBootstrap(s) &&\n !s.snapshotSeededHandles.has(hId) &&\n !hasBootstrapDependency(s, hId)\n ) {\n s.bootstrapCreates.delete(hId);\n }\n pushEvent(s, { kind: 'destroyBuffer', handleId: hId });\n }\n return res;\n },\n\n destroyQuerySet(querySet: QuerySet) {\n return realDevice.destroyQuerySet(querySet);\n },\n\n destroyTexture(tex: Texture) {\n const hId = s.handleMap.get(tex as object);\n const res = realDevice.destroyTexture(tex);\n if (!res.ok) return res;\n if (hId !== undefined) {\n s.descriptorTable.delete(hId);\n // Same gate + same bounded residual as destroyBuffer above.\n if (\n !retainsCaptureBootstrap(s) &&\n !s.snapshotSeededHandles.has(hId) &&\n !hasBootstrapDependency(s, hId)\n ) {\n s.bootstrapCreates.delete(hId);\n }\n pushEvent(s, { kind: 'destroyTexture', handleId: hId });\n }\n return res;\n },\n\n createCommandEncoder(desc?: CommandEncoderDescriptor | undefined) {\n const res = realDevice.createCommandEncoder(desc);\n if (!res.ok) return res;\n // Idle fast-path: return the real (un-proxied) encoder when not\n // recording. One gate here elides the proxy wrapper AND every\n // beginRenderPass/draw/setBindGroup/copy* call that would otherwise\n // route through proxyCmdEncoder + proxyRenderPass only to be dropped\n // by the pushEvent gate. Safe because a frame body runs synchronously\n // in one rAF callback: createCommandEncoder -> passes -> queue.submit\n // all observe the same recorder state (arm() only fires between frames),\n // so an idle-created encoder's whole frame is consistently un-recorded,\n // matching the now-gated queue.submit which skips its handle lookup.\n if (!shouldRecord(s)) {\n return res;\n }\n const cmdId = allocHandleId('commandEncoder');\n pushEvent(s, {\n kind: 'createCommandEncoder',\n cmdHandleId: cmdId,\n desc: desc as Partial<GPUCommandEncoderDescriptor> | undefined,\n });\n const proxyEnc = createCommandEncoderProxy(s, res.value, cmdId);\n return makeOk(proxyEnc as RhiCommandEncoder) as Result<\n RhiCommandEncoder,\n import('@forgeax/engine-rhi').RhiError\n >;\n },\n };\n return d;\n}\n\n// --------------------------------------------------\n// wrap RhiInstance\n// --------------------------------------------------\n","// @forgeax/engine-rhi-debug/src/recorder/lifecycle -- capture state and snapshot lifecycle.\n\n/// <reference types=\"@webgpu/types\" />\n\nimport type { Result, RhiDevice } from '@forgeax/engine-rhi';\nimport { err as makeErr, ok as makeOk } from '@forgeax/engine-types';\nimport { createRhiDebugError, type RhiDebugError } from '../errors';\nimport {\n readbackBufferBytes,\n readbackBufferBytesBatch,\n readbackTexturePixels,\n readbackTexturePixelsBatch,\n} from '../readback';\nimport { computeTextureLayout, projectTextureExtent } from '../texel-layout';\nimport type { HandleId, RhiCallEvent, Tape } from '../types';\nimport {\n _collectFrameReferencedHandleIds,\n _computeClosure,\n _getCreateEventReferencedHandleIds,\n _topoSortClosure,\n} from './closure';\nimport {\n isDepthOrStencilFormat,\n isMappableBuffer,\n isSnapshottableColorTexture,\n pushSnapshotEvent,\n type RecorderInternal,\n RecorderState,\n reconcileSwapchainViewFormats,\n SNAPSHOT_RESOURCE_BATCH_SIZE,\n SNAPSHOT_TIMEOUT_MS,\n snapshotStageOf,\n snapshotTimeoutDetail,\n storeBlob,\n TAPE_FORMAT_VERSION,\n} from './core';\n\nexport function createRecorderLifecycle(s: RecorderInternal) {\n function arm(frames: number): Result<void, RhiDebugError> {\n if (\n s.state === RecorderState.Armed ||\n s.state === RecorderState.Snapshotting ||\n s.state === RecorderState.Recording ||\n s.state === RecorderState.Finalizing\n ) {\n return makeErr(\n createRhiDebugError('capture-busy', {\n stage: 'capture',\n cause: 'arm() called while the recorder is already capturing',\n }),\n );\n }\n if (s.state === RecorderState.Error) {\n return makeErr(\n createRhiDebugError('capture-unavailable', {\n stage: 'capture',\n cause: 'the recorder is in an error state; dispose the failed capture before re-arming',\n }),\n );\n }\n\n s.state = RecorderState.Armed;\n // A previous bounded snapshot may still be unwinding after its timeout.\n // Its generation fence prevents stale cleanup from touching this capture;\n // reset the suppression latch here so the new capture can record normally.\n s._skipRecord = false;\n s.snapshotGeneration += 1;\n s.requestedFrames = frames;\n s.recordedFrames = 0;\n s.events = [];\n s.blobPool = new Map();\n s.snapshotSeededHandles.clear();\n s.snapshotProgress = undefined;\n s.frameIdx = 0;\n s.bootstrap = true;\n s.valid = true;\n return makeOk(undefined);\n }\n\n function onFrameEnd(): void {\n if (s.state === RecorderState.Idle) {\n s.frameIdx++;\n s.bootstrap = false;\n return;\n }\n\n // Snapshotting = the async frame-header snapshot loop is mid-flight. Its\n // readbacks await between resources, so the host rAF loop CAN fire\n // onFrameEnd while the loop is still pushing initialData events. If we let\n // that tick advance the state machine (Recording -> frameMark -> Finalizing\n // -> Idle), the still-running snapshot loop's later pushEvent() calls hit\n // the Idle gate and are silently dropped -- the exact race that lost every\n // texture initialData (material default textures all-zero -> black cube).\n // Ignore the tick entirely: snapshotAllLiveResources() sets Recording when\n // it completes, and the NEXT onFrameEnd records the real frame.\n if (s.state === RecorderState.Snapshotting) {\n s.bootstrap = false;\n return;\n }\n\n // Armed at frame end -> recording. This is the fallback for hosts that\n // never call snapshotAllLiveResources() (the snapshot loop is opt-in at the\n // seam); they record straight from Armed with no frame-header snapshot.\n if (s.state === RecorderState.Armed) {\n s.state = RecorderState.Recording;\n s.bootstrap = false;\n }\n\n if (s.state === RecorderState.Recording) {\n // Emit frameMark at end of this frame\n s.events.push({ kind: 'frameMark', frameIdx: s.frameIdx });\n s.recordedFrames++;\n s.frameIdx++;\n\n if (s.recordedFrames >= s.requestedFrames) {\n s.state = RecorderState.Finalizing;\n if (s.onFrameEndUnsubscribe) {\n s.onFrameEndUnsubscribe();\n s.onFrameEndUnsubscribe = undefined;\n }\n s.state = RecorderState.Idle;\n }\n return;\n }\n\n // finalizing or error: no-op\n s.frameIdx++;\n }\n\n function getTape(): Tape | RhiDebugError | undefined {\n if (s.events.length === 0) return undefined;\n\n reconcileSwapchainViewFormats(s);\n\n // Pre-scan s.events for create* declarations: handleIds whose\n // create event is already carried by the frame events (transient\n // per-frame resources like swapchain textures, command encoders).\n // These handles do NOT need bootstrap prefixing -- they were born\n // during the recorded frame and their create event is in s.events.\n // Collect handleIds that are directly declared by create* events in s.events.\n // Only include the handleId field of the create event itself — NOT backward-refs\n // (layoutHandleId, resourceHandleIds, etc.) from _getCreateEventReferencedHandleIds.\n //\n // Backward-refs from in-frame create events often point to persistent resources\n // (buffers, textures, pipelines) that were created before arm(). Including them\n // in inFrameHandleIds would exclude those resources from bootstrap prefixing,\n // causing tapes to be non-self-contained (missing create* events for early handles).\n //\n // Swapchain textures that have no createTexture event are handled elsewhere:\n // createTextureView (line 1237) detects missing bootstrap entries and constructs\n // faithful createTexture events at capture time, so they are already in both\n // bootstrapCreates and s.events.\n const inFrameHandleIds = new Set<HandleId>();\n for (const e of s.events) {\n // create* events declare handleId (or resultHandleId for createTextureView).\n if (\n e.kind.startsWith('create') &&\n 'handleId' in e &&\n typeof (e as { handleId: unknown }).handleId === 'string'\n ) {\n inFrameHandleIds.add((e as { handleId: HandleId }).handleId);\n }\n // createTextureView declares the result via resultHandleId.\n if (\n e.kind === 'createTextureView' &&\n 'resultHandleId' in e &&\n typeof (e as { resultHandleId: unknown }).resultHandleId === 'string'\n ) {\n inFrameHandleIds.add((e as { resultHandleId: HandleId }).resultHandleId);\n }\n // createCommandEncoder declares the cmd via cmdHandleId.\n if (\n e.kind === 'createCommandEncoder' &&\n 'cmdHandleId' in e &&\n typeof (e as { cmdHandleId: unknown }).cmdHandleId === 'string'\n ) {\n inFrameHandleIds.add((e as { cmdHandleId: HandleId }).cmdHandleId);\n }\n // beginRenderPass / beginComputePass declare passHandleId.\n if (\n (e.kind === 'beginRenderPass' || e.kind === 'beginComputePass') &&\n 'passHandleId' in e &&\n typeof (e as { passHandleId: unknown }).passHandleId === 'string'\n ) {\n inFrameHandleIds.add((e as { passHandleId: HandleId }).passHandleId);\n }\n }\n\n // Collect frame-referenced handleIds from per-frame events.\n const allFrameHandleIds = _collectFrameReferencedHandleIds(s.events);\n\n // Exclude handles whose create event is already in s.events:\n // only compute bootstrap closure for handles that need prefixing.\n const prefixSeedIds = new Set<HandleId>();\n for (const hId of allFrameHandleIds) {\n if (!inFrameHandleIds.has(hId)) {\n prefixSeedIds.add(hId);\n }\n }\n\n // Transitive closure from bootstrapCreates\n const { closure, missing } = _computeClosure(\n prefixSeedIds,\n s.bootstrapCreates,\n inFrameHandleIds,\n );\n\n if (missing !== null) {\n // Missing create — return error (hint refined in w9)\n const referencingEventIndex = s.events.findIndex((event) => {\n try {\n return JSON.stringify(event).includes(missing);\n } catch {\n return false;\n }\n });\n const referencingEventKind =\n referencingEventIndex >= 0 ? s.events[referencingEventIndex]?.kind : undefined;\n const referencingCreate = [...s.bootstrapCreates.entries()].find(([, event]) =>\n _getCreateEventReferencedHandleIds(event).includes(missing),\n );\n return createRhiDebugError('tape-invalid', {\n stage: 'validate',\n cause: `handleId '${missing}' has no create event in bootstrap table; referenced by event ${referencingEventIndex} (${referencingEventKind ?? 'unknown'}) and bootstrap ${referencingCreate?.[0] ?? 'unknown'} (${referencingCreate?.[1].kind ?? 'unknown'})`,\n handleId: missing,\n eventIndex: referencingEventIndex,\n });\n }\n\n // Topological sort: dependencies (leaf resources) before dependents\n const prefixEvents: RhiCallEvent[] = _topoSortClosure(closure, s.bootstrapCreates);\n\n // dedup: only prefix create events not already in s.events.\n const dedupedPrefx = prefixEvents.filter((e) => {\n if ('handleId' in e && typeof (e as { handleId: unknown }).handleId === 'string') {\n return !inFrameHandleIds.has((e as { handleId: HandleId }).handleId);\n }\n return true;\n });\n\n return {\n formatVersion: TAPE_FORMAT_VERSION,\n rhiCapsRecorded: s.recordedCaps ?? {\n canvasFormat: 'bgra8unorm' as GPUTextureFormat,\n rgba16floatRenderable: false,\n float32Filterable: false,\n textureCompressionBc: false,\n textureCompressionEtc2: false,\n textureCompressionAstc: false,\n storageBuffer: false,\n timestampQuery: false,\n },\n events: [...dedupedPrefx, ...s.events],\n blobPool: s.blobPool,\n };\n }\n\n function getState(): string {\n return s.state;\n }\n function getEvents(): readonly RhiCallEvent[] {\n return s.events;\n }\n function getBlobPool(): ReadonlyMap<string, ArrayBuffer> {\n return s.blobPool;\n }\n\n function transitionToError(): void {\n if (\n s.state === RecorderState.Recording ||\n s.state === RecorderState.Armed ||\n s.state === RecorderState.Snapshotting\n ) {\n s.state = RecorderState.Error;\n s.snapshotGeneration += 1;\n s._skipRecord = false;\n s.valid = false;\n if (s.onFrameEndUnsubscribe) {\n s.onFrameEndUnsubscribe();\n s.onFrameEndUnsubscribe = undefined;\n }\n }\n }\n\n function disposeError(): void {\n if (s.state === RecorderState.Error) {\n s.state = RecorderState.Idle;\n s.snapshotGeneration += 1;\n s._skipRecord = false;\n s.events = [];\n s.blobPool = new Map();\n s.valid = true;\n s.snapshotProgress = undefined;\n }\n }\n\n /**\n * Snapshot a resource's GPU bytes into the tape as an initialData event.\n *\n * Reads the resource shape from the descriptor registry, copies the bytes\n * back from the GPU via readbackBufferBytes (buffer) / readbackTexturePixels\n * (texture), stores them in the blobPool (djb2 hash-dedup), and pushes an\n * `initialData` event into the stream. The snapshot's own copy/submit are\n * wrapped in `_skipRecord = true` so they never leak into the tape event\n * stream (D-8 isolation).\n *\n * Async because the GPU readback chain (copyToBuffer -> submit ->\n * onSubmittedWorkDone -> mapAsync) is inherently asynchronous; the M1 stub\n * locked a sync signature, but no caller existed yet — the frame-header loop\n * added here is the first consumer (Change stance: optimal > compatible).\n *\n * Returns Result with {handleId, dataHash} on success, or\n * capture-snapshot-failed (with structured snapshot detail) on a\n * failure, so AI users can switch-exhaustive narrow the code (D-3).\n */\n async function snapshotResource(\n handleId: HandleId,\n snapshotGeneration?: number,\n ): Promise<Result<{ handleId: HandleId; dataHash: string }, RhiDebugError>> {\n type SnapshotResult = Result<{ handleId: HandleId; dataHash: string }, RhiDebugError>;\n const fail = (\n stage: 'copy' | 'map' | 'store',\n _expected: string,\n hint: string,\n ): SnapshotResult =>\n makeErr(\n createRhiDebugError('capture-snapshot-failed', {\n stage: 'snapshot',\n cause: `${stage}: ${hint}`,\n handleId,\n }),\n );\n\n const entry = s.descriptorTable.get(handleId);\n if (entry === undefined) {\n return fail(\n 'copy',\n 'handleId present in descriptor registry',\n `no live resource registered for handleId '${handleId}'; it may have been destroyed or never created through the recorder proxy`,\n );\n }\n\n const device = s.capturedDevice;\n if (device === undefined) {\n return fail(\n 'copy',\n 'a captured RhiDevice to drive GPU readback',\n 'no device has been acquired through the recorder proxy yet; drive requestAdapter().requestDevice() before snapshotting',\n );\n }\n\n // Resolve the unwrapped real device — readback issues copy/submit/mapAsync\n // through it. The proxy device would re-record those calls were it not for\n // the _skipRecord guard below; using the real device sidesteps the proxy\n // entirely for the readback staging buffer.\n const realDevice = (device as RhiDevice & { _realDevice?: RhiDevice })._realDevice ?? device;\n const snapshotIsActive = () =>\n snapshotGeneration === undefined ||\n (s.state === RecorderState.Snapshotting && s.snapshotGeneration === snapshotGeneration);\n const cancelled = () =>\n makeErr(\n createRhiDebugError('capture-snapshot-failed', {\n stage: 'snapshot',\n cause:\n 'snapshot was cancelled after a timeout or recorder error; discard this capture and retry',\n handleId,\n }),\n );\n\n let bytes: ArrayBuffer;\n const prevSkip = s._skipRecord;\n s._skipRecord = true;\n try {\n if (entry.kind === 'buffer') {\n const size = typeof entry.size === 'number' ? entry.size : 0;\n const res = await readbackBufferBytes(realDevice, entry.resource, size);\n if (!res.ok) return fail(snapshotStageOf(res.error), res.error.expected, res.error.hint);\n if (!snapshotIsActive()) return cancelled();\n bytes = res.value;\n } else {\n const { width, height, layerCount } = projectTextureExtent(entry.size);\n const layout = computeTextureLayout(\n entry.format,\n width,\n height,\n layerCount,\n entry.mipLevelCount ?? 1,\n );\n if (layout === undefined) {\n // Should not happen: the snapshot loop's isSnapshottableColorTexture\n // gate already excludes formats with no texel size. Fail fast rather\n // than emit a corrupt seed.\n return fail(\n 'copy',\n 'a snapshottable color format with a known texel size',\n `format '${entry.format}' has no byte layout; the snapshot gate should have skipped it`,\n );\n }\n try {\n // Read every (layer, mip) subresource and concatenate tight into one\n // blob in the canonical order computeTextureLayout defines; the seed\n // side walks the same layout to writeTexture each slice back.\n const blob = new Uint8Array(layout.totalBytes);\n for (const slice of layout.slices) {\n if (!snapshotIsActive()) return cancelled();\n const sub = await readbackTexturePixels(\n realDevice,\n entry.resource,\n slice.width,\n slice.height,\n {\n bytesPerBlock: layout.bytesPerBlock,\n blockWidth: layout.blockWidth,\n blockHeight: layout.blockHeight,\n mipLevel: slice.mip,\n baseArrayLayer: slice.layer,\n },\n );\n if (!snapshotIsActive()) return cancelled();\n blob.set(sub.subarray(0, slice.byteLength), slice.byteOffset);\n }\n bytes = blob.buffer.slice(\n blob.byteOffset,\n blob.byteOffset + blob.byteLength,\n ) as ArrayBuffer;\n } catch (e) {\n return fail(\n 'copy',\n 'texture GPU byte readback to succeed',\n `readbackTexturePixels failed: ${String(e)}`,\n );\n }\n }\n } finally {\n // A retry may begin before a timed-out readback promise settles. Do not\n // let the stale generation restore its old suppression bit over the new\n // capture's active snapshot; only the generation that acquired it may\n // release it.\n if (snapshotGeneration === undefined || s.snapshotGeneration === snapshotGeneration) {\n s._skipRecord = prevSkip;\n }\n }\n\n if (!snapshotIsActive()) return cancelled();\n\n // storeBlob: djb2 hash-dedup into the unified blobPool (D-1, no separate\n // init-data pool). Reuses the same tag space as writeBuffer/writeTexture.\n let dataHash: string;\n try {\n dataHash = storeBlob(s, bytes);\n } catch (e) {\n return fail(\n 'store',\n 'storeBlob to hash + insert the snapshot bytes',\n `storeBlob failed: ${String(e)}`,\n );\n }\n\n pushSnapshotEvent(s, { kind: 'initialData', handleId, dataHash });\n s.snapshotSeededHandles.add(handleId);\n return makeOk({ handleId, dataHash });\n }\n\n /**\n * Frame-header snapshot loop (D-5, C-3, C-4): with the recorder in the\n * Snapshotting middle state, await all submitted work, then snapshot every\n * live resource in the descriptor registry (full-table dump, no size\n * threshold / allowlist trimming — that for-loop is the single Phase 2\n * policy seam, OOS-4 / OOS-5). On full success the recorder advances to\n * Recording; a single snapshot failure aborts with its Result so the\n * caller fails fast (architecture §5) rather than recording a partial seed.\n */\n async function snapshotAllLiveResources(\n timeoutMs = SNAPSHOT_TIMEOUT_MS,\n ): Promise<Result<void, RhiDebugError>> {\n if (s.state !== RecorderState.Armed && s.state !== RecorderState.Snapshotting) {\n return makeErr(\n createRhiDebugError('capture-unavailable', {\n stage: 'capture',\n cause: `snapshotAllLiveResources called while recorder is in '${s.state}' state; arm() before the frame-header snapshot`,\n }),\n );\n }\n const snapshotGeneration = s.snapshotGeneration;\n s.state = RecorderState.Snapshotting;\n\n const timeoutError = () =>\n createRhiDebugError('capture-timeout', snapshotTimeoutDetail(s.snapshotProgress, timeoutMs));\n let timer: ReturnType<typeof setTimeout> | undefined;\n const timeoutResult = new Promise<Result<void, RhiDebugError>>((resolve) => {\n timer = setTimeout(() => {\n // The caller may have timed out first, disposed the failed capture,\n // and already started a new generation. A late timer from that stale\n // snapshot must not poison the retry that now owns the recorder.\n if (s.state === RecorderState.Snapshotting && s.snapshotGeneration === snapshotGeneration) {\n transitionToError();\n }\n resolve(makeErr(timeoutError()));\n }, timeoutMs);\n });\n\n try {\n const result = await Promise.race([\n runSnapshotAllLiveResources(snapshotGeneration),\n timeoutResult,\n ]);\n if (\n !result.ok &&\n s.state === RecorderState.Snapshotting &&\n s.snapshotGeneration === snapshotGeneration\n ) {\n transitionToError();\n }\n return result;\n } catch (error) {\n if (s.state === RecorderState.Snapshotting && s.snapshotGeneration === snapshotGeneration) {\n transitionToError();\n }\n throw error;\n } finally {\n if (timer !== undefined) clearTimeout(timer);\n }\n }\n\n async function runSnapshotAllLiveResources(\n snapshotGeneration: number,\n ): Promise<Result<void, RhiDebugError>> {\n s.snapshotProgress = {\n startedAt: Date.now(),\n stage: 'queue-drain',\n totalResources: s.descriptorTable.size,\n completedResources: 0,\n skippedResources: 0,\n currentHandleId: null,\n currentKind: null,\n currentSizeBytes: null,\n };\n\n // C-3 conservative timing: drain queued work so snapshots read frame-outside\n // / historical content, never a half-written in-frame value (A-2).\n const device = s.capturedDevice;\n const realDevice =\n device === undefined\n ? undefined\n : ((device as RhiDevice & { _realDevice?: RhiDevice })._realDevice ?? device);\n if (realDevice !== undefined) {\n const prevSkip = s._skipRecord;\n s._skipRecord = true;\n try {\n await realDevice.queue.onSubmittedWorkDone();\n } finally {\n if (s.snapshotGeneration === snapshotGeneration) s._skipRecord = prevSkip;\n }\n if (s.snapshotProgress !== undefined) {\n s.snapshotProgress = { ...s.snapshotProgress, stage: 'resource-readback' };\n }\n if (s.state !== RecorderState.Snapshotting || s.snapshotGeneration !== snapshotGeneration) {\n return makeErr(\n createRhiDebugError('capture-snapshot-failed', {\n stage: 'snapshot',\n cause: 'snapshot was cancelled while queued GPU work was draining',\n }),\n );\n }\n }\n\n const liveEntries = [...s.descriptorTable.entries()];\n const candidates = liveEntries.filter(([handleId, entry]) => {\n // Mappable buffers are staging scratch, not seedable authored resources.\n if (entry.kind === 'buffer' && isMappableBuffer(entry.usage)) {\n if (s.snapshotProgress !== undefined) {\n s.snapshotProgress = {\n ...s.snapshotProgress,\n skippedResources: s.snapshotProgress.skippedResources + 1,\n };\n }\n return false;\n }\n // Depth/stencil and multisample textures cannot be faithfully re-seeded.\n if (\n entry.kind === 'texture' &&\n (isDepthOrStencilFormat(entry.format) ||\n !isSnapshottableColorTexture(entry.format, entry.size, entry.sampleCount))\n ) {\n if (s.snapshotProgress !== undefined) {\n s.snapshotProgress = {\n ...s.snapshotProgress,\n skippedResources: s.snapshotProgress.skippedResources + 1,\n };\n }\n return false;\n }\n // Preserve the existing transient-texture policy: a texture destroyed\n // before its turn is skipped, while a resource already admitted to a\n // batch retains its seed even if it is released during that batch.\n if (entry.kind === 'texture' && !s.descriptorTable.has(handleId)) {\n if (s.snapshotProgress !== undefined) {\n s.snapshotProgress = {\n ...s.snapshotProgress,\n skippedResources: s.snapshotProgress.skippedResources + 1,\n };\n }\n return false;\n }\n return true;\n });\n\n const snapshotIsActive = () =>\n s.state === RecorderState.Snapshotting && s.snapshotGeneration === snapshotGeneration;\n const cancelledResult = () =>\n makeErr(\n createRhiDebugError('capture-snapshot-failed', {\n stage: 'snapshot',\n cause: 'snapshot was cancelled while live resources were being seeded',\n }),\n );\n\n // No captured device is an existing error path for snapshotResource. Keep\n // it serial and deterministic rather than manufacturing a batch surface.\n if (realDevice === undefined) {\n for (const [handleId, entry] of candidates) {\n if (s.snapshotProgress !== undefined) {\n s.snapshotProgress = {\n ...s.snapshotProgress,\n stage: 'resource-readback',\n currentHandleId: handleId,\n currentKind: entry.kind,\n currentSizeBytes:\n entry.kind === 'buffer' && typeof entry.size === 'number' ? entry.size : null,\n };\n }\n const result = await snapshotResource(handleId, snapshotGeneration);\n if (!result.ok) return result;\n if (s.snapshotProgress !== undefined) {\n s.snapshotProgress = {\n ...s.snapshotProgress,\n completedResources: s.snapshotProgress.completedResources + 1,\n currentHandleId: null,\n currentKind: null,\n currentSizeBytes: null,\n };\n }\n }\n } else {\n let offset = 0;\n while (offset < candidates.length) {\n const first = candidates[offset];\n if (first === undefined) break;\n const kind = first[1].kind;\n const batchEntries: typeof candidates = [];\n while (\n offset < candidates.length &&\n batchEntries.length < SNAPSHOT_RESOURCE_BATCH_SIZE &&\n candidates[offset]?.[1].kind === kind\n ) {\n const candidate = candidates[offset];\n if (candidate !== undefined) batchEntries.push(candidate);\n offset += 1;\n }\n\n if (s.snapshotProgress !== undefined) {\n s.snapshotProgress = {\n ...s.snapshotProgress,\n stage: 'resource-readback',\n currentHandleId: batchEntries[0]?.[0] ?? null,\n currentKind: kind,\n currentSizeBytes:\n kind === 'buffer' && typeof batchEntries[0]?.[1].size === 'number'\n ? batchEntries[0][1].size\n : null,\n };\n }\n\n if (kind === 'buffer') {\n const batch = await readbackBufferBytesBatch(\n realDevice,\n batchEntries.map(([handleId, entry]) => ({\n handleId,\n buffer: entry.resource,\n size: typeof entry.size === 'number' ? entry.size : 0,\n })),\n {\n onResourceStart: (handleId) => {\n const entry = s.descriptorTable.get(handleId);\n if (s.snapshotProgress !== undefined && entry !== undefined) {\n s.snapshotProgress = {\n ...s.snapshotProgress,\n currentHandleId: handleId,\n currentKind: 'buffer',\n currentSizeBytes: typeof entry.size === 'number' ? entry.size : null,\n };\n }\n },\n onResourceComplete: () => {\n if (s.snapshotProgress !== undefined) {\n s.snapshotProgress = {\n ...s.snapshotProgress,\n completedResources: s.snapshotProgress.completedResources + 1,\n currentHandleId: null,\n currentKind: null,\n currentSizeBytes: null,\n };\n }\n },\n isCancelled: () => !snapshotIsActive(),\n },\n );\n if (!batch.ok) return batch;\n if (!snapshotIsActive()) return cancelledResult();\n for (const [handleId] of batchEntries) {\n const bytes = batch.value.get(handleId);\n if (bytes === undefined) {\n return makeErr(\n createRhiDebugError('capture-snapshot-failed', {\n stage: 'snapshot',\n cause: 'the batched GPU readback returned no bytes for a live buffer',\n handleId,\n resourceKind: 'buffer',\n }),\n );\n }\n const dataHash = storeBlob(s, bytes);\n pushSnapshotEvent(s, { kind: 'initialData', handleId, dataHash });\n s.snapshotSeededHandles.add(handleId);\n }\n } else {\n const requests = batchEntries.map(([handleId, entry]) => {\n const { width, height, layerCount } = projectTextureExtent(entry.size);\n const layout = computeTextureLayout(\n entry.format,\n width,\n height,\n layerCount,\n entry.mipLevelCount ?? 1,\n );\n if (layout === undefined) {\n throw new Error(`texture '${handleId}' has no snapshottable byte layout`);\n }\n return {\n handleId,\n texture: entry.resource,\n bytesPerBlock: layout.bytesPerBlock,\n blockWidth: layout.blockWidth,\n blockHeight: layout.blockHeight,\n totalBytes: layout.totalBytes,\n slices: layout.slices,\n };\n });\n const batch = await readbackTexturePixelsBatch(realDevice, requests, {\n onResourceStart: (handleId) => {\n if (s.snapshotProgress !== undefined) {\n s.snapshotProgress = {\n ...s.snapshotProgress,\n currentHandleId: handleId,\n currentKind: 'texture',\n currentSizeBytes: null,\n };\n }\n },\n isCancelled: () => !snapshotIsActive(),\n });\n if (!batch.ok) return batch;\n if (!snapshotIsActive()) return cancelledResult();\n for (const [handleId] of batchEntries) {\n // A transient texture can be released while its batch is waiting\n // on the GPU. The copy was intentionally isolated and cleaned up,\n // but the released handle must not become a seed for the next\n // frame. Buffers retain the historical batch behavior above.\n if (!s.descriptorTable.has(handleId)) {\n if (s.snapshotProgress !== undefined) {\n s.snapshotProgress = {\n ...s.snapshotProgress,\n skippedResources: s.snapshotProgress.skippedResources + 1,\n currentHandleId: null,\n currentKind: null,\n currentSizeBytes: null,\n };\n }\n continue;\n }\n const bytes = batch.value.get(handleId);\n if (bytes === undefined) {\n return makeErr(\n createRhiDebugError('capture-snapshot-failed', {\n stage: 'snapshot',\n cause: 'the batched GPU readback returned no bytes for a live texture',\n handleId,\n resourceKind: 'texture',\n }),\n );\n }\n const dataHash = storeBlob(s, bytes);\n pushSnapshotEvent(s, { kind: 'initialData', handleId, dataHash });\n s.snapshotSeededHandles.add(handleId);\n if (s.snapshotProgress !== undefined) {\n s.snapshotProgress = {\n ...s.snapshotProgress,\n completedResources: s.snapshotProgress.completedResources + 1,\n currentHandleId: null,\n currentKind: null,\n currentSizeBytes: null,\n };\n }\n }\n }\n if (!snapshotIsActive()) return cancelledResult();\n }\n }\n\n if (s.snapshotProgress !== undefined) {\n s.snapshotProgress = {\n ...s.snapshotProgress,\n currentHandleId: null,\n currentKind: null,\n currentSizeBytes: null,\n };\n }\n\n if (s.state !== RecorderState.Snapshotting || s.snapshotGeneration !== snapshotGeneration) {\n return makeErr(\n createRhiDebugError('capture-snapshot-failed', {\n stage: 'snapshot',\n cause: 'snapshot was cancelled before the full live-resource table was seeded',\n }),\n );\n }\n s.state = RecorderState.Recording;\n return makeOk(undefined);\n }\n\n // --------------------------------------------------\n // proxy construction\n // --------------------------------------------------\n\n return {\n arm,\n onFrameEnd,\n getTape,\n getState,\n getEvents,\n getBlobPool,\n transitionToError,\n disposeError,\n snapshotResource,\n snapshotAllLiveResources,\n };\n}\n","// @forgeax/engine-rhi-debug/src/recorder/wrap -- RHI instance assembly.\n\n/// <reference types=\"@webgpu/types\" />\n\nimport type {\n RequestAdapterOptions,\n RequestDeviceOptions,\n Result,\n RhiAdapter,\n RhiDevice,\n RhiInstance,\n ShaderModule,\n} from '@forgeax/engine-rhi';\nimport { ok as makeOk } from '@forgeax/engine-types';\nimport type { HandleId, RhiCallEvent } from '../types';\nimport {\n type DebugRhiInstance,\n pushEvent,\n type RecorderInternal,\n RecorderState,\n registerHandle,\n} from './core';\nimport { createDeviceProxy } from './device';\nimport { createRecorderLifecycle } from './lifecycle';\n\nexport function wrap(instance: RhiInstance): DebugRhiInstance {\n const s: RecorderInternal = {\n state: RecorderState.Idle,\n requestedFrames: 0,\n recordedFrames: 0,\n events: [],\n blobPool: new Map(),\n handleMap: new WeakMap(),\n textureViewHandleMap: new WeakMap(),\n bootstrapCreates: new Map(),\n snapshotSeededHandles: new Set(),\n snapshotGeneration: 0,\n snapshotProgress: undefined,\n descriptorTable: new Map(),\n _skipRecord: false,\n frameIdx: 0,\n bootstrap: true,\n recordedCaps: undefined,\n valid: true,\n capturedDevice: undefined,\n };\n\n const lifecycle = createRecorderLifecycle(s);\n const {\n arm,\n onFrameEnd,\n getTape,\n getState,\n getEvents,\n getBlobPool,\n transitionToError,\n disposeError,\n snapshotResource,\n snapshotAllLiveResources,\n } = lifecycle;\n\n const debugInst: DebugRhiInstance = {\n arm,\n onFrameEnd,\n getTape,\n getState,\n getEvents,\n getBlobPool,\n transitionToError,\n disposeError,\n snapshotResource,\n snapshotAllLiveResources,\n pushExternalEvent(event: RhiCallEvent): void {\n pushEvent(s, event);\n },\n registerShaderModule(handle: ShaderModule, handleId: HandleId): void {\n s.handleMap.set(handle as object, handleId);\n },\n pushExternalCreateEvent(handle: object, kind: string, event: RhiCallEvent): HandleId {\n const hId = registerHandle(s, handle, kind, event);\n pushEvent(s, event);\n return hId;\n },\n resetForDeviceLoss(): void {\n // A lost GPU device invalidates every opaque handle and every descriptor\n // entry. Keep the recorder usable for the renderer's subsequent rebuild:\n // resource and shader creation calls during recovery repopulate these\n // registries against the fresh device before the next capture arms.\n s.state = RecorderState.Idle;\n s.requestedFrames = 0;\n s.recordedFrames = 0;\n s.events = [];\n s.blobPool = new Map();\n s.handleMap = new WeakMap();\n s.textureViewHandleMap = new WeakMap();\n s.bootstrapCreates = new Map();\n s.descriptorTable = new Map();\n s.snapshotSeededHandles = new Set();\n s.snapshotProgress = undefined;\n s.frameIdx = 0;\n s.bootstrap = true;\n s.recordedCaps = undefined;\n s.valid = true;\n s.capturedDevice = undefined;\n },\n valid(): boolean {\n return s.valid;\n },\n bootstrapCreatesSize(): number {\n return s.bootstrapCreates.size;\n },\n bootstrapEvents(): readonly RhiCallEvent[] {\n return Array.from(s.bootstrapCreates.values());\n },\n descriptorTable() {\n return s.descriptorTable;\n },\n\n async requestAdapter(\n opts?: RequestAdapterOptions | undefined,\n compatibleSurface?: HTMLCanvasElement | OffscreenCanvas | undefined,\n ) {\n const res = await instance.requestAdapter(opts, compatibleSurface);\n if (!res.ok) return res;\n\n const realAdapter = res.value;\n const proxyAdapter: RhiAdapter = {\n features: realAdapter.features,\n limits: realAdapter.limits,\n async requestDevice(devOpts?: RequestDeviceOptions | undefined) {\n const devRes = await realAdapter.requestDevice(devOpts);\n if (!devRes.ok) return devRes;\n // Keep the proxied device available for recorder-owned readback.\n const proxied = createDeviceProxy(s, devRes.value);\n s.capturedDevice = proxied;\n s.recordedCaps = {\n // RhiDevice does not own a canvas, so retain the existing tape\n // default for this informational field while deriving every\n // device-backed capability from the captured device.\n canvasFormat: 'bgra8unorm' as GPUTextureFormat,\n rgba16floatRenderable: proxied.caps.rgba16floatRenderable,\n float32Filterable: proxied.caps.float32Filterable,\n textureCompressionBc: proxied.caps.textureCompressionBc,\n textureCompressionEtc2: proxied.caps.textureCompressionEtc2,\n textureCompressionAstc: proxied.caps.textureCompressionAstc,\n storageBuffer: proxied.caps.storageBuffer,\n timestampQuery: proxied.caps.timestampQuery,\n };\n return makeOk(proxied) as Result<RhiDevice, import('@forgeax/engine-rhi').RhiError>;\n },\n };\n return makeOk(proxyAdapter) as Result<RhiAdapter, import('@forgeax/engine-rhi').RhiError>;\n },\n };\n\n return debugInst;\n}\n","import type { RhiCanvasContext, RhiDevice, RhiError, RhiInstance } from '@forgeax/engine-rhi';\nimport { err, ok, type Result } from '@forgeax/engine-types';\nimport { createRhiDebugError, type RhiDebugError } from '../errors';\nimport {\n type CreateShaderModuleFn,\n type DebugRhiInstance,\n wrap,\n wrapCreateShaderModule,\n} from '../recorder';\n\nexport interface RecordableBackend {\n readonly rhi: RhiInstance & {\n readonly acquireCanvasContext?: (\n canvas: HTMLCanvasElement | OffscreenCanvas,\n ) => Result<RhiCanvasContext, RhiError>;\n };\n readonly createShaderModule: CreateShaderModuleFn;\n}\n\nexport interface RecorderBackend extends RecordableBackend {\n readonly unwrapDeviceForSurface: (device: RhiDevice) => Result<RhiDevice, RhiDebugError>;\n}\n\nexport interface RecorderProxy {\n readonly backend: RecorderBackend;\n readonly recorder: DebugRhiInstance;\n}\n\nexport function createRecorderProxy(backend: RecordableBackend): RecorderProxy {\n const recorder = wrap(backend.rhi);\n const wrappedCreateShaderModule = wrapCreateShaderModule(backend.createShaderModule, recorder);\n const acquireCanvasContext = backend.rhi.acquireCanvasContext;\n // Runtime's explicit-RHI seam receives the wrapped singleton as one value.\n // Keep the standalone shader factory enumerable on that value so the\n // renderer can preserve the complete typed backend pack after capture\n // attachment; the public RhiInstance contract remains unchanged.\n const rhi: RecordableBackend['rhi'] & { readonly createShaderModule: CreateShaderModuleFn } = {\n requestAdapter: recorder.requestAdapter.bind(recorder),\n createShaderModule: wrappedCreateShaderModule,\n ...(acquireCanvasContext === undefined\n ? {}\n : { acquireCanvasContext: acquireCanvasContext.bind(backend.rhi) }),\n };\n const wrappedBackend: RecorderBackend = {\n rhi,\n createShaderModule: wrappedCreateShaderModule,\n unwrapDeviceForSurface(device) {\n const raw = (device as RhiDevice & { readonly _realDevice?: RhiDevice })._realDevice;\n if (raw !== undefined) return ok(raw);\n return err(\n createRhiDebugError('capture-unavailable', {\n stage: 'capture',\n cause: 'the recorder backend does not expose a surface device resolver',\n }),\n );\n },\n };\n return { backend: wrappedBackend, recorder };\n}\n","import type { DebugRhiInstance } from '../recorder';\nimport type { HandleId } from '../types';\n\nexport interface ResourceCandidate {\n readonly handleId: HandleId;\n readonly kind: 'buffer' | 'texture';\n readonly estimatedBytes: number;\n}\n\nexport class ResourceRegistry {\n constructor(private readonly recorder: DebugRhiInstance) {}\n\n candidates(): readonly ResourceCandidate[] {\n return Array.from(this.recorder.descriptorTable(), ([handleId, descriptor]) => ({\n handleId,\n kind: descriptor.kind,\n estimatedBytes: estimateBytes(descriptor),\n }));\n }\n\n estimateSnapshotBytes(): number {\n return this.candidates().reduce((total, candidate) => total + candidate.estimatedBytes, 0);\n }\n\n clearGeneration(): void {\n this.recorder.transitionToError();\n this.recorder.resetForDeviceLoss();\n }\n}\n\nfunction estimateBytes(descriptor: {\n readonly kind: 'buffer' | 'texture';\n readonly size?: number | GPUExtent3DStrict;\n}): number {\n if (descriptor.kind === 'buffer') {\n return typeof descriptor.size === 'number' ? descriptor.size : 0;\n }\n if (descriptor.size === undefined || typeof descriptor.size === 'number') return 4;\n if (Array.isArray(descriptor.size)) {\n return Math.max(\n 1,\n (descriptor.size[0] ?? 1) * (descriptor.size[1] ?? 1) * (descriptor.size[2] ?? 1) * 4,\n );\n }\n if (!('width' in descriptor.size)) return 4;\n return Math.max(\n 1,\n descriptor.size.width *\n (descriptor.size.height ?? 1) *\n (descriptor.size.depthOrArrayLayers ?? 1) *\n 4,\n );\n}\n","import { err, ok, type Result } from '@forgeax/engine-types';\nimport { createRhiDebugError, type RhiDebugError } from '../errors';\nimport type { DebugRhiInstance } from '../recorder';\nimport type { ResourceRegistry } from './resource-registry';\n\nexport interface SnapshotOptions {\n readonly snapshotTimeoutMs: number;\n readonly byteBudget: number;\n}\n\nexport async function snapshotFrame(\n recorder: DebugRhiInstance,\n registry: ResourceRegistry,\n options: SnapshotOptions,\n): Promise<Result<void, RhiDebugError>> {\n const estimatedBytes = registry.estimateSnapshotBytes();\n const requiredBytes = Math.max(1, estimatedBytes);\n if (requiredBytes > options.byteBudget) {\n return err(\n createRhiDebugError('capture-snapshot-failed', {\n stage: 'snapshot',\n cause: `snapshot byte budget ${options.byteBudget} is smaller than the ${requiredBytes}-byte capture minimum`,\n }),\n );\n }\n try {\n const result = await recorder.snapshotAllLiveResources(options.snapshotTimeoutMs);\n if (result.ok) return ok(undefined);\n return err(result.error);\n } catch (cause) {\n return err(\n createRhiDebugError('capture-snapshot-failed', {\n stage: 'snapshot',\n cause: String(cause),\n }),\n );\n }\n}\n","import { err, ok, type Result } from '@forgeax/engine-types';\nimport { createRhiDebugError, type RhiDebugError } from '../errors';\nimport { assembleTape, type EncodedTape } from './assemble';\nimport { createRecorderProxy, type RecordableBackend, type RecorderBackend } from './proxy';\nimport { ResourceRegistry } from './resource-registry';\nimport { snapshotFrame } from './snapshot';\n\nexport interface CaptureFrameOptions {\n readonly snapshotTimeoutMs?: number;\n readonly byteBudget?: number;\n readonly signal?: AbortSignal;\n}\n\nexport interface RecorderOptions {\n readonly snapshotTimeoutMs?: number;\n readonly byteBudget?: number;\n}\n\nexport interface RecorderAttachment {\n readonly backend: RecorderBackend;\n captureFrame(options?: CaptureFrameOptions): Promise<Result<EncodedTape, RhiDebugError>>;\n frameBoundary(): Promise<Result<void, RhiDebugError>>;\n deviceLost(): void;\n dispose(): Promise<Result<void, RhiDebugError>>;\n}\n\ntype Phase = 'idle' | 'armed' | 'snapshotting' | 'recording' | 'disposed';\n\nexport function attachRecorder(\n backend: RecordableBackend,\n options: RecorderOptions = {},\n): Result<RecorderAttachment, RhiDebugError> {\n const proxy = createRecorderProxy(backend);\n const registry = new ResourceRegistry(proxy.recorder);\n let phase: Phase = 'idle';\n let generation = 0;\n let active:\n | {\n readonly generation: number;\n readonly options: CaptureFrameOptions;\n readonly resolve: (result: Result<EncodedTape, RhiDebugError>) => void;\n readonly signal?: AbortSignal;\n abortListener?: () => void;\n }\n | undefined;\n\n const fail = <T>(\n code: 'capture-unavailable' | 'capture-busy',\n cause: string,\n ): Result<T, RhiDebugError> => err(createRhiDebugError(code, { stage: 'capture', cause }));\n\n const settle = (result: Result<EncodedTape, RhiDebugError>): void => {\n const request = active;\n if (request === undefined) return;\n active = undefined;\n request.signal?.removeEventListener('abort', request.abortListener ?? (() => {}));\n if (!result.ok && proxy.recorder.getState() === 'error') proxy.recorder.disposeError();\n phase = phase === 'disposed' ? 'disposed' : 'idle';\n request.resolve(result);\n };\n\n const abort = (): void => {\n if (active === undefined) return;\n proxy.recorder.transitionToError();\n settle(fail('capture-unavailable', 'capture request was aborted'));\n };\n\n const attachment: RecorderAttachment = {\n backend: proxy.backend,\n captureFrame(captureOptions = {}) {\n if (phase === 'disposed')\n return Promise.resolve(fail('capture-unavailable', 'recorder is disposed'));\n if (active !== undefined)\n return Promise.resolve(fail('capture-busy', 'another capture is active'));\n const signal = captureOptions.signal;\n if (signal?.aborted)\n return Promise.resolve(fail('capture-unavailable', 'capture request was aborted'));\n const arm = proxy.recorder.arm(1);\n if (!arm.ok) return Promise.resolve(fail('capture-busy', arm.error.hint));\n phase = 'armed';\n generation += 1;\n return new Promise<Result<EncodedTape, RhiDebugError>>((resolve) => {\n const request = {\n generation,\n options: captureOptions,\n resolve,\n ...(signal === undefined ? {} : { signal }),\n } as {\n readonly generation: number;\n readonly options: CaptureFrameOptions;\n readonly resolve: (result: Result<EncodedTape, RhiDebugError>) => void;\n readonly signal?: AbortSignal;\n abortListener?: () => void;\n };\n request.abortListener = abort;\n active = request;\n signal?.addEventListener('abort', abort, { once: true });\n });\n },\n async frameBoundary() {\n if (phase === 'disposed' || active === undefined) return ok(undefined);\n const request = active;\n if (request.generation !== generation) return ok(undefined);\n if (phase === 'armed') {\n phase = 'snapshotting';\n const result = await snapshotFrame(proxy.recorder, registry, {\n snapshotTimeoutMs:\n request.options.snapshotTimeoutMs ?? options.snapshotTimeoutMs ?? 30_000,\n byteBudget: request.options.byteBudget ?? options.byteBudget ?? Number.MAX_SAFE_INTEGER,\n });\n if (!result.ok) {\n proxy.recorder.transitionToError();\n settle(err(result.error));\n return err(result.error);\n }\n phase = 'recording';\n return ok(undefined);\n }\n if (phase !== 'recording') return ok(undefined);\n proxy.recorder.onFrameEnd();\n if (proxy.recorder.getState() !== 'idle') return ok(undefined);\n const result = assembleTape(proxy.recorder);\n settle(result);\n return result.ok ? ok(undefined) : err(result.error);\n },\n deviceLost() {\n generation += 1;\n registry.clearGeneration();\n if (active !== undefined) {\n phase = 'idle';\n settle(fail('capture-unavailable', 'device loss invalidated the active generation'));\n } else if (phase !== 'disposed') {\n phase = 'idle';\n }\n },\n async dispose() {\n if (phase === 'disposed') return ok(undefined);\n if (active !== undefined) {\n proxy.recorder.transitionToError();\n settle(fail('capture-unavailable', 'recorder was disposed during capture'));\n }\n proxy.recorder.disposeError();\n phase = 'disposed';\n return ok(undefined);\n },\n };\n return ok(attachment);\n}\n\nexport type { CreateShaderModuleFn } from '../recorder';\nexport type { EncodedTape } from './assemble';\nexport type { RecordableBackend, RecorderBackend } from './proxy';\n","// @forgeax/engine-rhi-debug/src/replay/execute-support -- replay event helpers.\n\nimport type {\n Buffer,\n RhiCommandEncoder,\n RhiComputePassEncoder,\n RhiRenderPassEncoder,\n} from '@forgeax/engine-rhi';\nimport { err, ok, type Result } from '@forgeax/engine-types';\nimport { createRhiDebugError, type RhiDebugError } from '../errors';\nimport type { RhiCallEvent, Tape } from '../protocol/types';\nimport type { ReplayExecutionContext } from './execute';\nimport type { ReplayResource } from './resources';\n\ntype ReplayPass = RhiRenderPassEncoder & RhiComputePassEncoder;\n\nexport function eventRecord(event: RhiCallEvent): Record<string, unknown> {\n return JSON.parse(JSON.stringify(event));\n}\n\nexport function eventFailure(\n eventIndex: number,\n event: RhiCallEvent,\n stage: 'lookup' | 'create' | 'write' | 'encode' | 'finish' | 'submit',\n cause: unknown,\n): Result<never, RhiDebugError> {\n return err(\n createRhiDebugError('replay-event-failed', {\n eventIndex,\n kind: event.kind,\n stage,\n cause: cause instanceof Error ? cause.message : String(cause),\n }),\n );\n}\n\nexport function blob(\n tape: Tape,\n hash: string,\n event: RhiCallEvent,\n eventIndex: number,\n): Result<Uint8Array, RhiDebugError> {\n const found = tape.blobs.find((candidate) => candidate.hash === hash);\n return found === undefined\n ? eventFailure(eventIndex, event, 'lookup', `blob ${hash} is missing`)\n : ok(found.bytes);\n}\n\nexport function clearBuffer(\n context: ReplayExecutionContext,\n event: Extract<RhiCallEvent, { kind: 'clearBuffer' }>,\n eventIndex: number,\n): Result<void, RhiDebugError> {\n const encoder = requireResource<RhiCommandEncoder>(\n context,\n event.cmdHandleId,\n 'encoder',\n eventIndex,\n event.kind,\n 'command',\n );\n const buffer = requireResource<Buffer>(context, event.handleId, 'buffer', eventIndex, event.kind);\n if (!encoder.ok) return encoder;\n if (!buffer.ok) return buffer;\n encoder.value.clearBuffer(buffer.value, event.offset, event.size);\n return ok(undefined);\n}\n\nexport function commandEncoderCall(\n context: ReplayExecutionContext,\n event: Extract<RhiCallEvent, { kind: 'pushDebugGroup' | 'popDebugGroup' | 'insertDebugMarker' }>,\n eventIndex: number,\n call: (encoder: RhiCommandEncoder) => void,\n): Result<void, RhiDebugError> {\n const encoder = requireResource<RhiCommandEncoder>(\n context,\n event.cmdHandleId,\n 'encoder',\n eventIndex,\n event.kind,\n 'command',\n );\n if (!encoder.ok) return encoder;\n call(encoder.value);\n return ok(undefined);\n}\n\nexport function finish(\n context: ReplayExecutionContext,\n event: Extract<RhiCallEvent, { kind: 'finish' }>,\n eventIndex: number,\n): Result<void, RhiDebugError> {\n const encoder = requireResource<RhiCommandEncoder>(\n context,\n event.cmdHandleId,\n 'encoder',\n eventIndex,\n event.kind,\n 'command',\n );\n if (!encoder.ok) return encoder;\n const result = encoder.value.finish();\n if (!result.ok) return eventFailure(eventIndex, event, 'finish', result.error);\n return context.table.set(\n event.cmdHandleId,\n { kind: 'encoder', role: 'command-buffer', value: result.value },\n eventRecord(event),\n );\n}\n\nexport function endPass(\n context: ReplayExecutionContext,\n event: Extract<RhiCallEvent, { kind: 'endRenderPass' | 'endComputePass' }>,\n eventIndex: number,\n role: 'render-pass' | 'compute-pass',\n): Result<void, RhiDebugError> {\n const pass = requireResource<RhiRenderPassEncoder | RhiComputePassEncoder>(\n context,\n event.passHandleId,\n 'encoder',\n eventIndex,\n event.kind,\n role,\n );\n if (!pass.ok) return pass;\n pass.value.end();\n context.table.delete(event.passHandleId);\n return ok(undefined);\n}\n\nexport function seedInitialData(\n context: ReplayExecutionContext,\n event: Extract<RhiCallEvent, { kind: 'initialData' }>,\n eventIndex: number,\n): Result<void, RhiDebugError> {\n const entry = context.table.get(event.handleId);\n const bytes = blob(context.tape, event.dataHash, event, eventIndex);\n if (!bytes.ok) return bytes;\n if (entry?.resource.kind === 'buffer') {\n const result = context.queue.writeBuffer(entry.resource.value, 0, bytes.value);\n return result.ok ? ok(undefined) : eventFailure(eventIndex, event, 'write', result.error);\n }\n return eventFailure(\n eventIndex,\n event,\n 'lookup',\n 'initialData currently requires a buffer resource',\n );\n}\n\nexport function requireResource<T>(\n context: ReplayExecutionContext,\n resourceId: string,\n kind: ReplayResource['kind'] | string,\n eventIndex: number,\n eventKind: RhiCallEvent['kind'],\n role?: string,\n): Result<T, RhiDebugError> {\n const entry = context.table.get(resourceId);\n if (\n entry === undefined ||\n entry.resource.kind !== kind ||\n (role !== undefined && entry.resource.role !== role)\n ) {\n return missingResource(\n eventIndex,\n { kind: eventKind } as RhiCallEvent,\n resourceId,\n `${kind}${role === undefined ? '' : `/${role}`}`,\n );\n }\n return ok(entry.resource.value as T);\n}\n\nexport function requireReplayResource(\n context: ReplayExecutionContext,\n resourceId: string,\n kind: ReplayResource['kind'] | string,\n eventIndex: number,\n eventKind: RhiCallEvent['kind'],\n role?: string,\n): Result<ReplayResource, RhiDebugError> {\n const entry = context.table.get(resourceId);\n if (\n entry === undefined ||\n entry.resource.kind !== kind ||\n (role !== undefined && entry.resource.role !== role)\n ) {\n return missingResource(\n eventIndex,\n { kind: eventKind } as RhiCallEvent,\n resourceId,\n `${kind}${role === undefined ? '' : `/${role}`}`,\n );\n }\n return ok(entry.resource);\n}\n\nexport function passCall(\n context: ReplayExecutionContext,\n event: RhiCallEvent,\n eventIndex: number,\n role: 'render-pass' | 'compute-pass' | 'pass',\n call: (pass: ReplayPass) => Result<void, RhiDebugError>,\n): Result<void, RhiDebugError> {\n const passId = 'passHandleId' in event ? event.passHandleId : undefined;\n if (passId === undefined)\n return eventFailure(eventIndex, event, 'lookup', 'pass handle is missing');\n const entry = context.table.get(passId);\n const valid =\n entry?.resource.kind === 'encoder' && (role === 'pass' || entry.resource.role === role);\n if (!valid || entry === undefined || entry.resource.kind !== 'encoder') {\n return missingResource(eventIndex, event, passId, role);\n }\n return call(entry.resource.value as ReplayPass);\n}\n\nexport function pipelineError<T>(\n result: Result<T, RhiDebugError>,\n event: RhiCallEvent,\n eventIndex: number,\n): Result<never, RhiDebugError> {\n return result.ok\n ? eventFailure(eventIndex, event, 'lookup', 'resource has the wrong role')\n : result;\n}\n\nexport function missingResource(\n eventIndex: number,\n event: RhiCallEvent,\n resourceId: string,\n expected: string,\n): Result<never, RhiDebugError> {\n return eventFailure(eventIndex, event, 'lookup', `resource ${resourceId} is not a ${expected}`);\n}\n\nexport function unsupportedEvent(\n eventIndex: number,\n event: RhiCallEvent,\n cause: string,\n): Result<never, RhiDebugError> {\n return eventFailure(eventIndex, event, 'lookup', cause);\n}\n","/// <reference types=\"@webgpu/types\" />\n\nexport interface TextureReadbackDescriptor {\n readonly format: string;\n readonly dimension: string;\n readonly aspect?: GPUTextureAspect | undefined;\n}\n\nexport type TextureReadbackPlan =\n | {\n readonly supported: true;\n readonly format: string;\n readonly bytesPerTexel: number;\n readonly blockWidth: 1;\n readonly blockHeight: 1;\n }\n | {\n readonly supported: false;\n readonly format: string;\n readonly reason: string;\n };\n\nconst BYTES_PER_TEXEL: Readonly<Record<string, number>> = {\n r8unorm: 1,\n rg8unorm: 2,\n rgba8unorm: 4,\n 'rgba8unorm-srgb': 4,\n bgra8unorm: 4,\n 'bgra8unorm-srgb': 4,\n r16float: 2,\n rg16float: 4,\n rgba16float: 8,\n r32float: 4,\n rg32float: 8,\n rgba32float: 16,\n rgb10a2unorm: 4,\n rg11b10ufloat: 4,\n};\n\nconst DEPTH_FORMATS = new Set([\n 'depth16unorm',\n 'depth24plus',\n 'depth24plus-stencil8',\n 'depth32float',\n 'depth32float-stencil8',\n]);\n\nexport function isDepthTextureFormat(format: string): boolean {\n return DEPTH_FORMATS.has(format);\n}\n\nexport function isDepthStencilTextureFormat(format: string): boolean {\n return format.endsWith('-stencil8');\n}\n\nexport function getTextureReadbackPlan(descriptor: TextureReadbackDescriptor): TextureReadbackPlan {\n if (descriptor.dimension === '3d') {\n return {\n supported: false,\n format: descriptor.format,\n reason: '3D texture volume readback is outside the v7 core matrix',\n };\n }\n if (/^(bc|etc2|eac|astc)-/.test(descriptor.format)) {\n return {\n supported: false,\n format: descriptor.format,\n reason: 'compressed texture readback has no core decoder',\n };\n }\n if (DEPTH_FORMATS.has(descriptor.format)) {\n return {\n supported: true,\n format: descriptor.format,\n bytesPerTexel: 4,\n blockWidth: 1,\n blockHeight: 1,\n };\n }\n const bytesPerTexel = BYTES_PER_TEXEL[descriptor.format];\n if (bytesPerTexel === undefined) {\n return {\n supported: false,\n format: descriptor.format,\n reason: 'texture format is not in the v7 readback matrix',\n };\n }\n return {\n supported: true,\n format: descriptor.format,\n bytesPerTexel,\n blockWidth: 1,\n blockHeight: 1,\n };\n}\n\nexport function textureBytesPerTexel(format: string): number | undefined {\n return BYTES_PER_TEXEL[format] ?? (DEPTH_FORMATS.has(format) ? 4 : undefined);\n}\n","import type {\n BindGroupDescriptor,\n Buffer,\n CommandBuffer,\n PipelineLayout,\n RenderPassColorAttachment,\n RenderPassDepthStencilAttachment,\n RhiBindingResource,\n RhiCommandEncoder,\n RhiDevice,\n RhiError,\n RhiQueue,\n Texture,\n} from '@forgeax/engine-rhi';\nimport { ok, type Result } from '@forgeax/engine-types';\nimport type { RhiDebugError } from '../errors';\nimport type { RhiCallEvent, Tape } from '../protocol/types';\nimport {\n blob,\n clearBuffer,\n commandEncoderCall,\n endPass,\n eventFailure,\n eventRecord,\n finish,\n missingResource,\n passCall,\n pipelineError,\n requireReplayResource,\n requireResource,\n seedInitialData,\n unsupportedEvent,\n} from './execute-support';\nimport type { ReplayResource, ResourceTable } from './resources';\nimport { isDepthTextureFormat } from './texture-format';\n\nexport { eventFailure } from './execute-support';\n\nexport interface ReplayExecutionContext {\n readonly device: RhiDevice;\n readonly queue: RhiQueue;\n readonly tape: Tape;\n readonly table: ResourceTable;\n readonly createShaderModule: (\n device: RhiDevice,\n desc: { readonly code: string; readonly label?: string | undefined },\n ) => Promise<Result<import('@forgeax/engine-rhi').ShaderModule, RhiError>>;\n}\n\nexport async function executeEvent(\n context: ReplayExecutionContext,\n event: RhiCallEvent,\n eventIndex: number,\n): Promise<Result<void, RhiDebugError>> {\n try {\n switch (event.kind) {\n case 'frameMark':\n return ok(undefined);\n case 'createBuffer':\n return createResource(context, eventIndex, event, context.device.createBuffer(event.desc), {\n kind: 'buffer',\n });\n case 'createTexture':\n return createResource(\n context,\n eventIndex,\n event,\n context.device.createTexture(replayTextureDescriptor(event.desc) as never),\n {\n kind: 'texture',\n },\n );\n case 'destroyBuffer':\n return destroyResource(context, eventIndex, event, 'buffer');\n case 'destroyTexture':\n return destroyResource(context, eventIndex, event, 'texture');\n case 'createTextureView': {\n const texture = requireResource<Texture>(\n context,\n event.sourceHandleId,\n 'texture',\n eventIndex,\n event.kind,\n );\n if (!texture.ok) return texture;\n return createResource(\n context,\n eventIndex,\n event,\n context.device.createTextureView(texture.value, event.desc),\n { kind: 'texture-view' },\n event.resultHandleId,\n );\n }\n case 'createSampler':\n return createResource(\n context,\n eventIndex,\n event,\n context.device.createSampler(event.desc),\n {\n kind: 'sampler',\n },\n );\n case 'createBindGroupLayout':\n return createResource(\n context,\n eventIndex,\n event,\n context.device.createBindGroupLayout(event.desc as never),\n { kind: 'binding', role: 'bind-group-layout' },\n );\n case 'createBindGroup':\n return createBindGroup(context, event, eventIndex);\n case 'createPipelineLayout':\n return createPipelineLayout(context, event, eventIndex);\n case 'createRenderPipeline':\n return createRenderPipeline(context, event, eventIndex);\n case 'createComputePipeline':\n return createComputePipeline(context, event, eventIndex);\n case 'createShaderModule':\n return createShaderModule(context, event, eventIndex);\n case 'createCommandEncoder':\n return createResource(\n context,\n eventIndex,\n event,\n context.device.createCommandEncoder(event.desc),\n { kind: 'encoder', role: 'command' },\n event.cmdHandleId,\n );\n case 'writeBuffer':\n return writeBuffer(context, event, eventIndex);\n case 'writeTexture':\n return writeTexture(context, event, eventIndex);\n case 'copyExternalImageToTexture':\n return unsupportedEvent(eventIndex, event, 'external image sources are not self-contained');\n case 'submit':\n return submit(context, event, eventIndex);\n case 'beginRenderPass':\n return beginRenderPass(context, event, eventIndex);\n case 'beginComputePass':\n return beginComputePass(context, event, eventIndex);\n case 'copyBufferToBuffer':\n return copyBufferToBuffer(context, event, eventIndex);\n case 'copyBufferToTexture':\n return copyBufferToTexture(context, event, eventIndex);\n case 'copyTextureToBuffer':\n return copyTextureToBuffer(context, event, eventIndex);\n case 'copyTextureToTexture':\n return copyTextureToTexture(context, event, eventIndex);\n case 'clearBuffer':\n return clearBuffer(context, event, eventIndex);\n case 'pushDebugGroup':\n return commandEncoderCall(context, event, eventIndex, (encoder) =>\n encoder.pushDebugGroup(event.groupLabel),\n );\n case 'popDebugGroup':\n return commandEncoderCall(context, event, eventIndex, (encoder) => encoder.popDebugGroup());\n case 'insertDebugMarker':\n return commandEncoderCall(context, event, eventIndex, (encoder) =>\n encoder.insertDebugMarker(event.markerLabel),\n );\n case 'finish':\n return finish(context, event, eventIndex);\n case 'setPipeline':\n return passCall(context, event, eventIndex, 'render-pass', (pass) => {\n const pipeline = requireReplayResource(\n context,\n event.pipelineHandleId,\n 'pipeline',\n eventIndex,\n event.kind,\n );\n if (!pipeline.ok || pipeline.value.role !== 'render')\n return pipelineError(pipeline, event, eventIndex);\n pass.setPipeline(pipeline.value.value as never);\n return ok(undefined);\n });\n case 'setVertexBuffer':\n return passCall(context, event, eventIndex, 'render-pass', (pass) => {\n const buffer = requireResource<Buffer>(\n context,\n event.bufferHandleId,\n 'buffer',\n eventIndex,\n event.kind,\n );\n if (!buffer.ok) return buffer;\n pass.setVertexBuffer(event.slot, buffer.value, event.offset, event.size);\n return ok(undefined);\n });\n case 'setIndexBuffer':\n return passCall(context, event, eventIndex, 'render-pass', (pass) => {\n const buffer = requireResource<Buffer>(\n context,\n event.bufferHandleId,\n 'buffer',\n eventIndex,\n event.kind,\n );\n if (!buffer.ok) return buffer;\n pass.setIndexBuffer(buffer.value, event.format, event.offset, event.size);\n return ok(undefined);\n });\n case 'setBindGroup':\n return passCall(context, event, eventIndex, 'pass', (pass) => {\n const bindGroup = requireReplayResource(\n context,\n event.bindGroupHandleId,\n 'binding',\n eventIndex,\n event.kind,\n );\n if (!bindGroup.ok || bindGroup.value.role !== 'bind-group')\n return pipelineError(bindGroup, event, eventIndex);\n pass.setBindGroup(event.index, bindGroup.value.value as never, event.dynamicOffsets);\n return ok(undefined);\n });\n case 'draw':\n return passCall(context, event, eventIndex, 'render-pass', (pass) => {\n pass.draw(event.vertexCount, event.instanceCount, event.firstVertex, event.firstInstance);\n return ok(undefined);\n });\n case 'drawIndexed':\n return passCall(context, event, eventIndex, 'render-pass', (pass) => {\n pass.drawIndexed(\n event.indexCount,\n event.instanceCount,\n event.firstIndex,\n event.baseVertex,\n event.firstInstance,\n );\n return ok(undefined);\n });\n case 'setViewport':\n return passCall(context, event, eventIndex, 'render-pass', (pass) => {\n pass.setViewport(event.x, event.y, event.w, event.h, event.minDepth, event.maxDepth);\n return ok(undefined);\n });\n case 'setScissorRect':\n return passCall(context, event, eventIndex, 'render-pass', (pass) => {\n pass.setScissorRect(event.x, event.y, event.w, event.h);\n return ok(undefined);\n });\n case 'setStencilReference':\n return passCall(context, event, eventIndex, 'render-pass', (pass) => {\n pass.setStencilReference(event.reference);\n return ok(undefined);\n });\n case 'endRenderPass':\n return endPass(context, event, eventIndex, 'render-pass');\n case 'setBlendConstant':\n return passCall(context, event, eventIndex, 'render-pass', (pass) => {\n pass.setBlendConstant(event.color);\n return ok(undefined);\n });\n case 'drawIndirect':\n return passCall(context, event, eventIndex, 'render-pass', (pass) => {\n const buffer = requireResource<Buffer>(\n context,\n event.indirectBufferHandleId,\n 'buffer',\n eventIndex,\n event.kind,\n );\n if (!buffer.ok) return buffer;\n pass.drawIndirect(buffer.value, event.indirectOffset);\n return ok(undefined);\n });\n case 'drawIndexedIndirect':\n return passCall(context, event, eventIndex, 'render-pass', (pass) => {\n const buffer = requireResource<Buffer>(\n context,\n event.indirectBufferHandleId,\n 'buffer',\n eventIndex,\n event.kind,\n );\n if (!buffer.ok) return buffer;\n pass.drawIndexedIndirect(buffer.value, event.indirectOffset);\n return ok(undefined);\n });\n case 'passPushDebugGroup':\n return passCall(context, event, eventIndex, 'pass', (pass) => {\n pass.pushDebugGroup(event.groupLabel);\n return ok(undefined);\n });\n case 'passPopDebugGroup':\n return passCall(context, event, eventIndex, 'pass', (pass) => {\n pass.popDebugGroup();\n return ok(undefined);\n });\n case 'passInsertDebugMarker':\n return passCall(context, event, eventIndex, 'pass', (pass) => {\n pass.insertDebugMarker(event.markerLabel);\n return ok(undefined);\n });\n case 'setComputePipeline':\n return passCall(context, event, eventIndex, 'compute-pass', (pass) => {\n const pipeline = requireReplayResource(\n context,\n event.pipelineHandleId,\n 'pipeline',\n eventIndex,\n event.kind,\n );\n if (!pipeline.ok || pipeline.value.role !== 'compute')\n return pipelineError(pipeline, event, eventIndex);\n pass.setPipeline(pipeline.value.value as never);\n return ok(undefined);\n });\n case 'dispatchWorkgroups':\n return passCall(context, event, eventIndex, 'compute-pass', (pass) => {\n pass.dispatchWorkgroups(event.x, event.y, event.z);\n return ok(undefined);\n });\n case 'dispatchWorkgroupsIndirect':\n return passCall(context, event, eventIndex, 'compute-pass', (pass) => {\n const buffer = requireResource<Buffer>(\n context,\n event.indirectBufferHandleId,\n 'buffer',\n eventIndex,\n event.kind,\n );\n if (!buffer.ok) return buffer;\n pass.dispatchWorkgroupsIndirect(buffer.value, event.indirectOffset);\n return ok(undefined);\n });\n case 'endComputePass':\n return endPass(context, event, eventIndex, 'compute-pass');\n case 'initialData':\n return seedInitialData(context, event, eventIndex);\n default:\n return unsupportedEvent(eventIndex, event, 'event kind has no replay executor');\n }\n } catch (cause) {\n return eventFailure(eventIndex, event, 'encode', cause);\n }\n}\n\nfunction replayTextureDescriptor(\n descriptor: Extract<RhiCallEvent, { kind: 'createTexture' }>['desc'],\n): Extract<RhiCallEvent, { kind: 'createTexture' }>['desc'] {\n if (!isDepthTextureFormat(descriptor.format)) return descriptor;\n return {\n ...descriptor,\n // depth24plus* readback uses a package-owned depth-to-color blit and thus\n // needs the source texture to be bindable on a fresh replay device.\n usage: (descriptor.usage ?? 0) | 0x04,\n };\n}\n\nfunction createResource<T extends ReplayResource>(\n context: ReplayExecutionContext,\n eventIndex: number,\n event: RhiCallEvent,\n result: Result<T['value'], RhiError>,\n shape: Pick<ReplayResource, 'kind'> & { readonly role?: string },\n resourceId?: string,\n): Result<void, RhiDebugError> {\n if (!result.ok) return eventFailure(eventIndex, event, 'create', result.error);\n const id = resourceId ?? ('handleId' in event ? event.handleId : undefined);\n if (id === undefined)\n return eventFailure(eventIndex, event, 'lookup', 'created resource has no handle id');\n const stored = context.table.set(id, { ...shape, value: result.value } as T, eventRecord(event));\n return stored.ok ? ok(undefined) : stored;\n}\n\nfunction destroyResource(\n context: ReplayExecutionContext,\n eventIndex: number,\n event: Extract<RhiCallEvent, { kind: 'destroyBuffer' | 'destroyTexture' }>,\n kind: 'buffer' | 'texture',\n): Result<void, RhiDebugError> {\n const entry = context.table.get(event.handleId);\n if (entry === undefined || entry.resource.kind !== kind)\n return missingResource(eventIndex, event, event.handleId, kind);\n const result =\n kind === 'buffer'\n ? context.device.destroyBuffer(entry.resource.value as Buffer)\n : context.device.destroyTexture(entry.resource.value as Texture);\n if (!result.ok) return eventFailure(eventIndex, event, 'create', result.error);\n context.table.delete(event.handleId);\n return ok(undefined);\n}\n\nasync function createShaderModule(\n context: ReplayExecutionContext,\n event: Extract<RhiCallEvent, { kind: 'createShaderModule' }>,\n eventIndex: number,\n): Promise<Result<void, RhiDebugError>> {\n const result = await context.createShaderModule(context.device, { code: event.wgslCode });\n return createResource(context, eventIndex, event, result, { kind: 'shader-module' });\n}\n\nfunction createBindGroup(\n context: ReplayExecutionContext,\n event: Extract<RhiCallEvent, { kind: 'createBindGroup' }>,\n eventIndex: number,\n): Result<void, RhiDebugError> {\n const layout = requireReplayResource(\n context,\n event.layoutHandleId,\n 'binding',\n eventIndex,\n event.kind,\n );\n if (!layout.ok || layout.value.role !== 'bind-group-layout')\n return pipelineError(layout, event, eventIndex);\n const resources: RhiBindingResource[] = [];\n for (const [index, entry] of event.entries.entries()) {\n const resourceId = event.resourceHandleIds[index];\n if (resourceId === undefined)\n return eventFailure(eventIndex, event, 'lookup', 'bind group resource handle is missing');\n const resolved = context.table.get(resourceId);\n if (resolved === undefined)\n return missingResource(eventIndex, event, resourceId, entry.resourceKind);\n if (entry.resourceKind === 'buffer' && resolved.resource.kind === 'buffer') {\n resources.push({\n kind: 'buffer',\n value: {\n buffer: resolved.resource.value,\n ...(entry.bufferOffset === undefined ? {} : { offset: entry.bufferOffset }),\n ...(entry.bufferSize === undefined ? {} : { size: entry.bufferSize }),\n },\n });\n } else if (entry.resourceKind === 'sampler' && resolved.resource.kind === 'sampler') {\n resources.push({ kind: 'sampler', value: resolved.resource.value });\n } else if (entry.resourceKind === 'textureView' && resolved.resource.kind === 'texture-view') {\n resources.push({ kind: 'textureView', value: resolved.resource.value });\n } else {\n return missingResource(eventIndex, event, resourceId, entry.resourceKind);\n }\n }\n const descriptor: BindGroupDescriptor = {\n layout: layout.value.value as never,\n entries: event.entries.map((entry, index) => ({\n binding: entry.binding,\n resource: resources[index] as RhiBindingResource,\n })),\n };\n return createResource(context, eventIndex, event, context.device.createBindGroup(descriptor), {\n kind: 'binding',\n role: 'bind-group',\n });\n}\n\nfunction createPipelineLayout(\n context: ReplayExecutionContext,\n event: Extract<RhiCallEvent, { kind: 'createPipelineLayout' }>,\n eventIndex: number,\n): Result<void, RhiDebugError> {\n const layouts: import('@forgeax/engine-rhi').BindGroupLayout[] = [];\n for (const id of event.bglHandleIds) {\n const layout = requireReplayResource(context, id, 'binding', eventIndex, event.kind);\n if (!layout.ok || layout.value.role !== 'bind-group-layout')\n return pipelineError(layout, event, eventIndex);\n layouts.push(layout.value.value as import('@forgeax/engine-rhi').BindGroupLayout);\n }\n return createResource(\n context,\n eventIndex,\n event,\n context.device.createPipelineLayout({ bindGroupLayouts: layouts }),\n { kind: 'binding', role: 'pipeline-layout' },\n );\n}\n\nfunction createRenderPipeline(\n context: ReplayExecutionContext,\n event: Extract<RhiCallEvent, { kind: 'createRenderPipeline' }>,\n eventIndex: number,\n): Result<void, RhiDebugError> {\n const layout = requireReplayResource(\n context,\n event.layoutHandleId,\n 'binding',\n eventIndex,\n event.kind,\n );\n if (!layout.ok || layout.value.role !== 'pipeline-layout')\n return pipelineError(layout, event, eventIndex);\n const vertex = event.desc.vertex;\n const fragment = event.desc.fragment;\n const vertexShader =\n vertex === undefined ? undefined : shaderValue(context, event.vertexShaderModuleHandleId);\n const fragmentShader =\n fragment === undefined ? undefined : shaderValue(context, event.fragmentShaderModuleHandleId);\n const descriptor = {\n ...event.desc,\n layout: layout.value.value as PipelineLayout,\n ...(vertex === undefined ? {} : { vertex: { ...vertex, module: vertexShader } }),\n ...(fragment === undefined\n ? {}\n : {\n fragment: {\n ...fragment,\n module: fragmentShader,\n },\n }),\n };\n if (\n (vertex !== undefined && vertexShader === undefined) ||\n (fragment !== undefined && fragmentShader === undefined)\n ) {\n return eventFailure(\n eventIndex,\n event,\n 'lookup',\n 'render pipeline shader module handle is missing',\n );\n }\n return createResource(\n context,\n eventIndex,\n event,\n context.device.createRenderPipeline(descriptor as never),\n {\n kind: 'pipeline',\n role: 'render',\n },\n );\n}\n\nfunction createComputePipeline(\n context: ReplayExecutionContext,\n event: Extract<RhiCallEvent, { kind: 'createComputePipeline' }>,\n eventIndex: number,\n): Result<void, RhiDebugError> {\n const layout = requireReplayResource(\n context,\n event.layoutHandleId,\n 'binding',\n eventIndex,\n event.kind,\n );\n if (!layout.ok || layout.value.role !== 'pipeline-layout')\n return pipelineError(layout, event, eventIndex);\n const shader = shaderValue(context, event.computeShaderModuleHandleId);\n if (shader === undefined)\n return eventFailure(\n eventIndex,\n event,\n 'lookup',\n 'compute pipeline shader module handle is missing',\n );\n return createResource(\n context,\n eventIndex,\n event,\n context.device.createComputePipeline({\n ...event.desc,\n layout: layout.value.value as PipelineLayout,\n compute: { ...event.desc.compute, module: shader },\n } as never),\n { kind: 'pipeline', role: 'compute' },\n );\n}\n\nfunction shaderValue(\n context: ReplayExecutionContext,\n id: string | undefined,\n): import('@forgeax/engine-rhi').ShaderModule | undefined {\n if (id === undefined) return undefined;\n const entry = context.table.get(id);\n if (entry?.resource.kind !== 'shader-module') return undefined;\n return entry.resource.value;\n}\n\nfunction writeBuffer(\n context: ReplayExecutionContext,\n event: Extract<RhiCallEvent, { kind: 'writeBuffer' }>,\n eventIndex: number,\n): Result<void, RhiDebugError> {\n const buffer = requireResource<Buffer>(context, event.handleId, 'buffer', eventIndex, event.kind);\n if (!buffer.ok) return buffer;\n const bytes = blob(context.tape, event.dataHash, event, eventIndex);\n if (!bytes.ok) return bytes;\n const result = context.queue.writeBuffer(\n buffer.value,\n event.bufferOffset,\n bytes.value,\n 0,\n event.size,\n );\n return result.ok ? ok(undefined) : eventFailure(eventIndex, event, 'write', result.error);\n}\n\nfunction writeTexture(\n context: ReplayExecutionContext,\n event: Extract<RhiCallEvent, { kind: 'writeTexture' }>,\n eventIndex: number,\n): Result<void, RhiDebugError> {\n const texture = requireResource<Texture>(\n context,\n event.destination.textureHandleId,\n 'texture',\n eventIndex,\n event.kind,\n );\n if (!texture.ok) return texture;\n const bytes = blob(context.tape, event.dataHash, event, eventIndex);\n if (!bytes.ok) return bytes;\n const result = context.queue.writeTexture(\n {\n texture: texture.value,\n mipLevel: event.destination.mipLevel ?? 0,\n origin: event.destination.origin,\n aspect: event.destination.aspect,\n } as never,\n bytes.value,\n {\n offset: event.dataLayout.offset ?? 0,\n ...(event.dataLayout.bytesPerRow === undefined\n ? {}\n : { bytesPerRow: event.dataLayout.bytesPerRow }),\n ...(event.dataLayout.rowsPerImage === undefined\n ? {}\n : { rowsPerImage: event.dataLayout.rowsPerImage }),\n },\n event.size,\n );\n return result.ok ? ok(undefined) : eventFailure(eventIndex, event, 'write', result.error);\n}\n\nfunction submit(\n context: ReplayExecutionContext,\n event: Extract<RhiCallEvent, { kind: 'submit' }>,\n eventIndex: number,\n): Result<void, RhiDebugError> {\n const commandBuffers: CommandBuffer[] = [];\n for (const id of event.cmdHandleIds) {\n const entry = context.table.get(id);\n if (entry?.resource.kind !== 'encoder' || entry.resource.role !== 'command-buffer') {\n return missingResource(eventIndex, event, id, 'encoder');\n }\n commandBuffers.push(entry.resource.value as CommandBuffer);\n }\n const result = context.queue.submit(commandBuffers);\n return result.ok ? ok(undefined) : eventFailure(eventIndex, event, 'submit', result.error);\n}\n\nfunction beginRenderPass(\n context: ReplayExecutionContext,\n event: Extract<RhiCallEvent, { kind: 'beginRenderPass' }>,\n eventIndex: number,\n): Result<void, RhiDebugError> {\n const encoder = requireResource<RhiCommandEncoder>(\n context,\n event.cmdHandleId,\n 'encoder',\n eventIndex,\n event.kind,\n 'command',\n );\n if (!encoder.ok) return encoder;\n const colors = Array.from(event.desc.colorAttachments).map((attachment, index) => {\n if (attachment === null || attachment === undefined) return attachment;\n const viewId = event.colorAttachmentViewHandleIds[index];\n const view = viewId === undefined ? undefined : context.table.get(viewId)?.resource;\n if (view?.kind !== 'texture-view') throw new Error(`missing color attachment view ${viewId}`);\n const resolveId = event.colorAttachmentResolveTargetHandleIds?.[index];\n const resolve = resolveId === undefined ? undefined : context.table.get(resolveId)?.resource;\n return {\n ...attachment,\n view: view.value,\n ...(resolve?.kind === 'texture-view' ? { resolveTarget: resolve.value } : {}),\n } as RenderPassColorAttachment;\n });\n const depth =\n event.depthStencilViewHandleId === undefined\n ? undefined\n : context.table.get(event.depthStencilViewHandleId)?.resource;\n const descriptor = {\n ...event.desc,\n colorAttachments: colors,\n ...(depth?.kind === 'texture-view'\n ? {\n depthStencilAttachment: {\n ...event.desc.depthStencilAttachment,\n view: depth.value,\n } as RenderPassDepthStencilAttachment,\n }\n : {}),\n };\n const pass = encoder.value.beginRenderPass(descriptor as never);\n return context.table.set(\n event.passHandleId,\n { kind: 'encoder', role: 'render-pass', value: pass },\n eventRecord(event),\n );\n}\n\nfunction beginComputePass(\n context: ReplayExecutionContext,\n event: Extract<RhiCallEvent, { kind: 'beginComputePass' }>,\n eventIndex: number,\n): Result<void, RhiDebugError> {\n const encoder = requireResource<RhiCommandEncoder>(\n context,\n event.cmdHandleId,\n 'encoder',\n eventIndex,\n event.kind,\n 'command',\n );\n if (!encoder.ok) return encoder;\n const pass = encoder.value.beginComputePass(JSON.parse(JSON.stringify(event.desc)));\n return context.table.set(\n event.passHandleId,\n { kind: 'encoder', role: 'compute-pass', value: pass },\n eventRecord(event),\n );\n}\n\nfunction copyBufferToBuffer(\n context: ReplayExecutionContext,\n event: Extract<RhiCallEvent, { kind: 'copyBufferToBuffer' }>,\n eventIndex: number,\n): Result<void, RhiDebugError> {\n const encoder = requireResource<RhiCommandEncoder>(\n context,\n event.cmdHandleId,\n 'encoder',\n eventIndex,\n event.kind,\n 'command',\n );\n const source = requireResource<Buffer>(\n context,\n event.sourceHandleId,\n 'buffer',\n eventIndex,\n event.kind,\n );\n const destination = requireResource<Buffer>(\n context,\n event.destinationHandleId,\n 'buffer',\n eventIndex,\n event.kind,\n );\n if (!encoder.ok) return encoder;\n if (!source.ok) return source;\n if (!destination.ok) return destination;\n encoder.value.copyBufferToBuffer(\n source.value,\n event.sourceOffset,\n destination.value,\n event.destinationOffset,\n event.size,\n );\n return ok(undefined);\n}\n\nfunction copyBufferToTexture(\n context: ReplayExecutionContext,\n event: Extract<RhiCallEvent, { kind: 'copyBufferToTexture' }>,\n eventIndex: number,\n): Result<void, RhiDebugError> {\n const encoder = requireResource<RhiCommandEncoder>(\n context,\n event.cmdHandleId,\n 'encoder',\n eventIndex,\n event.kind,\n 'command',\n );\n const buffer = requireResource<Buffer>(\n context,\n event.source.bufferHandleId,\n 'buffer',\n eventIndex,\n event.kind,\n );\n const texture = requireResource<Texture>(\n context,\n event.destination.textureHandleId,\n 'texture',\n eventIndex,\n event.kind,\n );\n if (!encoder.ok) return encoder;\n if (!buffer.ok) return buffer;\n if (!texture.ok) return texture;\n encoder.value.copyBufferToTexture(\n { ...event.source, buffer: buffer.value } as never,\n { ...event.destination, texture: texture.value } as never,\n event.copySize,\n );\n return ok(undefined);\n}\n\nfunction copyTextureToBuffer(\n context: ReplayExecutionContext,\n event: Extract<RhiCallEvent, { kind: 'copyTextureToBuffer' }>,\n eventIndex: number,\n): Result<void, RhiDebugError> {\n const encoder = requireResource<RhiCommandEncoder>(\n context,\n event.cmdHandleId,\n 'encoder',\n eventIndex,\n event.kind,\n 'command',\n );\n const texture = requireResource<Texture>(\n context,\n event.source.textureHandleId,\n 'texture',\n eventIndex,\n event.kind,\n );\n const buffer = requireResource<Buffer>(\n context,\n event.destination.bufferHandleId,\n 'buffer',\n eventIndex,\n event.kind,\n );\n if (!encoder.ok) return encoder;\n if (!texture.ok) return texture;\n if (!buffer.ok) return buffer;\n encoder.value.copyTextureToBuffer(\n { ...event.source, texture: texture.value } as never,\n { ...event.destination, buffer: buffer.value } as never,\n event.copySize,\n );\n return ok(undefined);\n}\n\nfunction copyTextureToTexture(\n context: ReplayExecutionContext,\n event: Extract<RhiCallEvent, { kind: 'copyTextureToTexture' }>,\n eventIndex: number,\n): Result<void, RhiDebugError> {\n const encoder = requireResource<RhiCommandEncoder>(\n context,\n event.cmdHandleId,\n 'encoder',\n eventIndex,\n event.kind,\n 'command',\n );\n const source = requireResource<Texture>(\n context,\n event.source.textureHandleId,\n 'texture',\n eventIndex,\n event.kind,\n );\n const destination = requireResource<Texture>(\n context,\n event.destination.textureHandleId,\n 'texture',\n eventIndex,\n event.kind,\n );\n if (!encoder.ok) return encoder;\n if (!source.ok) return source;\n if (!destination.ok) return destination;\n encoder.value.copyTextureToTexture(\n { ...event.source, texture: source.value } as never,\n { ...event.destination, texture: destination.value } as never,\n event.copySize,\n );\n return ok(undefined);\n}\n","import type {\n Buffer,\n MappedBuffer,\n RhiCommandEncoder,\n RhiDevice,\n Texture,\n} from '@forgeax/engine-rhi';\nimport { err, ok, type Result } from '@forgeax/engine-types';\nimport { createRhiDebugError, type RhiDebugError } from '../errors';\nimport type { CreateShaderModuleFn } from '../recorder';\nimport type { ResourceTable, ResourceTableEntry } from './resources';\nimport {\n getTextureReadbackPlan,\n isDepthStencilTextureFormat,\n isDepthTextureFormat,\n textureBytesPerTexel,\n} from './texture-format';\n\nconst COPY_DST_MAP_READ = 0x9;\nconst GPU_MAP_MODE_READ = 0x1;\n\nexport interface BufferReadbackRange {\n readonly offset: number;\n readonly size?: number;\n}\n\nexport interface TextureReadbackSubresource {\n readonly mipLevel?: number;\n readonly arrayLayer?: number;\n readonly aspect?: 'all' | 'depth-only' | 'stencil-only';\n}\n\nexport type ReplayReadbackRequest = BufferReadbackRange | TextureReadbackSubresource;\n\nexport interface ReplayReadbackResult {\n readonly resourceId: string;\n readonly kind: 'buffer' | 'texture';\n readonly format?: string;\n readonly width?: number;\n readonly height?: number;\n readonly bytes: Uint8Array;\n}\n\nexport async function readReplayResource(\n device: RhiDevice,\n table: ResourceTable,\n resourceId: string,\n subresource: ReplayReadbackRequest | undefined,\n createShaderModule: CreateShaderModuleFn,\n): Promise<Result<ReplayReadbackResult, RhiDebugError>> {\n const entry = table.get(resourceId);\n if (entry === undefined)\n return readbackFailure(`resource ${resourceId} is not present in the current generation`);\n if (entry.resource.kind === 'texture-view') {\n const sourceId = stringField(entry.descriptor, 'sourceHandleId');\n const source = sourceId === undefined ? undefined : table.get(sourceId);\n if (source === undefined || source.resource.kind !== 'texture') {\n return readbackFailure(`texture view ${resourceId} has no readable source texture`);\n }\n return readTexture(device, source, resourceId, subresource, createShaderModule);\n }\n if (entry.resource.kind === 'texture')\n return readTexture(device, entry, resourceId, subresource, createShaderModule);\n if (entry.resource.kind === 'buffer') return readBuffer(device, entry, resourceId, subresource);\n return readbackFailure(`resource ${resourceId} is not readable by the v7 core matrix`);\n}\n\nasync function readBuffer(\n device: RhiDevice,\n entry: ResourceTableEntry,\n resourceId: string,\n subresource: ReplayReadbackRequest | undefined,\n): Promise<Result<ReplayReadbackResult, RhiDebugError>> {\n const size = numberField(recordField(entry.descriptor, 'desc'), 'size');\n if (size === undefined || !Number.isSafeInteger(size) || size < 0)\n return readbackFailure(`buffer ${resourceId} has no valid recorded size`);\n const request = isBufferRange(subresource) ? subresource : undefined;\n const offset = request?.offset ?? 0;\n const requestedSize = request?.size ?? size - offset;\n if (!validRange(offset, requestedSize, size))\n return readbackFailure(\n `buffer range ${offset}:${requestedSize} escapes ${resourceId} (${size} bytes)`,\n );\n const bytes = await copyBufferBytes(\n device,\n entry.resource.value as Buffer,\n offset,\n requestedSize,\n );\n if (!bytes.ok) return bytes;\n return ok({ resourceId, kind: 'buffer', bytes: bytes.value });\n}\n\nasync function readTexture(\n device: RhiDevice,\n entry: ResourceTableEntry,\n resourceId: string,\n subresource: ReplayReadbackRequest | undefined,\n createShaderModule: CreateShaderModuleFn,\n): Promise<Result<ReplayReadbackResult, RhiDebugError>> {\n const descriptor = recordField(entry.descriptor, 'desc');\n const format = stringField(descriptor, 'format');\n const dimension = stringField(descriptor, 'dimension') ?? '2d';\n if (format === undefined) return readbackFailure(`texture ${resourceId} has no recorded format`);\n const plan = getTextureReadbackPlan({ format, dimension });\n if (!plan.supported) {\n return err(\n createRhiDebugError('readback-unsupported', {\n stage: 'readback',\n resourceId,\n format,\n reason: plan.reason,\n }),\n );\n }\n const size = textureSize(recordField(descriptor, 'size'));\n const mipLevel = textureSubresourceField(subresource, 'mipLevel') ?? 0;\n const arrayLayer = textureSubresourceField(subresource, 'arrayLayer') ?? 0;\n const mipCount = numberField(descriptor, 'mipLevelCount') ?? 1;\n if (\n !validIndex(mipLevel, mipCount) ||\n !Number.isInteger(arrayLayer) ||\n arrayLayer < 0 ||\n arrayLayer >= size.depthOrArrayLayers\n ) {\n return readbackFailure(`texture subresource for ${resourceId} is outside the recorded extent`);\n }\n const width = Math.max(1, Math.floor(size.width / 2 ** mipLevel));\n const height = Math.max(1, Math.floor(size.height / 2 ** mipLevel));\n const requestedAspect = textureAspect(subresource);\n if (format === 'depth24plus' || format === 'depth24plus-stencil8') {\n if (format === 'depth24plus-stencil8' && requestedAspect === 'all') {\n return readbackUnsupported(\n resourceId,\n format,\n 'depth24plus-stencil8 requires an explicit depth-only or stencil-only aspect',\n );\n }\n if (requestedAspect === 'stencil-only') {\n if (format !== 'depth24plus-stencil8') {\n return readbackUnsupported(resourceId, format, 'depth24plus has no stencil aspect');\n }\n const bytes = await copyTextureBytes(\n device,\n entry.resource.value as Texture,\n align256(width) * height,\n {\n mipLevel,\n arrayLayer,\n aspect: 'stencil-only',\n width,\n height,\n bytesPerRow: align256(width),\n rowBytes: width,\n },\n );\n if (!bytes.ok) return bytes;\n return ok({ resourceId, kind: 'texture', format, width, height, bytes: bytes.value });\n }\n return blitDepth24PlusTexture(\n device,\n entry.resource.value as Texture,\n resourceId,\n format,\n width,\n height,\n mipLevel,\n arrayLayer,\n createShaderModule,\n );\n }\n const texelBytes = textureBytesPerTexel(format);\n if (texelBytes === undefined)\n return readbackFailure(`texture format ${format} has no byte layout`);\n const rowBytes = width * texelBytes;\n const bytesPerRow = align256(rowBytes);\n const bytes = await copyTextureBytes(\n device,\n entry.resource.value as Texture,\n bytesPerRow * height,\n {\n mipLevel,\n arrayLayer,\n aspect: directTextureAspect(format, requestedAspect),\n width,\n height,\n bytesPerRow,\n rowBytes,\n },\n );\n if (!bytes.ok) return bytes;\n return ok({ resourceId, kind: 'texture', format, width, height, bytes: bytes.value });\n}\n\nfunction readbackUnsupported(\n resourceId: string,\n format: string,\n reason: string,\n): Result<never, RhiDebugError> {\n return err(\n createRhiDebugError('readback-unsupported', {\n stage: 'readback',\n resourceId,\n format,\n reason,\n }),\n );\n}\n\nfunction directTextureAspect(\n format: string,\n aspect: 'all' | 'depth-only' | 'stencil-only',\n): 'all' | 'depth-only' | 'stencil-only' {\n if (isDepthTextureFormat(format) && !isDepthStencilTextureFormat(format)) {\n return 'depth-only';\n }\n if (isDepthStencilTextureFormat(format) && aspect === 'all') return 'depth-only';\n return aspect;\n}\n\nconst DEPTH_BLIT_SHADER = `\n@group(0) @binding(0) var sourceDepth: texture_depth_2d;\n\nstruct VertexOutput {\n @builtin(position) position: vec4<f32>,\n};\n\n@vertex\nfn vs_main(@builtin(vertex_index) vertexIndex: u32) -> VertexOutput {\n var positions = array<vec2<f32>, 3>(\n vec2<f32>(-1.0, -1.0),\n vec2<f32>( 3.0, -1.0),\n vec2<f32>(-1.0, 3.0),\n );\n var output: VertexOutput;\n output.position = vec4<f32>(positions[vertexIndex], 0.0, 1.0);\n return output;\n}\n\n@fragment\nfn fs_main(@builtin(position) position: vec4<f32>) -> @location(0) vec4<f32> {\n let pixel = vec2<i32>(i32(position.x), i32(position.y));\n return vec4<f32>(textureLoad(sourceDepth, pixel, 0), 0.0, 0.0, 1.0);\n}\n`;\n\nasync function blitDepth24PlusTexture(\n device: RhiDevice,\n source: Texture,\n resourceId: string,\n format: string,\n width: number,\n height: number,\n mipLevel: number,\n arrayLayer: number,\n createShaderModule: CreateShaderModuleFn,\n): Promise<Result<ReplayReadbackResult, RhiDebugError>> {\n let output: Texture | undefined;\n let staging: Buffer | undefined;\n let mapped: MappedBuffer | undefined;\n try {\n const sourceView = device.createTextureView(source, {\n dimension: '2d',\n baseMipLevel: mipLevel,\n mipLevelCount: 1,\n baseArrayLayer: arrayLayer,\n arrayLayerCount: 1,\n aspect: 'depth-only',\n });\n if (!sourceView.ok)\n return readbackFailure(\n `depth readback source view creation failed: ${sourceView.error.code}`,\n );\n\n const layout = device.createBindGroupLayout({\n entries: [\n {\n binding: 0,\n visibility: 0x2,\n texture: { sampleType: 'depth', viewDimension: '2d', multisampled: false },\n },\n ],\n });\n if (!layout.ok)\n return readbackFailure(`depth readback bind group layout failed: ${layout.error.code}`);\n const pipelineLayout = device.createPipelineLayout({ bindGroupLayouts: [layout.value] });\n if (!pipelineLayout.ok)\n return readbackFailure(`depth readback pipeline layout failed: ${pipelineLayout.error.code}`);\n const shader = await createShaderModule(device, {\n code: DEPTH_BLIT_SHADER,\n label: 'rhi-debug-depth-readback',\n });\n if (!shader.ok) return readbackFailure(`depth readback shader failed: ${shader.error.code}`);\n const pipeline = device.createRenderPipeline({\n layout: pipelineLayout.value,\n vertex: { module: shader.value, entryPoint: 'vs_main', buffers: [] },\n fragment: {\n module: shader.value,\n entryPoint: 'fs_main',\n targets: [{ format: 'rgba32float' }],\n },\n primitive: { topology: 'triangle-list' },\n } as never);\n if (!pipeline.ok)\n return readbackFailure(`depth readback pipeline failed: ${pipeline.error.code}`);\n const bindGroup = device.createBindGroup({\n layout: layout.value,\n entries: [{ binding: 0, resource: { kind: 'textureView', value: sourceView.value } }],\n });\n if (!bindGroup.ok)\n return readbackFailure(`depth readback bind group failed: ${bindGroup.error.code}`);\n\n const outputResult = device.createTexture({\n size: { width, height, depthOrArrayLayers: 1 },\n format: 'rgba32float',\n dimension: '2d',\n mipLevelCount: 1,\n sampleCount: 1,\n usage: 0x11,\n });\n if (!outputResult.ok)\n return readbackFailure(`depth readback output texture failed: ${outputResult.error.code}`);\n output = outputResult.value;\n const outputView = device.createTextureView(output, { dimension: '2d' });\n if (!outputView.ok)\n return readbackFailure(`depth readback output view failed: ${outputView.error.code}`);\n\n const encoderResult = device.createCommandEncoder({});\n if (!encoderResult.ok)\n return readbackFailure(`depth readback encoder failed: ${encoderResult.error.code}`);\n const pass = encoderResult.value.beginRenderPass({\n colorAttachments: [\n {\n view: outputView.value,\n loadOp: 'clear',\n storeOp: 'store',\n clearValue: { r: 0, g: 0, b: 0, a: 1 },\n },\n ],\n } as never);\n pass.setPipeline(pipeline.value);\n pass.setBindGroup(0, bindGroup.value);\n pass.draw(3, 1, 0, 0);\n pass.end();\n\n const bytesPerRow = align256(width * 16);\n const created = device.createBuffer({ size: bytesPerRow * height, usage: COPY_DST_MAP_READ });\n if (!created.ok)\n return readbackFailure(`depth readback staging buffer failed: ${created.error.code}`);\n staging = created.value;\n encoderResult.value.copyTextureToBuffer(\n { texture: output, aspect: 'all' } as never,\n { buffer: staging, offset: 0, bytesPerRow, rowsPerImage: height } as never,\n { width, height, depthOrArrayLayers: 1 },\n );\n const finished = encoderResult.value.finish();\n if (!finished.ok)\n return readbackFailure(`depth readback finish failed: ${finished.error.code}`);\n const submitted = device.queue.submit([finished.value]);\n if (!submitted.ok)\n return readbackFailure(`depth readback submit failed: ${submitted.error.code}`);\n await device.queue.onSubmittedWorkDone();\n const mappedResult = await staging.mapAsync(GPU_MAP_MODE_READ);\n if (!mappedResult.ok)\n return readbackFailure(`depth readback map failed: ${mappedResult.error.code}`);\n mapped = mappedResult.value;\n const range = mapped.getMappedRange(0, bytesPerRow * height);\n if (!range.ok)\n return readbackFailure(`depth readback mapped range failed: ${range.error.code}`);\n const padded = new Uint8Array(range.value);\n const bytes = new Uint8Array(width * height * 4);\n for (let row = 0; row < height; row++) {\n for (let column = 0; column < width; column++) {\n const sourceOffset = row * bytesPerRow + column * 16;\n const targetOffset = (row * width + column) * 4;\n bytes.set(padded.subarray(sourceOffset, sourceOffset + 4), targetOffset);\n }\n }\n return ok({ resourceId, kind: 'texture', format, width, height, bytes });\n } catch (cause) {\n return readbackFailure(`depth readback failed: ${messageOf(cause)}`);\n } finally {\n if (mapped !== undefined) mapped.unmap();\n if (staging !== undefined) device.destroyBuffer(staging);\n if (output !== undefined) device.destroyTexture(output);\n }\n}\n\nasync function copyBufferBytes(\n device: RhiDevice,\n source: Buffer,\n sourceOffset: number,\n size: number,\n): Promise<Result<Uint8Array, RhiDebugError>> {\n let staging: Buffer | undefined;\n let mapped: MappedBuffer | undefined;\n try {\n const created = device.createBuffer({ size: Math.max(4, size), usage: COPY_DST_MAP_READ });\n if (!created.ok)\n return readbackFailure(`staging buffer creation failed: ${created.error.code}`);\n staging = created.value;\n const encoderResult = device.createCommandEncoder({});\n if (!encoderResult.ok)\n return readbackFailure(`readback encoder creation failed: ${encoderResult.error.code}`);\n const encoder = encoderResult.value;\n encoder.copyBufferToBuffer(source, sourceOffset, staging, 0, size);\n const finished = encoder.finish();\n if (!finished.ok)\n return readbackFailure(`readback encoder finish failed: ${finished.error.code}`);\n const submitted = device.queue.submit([finished.value]);\n if (!submitted.ok) return readbackFailure(`readback submit failed: ${submitted.error.code}`);\n await device.queue.onSubmittedWorkDone();\n const mappedResult = await staging.mapAsync(GPU_MAP_MODE_READ);\n if (!mappedResult.ok) return readbackFailure(`readback map failed: ${mappedResult.error.code}`);\n mapped = mappedResult.value;\n const range = mapped.getMappedRange(0, size);\n if (!range.ok) return readbackFailure(`readback mapped range failed: ${range.error.code}`);\n return ok(new Uint8Array(range.value).slice());\n } catch (cause) {\n return readbackFailure(`buffer readback failed: ${messageOf(cause)}`);\n } finally {\n if (mapped !== undefined) mapped.unmap();\n if (staging !== undefined) device.destroyBuffer(staging);\n }\n}\n\nasync function copyTextureBytes(\n device: RhiDevice,\n source: Texture,\n bufferSize: number,\n copy: {\n readonly mipLevel: number;\n readonly arrayLayer: number;\n readonly aspect: 'all' | 'depth-only' | 'stencil-only';\n readonly width: number;\n readonly height: number;\n readonly bytesPerRow: number;\n readonly rowBytes: number;\n },\n): Promise<Result<Uint8Array, RhiDebugError>> {\n let staging: Buffer | undefined;\n let mapped: MappedBuffer | undefined;\n try {\n const created = device.createBuffer({ size: bufferSize, usage: COPY_DST_MAP_READ });\n if (!created.ok)\n return readbackFailure(`staging buffer creation failed: ${created.error.code}`);\n staging = created.value;\n const encoderResult = device.createCommandEncoder({});\n if (!encoderResult.ok)\n return readbackFailure(`readback encoder creation failed: ${encoderResult.error.code}`);\n const encoder: RhiCommandEncoder = encoderResult.value;\n encoder.copyTextureToBuffer(\n {\n texture: source,\n mipLevel: copy.mipLevel,\n origin: { x: 0, y: 0, z: copy.arrayLayer },\n aspect: copy.aspect,\n } as never,\n {\n buffer: staging,\n offset: 0,\n bytesPerRow: copy.bytesPerRow,\n rowsPerImage: copy.height,\n } as never,\n { width: copy.width, height: copy.height, depthOrArrayLayers: 1 },\n );\n const finished = encoder.finish();\n if (!finished.ok)\n return readbackFailure(`readback encoder finish failed: ${finished.error.code}`);\n const submitted = device.queue.submit([finished.value]);\n if (!submitted.ok) return readbackFailure(`readback submit failed: ${submitted.error.code}`);\n await device.queue.onSubmittedWorkDone();\n const mappedResult = await staging.mapAsync(GPU_MAP_MODE_READ);\n if (!mappedResult.ok) return readbackFailure(`readback map failed: ${mappedResult.error.code}`);\n mapped = mappedResult.value;\n const range = mapped.getMappedRange(0, bufferSize);\n if (!range.ok) return readbackFailure(`readback mapped range failed: ${range.error.code}`);\n const padded = new Uint8Array(range.value);\n const bytes = new Uint8Array(copy.rowBytes * copy.height);\n for (let row = 0; row < copy.height; row++) {\n bytes.set(\n padded.subarray(row * copy.bytesPerRow, row * copy.bytesPerRow + copy.rowBytes),\n row * copy.rowBytes,\n );\n }\n return ok(bytes);\n } catch (cause) {\n return readbackFailure(`texture readback failed: ${messageOf(cause)}`);\n } finally {\n if (mapped !== undefined) mapped.unmap();\n if (staging !== undefined) device.destroyBuffer(staging);\n }\n}\n\nfunction readbackFailure(cause: string): Result<never, RhiDebugError> {\n return err(createRhiDebugError('readback-failed', { stage: 'readback', cause }));\n}\n\nfunction recordField(\n value: Record<string, unknown> | undefined,\n key: string,\n): Record<string, unknown> | undefined {\n const field = value?.[key];\n return field !== null && typeof field === 'object'\n ? (field as Record<string, unknown>)\n : undefined;\n}\n\nfunction stringField(value: Record<string, unknown> | undefined, key: string): string | undefined {\n const field = value?.[key];\n return typeof field === 'string' ? field : undefined;\n}\n\nfunction numberField(value: Record<string, unknown> | undefined, key: string): number | undefined {\n const field = value?.[key];\n return typeof field === 'number' ? field : undefined;\n}\n\nfunction textureSize(value: unknown): {\n readonly width: number;\n readonly height: number;\n readonly depthOrArrayLayers: number;\n} {\n if (Array.isArray(value)) {\n return {\n width: integerOr(value[0], 1),\n height: integerOr(value[1], integerOr(value[0], 1)),\n depthOrArrayLayers: integerOr(value[2], 1),\n };\n }\n const object =\n value !== null && typeof value === 'object' ? (value as Record<string, unknown>) : undefined;\n return {\n width: integerOr(object?.width, 1),\n height: integerOr(object?.height, integerOr(object?.width, 1)),\n depthOrArrayLayers: integerOr(object?.depthOrArrayLayers, 1),\n };\n}\n\nfunction integerOr(value: unknown, fallback: number): number {\n return typeof value === 'number' && Number.isInteger(value) && value > 0 ? value : fallback;\n}\n\nfunction textureSubresourceField(\n value: ReplayReadbackRequest | undefined,\n key: 'mipLevel' | 'arrayLayer',\n): number | undefined {\n if (value === undefined || isBufferRange(value)) return undefined;\n return value[key];\n}\n\nfunction textureAspect(\n value: ReplayReadbackRequest | undefined,\n): 'all' | 'depth-only' | 'stencil-only' {\n if (value === undefined || isBufferRange(value)) return 'all';\n return value.aspect ?? 'all';\n}\n\nfunction isBufferRange(value: ReplayReadbackRequest | undefined): value is BufferReadbackRange {\n return value !== undefined && 'offset' in value;\n}\n\nfunction validRange(offset: number, size: number, total: number): boolean {\n return (\n Number.isSafeInteger(offset) &&\n Number.isSafeInteger(size) &&\n offset >= 0 &&\n size >= 0 &&\n offset + size <= total\n );\n}\n\nfunction validIndex(value: number, count: number): boolean {\n return Number.isInteger(value) && value >= 0 && value < count;\n}\n\nfunction align256(value: number): number {\n return Math.max(256, Math.ceil(value / 256) * 256);\n}\n\nfunction messageOf(cause: unknown): string {\n return cause instanceof Error ? cause.message : String(cause);\n}\n","import type {\n BindGroup,\n BindGroupLayout,\n Buffer,\n CommandBuffer,\n ComputePipeline,\n PipelineLayout,\n RenderPipeline,\n RhiCommandEncoder,\n RhiComputePassEncoder,\n RhiDevice,\n RhiRenderPassEncoder,\n Sampler,\n ShaderModule,\n Texture,\n TextureView,\n} from '@forgeax/engine-rhi';\nimport { err, ok, type Result } from '@forgeax/engine-types';\nimport { createRhiDebugError, type RhiDebugError } from '../errors';\nimport type { ResourceKind } from '../protocol/types';\n\nexport type ReplayResource = {\n readonly role?: string;\n} & (\n | { readonly kind: 'buffer'; readonly value: Buffer }\n | { readonly kind: 'texture'; readonly value: Texture }\n | { readonly kind: 'texture-view'; readonly value: TextureView }\n | { readonly kind: 'sampler'; readonly value: Sampler }\n | { readonly kind: 'shader-module'; readonly value: ShaderModule }\n | {\n readonly kind: 'pipeline';\n readonly role: 'render' | 'compute';\n readonly value: RenderPipeline | ComputePipeline;\n }\n | {\n readonly kind: 'binding';\n readonly role: 'bind-group' | 'bind-group-layout' | 'pipeline-layout';\n readonly value: BindGroup | BindGroupLayout | PipelineLayout;\n }\n | {\n readonly kind: 'encoder';\n readonly role: 'command' | 'command-buffer' | 'render-pass' | 'compute-pass';\n readonly value:\n | RhiCommandEncoder\n | RhiRenderPassEncoder\n | RhiComputePassEncoder\n | CommandBuffer;\n }\n);\n\nexport interface ResourceTableEntry {\n readonly resourceId: string;\n readonly generation: number;\n readonly resource: ReplayResource;\n readonly descriptor: Record<string, unknown> | undefined;\n}\n\nexport class ResourceTable {\n private readonly entries = new Map<string, ResourceTableEntry>();\n private disposed = false;\n private currentGeneration: number;\n\n constructor(\n private readonly device: RhiDevice,\n generation = 0,\n ) {\n this.currentGeneration = generation;\n }\n\n get generation(): number {\n return this.currentGeneration;\n }\n\n get(resourceId: string): ResourceTableEntry | undefined {\n return this.entries.get(resourceId);\n }\n\n set(\n resourceId: string,\n resource: ReplayResource,\n descriptor?: Record<string, unknown> | undefined,\n ): Result<void, RhiDebugError> {\n if (this.disposed) {\n return err(\n createRhiDebugError('replay-position-invalid', {\n requested: this.generation,\n available: -1,\n }),\n );\n }\n this.entries.set(resourceId, {\n resourceId,\n generation: this.generation,\n resource,\n descriptor,\n });\n return ok(undefined);\n }\n\n delete(resourceId: string): void {\n this.entries.delete(resourceId);\n }\n\n values(): IterableIterator<ResourceTableEntry> {\n return this.entries.values();\n }\n\n reset(): Result<void, RhiDebugError> {\n const result = this.releaseAll();\n if (!result.ok) return result;\n this.entries.clear();\n this.currentGeneration += 1;\n return ok(undefined);\n }\n\n dispose(): Result<void, RhiDebugError> {\n if (this.disposed) return ok(undefined);\n const result = this.releaseAll();\n this.entries.clear();\n this.disposed = true;\n return result;\n }\n\n private releaseAll(): Result<void, RhiDebugError> {\n let firstFailure: Result<never, RhiDebugError> | undefined;\n for (const entry of this.entries.values()) {\n if (entry.resource.kind === 'buffer') {\n const result = this.device.destroyBuffer(entry.resource.value);\n if (!result.ok && firstFailure === undefined)\n firstFailure = resourceDisposeFailure(entry.resourceId, result.error.code);\n } else if (entry.resource.kind === 'texture') {\n const result = this.device.destroyTexture(entry.resource.value);\n if (!result.ok && firstFailure === undefined)\n firstFailure = resourceDisposeFailure(entry.resourceId, result.error.code);\n }\n }\n return firstFailure ?? ok(undefined);\n }\n}\n\nfunction resourceDisposeFailure(resourceId: string, cause: string): Result<never, RhiDebugError> {\n return err(\n createRhiDebugError('replay-event-failed', {\n eventIndex: -1,\n kind: `dispose:${resourceId}`,\n stage: 'create',\n cause,\n }),\n );\n}\n\nexport function isResourceKind(resource: ReplayResource, kind: ResourceKind): boolean {\n return resource.kind === kind;\n}\n","import type {\n RhiCommandEncoder,\n RhiComputePassEncoder,\n RhiDevice,\n RhiRenderPassEncoder,\n} from '@forgeax/engine-rhi';\nimport { err, ok, type Result } from '@forgeax/engine-types';\nimport { createRhiDebugError, type RhiDebugError } from '../errors';\nimport { buildTapeIndex, type TapeIndex, type TapeWorkEntry } from '../protocol/tape-index';\nimport type { BootstrapResource, RhiCallEvent, Tape } from '../protocol/types';\nimport type { CreateShaderModuleFn } from '../recorder';\nimport { computeTextureLayout, projectTextureExtent } from '../texel-layout';\nimport { eventFailure, executeEvent, type ReplayExecutionContext } from './execute';\nimport {\n type BufferReadbackRange,\n type ReplayReadbackResult,\n readReplayResource,\n} from './readback';\nimport { ResourceTable } from './resources';\n\nexport interface ReplayBackend {\n readonly device: RhiDevice;\n readonly createShaderModule: CreateShaderModuleFn;\n}\n\nexport interface TextureSubresource {\n readonly mipLevel: number;\n readonly arrayLayer: number;\n readonly aspect?: 'all' | 'depth-only' | 'stencil-only';\n}\n\nexport type ReadbackSubresource = TextureSubresource | BufferReadbackRange;\n\nexport type InspectField = 'bindings' | 'pipeline' | 'pixels';\n\nexport interface WorkInspection {\n readonly workIndex: number;\n readonly eventIndex: number;\n readonly passIndex: number;\n readonly attachment: ReplayReadbackResult | undefined;\n}\n\nexport interface ReplaySession {\n readonly generation: number;\n inspectWork(\n workIndex: number,\n fields?: readonly InspectField[],\n signal?: AbortSignal,\n ): Promise<Result<WorkInspection, RhiDebugError>>;\n readResource(\n resourceId: string,\n subresource?: ReadbackSubresource,\n signal?: AbortSignal,\n ): Promise<Result<ReplayReadbackResult, RhiDebugError>>;\n dispose(): Promise<Result<void, RhiDebugError>>;\n}\n\nexport async function openReplay(\n tape: Tape,\n backend: ReplayBackend,\n): Promise<Result<ReplaySession, RhiDebugError>> {\n if (tape.header.formatVersion !== 7) {\n return err(\n createRhiDebugError('tape-version-unsupported', {\n foundVersion: tape.header.formatVersion,\n expectedVersion: 7,\n }),\n );\n }\n const capabilityFailure = checkCapabilities(tape, backend.device);\n if (capabilityFailure !== undefined) return err(capabilityFailure);\n\n const index = buildTapeIndex(tape);\n const table = new ResourceTable(backend.device, 0);\n let disposed = false;\n let prepared = false;\n\n const context: ReplayExecutionContext = {\n device: backend.device,\n queue: backend.device.queue,\n tape,\n table,\n createShaderModule: backend.createShaderModule,\n };\n\n const reset = async (): Promise<Result<void, RhiDebugError>> => {\n const cleared = table.reset();\n if (!cleared.ok) return cleared;\n prepared = false;\n return ok(undefined);\n };\n\n const prepare = async (): Promise<Result<void, RhiDebugError>> => {\n if (prepared) return ok(undefined);\n for (let index = 0; index < tape.bootstrap.length; index++) {\n const resource = tape.bootstrap[index];\n if (resource === undefined) continue;\n const created = await executeBootstrapResource(context, resource, index);\n if (!created.ok) return created;\n const seeded = await seedBootstrapResource(context, resource, index);\n if (!seeded.ok) return seeded;\n }\n prepared = true;\n return ok(undefined);\n };\n\n const session: ReplaySession = {\n get generation() {\n return table.generation;\n },\n async inspectWork(workIndex, fields, signal) {\n if (disposed) return positionError(workIndex, index.works.length);\n if (signal?.aborted) return positionError(workIndex, index.works.length);\n const work = index.works[workIndex];\n if (work === undefined) return positionError(workIndex, index.works.length);\n const cleared = await reset();\n if (!cleared.ok) return cleared;\n const bootstrapped = await prepare();\n if (!bootstrapped.ok) return bootstrapped;\n const replayed = await replayThroughWork(context, index, work, signal);\n if (!replayed.ok) return replayed;\n const attachment = fields?.includes('pixels')\n ? await readWorkAttachment(context, index, work)\n : undefined;\n if (attachment !== undefined && !attachment.ok) return attachment;\n return ok({\n workIndex: work.workIndex,\n eventIndex: work.eventIndex,\n passIndex: work.passIndex,\n attachment: attachment === undefined ? undefined : attachment.value,\n });\n },\n async readResource(resourceId, subresource, signal) {\n if (disposed) {\n return err(\n createRhiDebugError('replay-position-invalid', {\n requested: -1,\n available: 0,\n }),\n );\n }\n if (signal?.aborted) {\n return err(\n createRhiDebugError('readback-failed', {\n stage: 'readback',\n cause: 'readback was aborted',\n }),\n );\n }\n const cleared = await reset();\n if (!cleared.ok) return cleared;\n const bootstrapped = await prepare();\n if (!bootstrapped.ok) return bootstrapped;\n return readReplayResource(\n backend.device,\n table,\n resourceId,\n subresource,\n backend.createShaderModule,\n );\n },\n async dispose() {\n if (disposed) return ok(undefined);\n const result = table.dispose();\n disposed = true;\n prepared = false;\n return result;\n },\n };\n\n return ok(session);\n}\n\nfunction checkCapabilities(tape: Tape, device: RhiDevice): RhiDebugError | undefined {\n const recorded = tape.header.rhiCaps;\n const missing = Object.entries(recorded).filter(([key, value]) => {\n if (value !== true) return false;\n const target = device.caps[key as keyof typeof device.caps];\n return target !== true;\n });\n if (missing.length === 0) return undefined;\n return createRhiDebugError('replay-capability-mismatch', {\n stage: 'replay',\n cause: `missing capabilities: ${missing.map(([key]) => key).join(', ')}`,\n });\n}\n\nasync function executeBootstrapResource(\n context: ReplayExecutionContext,\n resource: BootstrapResource,\n bootstrapIndex: number,\n): Promise<Result<void, RhiDebugError>> {\n const event: RhiCallEvent = JSON.parse(JSON.stringify(resource.create));\n const result = await executeEvent(context, event, -bootstrapIndex - 1);\n return result;\n}\n\nasync function seedBootstrapResource(\n context: ReplayExecutionContext,\n resource: BootstrapResource,\n bootstrapIndex: number,\n): Promise<Result<void, RhiDebugError>> {\n if (resource.initialData.length === 0) return ok(undefined);\n const entry = context.table.get(resource.handleId);\n const event: RhiCallEvent = JSON.parse(JSON.stringify(resource.create));\n if (entry?.resource.kind === 'texture' && event.kind === 'createTexture') {\n return seedTextureInitialData(context, entry.resource.value, event, resource, bootstrapIndex);\n }\n if (entry?.resource.kind !== 'buffer') {\n return eventFailure(\n -bootstrapIndex - 1,\n event,\n 'lookup',\n 'bootstrap initialData requires a buffer or color texture resource',\n );\n }\n for (const slice of resource.initialData) {\n const blob = context.tape.blobs.find((candidate) => candidate.hash === slice.hash);\n if (blob === undefined) {\n return eventFailure(-bootstrapIndex - 1, event, 'lookup', `blob ${slice.hash} is missing`);\n }\n const end = slice.byteOffset + slice.byteLength;\n if (slice.byteOffset < 0 || slice.byteLength < 0 || end > blob.bytes.byteLength) {\n return eventFailure(\n -bootstrapIndex - 1,\n event,\n 'lookup',\n `blob ${slice.hash} does not contain initialData slice [${slice.byteOffset}, ${end})`,\n );\n }\n const bytes = blob.bytes.slice(slice.byteOffset, slice.byteOffset + slice.byteLength);\n const written = context.queue.writeBuffer(entry.resource.value, 0, bytes);\n if (!written.ok) {\n return eventFailure(-bootstrapIndex - 1, event, 'write', written.error);\n }\n }\n return ok(undefined);\n}\n\nfunction seedTextureInitialData(\n context: ReplayExecutionContext,\n texture: import('@forgeax/engine-rhi').Texture,\n event: Extract<RhiCallEvent, { kind: 'createTexture' }>,\n resource: BootstrapResource,\n bootstrapIndex: number,\n): Result<void, RhiDebugError> {\n const extent = projectTextureExtent(event.desc.size);\n const layout = computeTextureLayout(\n event.desc.format,\n extent.width,\n extent.height,\n extent.layerCount,\n event.desc.mipLevelCount ?? 1,\n );\n if (layout === undefined) {\n return eventFailure(\n -bootstrapIndex - 1,\n event,\n 'lookup',\n `texture format '${event.desc.format}' has no known bootstrap byte layout`,\n );\n }\n for (const slice of resource.initialData) {\n const blob = context.tape.blobs.find((candidate) => candidate.hash === slice.hash);\n if (blob === undefined) {\n return eventFailure(-bootstrapIndex - 1, event, 'lookup', `blob ${slice.hash} is missing`);\n }\n const end = slice.byteOffset + slice.byteLength;\n if (slice.byteOffset < 0 || slice.byteLength < 0 || end > blob.bytes.byteLength) {\n return eventFailure(\n -bootstrapIndex - 1,\n event,\n 'lookup',\n `blob ${slice.hash} does not contain initialData slice [${slice.byteOffset}, ${end})`,\n );\n }\n const bytes = blob.bytes.subarray(slice.byteOffset, end);\n if (bytes.byteLength !== layout.totalBytes) {\n return eventFailure(\n -bootstrapIndex - 1,\n event,\n 'lookup',\n `texture initialData has ${bytes.byteLength} bytes; expected ${layout.totalBytes}`,\n );\n }\n for (const subresource of layout.slices) {\n const rowBytes = Math.ceil(subresource.width / layout.blockWidth) * layout.bytesPerBlock;\n const rowCount = Math.ceil(subresource.height / layout.blockHeight);\n const subresourceBytes = bytes.subarray(\n subresource.byteOffset,\n subresource.byteOffset + subresource.byteLength,\n );\n const written = context.queue.writeTexture(\n {\n texture,\n mipLevel: subresource.mip,\n origin: { x: 0, y: 0, z: subresource.layer },\n aspect: 'all',\n } as never,\n subresourceBytes,\n { offset: 0, bytesPerRow: rowBytes, rowsPerImage: rowCount },\n {\n width: Math.ceil(subresource.width / layout.blockWidth) * layout.blockWidth,\n height: Math.ceil(subresource.height / layout.blockHeight) * layout.blockHeight,\n depthOrArrayLayers: 1,\n },\n );\n if (!written.ok) {\n return eventFailure(-bootstrapIndex - 1, event, 'write', written.error);\n }\n }\n }\n return ok(undefined);\n}\n\nasync function replayThroughWork(\n context: ReplayExecutionContext,\n index: TapeIndex,\n work: TapeWorkEntry,\n signal?: AbortSignal,\n): Promise<Result<void, RhiDebugError>> {\n for (let eventIndex = 0; eventIndex <= work.eventIndex; eventIndex++) {\n const event = context.tape.events[eventIndex];\n if (event === undefined) break;\n if (signal?.aborted) {\n return eventFailure(eventIndex, event, 'lookup', 'inspectWork was aborted');\n }\n const result = await executeEvent(context, event, eventIndex);\n if (!result.ok) return result;\n }\n return finalizeWorkPass(context, index, work);\n}\n\nasync function finalizeWorkPass(\n context: ReplayExecutionContext,\n index: TapeIndex,\n work: TapeWorkEntry,\n): Promise<Result<void, RhiDebugError>> {\n const pass = index.passes.find((candidate) => candidate.passIndex === work.passIndex);\n if (pass === undefined) return ok(undefined);\n const begin = context.tape.events[pass.beginEventIndex];\n if (begin?.kind !== 'beginRenderPass' && begin?.kind !== 'beginComputePass') return ok(undefined);\n const entry = context.table.get(begin.passHandleId);\n if (\n entry?.resource.kind !== 'encoder' ||\n (entry.resource.role !== 'render-pass' && entry.resource.role !== 'compute-pass')\n ) {\n return eventFailure(\n pass.beginEventIndex,\n begin,\n 'lookup',\n `pass ${begin.passHandleId} is not open`,\n );\n }\n try {\n (entry.resource.value as RhiRenderPassEncoder | RhiComputePassEncoder).end();\n } catch (cause) {\n return eventFailure(pass.endEventIndex ?? work.eventIndex, begin, 'encode', cause);\n }\n context.table.delete(begin.passHandleId);\n const finishEventIndex = findNextEvent(\n context.tape.events,\n pass.beginEventIndex,\n 'finish',\n begin.cmdHandleId,\n );\n const encoder = context.table.get(begin.cmdHandleId);\n if (encoder?.resource.kind !== 'encoder' || encoder.resource.role !== 'command') {\n return eventFailure(\n finishEventIndex ?? work.eventIndex,\n begin,\n 'lookup',\n `encoder ${begin.cmdHandleId} is not available`,\n );\n }\n const finished = (encoder.resource.value as RhiCommandEncoder).finish();\n const finishEvent = context.tape.events[finishEventIndex ?? work.eventIndex] ?? begin;\n if (!finished.ok)\n return eventFailure(finishEventIndex ?? work.eventIndex, finishEvent, 'finish', finished.error);\n context.table.set(begin.cmdHandleId, {\n kind: 'encoder',\n role: 'command-buffer',\n value: finished.value,\n });\n const submitEventIndex = findNextEvent(\n context.tape.events,\n finishEventIndex ?? pass.beginEventIndex,\n 'submit',\n begin.cmdHandleId,\n );\n const submitted = context.queue.submit([finished.value]);\n const submitEvent = context.tape.events[submitEventIndex ?? work.eventIndex] ?? begin;\n if (!submitted.ok)\n return eventFailure(\n submitEventIndex ?? work.eventIndex,\n submitEvent,\n 'submit',\n submitted.error,\n );\n await context.queue.onSubmittedWorkDone();\n return ok(undefined);\n}\n\nfunction findNextEvent(\n events: readonly RhiCallEvent[],\n start: number,\n kind: 'finish' | 'submit',\n commandId: string,\n): number | undefined {\n for (let index = start + 1; index < events.length; index++) {\n const event = events[index];\n if (event?.kind === 'finish' && kind === 'finish' && event.cmdHandleId === commandId)\n return index;\n if (event?.kind === 'submit' && kind === 'submit' && event.cmdHandleIds.includes(commandId))\n return index;\n }\n return undefined;\n}\n\nfunction positionError(requested: number, available: number): Result<never, RhiDebugError> {\n return err(\n createRhiDebugError('replay-position-invalid', {\n requested,\n available,\n }),\n );\n}\n\nasync function readWorkAttachment(\n context: ReplayExecutionContext,\n index: TapeIndex,\n work: TapeWorkEntry,\n): Promise<Result<ReplayReadbackResult, RhiDebugError>> {\n const pass = index.passes.find((candidate) => candidate.passIndex === work.passIndex);\n const begin = pass === undefined ? undefined : context.tape.events[pass.beginEventIndex];\n if (begin?.kind !== 'beginRenderPass') {\n return err(\n createRhiDebugError('readback-unsupported', {\n stage: 'readback',\n reason: 'work has no color attachment',\n }),\n );\n }\n const viewId = begin.colorAttachmentViewHandleIds.find(\n (candidate): candidate is string => candidate !== undefined,\n );\n if (viewId === undefined) {\n return err(\n createRhiDebugError('readback-unsupported', {\n stage: 'readback',\n reason: 'render pass has no readable color attachment view',\n }),\n );\n }\n return readReplayResource(\n context.device,\n context.table,\n viewId,\n undefined,\n context.createShaderModule,\n );\n}\n\nexport type { BufferReadbackRange, ReplayReadbackResult } from './readback';\n","// texel-decode.ts -- CPU decode of each uncompressed color format to RGBA8 for preview.\n//\n// The recorder promotes COPY_SRC onto every createTexture, so the replayer's\n// copyTextureToBuffer reads back each uncompressed color texture's raw bytes\n// faithfully (no format change -- replay fidelity intact). This module turns\n// those raw bytes into displayable RGBA8 entirely on the host:\n//\n// raw bytes --formatInfo--> per-channel values --[display map]--> RGBA8\n//\n// Display map (RenderDoc's default initial state, confirmed with the user):\n// float/ufloat -> clamp(v, 0, 1) * 255 (HDR highlights >1 saturate to white)\n// unorm -> v * 255 (already 0..1)\n// snorm -> clamp(v, 0, 1) * 255 (negatives clip to black)\n// uint/sint -> clamp(v, 0, 255) (small integer ids stay visible)\n//\n// Channels -> RGBA: 1ch grayscale (R=G=B), 2ch (R,G,B=0), 3ch (RGB,A=255), 4ch.\n//\n// Related: plan \"all-format color preview\"; reuses formatInfo (rhi-debug texel-layout).\n\nimport { bytesPerTexel, type FormatInfo, formatInfo } from './texel-layout';\n\n/** Decode a single IEEE half-float (16-bit) bit pattern to a JS number. */\nexport function halfToFloat(h: number): number {\n const sign = (h & 0x8000) >> 15;\n const exp = (h & 0x7c00) >> 10;\n const frac = h & 0x03ff;\n const s = sign === 0 ? 1 : -1;\n if (exp === 0) {\n // Subnormal (or zero): 2^-14 * (frac / 1024).\n return s * 2 ** -14 * (frac / 1024);\n }\n if (exp === 0x1f) {\n // Inf / NaN.\n return frac === 0 ? s * Number.POSITIVE_INFINITY : Number.NaN;\n }\n // Normal: 2^(exp-15) * (1 + frac/1024).\n return s * 2 ** (exp - 15) * (1 + frac / 1024);\n}\n\n/**\n * Decode an unsigned-int bit pattern of an 11- or 10-bit unsigned float\n * (rg11b10ufloat layout: no sign bit). 11-bit = 5 exp + 6 mantissa; 10-bit =\n * 5 exp + 5 mantissa. Bias 15, matching the f16 exponent.\n */\nfunction smallUFloatToFloat(bits: number, mantissaBits: number): number {\n const expBits = 5;\n const exp = (bits >> mantissaBits) & ((1 << expBits) - 1);\n const mantMax = 1 << mantissaBits;\n const frac = bits & (mantMax - 1);\n if (exp === 0) return 2 ** -14 * (frac / mantMax);\n if (exp === 0x1f) return frac === 0 ? Number.POSITIVE_INFINITY : Number.NaN;\n return 2 ** (exp - 15) * (1 + frac / mantMax);\n}\n\nconst clamp01 = (v: number) => (v < 0 ? 0 : v > 1 ? 1 : v);\n\n/** Map one decoded channel value to a 0..255 display byte by channel type. */\nfunction toByte(v: number, channelType: FormatInfo['channelType']): number {\n // uint/sint: small integer ids stay visible (clamp 0..255, no normalize).\n if (channelType === 'uint' || channelType === 'sint') {\n return Math.round(v < 0 ? 0 : v > 255 ? 255 : v);\n }\n // float/ufloat clamp HDR to [0,1]; unorm already 0..1; snorm clips negatives.\n return Math.round(clamp01(v) * 255);\n}\n\n/**\n * Read the `channels` raw channel values of one texel at byte offset `off`.\n * Plain formats read each channel at a uniform per-channel byte width; packed\n * formats unpack the single 32-bit word by bit-field. Values are returned in the\n * format's native channel order (BGRA swizzle handled by the caller).\n */\nfunction readTexel(\n view: DataView,\n off: number,\n info: FormatInfo,\n channelBytes: number,\n): [number, number, number, number] {\n const out: [number, number, number, number] = [0, 0, 0, 1];\n\n if (info.packed === 'rgb10a2unorm') {\n const word = view.getUint32(off, true);\n out[0] = (word & 0x3ff) / 1023;\n out[1] = ((word >> 10) & 0x3ff) / 1023;\n out[2] = ((word >> 20) & 0x3ff) / 1023;\n out[3] = ((word >> 30) & 0x3) / 3;\n return out;\n }\n if (info.packed === 'rg11b10ufloat') {\n const word = view.getUint32(off, true);\n out[0] = smallUFloatToFloat(word & 0x7ff, 6);\n out[1] = smallUFloatToFloat((word >> 11) & 0x7ff, 6);\n out[2] = smallUFloatToFloat((word >> 22) & 0x3ff, 5);\n out[3] = 1;\n return out;\n }\n\n for (let c = 0; c < info.channels; c++) {\n const co = off + c * channelBytes;\n let v: number;\n switch (info.channelType) {\n case 'float':\n v = channelBytes === 2 ? halfToFloat(view.getUint16(co, true)) : view.getFloat32(co, true);\n break;\n case 'unorm':\n v =\n channelBytes === 1\n ? view.getUint8(co) / 255\n : channelBytes === 2\n ? view.getUint16(co, true) / 65535\n : view.getUint32(co, true) / 4294967295;\n break;\n case 'snorm': {\n const raw =\n channelBytes === 1\n ? view.getInt8(co)\n : channelBytes === 2\n ? view.getInt16(co, true)\n : view.getInt32(co, true);\n const denom = channelBytes === 1 ? 127 : channelBytes === 2 ? 32767 : 2147483647;\n v = Math.max(-1, raw / denom);\n break;\n }\n case 'uint':\n v =\n channelBytes === 1\n ? view.getUint8(co)\n : channelBytes === 2\n ? view.getUint16(co, true)\n : view.getUint32(co, true);\n break;\n case 'sint':\n v =\n channelBytes === 1\n ? view.getInt8(co)\n : channelBytes === 2\n ? view.getInt16(co, true)\n : view.getInt32(co, true);\n break;\n default:\n v = 0;\n }\n out[c] = v;\n }\n return out;\n}\n\n/**\n * Decode tight raw GPU bytes of an uncompressed color texture into RGBA8 the\n * canvas can paint via putImageData. Returns null when the format has no\n * {@link formatInfo} entry (compressed / depth / unknown -> caller falls back).\n *\n * @param bytes - Tight readback bytes (no row padding), length = w*h*bytesPerTexel.\n * @param format - The texture's real format string.\n * @param width - Texture width in pixels.\n * @param height - Texture height in pixels.\n */\nexport function decodeToRgba8(\n bytes: Uint8Array,\n format: string,\n width: number,\n height: number,\n): Uint8ClampedArray<ArrayBuffer> | null {\n const info = formatInfo(format);\n const texBytes = bytesPerTexel(format as never);\n if (!info || texBytes === undefined) return null;\n\n // Per-channel byte width for plain formats (packed formats ignore this).\n const channelBytes = info.packed ? texBytes : texBytes / info.channels;\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n // Explicit ArrayBuffer backing (not ArrayBufferLike) so ImageData accepts it.\n const out = new Uint8ClampedArray(new ArrayBuffer(width * height * 4));\n\n for (let i = 0; i < width * height; i++) {\n const [c0, c1, c2, c3] = readTexel(view, i * texBytes, info, channelBytes);\n const di = i * 4;\n if (info.channels === 1) {\n const g = toByte(c0, info.channelType);\n out[di] = g;\n out[di + 1] = g;\n out[di + 2] = g;\n out[di + 3] = 255;\n } else if (info.channels === 2) {\n out[di] = toByte(c0, info.channelType);\n out[di + 1] = toByte(c1, info.channelType);\n out[di + 2] = 0;\n out[di + 3] = 255;\n } else {\n // 3 or 4 channels. BGRA stores blue-first -> swizzle B<->R.\n const r = info.bgra ? c2 : c0;\n const b = info.bgra ? c0 : c2;\n out[di] = toByte(r, info.channelType);\n out[di + 1] = toByte(c1, info.channelType);\n out[di + 2] = toByte(b, info.channelType);\n out[di + 3] = info.channels === 4 ? toByte(c3, info.channelType) : 255;\n }\n }\n return out;\n}\n\n/**\n * Decode a single texel from tight raw GPU bytes into raw float RGBA values\n * without the display clamp (D-4: raw byte bypass for HDR fidelity).\n *\n * Unlike `decodeToRgba8` which clamps float/ufloat to [0,1] for display, this\n * returns the decoded per-channel values as-is: float formats keep true values\n * (2.5 stays 2.5, negative stays negative), unorm/snorm stay in their native\n * ranges, uint/sint stay as integers cast to number.\n *\n * Channels: 1ch grayscale (R=G=B, A=1), 2ch (RG, B=0, A=1), 3/4ch (RGBA or\n * BGRA→swizzled). Returns null when the format has no {@link formatInfo} entry.\n *\n * @param bytes - Tight readback bytes, length = width*height*bytesPerTexel.\n * @param format - The texture's real format string.\n * @param width - Texture width in pixels.\n * @param height - Texture height in pixels.\n * @param texelX - 0-based column of the target texel.\n * @param texelY - 0-based row of the target texel.\n */\nexport function decodeTexelRaw(\n bytes: Uint8Array,\n format: string,\n width: number,\n height: number,\n texelX: number,\n texelY: number,\n): [number, number, number, number] | null {\n if (texelX < 0 || texelX >= width || texelY < 0 || texelY >= height) return null;\n\n const info = formatInfo(format);\n const texBytes = bytesPerTexel(format as never);\n if (!info || texBytes === undefined) return null;\n\n const texelIdx = texelY * width + texelX;\n const byteOffset = texelIdx * texBytes;\n\n // Guard: the buffer must be large enough for this texel.\n if (byteOffset + texBytes > bytes.byteLength) return null;\n\n const channelBytes = info.packed ? texBytes : texBytes / info.channels;\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const channels = readTexel(view, byteOffset, info, channelBytes);\n\n if (info.channels === 1) {\n return [channels[0], channels[0], channels[0], 1];\n }\n if (info.channels === 2) {\n return [channels[0], channels[1], 0, 1];\n }\n // 3 or 4 channels. BGRA swizzle B<->R.\n const r = info.bgra ? channels[2] : channels[0];\n const b = info.bgra ? channels[0] : channels[2];\n const a = info.channels === 4 ? channels[3] : 1;\n return [r, channels[1], b, a];\n}\n"]}