rdc-cli 0.6.1__tar.gz → 0.6.3__tar.gz

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 (355) hide show
  1. {rdc_cli-0.6.1/src/rdc_cli.egg-info → rdc_cli-0.6.3}/PKG-INFO +1 -1
  2. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/docs-astro/src/data/commands.json +1 -1
  3. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/src/rdc/_skills/references/commands-quick-ref.md +1 -0
  4. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/src/rdc/commands/descriptors.py +2 -0
  5. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/src/rdc/commands/export.py +12 -2
  6. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/src/rdc/commands/resources.py +2 -1
  7. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/src/rdc/handlers/_helpers.py +15 -6
  8. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/src/rdc/handlers/descriptor.py +3 -0
  9. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/src/rdc/handlers/query.py +3 -0
  10. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/src/rdc/handlers/texture.py +70 -7
  11. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/src/rdc/vfs/router.py +6 -0
  12. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/src/rdc/vfs/tree_cache.py +13 -0
  13. {rdc_cli-0.6.1 → rdc_cli-0.6.3/src/rdc_cli.egg-info}/PKG-INFO +1 -1
  14. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/src/rdc_cli.egg-info/scm_file_list.json +288 -288
  15. rdc_cli-0.6.3/src/rdc_cli.egg-info/scm_version.json +8 -0
  16. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_descriptors_commands.py +5 -0
  17. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_descriptors_daemon.py +12 -3
  18. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_export_commands.py +24 -0
  19. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_formatters.py +3 -3
  20. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_resources_commands.py +5 -1
  21. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_resources_filter.py +18 -0
  22. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_tex_stats_handler.py +192 -9
  23. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_vfs_router.py +7 -0
  24. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_vfs_tree_cache.py +15 -0
  25. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/uv.lock +91 -95
  26. rdc_cli-0.6.1/src/rdc_cli.egg-info/scm_version.json +0 -8
  27. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/.commitlintrc.yml +0 -0
  28. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/.githooks/pre-commit +0 -0
  29. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/.githooks/pre-push +0 -0
  30. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/.github/CODEOWNERS +0 -0
  31. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  32. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  33. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  34. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  35. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/.github/workflows/aur.yml +0 -0
  36. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/.github/workflows/ci.yml +0 -0
  37. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/.github/workflows/commitlint.yml +0 -0
  38. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/.github/workflows/docs.yml +0 -0
  39. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/.gitignore +0 -0
  40. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/.python-version +0 -0
  41. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/.release-please-manifest.json +0 -0
  42. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/CONTRIBUTING.md +0 -0
  43. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/LICENSE +0 -0
  44. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/Makefile +0 -0
  45. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/README.md +0 -0
  46. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/SECURITY.md +0 -0
  47. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/aur/PKGBUILD +0 -0
  48. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/aur/stable/PKGBUILD +0 -0
  49. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/docker/Dockerfile +0 -0
  50. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/docs-astro/astro.config.mjs +0 -0
  51. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/docs-astro/package-lock.json +0 -0
  52. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/docs-astro/package.json +0 -0
  53. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/docs-astro/public/.nojekyll +0 -0
  54. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/docs-astro/public/favicon.svg +0 -0
  55. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/docs-astro/src/components/Commands.astro +0 -0
  56. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/docs-astro/src/components/Demo.astro +0 -0
  57. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/docs-astro/src/components/Features.astro +0 -0
  58. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/docs-astro/src/components/Footer.astro +0 -0
  59. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/docs-astro/src/components/Hero.astro +0 -0
  60. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/docs-astro/src/components/Install.astro +0 -0
  61. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/docs-astro/src/components/Navbar.astro +0 -0
  62. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/docs-astro/src/components/Philosophy.astro +0 -0
  63. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/docs-astro/src/components/Terminal.astro +0 -0
  64. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/docs-astro/src/components/ThemeSwitcher.astro +0 -0
  65. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/docs-astro/src/data/replay.json +0 -0
  66. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/docs-astro/src/data/stats.json +0 -0
  67. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/docs-astro/src/layouts/Base.astro +0 -0
  68. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/docs-astro/src/layouts/Docs.astro +0 -0
  69. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/docs-astro/src/pages/docs/ai-integration.astro +0 -0
  70. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/docs-astro/src/pages/docs/commands.astro +0 -0
  71. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/docs-astro/src/pages/docs/design.astro +0 -0
  72. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/docs-astro/src/pages/docs/examples.astro +0 -0
  73. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/docs-astro/src/pages/docs/index.astro +0 -0
  74. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/docs-astro/src/pages/docs/install.astro +0 -0
  75. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/docs-astro/src/pages/docs/remote.astro +0 -0
  76. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/docs-astro/src/pages/docs/usage.astro +0 -0
  77. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/docs-astro/src/pages/docs/vfs.astro +0 -0
  78. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/docs-astro/src/pages/index.astro +0 -0
  79. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/docs-astro/src/styles/global.css +0 -0
  80. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/docs-astro/tailwind.config.mjs +0 -0
  81. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/docs-astro/tapes/pipeline.tape +0 -0
  82. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/docs-astro/tapes/quickstart.tape +0 -0
  83. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/docs-astro/tests/validate.mjs +0 -0
  84. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/docs-astro/tsconfig.json +0 -0
  85. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/mypy.ini +0 -0
  86. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/pixi.lock +0 -0
  87. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/pixi.toml +0 -0
  88. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/pyproject.toml +0 -0
  89. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/release-please-config.json +0 -0
  90. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/ruff.toml +0 -0
  91. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/scripts/build-renderdoc.sh +0 -0
  92. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/scripts/build_renderdoc.py +0 -0
  93. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/scripts/capture_fixture.sh +0 -0
  94. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/scripts/dev_install.py +0 -0
  95. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/scripts/e2e_test.py +0 -0
  96. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/scripts/ensure-renderdoc.py +0 -0
  97. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/scripts/ensure-renderdoc.sh +0 -0
  98. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/scripts/ensure-skill-link.py +0 -0
  99. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/scripts/gen-commands.py +0 -0
  100. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/scripts/gen-replay.py +0 -0
  101. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/scripts/gen-skill-ref.py +0 -0
  102. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/scripts/gen-stats.py +0 -0
  103. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/scripts/gen_and_check.py +0 -0
  104. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/scripts/setup-renderdoc.sh +0 -0
  105. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/scripts/setup-vulkan-samples.sh +0 -0
  106. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/scripts/setup_android_tools.py +0 -0
  107. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/scripts/setup_vulkan_samples.py +0 -0
  108. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/scripts/verify-package.sh +0 -0
  109. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/scripts/verify_package.py +0 -0
  110. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/setup.cfg +0 -0
  111. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/src/rdc/__init__.py +0 -0
  112. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/src/rdc/_build_renderdoc.py +0 -0
  113. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/src/rdc/_platform.py +0 -0
  114. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/src/rdc/_progress.py +0 -0
  115. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/src/rdc/_skills/SKILL.md +0 -0
  116. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/src/rdc/_skills/__init__.py +0 -0
  117. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/src/rdc/_transport.py +0 -0
  118. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/src/rdc/adapter.py +0 -0
  119. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/src/rdc/capture_core.py +0 -0
  120. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/src/rdc/cli.py +0 -0
  121. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/src/rdc/commands/_helpers.py +0 -0
  122. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/src/rdc/commands/android.py +0 -0
  123. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/src/rdc/commands/assert_ci.py +0 -0
  124. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/src/rdc/commands/assert_image.py +0 -0
  125. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/src/rdc/commands/capture.py +0 -0
  126. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/src/rdc/commands/capture_control.py +0 -0
  127. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/src/rdc/commands/capturefile.py +0 -0
  128. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/src/rdc/commands/cbuffer.py +0 -0
  129. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/src/rdc/commands/completion.py +0 -0
  130. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/src/rdc/commands/counters.py +0 -0
  131. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/src/rdc/commands/debug.py +0 -0
  132. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/src/rdc/commands/diff.py +0 -0
  133. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/src/rdc/commands/doctor.py +0 -0
  134. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/src/rdc/commands/events.py +0 -0
  135. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/src/rdc/commands/info.py +0 -0
  136. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/src/rdc/commands/install_skill.py +0 -0
  137. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/src/rdc/commands/mesh.py +0 -0
  138. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/src/rdc/commands/pick_pixel.py +0 -0
  139. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/src/rdc/commands/pipeline.py +0 -0
  140. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/src/rdc/commands/pixel.py +0 -0
  141. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/src/rdc/commands/remote.py +0 -0
  142. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/src/rdc/commands/script.py +0 -0
  143. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/src/rdc/commands/search.py +0 -0
  144. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/src/rdc/commands/serve.py +0 -0
  145. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/src/rdc/commands/session.py +0 -0
  146. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/src/rdc/commands/setup_renderdoc.py +0 -0
  147. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/src/rdc/commands/shader_edit.py +0 -0
  148. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/src/rdc/commands/snapshot.py +0 -0
  149. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/src/rdc/commands/tex_stats.py +0 -0
  150. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/src/rdc/commands/unix_helpers.py +0 -0
  151. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/src/rdc/commands/unused_targets.py +0 -0
  152. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/src/rdc/commands/usage.py +0 -0
  153. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/src/rdc/commands/vfs.py +0 -0
  154. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/src/rdc/daemon_client.py +0 -0
  155. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/src/rdc/daemon_server.py +0 -0
  156. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/src/rdc/diff/__init__.py +0 -0
  157. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/src/rdc/diff/alignment.py +0 -0
  158. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/src/rdc/diff/draws.py +0 -0
  159. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/src/rdc/diff/framebuffer.py +0 -0
  160. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/src/rdc/diff/pipeline.py +0 -0
  161. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/src/rdc/diff/resources.py +0 -0
  162. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/src/rdc/diff/stats.py +0 -0
  163. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/src/rdc/diff/summary.py +0 -0
  164. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/src/rdc/discover.py +0 -0
  165. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/src/rdc/formatters/json_fmt.py +0 -0
  166. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/src/rdc/formatters/kv.py +0 -0
  167. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/src/rdc/formatters/options.py +0 -0
  168. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/src/rdc/formatters/tsv.py +0 -0
  169. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/src/rdc/handlers/__init__.py +0 -0
  170. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/src/rdc/handlers/_types.py +0 -0
  171. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/src/rdc/handlers/buffer.py +0 -0
  172. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/src/rdc/handlers/capture.py +0 -0
  173. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/src/rdc/handlers/capturefile.py +0 -0
  174. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/src/rdc/handlers/core.py +0 -0
  175. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/src/rdc/handlers/debug.py +0 -0
  176. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/src/rdc/handlers/pipe_state.py +0 -0
  177. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/src/rdc/handlers/pixel.py +0 -0
  178. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/src/rdc/handlers/script.py +0 -0
  179. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/src/rdc/handlers/shader.py +0 -0
  180. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/src/rdc/handlers/shader_edit.py +0 -0
  181. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/src/rdc/handlers/unused.py +0 -0
  182. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/src/rdc/handlers/vfs.py +0 -0
  183. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/src/rdc/image_compare.py +0 -0
  184. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/src/rdc/protocol.py +0 -0
  185. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/src/rdc/remote_core.py +0 -0
  186. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/src/rdc/remote_state.py +0 -0
  187. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/src/rdc/services/__init__.py +0 -0
  188. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/src/rdc/services/diff_service.py +0 -0
  189. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/src/rdc/services/query_service.py +0 -0
  190. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/src/rdc/services/session_service.py +0 -0
  191. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/src/rdc/session_state.py +0 -0
  192. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/src/rdc/target_state.py +0 -0
  193. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/src/rdc/vfs/__init__.py +0 -0
  194. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/src/rdc/vfs/formatter.py +0 -0
  195. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/src/rdc_cli.egg-info/SOURCES.txt +0 -0
  196. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/src/rdc_cli.egg-info/dependency_links.txt +0 -0
  197. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/src/rdc_cli.egg-info/entry_points.txt +0 -0
  198. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/src/rdc_cli.egg-info/requires.txt +0 -0
  199. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/src/rdc_cli.egg-info/top_level.txt +0 -0
  200. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/conftest.py +0 -0
  201. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/e2e/__init__.py +0 -0
  202. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/e2e/blackbox_test_catalog.md +0 -0
  203. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/e2e/conftest.py +0 -0
  204. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/e2e/e2e_helpers.py +0 -0
  205. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/e2e/test_advanced.py +0 -0
  206. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/e2e/test_assert.py +0 -0
  207. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/e2e/test_capture.py +0 -0
  208. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/e2e/test_capturefile.py +0 -0
  209. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/e2e/test_debug.py +0 -0
  210. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/e2e/test_diff.py +0 -0
  211. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/e2e/test_export.py +0 -0
  212. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/e2e/test_formats.py +0 -0
  213. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/e2e/test_presession.py +0 -0
  214. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/e2e/test_query.py +0 -0
  215. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/e2e/test_session.py +0 -0
  216. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/e2e/test_shader_edit.py +0 -0
  217. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/e2e/test_vfs.py +0 -0
  218. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/fixtures/gles-multipass-debug.apk +0 -0
  219. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/fixtures/gles-triangle-debug.apk +0 -0
  220. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/fixtures/gles_android_mali.rdc +0 -0
  221. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/fixtures/gles_multipass_mali.rdc +0 -0
  222. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/fixtures/hello_triangle.rdc +0 -0
  223. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/fixtures/vkcube.rdc +0 -0
  224. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/fixtures/vkcube_validation.rdc +0 -0
  225. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/integration/test_build_renderdoc_integration.py +0 -0
  226. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/integration/test_daemon_handlers_real.py +0 -0
  227. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/integration/test_mock_api_sync.py +0 -0
  228. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/integration/test_real_replay.py +0 -0
  229. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/integration/test_vulkan_samples.py +0 -0
  230. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/mocks/mock_renderdoc.py +0 -0
  231. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/conftest.py +0 -0
  232. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_adapter.py +0 -0
  233. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_android_commands.py +0 -0
  234. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_assert_ci_commands.py +0 -0
  235. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_assert_image_command.py +0 -0
  236. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_binary_daemon.py +0 -0
  237. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_buffer_decode.py +0 -0
  238. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_build_renderdoc.py +0 -0
  239. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_capture.py +0 -0
  240. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_capture_control.py +0 -0
  241. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_capture_core.py +0 -0
  242. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_capture_handlers.py +0 -0
  243. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_capturefile_commands.py +0 -0
  244. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_capturefile_handlers.py +0 -0
  245. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_cbuffer_commands.py +0 -0
  246. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_ci_files.py +0 -0
  247. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_cli.py +0 -0
  248. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_cli_session_flag.py +0 -0
  249. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_completion.py +0 -0
  250. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_count_shadermap.py +0 -0
  251. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_counters_commands.py +0 -0
  252. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_counters_daemon.py +0 -0
  253. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_daemon_crash_regression.py +0 -0
  254. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_daemon_output_quality.py +0 -0
  255. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_daemon_pipeline_extended.py +0 -0
  256. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_daemon_server_unit.py +0 -0
  257. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_daemon_shader_api_fix.py +0 -0
  258. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_daemon_shader_extended.py +0 -0
  259. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_daemon_transport.py +0 -0
  260. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_debug_commands.py +0 -0
  261. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_debug_handlers.py +0 -0
  262. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_dev_install.py +0 -0
  263. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_diff_alignment.py +0 -0
  264. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_diff_command.py +0 -0
  265. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_diff_draws.py +0 -0
  266. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_diff_framebuffer.py +0 -0
  267. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_diff_pipeline.py +0 -0
  268. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_diff_resources.py +0 -0
  269. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_diff_service.py +0 -0
  270. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_diff_stats.py +0 -0
  271. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_diff_summary.py +0 -0
  272. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_discover.py +0 -0
  273. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_doctor.py +0 -0
  274. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_doctor_hints.py +0 -0
  275. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_draws_daemon.py +0 -0
  276. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_draws_events_cli.py +0 -0
  277. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_draws_events_daemon.py +0 -0
  278. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_eid_completion.py +0 -0
  279. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_events_commands.py +0 -0
  280. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_export_overlay.py +0 -0
  281. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_fix1_draws_pass_name.py +0 -0
  282. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_fix2_vfs_intermediate_dirs.py +0 -0
  283. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_fix3_friendly_pass_name.py +0 -0
  284. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_formatters_kv.py +0 -0
  285. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_gen_skill_ref.py +0 -0
  286. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_handlers_remote.py +0 -0
  287. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_image_compare.py +0 -0
  288. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_info_commands.py +0 -0
  289. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_install_skill.py +0 -0
  290. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_json_errors.py +0 -0
  291. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_keep_remote.py +0 -0
  292. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_mesh_commands.py +0 -0
  293. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_mesh_handler.py +0 -0
  294. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_mock_capture_types.py +0 -0
  295. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_mock_renderdoc.py +0 -0
  296. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_open_remote.py +0 -0
  297. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_output_options.py +0 -0
  298. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_overlay_handler.py +0 -0
  299. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_pass_deps.py +0 -0
  300. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_pick_pixel_commands.py +0 -0
  301. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_pick_pixel_daemon.py +0 -0
  302. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_pipeline_cli_phase27.py +0 -0
  303. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_pipeline_commands.py +0 -0
  304. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_pipeline_daemon.py +0 -0
  305. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_pipeline_section_routing.py +0 -0
  306. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_pipeline_shader.py +0 -0
  307. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_pipeline_state.py +0 -0
  308. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_pixel_history_commands.py +0 -0
  309. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_pixel_history_daemon.py +0 -0
  310. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_pixi_files.py +0 -0
  311. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_platform.py +0 -0
  312. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_progress.py +0 -0
  313. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_protocol.py +0 -0
  314. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_query_service.py +0 -0
  315. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_quickfix_batch.py +0 -0
  316. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_remote_commands.py +0 -0
  317. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_remote_core.py +0 -0
  318. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_remote_replay.py +0 -0
  319. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_remote_setup.py +0 -0
  320. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_remote_state.py +0 -0
  321. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_remote_status_disconnect.py +0 -0
  322. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_require_pipe.py +0 -0
  323. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_resource_semantic_completion.py +0 -0
  324. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_script_command.py +0 -0
  325. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_script_handler.py +0 -0
  326. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_search.py +0 -0
  327. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_semantic_completion.py +0 -0
  328. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_serve.py +0 -0
  329. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_session_commands.py +0 -0
  330. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_session_completion.py +0 -0
  331. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_session_service.py +0 -0
  332. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_session_state.py +0 -0
  333. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_setup_renderdoc.py +0 -0
  334. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_setup_vulkan_samples.py +0 -0
  335. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_shader_edit_commands.py +0 -0
  336. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_shader_edit_handlers.py +0 -0
  337. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_shader_preload.py +0 -0
  338. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_skill_structure.py +0 -0
  339. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_snapshot_command.py +0 -0
  340. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_split_binary.py +0 -0
  341. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_split_core.py +0 -0
  342. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_stats_event_count.py +0 -0
  343. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_target_state.py +0 -0
  344. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_tex_stats_commands.py +0 -0
  345. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_tooling_files.py +0 -0
  346. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_unix_helpers_commands.py +0 -0
  347. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_unused_targets.py +0 -0
  348. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_usage_commands.py +0 -0
  349. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_usage_daemon.py +0 -0
  350. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_vfs_binary.py +0 -0
  351. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_vfs_commands.py +0 -0
  352. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_vfs_completion.py +0 -0
  353. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_vfs_daemon.py +0 -0
  354. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_vfs_formatter.py +0 -0
  355. {rdc_cli-0.6.1 → rdc_cli-0.6.3}/tests/unit/test_windows_compat.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: rdc-cli
3
- Version: 0.6.1
3
+ Version: 0.6.3
4
4
  Summary: CLI for RenderDoc .rdc captures
5
5
  Author: Jim
6
6
  License-Expression: MIT
@@ -199,7 +199,7 @@
199
199
  "name": "texture",
200
200
  "id": "texture",
201
201
  "help": "Export texture as PNG.",
202
- "usage": "rdc texture <ID> [-o PATH] [--mip INTEGER] [--raw]"
202
+ "usage": "rdc texture <ID> [-o PATH] [--mip INTEGER] [--slice INTEGER RANGE] [--raw]"
203
203
  },
204
204
  {
205
205
  "name": "buffer",
@@ -1206,6 +1206,7 @@ Export texture as PNG.
1206
1206
  |------|------|------|---------|
1207
1207
  | `-o, --output` | Write to file | path | |
1208
1208
  | `--mip` | Mip level (default 0) | integer | 0 |
1209
+ | `--slice` | Texture array or 3D depth slice (default 0) | integer range | 0 |
1209
1210
  | `--raw` | Force raw output even on TTY | flag | |
1210
1211
 
1211
1212
  ## `rdc thumbnail`
@@ -68,6 +68,7 @@ def descriptors_cmd( # noqa: PLR0913
68
68
  r.get("format", "-"),
69
69
  r.get("width", "-"),
70
70
  r.get("height", "-"),
71
+ r.get("depth", "-"),
71
72
  ]
72
73
  for r in rows
73
74
  ]
@@ -85,6 +86,7 @@ def descriptors_cmd( # noqa: PLR0913
85
86
  "FORMAT",
86
87
  "WIDTH",
87
88
  "HEIGHT",
89
+ "DEPTH",
88
90
  ],
89
91
  no_header=no_header,
90
92
  )
@@ -119,10 +119,20 @@ def _complete_rt_target(
119
119
  @click.argument("id", type=int, shell_complete=_complete_texture_id)
120
120
  @click.option("-o", "--output", type=click.Path(), default=None, help="Write to file")
121
121
  @click.option("--mip", default=0, type=int, help="Mip level (default 0)")
122
+ @click.option(
123
+ "--slice",
124
+ "array_slice",
125
+ default=0,
126
+ type=click.IntRange(min=0),
127
+ help="Texture array or 3D depth slice (default 0)",
128
+ )
122
129
  @click.option("--raw", is_flag=True, help="Force raw output even on TTY")
123
- def texture_cmd(id: int, output: str | None, mip: int, raw: bool) -> None:
130
+ def texture_cmd(id: int, output: str | None, mip: int, array_slice: int, raw: bool) -> None:
124
131
  """Export texture as PNG."""
125
- vfs_path = f"/textures/{id}/mips/{mip}.png" if mip > 0 else f"/textures/{id}/image.png"
132
+ if array_slice > 0:
133
+ vfs_path = f"/textures/{id}/mips/{mip}/slices/{array_slice}.png"
134
+ else:
135
+ vfs_path = f"/textures/{id}/mips/{mip}.png" if mip > 0 else f"/textures/{id}/image.png"
126
136
  _export_vfs_path(vfs_path, output, raw)
127
137
 
128
138
 
@@ -139,12 +139,13 @@ def resources_cmd( # noqa: PLR0913
139
139
  r.get("name", "-"),
140
140
  r.get("width", "-"),
141
141
  r.get("height", "-"),
142
+ r.get("depth", "-"),
142
143
  r.get("format", "-"),
143
144
  r.get("size", "-"),
144
145
  ]
145
146
  for r in rows
146
147
  ]
147
- header = ["ID", "TYPE", "NAME", "WIDTH", "HEIGHT", "FORMAT", "SIZE"]
148
+ header = ["ID", "TYPE", "NAME", "WIDTH", "HEIGHT", "DEPTH", "FORMAT", "SIZE"]
148
149
  write_tsv(tsv_rows, header=header, no_header=no_header)
149
150
 
150
151
  render_list(
@@ -235,21 +235,22 @@ def _build_shader_cache(state: DaemonState) -> None:
235
235
  populate_shaders_subtree(state.vfs_tree, state.shader_meta)
236
236
 
237
237
 
238
- def _make_texsave(rd: Any, resource_id: Any, mip: int = 0) -> Any:
238
+ def _make_texsave(rd: Any, resource_id: Any, mip: int = 0, array_slice: int = 0) -> Any:
239
239
  """Create a TextureSave object using the renderdoc module."""
240
240
  ts = rd.TextureSave()
241
241
  ts.resourceId = resource_id
242
242
  ts.mip = mip
243
243
  ts.slice = rd.TextureSliceMapping()
244
+ ts.slice.sliceIndex = array_slice
244
245
  ts.destType = rd.FileType.PNG
245
246
  return ts
246
247
 
247
248
 
248
- def _make_subresource(rd: Any, mip: int = 0) -> Any:
249
+ def _make_subresource(rd: Any, mip: int = 0, array_slice: int = 0) -> Any:
249
250
  """Create a Subresource object using the renderdoc module."""
250
251
  sub = rd.Subresource()
251
252
  sub.mip = mip
252
- sub.slice = 0
253
+ sub.slice = array_slice
253
254
  sub.sample = 0
254
255
  return sub
255
256
 
@@ -340,7 +341,15 @@ def _unpack_r9g9b9e5(words: Any) -> Any:
340
341
  return np.stack([rm * scale, gm * scale, bm * scale], axis=-1).astype(np.float32)
341
342
 
342
343
 
343
- def _decode_texture_png(rd: Any, tex: Any, raw: bytes, mip: int, *, is_depth: bool) -> bytes | None:
344
+ def _decode_texture_png(
345
+ rd: Any,
346
+ tex: Any,
347
+ raw: bytes,
348
+ mip: int,
349
+ *,
350
+ is_depth: bool,
351
+ depth_override: int | None = None,
352
+ ) -> bytes | None:
344
353
  """Decode tightly packed GetTextureData bytes into PNG bytes.
345
354
 
346
355
  Handles the full ``ResourceFormatType.Regular`` space deliberately: every
@@ -384,7 +393,7 @@ def _decode_texture_png(rd: Any, tex: Any, raw: bytes, mip: int, *, is_depth: bo
384
393
  return None
385
394
  width = max(1, tex.width >> mip)
386
395
  height = max(1, tex.height >> mip)
387
- depth_lvl = max(1, getattr(tex, "depth", 1) >> mip)
396
+ depth_lvl = depth_override or max(1, getattr(tex, "depth", 1) >> mip)
388
397
  if len(raw) != width * height * depth_lvl * 4:
389
398
  return None
390
399
  words = np.frombuffer(raw, dtype=np.dtype("<u4")).reshape((depth_lvl * height, width))
@@ -410,7 +419,7 @@ def _decode_texture_png(rd: Any, tex: Any, raw: bytes, mip: int, *, is_depth: bo
410
419
 
411
420
  width = max(1, tex.width >> mip)
412
421
  height = max(1, tex.height >> mip)
413
- depth_lvl = max(1, getattr(tex, "depth", 1) >> mip)
422
+ depth_lvl = depth_override or max(1, getattr(tex, "depth", 1) >> mip)
414
423
  cc = fmt.compCount
415
424
  cbw = fmt.compByteWidth
416
425
  if cc <= 0 or len(raw) != width * height * depth_lvl * cc * cbw:
@@ -127,6 +127,9 @@ def _handle_descriptors(
127
127
  if tex is not None:
128
128
  d_row["width"] = tex.width
129
129
  d_row["height"] = tex.height
130
+ d_row["depth"] = getattr(tex, "depth", 1)
131
+ d_row["dimension"] = getattr(tex, "dimension", 0)
132
+ d_row["texture_type"] = _enum_name(getattr(tex, "type", ""))
130
133
  if type_name in ("Sampler", "ImageSampler"):
131
134
  s = getattr(ud, "sampler", None)
132
135
  if s is not None:
@@ -166,6 +166,9 @@ def enrich_resource_row(row: dict[str, Any], state: DaemonState) -> dict[str, An
166
166
  fmt = getattr(tex, "format", None)
167
167
  row["width"] = tex.width
168
168
  row["height"] = tex.height
169
+ row["depth"] = getattr(tex, "depth", 1)
170
+ row["dimension"] = getattr(tex, "dimension", 0)
171
+ row["texture_type"] = _enum_name(getattr(tex, "type", ""))
169
172
  row["format"] = fmt.Name() if fmt is not None and hasattr(fmt, "Name") else ""
170
173
  row["size"] = getattr(tex, "byteSize", 0)
171
174
  return row
@@ -33,6 +33,33 @@ _OVERLAY_MAP: dict[str, int] = {
33
33
  }
34
34
 
35
35
 
36
+ def _is_block_compressed(fmt: Any) -> bool:
37
+ """Return whether RenderDoc identifies a format as block-compressed."""
38
+ block_format = getattr(fmt, "BlockFormat", None)
39
+ renderdoc_result = bool(block_format()) if callable(block_format) else False
40
+ return renderdoc_result or fmt.Name().upper().startswith(("ASTC", "BC", "EAC", "ETC", "PVRTC"))
41
+
42
+
43
+ def _select_3d_slice(tex: Any, raw: bytes, mip: int, array_slice: int, rd: Any) -> bytes:
44
+ """Return one depth slice when remote GetTextureData returns a whole 3D mip."""
45
+ depth = max(1, tex.depth >> mip)
46
+ if depth == 1:
47
+ return raw
48
+ width = max(1, tex.width >> mip)
49
+ height = max(1, tex.height >> mip)
50
+ fmt = tex.format
51
+ if fmt.type == rd.ResourceFormatType.Regular:
52
+ slice_size = width * height * fmt.compCount * fmt.compByteWidth
53
+ elif fmt.type in (rd.ResourceFormatType.R11G11B10, rd.ResourceFormatType.R9G9B9E5):
54
+ slice_size = width * height * 4
55
+ else:
56
+ return raw
57
+ if len(raw) != slice_size * depth:
58
+ return raw
59
+ start = array_slice * slice_size
60
+ return raw[start : start + slice_size]
61
+
62
+
36
63
  def _handle_tex_info(
37
64
  request_id: int, params: dict[str, Any], state: DaemonState
38
65
  ) -> tuple[dict[str, Any], bool]:
@@ -70,20 +97,36 @@ def _export_remote(
70
97
  resource_id: Any,
71
98
  temp_path: Path,
72
99
  mip: int,
100
+ array_slice: int = 0,
73
101
  *,
74
102
  is_depth: bool = False,
103
+ allow_save_fallback: bool = False,
75
104
  ) -> tuple[dict[str, Any], bool]:
76
105
  """Fetch raw pixels over the wire and decode them locally to a PNG."""
77
106
  controller = state.adapter.controller # type: ignore[union-attr]
78
- sub = _make_subresource(state.rd, mip)
107
+ sub = _make_subresource(state.rd, mip, array_slice)
79
108
  try:
80
109
  raw = controller.GetTextureData(resource_id, sub)
81
110
  except Exception as exc: # noqa: BLE001
82
111
  return _error_response(request_id, -32002, f"GetTextureData failed: {exc}"), True
83
112
  if not raw:
84
113
  return _error_response(request_id, -32002, "no texture data returned"), True
85
- png = _decode_texture_png(state.rd, tex, raw, mip, is_depth=is_depth)
114
+ if tex.type == state.rd.TextureType.Texture3D:
115
+ raw = _select_3d_slice(tex, raw, mip, array_slice, state.rd)
116
+ depth_override = 1 if tex.type == state.rd.TextureType.Texture3D else None
117
+ png = _decode_texture_png(
118
+ state.rd, tex, raw, mip, is_depth=is_depth, depth_override=depth_override
119
+ )
86
120
  if png is None:
121
+ if allow_save_fallback and _is_block_compressed(tex.format):
122
+ texsave = _make_texsave(state.rd, resource_id, mip, array_slice)
123
+ success = controller.SaveTexture(texsave, str(temp_path))
124
+ if success and temp_path.exists():
125
+ return _result_response(
126
+ request_id,
127
+ {"path": str(temp_path), "size": temp_path.stat().st_size},
128
+ ), True
129
+ return _error_response(request_id, -32002, "SaveTexture fallback failed"), True
87
130
  fmt_name = tex.format.Name() if hasattr(tex.format, "Name") else ""
88
131
  return _error_response(
89
132
  request_id, -32002, f"format {fmt_name} not supported for remote decode"
@@ -107,6 +150,7 @@ def _handle_tex_export(
107
150
  return _error_response(request_id, -32002, "temp directory not available"), True
108
151
  res_id = int(params.get("id", 0))
109
152
  mip = int(params.get("mip", 0))
153
+ array_slice = int(params.get("slice", 0))
110
154
  tex = state.tex_map.get(res_id)
111
155
  if tex is None:
112
156
  return _error_response(request_id, -32001, f"texture {res_id} not found"), True
@@ -114,15 +158,31 @@ def _handle_tex_export(
114
158
  return _error_response(
115
159
  request_id, -32001, f"mip {mip} out of range (max: {tex.mips - 1})"
116
160
  ), True
161
+ slice_count = tex.arraysize
162
+ if tex.type == state.rd.TextureType.Texture3D:
163
+ slice_count = max(1, tex.depth >> mip)
164
+ if array_slice < 0 or array_slice >= slice_count:
165
+ return _error_response(
166
+ request_id, -32001, f"slice {array_slice} out of range (max: {slice_count - 1})"
167
+ ), True
117
168
  eid = int(params.get("eid", state.current_eid))
118
169
  err = _set_frame_event(state, eid)
119
170
  if err:
120
171
  return _error_response(request_id, -32002, err), True
121
- temp_path = state.temp_dir / f"tex_{res_id}_mip{mip}.png"
172
+ temp_path = state.temp_dir / f"tex_{res_id}_mip{mip}_slice{array_slice}.png"
122
173
  if state.is_remote:
123
- return _export_remote(request_id, state, tex, tex.resourceId, temp_path, mip)
174
+ return _export_remote(
175
+ request_id,
176
+ state,
177
+ tex,
178
+ tex.resourceId,
179
+ temp_path,
180
+ mip,
181
+ array_slice,
182
+ allow_save_fallback=True,
183
+ )
124
184
  controller = state.adapter.controller
125
- texsave = _make_texsave(state.rd, tex.resourceId, mip)
185
+ texsave = _make_texsave(state.rd, tex.resourceId, mip, array_slice)
126
186
  success = controller.SaveTexture(texsave, str(temp_path))
127
187
  if not success or not temp_path.exists():
128
188
  return _error_response(request_id, -32002, "SaveTexture failed"), True
@@ -332,9 +392,12 @@ def _handle_tex_stats(
332
392
  return _error_response(
333
393
  request_id, -32001, f"mip {mip} out of range (max: {tex.mips - 1})"
334
394
  ), True
335
- if array_slice < 0 or array_slice >= tex.arraysize:
395
+ slice_count = tex.arraysize
396
+ if tex.type == rd.TextureType.Texture3D:
397
+ slice_count = max(1, tex.depth >> mip)
398
+ if array_slice < 0 or array_slice >= slice_count:
336
399
  return _error_response(
337
- request_id, -32001, f"slice {array_slice} out of range (max: {tex.arraysize - 1})"
400
+ request_id, -32001, f"slice {array_slice} out of range (max: {slice_count - 1})"
338
401
  ), True
339
402
 
340
403
  sub = rd.Subresource()
@@ -206,6 +206,12 @@ _r(
206
206
  "tex_export",
207
207
  [("id", int), ("mip", int)],
208
208
  )
209
+ _r(
210
+ r"/textures/(?P<id>\d+)/mips/(?P<mip>\d+)/slices/(?P<slice>\d+)\.png",
211
+ "leaf_bin",
212
+ "tex_export",
213
+ [("id", int), ("mip", int), ("slice", int)],
214
+ )
209
215
  _r(r"/textures/(?P<id>\d+)/data", "leaf_bin", "tex_raw", [("id", int)])
210
216
 
211
217
  _r("/buffers", "dir")
@@ -221,6 +221,19 @@ def build_vfs_skeleton(
221
221
  tree.static[f"{prefix}/mips"] = VfsNode("mips", "dir", list(mip_children))
222
222
  for i in range(mip_count):
223
223
  tree.static[f"{prefix}/mips/{i}.png"] = VfsNode(f"{i}.png", "leaf_bin")
224
+ if getattr(getattr(t, "type", None), "name", "") == "Texture3D":
225
+ slice_count = max(1, getattr(t, "depth", 1) >> i)
226
+ else:
227
+ slice_count = getattr(t, "arraysize", 1)
228
+ if slice_count > 1:
229
+ mip_path = f"{prefix}/mips/{i}"
230
+ tree.static[f"{prefix}/mips"].children.append(str(i))
231
+ tree.static[mip_path] = VfsNode(str(i), "dir", ["slices"])
232
+ slices_path = f"{prefix}/mips/{i}/slices"
233
+ slice_children = [f"{j}.png" for j in range(1, slice_count)]
234
+ tree.static[slices_path] = VfsNode("slices", "dir", slice_children)
235
+ for j in range(1, slice_count):
236
+ tree.static[f"{slices_path}/{j}.png"] = VfsNode(f"{j}.png", "leaf_bin")
224
237
 
225
238
  # /buffers
226
239
  buf_ids = [str(int(getattr(b, "resourceId", 0))) for b in _buffers]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: rdc-cli
3
- Version: 0.6.1
3
+ Version: 0.6.3
4
4
  Summary: CLI for RenderDoc .rdc captures
5
5
  Author: Jim
6
6
  License-Expression: MIT