bobframes 0.1.0__py3-none-any.whl

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 (130) hide show
  1. bobframes/__init__.py +3 -0
  2. bobframes/_version.py +1 -0
  3. bobframes/catalog.py +154 -0
  4. bobframes/cli.py +266 -0
  5. bobframes/derive_post_merge.py +365 -0
  6. bobframes/derives/__init__.py +0 -0
  7. bobframes/derives/pass_class_breakdown.py +102 -0
  8. bobframes/derives/texture_usage.py +121 -0
  9. bobframes/discovery.py +132 -0
  10. bobframes/global_entities.py +99 -0
  11. bobframes/html/__init__.py +0 -0
  12. bobframes/html/template.py +1056 -0
  13. bobframes/lint.py +114 -0
  14. bobframes/manifest.py +127 -0
  15. bobframes/parquetize.py +282 -0
  16. bobframes/parsers/__init__.py +0 -0
  17. bobframes/parsers/derive_program_transitions.py +73 -0
  18. bobframes/parsers/parse_init_state.py +675 -0
  19. bobframes/paths.py +111 -0
  20. bobframes/probes/__init__.py +0 -0
  21. bobframes/probes/whatif.py +165 -0
  22. bobframes/qrd_harness.py +119 -0
  23. bobframes/query_examples.py +222 -0
  24. bobframes/rdcmd.py +72 -0
  25. bobframes/replay/__init__.py +26 -0
  26. bobframes/replay/replay_main.py +2305 -0
  27. bobframes/reports/__init__.py +0 -0
  28. bobframes/reports/_dashboard.py +425 -0
  29. bobframes/reports/ab.py +88 -0
  30. bobframes/reports/base.py +114 -0
  31. bobframes/reports/cache.py +147 -0
  32. bobframes/reports/chrome.py +1306 -0
  33. bobframes/reports/cli.py +99 -0
  34. bobframes/reports/delta.py +167 -0
  35. bobframes/reports/discovery.py +118 -0
  36. bobframes/reports/draws_by_class.py +165 -0
  37. bobframes/reports/formatters.py +122 -0
  38. bobframes/reports/instancing_opportunities.py +276 -0
  39. bobframes/reports/orchestrator.py +59 -0
  40. bobframes/reports/overdraw.py +293 -0
  41. bobframes/reports/pass_gpu.py +190 -0
  42. bobframes/reports/shader_hotlist.py +240 -0
  43. bobframes/reports/trend_table.py +444 -0
  44. bobframes/resource_labels.py +162 -0
  45. bobframes/run.py +480 -0
  46. bobframes/schemas.py +426 -0
  47. bobframes/stable_keys.py +83 -0
  48. bobframes/tests/__init__.py +0 -0
  49. bobframes/tests/_render_util.py +84 -0
  50. bobframes/tests/data/golden/_reports/draws_by_class.html +323 -0
  51. bobframes/tests/data/golden/_reports/drill/District 01/2026-05-28_r110600/index.html +1560 -0
  52. bobframes/tests/data/golden/_reports/index.html +264 -0
  53. bobframes/tests/data/golden/_reports/instancing_opportunities.html +266 -0
  54. bobframes/tests/data/golden/_reports/overdraw.html +275 -0
  55. bobframes/tests/data/golden/_reports/pass_gpu.html +277 -0
  56. bobframes/tests/data/golden/_reports/shader_hotlist.html +265 -0
  57. bobframes/tests/data/golden/_reports/trend_table.html +390 -0
  58. bobframes/tests/data/golden/index.html +1175 -0
  59. bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/_manifest.json +51 -0
  60. bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/buffers.parquet +0 -0
  61. bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/clears.parquet +0 -0
  62. bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/counters_per_event.parquet +0 -0
  63. bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/descriptor_access.parquet +0 -0
  64. bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/dispatches.parquet +0 -0
  65. bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/draw_bindings.parquet +0 -0
  66. bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/draws.parquet +0 -0
  67. bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/events.parquet +0 -0
  68. bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/fbos.parquet +0 -0
  69. bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/frame_totals.parquet +0 -0
  70. bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/ibo_samples.parquet +0 -0
  71. bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/indirect_args.parquet +0 -0
  72. bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/passes.parquet +0 -0
  73. bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/pixel_history.parquet +0 -0
  74. bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/post_vs_samples.parquet +0 -0
  75. bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/program_transitions.parquet +0 -0
  76. bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/programs.parquet +0 -0
  77. bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/render_targets.parquet +0 -0
  78. bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/resource_creation.parquet +0 -0
  79. bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/rt_event_timeline.parquet +0 -0
  80. bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/samplers.parquet +0 -0
  81. bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/shaders.parquet +0 -0
  82. bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/state_change_events.parquet +0 -0
  83. bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/texture_samples.parquet +0 -0
  84. bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/textures.parquet +0 -0
  85. bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/vbo_samples.parquet +0 -0
  86. bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/vertex_inputs.parquet +0 -0
  87. bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/_manifest.json +51 -0
  88. bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/buffers.parquet +0 -0
  89. bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/clears.parquet +0 -0
  90. bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/counters_per_event.parquet +0 -0
  91. bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/descriptor_access.parquet +0 -0
  92. bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/dispatches.parquet +0 -0
  93. bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/draw_bindings.parquet +0 -0
  94. bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/draws.parquet +0 -0
  95. bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/events.parquet +0 -0
  96. bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/fbos.parquet +0 -0
  97. bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/frame_totals.parquet +0 -0
  98. bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/ibo_samples.parquet +0 -0
  99. bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/indirect_args.parquet +0 -0
  100. bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/passes.parquet +0 -0
  101. bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/pixel_history.parquet +0 -0
  102. bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/post_vs_samples.parquet +0 -0
  103. bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/program_transitions.parquet +0 -0
  104. bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/programs.parquet +0 -0
  105. bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/render_targets.parquet +0 -0
  106. bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/resource_creation.parquet +0 -0
  107. bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/rt_event_timeline.parquet +0 -0
  108. bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/samplers.parquet +0 -0
  109. bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/shaders.parquet +0 -0
  110. bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/state_change_events.parquet +0 -0
  111. bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/texture_samples.parquet +0 -0
  112. bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/textures.parquet +0 -0
  113. bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/vbo_samples.parquet +0 -0
  114. bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/vertex_inputs.parquet +0 -0
  115. bobframes/tests/make_synthetic.py +171 -0
  116. bobframes/tests/smoke.py +199 -0
  117. bobframes/tests/test_determinism.py +19 -0
  118. bobframes/tests/test_discovery.py +97 -0
  119. bobframes/tests/test_hardening.py +142 -0
  120. bobframes/tests/test_parity.py +22 -0
  121. bobframes/tests/test_perf.py +18 -0
  122. bobframes/tests/test_replay_drift.py +115 -0
  123. bobframes/tests/test_schemas.py +26 -0
  124. bobframes/tests/test_schemas_unit.py +55 -0
  125. bobframes/tests/test_stable_keys.py +61 -0
  126. bobframes-0.1.0.dist-info/METADATA +144 -0
  127. bobframes-0.1.0.dist-info/RECORD +130 -0
  128. bobframes-0.1.0.dist-info/WHEEL +4 -0
  129. bobframes-0.1.0.dist-info/entry_points.txt +2 -0
  130. bobframes-0.1.0.dist-info/licenses/LICENSE +21 -0
@@ -0,0 +1,144 @@
1
+ Metadata-Version: 2.4
2
+ Name: bobframes
3
+ Version: 0.1.0
4
+ Summary: RenderDoc capture pipeline: ingest, analyze, render.
5
+ Project-URL: Homepage, https://github.com/altpsyche/bobframes
6
+ Project-URL: Issues, https://github.com/altpsyche/bobframes/issues
7
+ Project-URL: Changelog, https://github.com/altpsyche/bobframes/blob/main/CHANGELOG.md
8
+ Author-email: Siva Subramanyam <sivasubramanyam@mayhem-studios.com>
9
+ License: MIT
10
+ License-File: LICENSE
11
+ Keywords: gpu,parquet,profiling,renderdoc
12
+ Classifier: Development Status :: 3 - Alpha
13
+ Classifier: Environment :: Console
14
+ Classifier: License :: OSI Approved :: MIT License
15
+ Classifier: Operating System :: Microsoft :: Windows
16
+ Classifier: Programming Language :: Python :: 3.10
17
+ Classifier: Programming Language :: Python :: 3.11
18
+ Classifier: Programming Language :: Python :: 3.12
19
+ Classifier: Programming Language :: Python :: 3.13
20
+ Classifier: Topic :: Multimedia :: Graphics
21
+ Classifier: Topic :: Software Development :: Debuggers
22
+ Requires-Python: <3.15,>=3.10
23
+ Requires-Dist: pyarrow<22,>=17
24
+ Provides-Extra: dev
25
+ Requires-Dist: build; extra == 'dev'
26
+ Requires-Dist: hatchling; extra == 'dev'
27
+ Requires-Dist: pytest; extra == 'dev'
28
+ Requires-Dist: twine; extra == 'dev'
29
+ Description-Content-Type: text/markdown
30
+
31
+ # BobFrames
32
+
33
+ RenderDoc capture pipeline: ingest, analyze, render. Point it at a folder of `.rdc` captures and it
34
+ produces `_data/` (Parquet tables) plus `_reports/` (static HTML you can browse). Windows-only in v1.
35
+
36
+ ## Requirements
37
+
38
+ - Windows 10 or later (the replay stage drives `qrenderdoc`, which is Windows-only in v1).
39
+ - Python 3.10 - 3.13.
40
+ - RenderDoc 1.x, or Arm Performance Studio, providing `renderdoccmd` and `qrenderdoc` on disk.
41
+
42
+ ## Install
43
+
44
+ ```
45
+ pipx install bobframes
46
+ bobframes check
47
+ ```
48
+
49
+ `bobframes check` prints the resolved paths for `renderdoccmd` and `qrenderdoc` and exits non-zero if
50
+ either is missing, so you can confirm the toolchain before a long ingest.
51
+
52
+ ## Quickstart
53
+
54
+ ```
55
+ cd path\to\captures # a folder of <Area>\<YYYY-MM-DD[_label]>\*.rdc
56
+ bobframes ingest . # export, parse, replay, parquetize, derive, render
57
+ bobframes serve . # open a local static preview of the reports
58
+ ```
59
+
60
+ `ingest` writes Parquet under `_data/` and HTML under `_reports/`. Re-run `bobframes render .` any
61
+ time to rebuild the HTML from existing Parquet without re-replaying captures.
62
+
63
+ ## Commands
64
+
65
+ | Command | Purpose |
66
+ |---|---|
67
+ | `ingest [root] [--area X] [--label Y] [--capture N] [--force] [--pixel-grid 4] [--render-only]` | Full pipeline: export, parse, replay, parquetize, derive, manifest, commit, catalog, render. |
68
+ | `render [root] [--area X] [--label Y]` | Rebuild HTML and catalog from existing Parquet. |
69
+ | `ab [root] --baseline-label X --compare-label Y` | All reports for one drop pair under `_reports/ab/<pair>/`. |
70
+ | `report [root] <name>` | Build one named report (draws-by-class, trend, instancing, pass-gpu, shader, overdraw, dashboard). |
71
+ | `catalog [root]` | Rebuild `_data/_catalog.parquet` only. |
72
+ | `lint <file>...` | Check HTML or markdown against the banlist. |
73
+ | `check` | Print resolved tool paths; non-zero when a tool is missing. |
74
+ | `serve [root] [--port 8000] [--bind 127.0.0.1]` | Static preview via the stdlib HTTP server. |
75
+ | `smoke [--data DIR]` | End-to-end check; render-only against the bundled fixture when `--data` is omitted. |
76
+ | `version` | Print `bobframes`, schema, and pyarrow versions. |
77
+
78
+ `<root>` is positional and defaults to `.`. Flags are long-form only. Exit codes: `0` success,
79
+ `1` pipeline or build failure, `2` usage error, `3` external tool missing, `4` interrupted.
80
+
81
+ ## External tools
82
+
83
+ The export stage runs `renderdoccmd convert`; the replay stage runs `qrenderdoc --python`. v1 looks
84
+ for both at a baked Arm Performance Studio install path and on `PATH`. A config file and a
85
+ tool-resolver with version globbing arrive in v0.2; until then, install RenderDoc where v1 expects it
86
+ or put the executables on `PATH`. Run `bobframes check` to see what was resolved.
87
+
88
+ ## Output layout
89
+
90
+ ```
91
+ <root>/
92
+ index.html root catalog view
93
+ <area>/<drop>/ raw RDC inputs (left untouched)
94
+ _data/ pipeline outputs
95
+ _catalog.parquet (+ .csv, .json)
96
+ _global_entities.parquet (+ .csv)
97
+ _query_examples.md
98
+ <area>/<drop>/ per-drop data (29 Parquet tables)
99
+ *.parquet (+ matching .csv)
100
+ _manifest.json, _resource_labels.json
101
+ shader_src/*.glsl, jsonl sidecars
102
+ done.marker
103
+ _reports/ rendered HTML
104
+ *.html (dashboard + reports)
105
+ ab/<pair>/*.html
106
+ drill/<area>/<drop>/index.html per-drop browser
107
+ _cache/
108
+ ```
109
+
110
+ The catalog stores each drop's path relative to `<root>` for portability.
111
+
112
+ ## Migrating from `_analysis`
113
+
114
+ v1 is a hard rename of the older project-embedded `_analysis` package, with no compatibility shim:
115
+ `python -m _analysis.*` stops working once `bobframes` is installed. Map old invocations to new ones:
116
+
117
+ | Old (`_analysis`) | New (`bobframes`) |
118
+ |---|---|
119
+ | `python -m _analysis.run --root . --area X --label Y` | `bobframes ingest . --area X --label Y` |
120
+ | `python -m _analysis.reports.ab --root . --baseline-label X --compare-label Y` | `bobframes ab . --baseline-label X --compare-label Y` |
121
+ | `python -m _analysis.lint <file>` | `bobframes lint <file>` |
122
+ | `python -m _analysis.tests.smoke` | `bobframes smoke` |
123
+
124
+ ## Troubleshooting
125
+
126
+ | Symptom | Resolution |
127
+ |---|---|
128
+ | `renderdoccmd not found` (exit 3) | Install RenderDoc or Arm Performance Studio, or put the executable on `PATH`; confirm with `bobframes check`. |
129
+ | `qrenderdoc` replay hangs | v1 kills the replay process tree on timeout and records `capture_status='replay_failed'` for that capture; the rest of the drop still completes. Re-run with `--force` to retry. |
130
+ | Lint failure during render | The emitted HTML contains a banned token. Run `bobframes lint <file>` to see the line and label. |
131
+ | `schema mismatch` (exit 1) | A drop's `_manifest.json` schema version differs from the installed schema. Rebuild it with `bobframes ingest --force` (the v1 schema-migration path; see G-3). |
132
+ | Permission denied on `_data` | Close any viewer holding a Parquet open, then re-run; writes are staged and renamed atomically. |
133
+
134
+ ## Advanced
135
+
136
+ - A/B reports: `bobframes ab . --baseline-label OLD --compare-label NEW` builds a side-by-side set.
137
+ - Programmatic use: import `bobframes.schemas`, `bobframes.discovery`, and `bobframes.paths` to drive
138
+ table lookups, drop discovery, and path resolution from your own scripts.
139
+ - `bobframes/probes/whatif.py` is a manual qrenderdoc-side probe and is not wired as a CLI command.
140
+ - A TOML config file, an externalized draw classifier, and design-token theming are planned for v0.2.
141
+
142
+ ## License
143
+
144
+ MIT. See [LICENSE](LICENSE).
@@ -0,0 +1,130 @@
1
+ bobframes/__init__.py,sha256=v-rRiDOgZ3sQSMQKq0vgUQZvpeOkoHFXissAx6Ktg84,61
2
+ bobframes/_version.py,sha256=kUR5RAFc7HCeiqdlX36dZOHkUI5wI6V_43RpEcD8b-0,22
3
+ bobframes/catalog.py,sha256=snPmN8RfNHtQkc-6PmgaqyJ6qXUHwWiAbAUdkHcaFYM,5748
4
+ bobframes/cli.py,sha256=w9rlZov2qYTl6213T7oubqdG58gAQYuXw27awkb8TNs,9498
5
+ bobframes/derive_post_merge.py,sha256=tYHGhkLsUx3hBC7JLei52AM6prLWa9q_Nr0fM5LG6VU,14301
6
+ bobframes/discovery.py,sha256=xUS5Q-f9B6xJffI8rqVDWqxRIyJHL5GLbGc6UeqIs9w,4053
7
+ bobframes/global_entities.py,sha256=7ZUu1THpgfUgpaNoSeYJSzexjAHpbnOg-9pLXnmaYos,3498
8
+ bobframes/lint.py,sha256=C3L0zAJz7Kls3a8zmx-nsjo-QWrwh0KvhloDxhZ2Oe4,4456
9
+ bobframes/manifest.py,sha256=DkgItSt2cNrTFCyXUYQNxkY6F3F_-JZwSildHp1gfHg,4127
10
+ bobframes/parquetize.py,sha256=y_hJQIV9Z4Z5NRSrJvOQwJ8tSz2yYB7vlocTNfgznfM,10412
11
+ bobframes/paths.py,sha256=t7MtUAfDOo0FJ-SuD1En_HvXgOZ0jkba2PqDgg5SAIM,3655
12
+ bobframes/qrd_harness.py,sha256=3INEfqdikh5pRzc8umw08u6C0_HoqU7uO2v18e7_pJw,3969
13
+ bobframes/query_examples.py,sha256=f_ctz7ziaki2cgWKQ_OgvoUldBO_-mWPBqSJQRqRGwA,6261
14
+ bobframes/rdcmd.py,sha256=X8nMc2n8mNt19t0dtMCWTCkzLo_29t0K9sJgnXjb0i4,2395
15
+ bobframes/resource_labels.py,sha256=xx_d9WE885mSaEFgWFQBiKOxYBzAdeV3RDXSIrrrdd0,5686
16
+ bobframes/run.py,sha256=YCeueyt4npIAwhqCCkjOXmpgiRT7PaYlTGBx4LxJP4Q,19445
17
+ bobframes/schemas.py,sha256=tz4PKNsX3k7y9hTg9c9bbZHBhc7HanNlJbpR3j6jVmg,17940
18
+ bobframes/stable_keys.py,sha256=vBqo1MtJV5LonDB3Xo1j4jFG8aZp260YLp-6Pc87IQ8,2640
19
+ bobframes/derives/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
20
+ bobframes/derives/pass_class_breakdown.py,sha256=NBL37Vt0bYMH9h01Swh3rbMyjcoIm5oafY7n-gjKsqk,3946
21
+ bobframes/derives/texture_usage.py,sha256=XSMj_FlQ81Mcc7vQTGqT2iBQ1-mCiUC8KEiCbl1m1EU,4583
22
+ bobframes/html/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
23
+ bobframes/html/template.py,sha256=vWgm_OZeIhmZ_N_F-DTqkPmhqihvZEJ9Gc6DiYJ3efY,40258
24
+ bobframes/parsers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
25
+ bobframes/parsers/derive_program_transitions.py,sha256=Yj9U8gngX3-GiHSR2lWm-Pnvcmf-ThSnOcURvsSThVQ,2532
26
+ bobframes/parsers/parse_init_state.py,sha256=wDfHp13g9Qlcq_uh2h-bSb2oWLUgCLeIkIjpRNKonWE,25323
27
+ bobframes/probes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
28
+ bobframes/probes/whatif.py,sha256=jUSDDRWInxvuttk8YrCPdDQCpjFaA6sOfhnpjE6DpAg,5827
29
+ bobframes/replay/__init__.py,sha256=24W5zSUzCAK-b4BXLOcsLAjuNqylkZYiQ9W5Je4yD7E,1168
30
+ bobframes/reports/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
31
+ bobframes/reports/_dashboard.py,sha256=CPgVMFTVM5OE2mnV51LxiOypddNdWrOgwaW7735rNzI,15020
32
+ bobframes/reports/ab.py,sha256=gkO44HquuHAZjFwHunAoHexKpeSA0Wod_qpxgdydWD0,2924
33
+ bobframes/reports/base.py,sha256=dOW8Ef4R0bN7rK3HHL5bNF0JEKgUBWXScFhGqdDVawo,3042
34
+ bobframes/reports/cache.py,sha256=3y4vnSl1BAyZ3YCOLXZRUPwteaa2nUk4A95dKey7Ac0,5340
35
+ bobframes/reports/chrome.py,sha256=lR8WQ2IS31wKx0apXYvsKVzJolJDl0bUSWB6fkg11nA,45159
36
+ bobframes/reports/cli.py,sha256=lRsQ62QMGGaoFs685W37OU0gYC4LSX_UI_2LF7ji3lY,3740
37
+ bobframes/reports/delta.py,sha256=EfU-9yi_ojYx70GbzaMKFlG6ObzglUD9_0Q208QQ2tg,5443
38
+ bobframes/reports/discovery.py,sha256=KoW8Zx3uWcasm3zn4vUaroOVPPFct19JYQRhcApYoWI,3753
39
+ bobframes/reports/draws_by_class.py,sha256=KOn0CCOUFDlGwjfRKqkLSlwSKYJmwNNH-M3UD1cm5TI,6227
40
+ bobframes/reports/formatters.py,sha256=POHwd89HkUGVAah32uzmv4FH6T4Ua3n_P4reKZwD5as,3192
41
+ bobframes/reports/instancing_opportunities.py,sha256=XaTz_pYu2eJCtcLn03A3N44JJ6AzaZOeCPJ19BpMQ-M,10934
42
+ bobframes/reports/orchestrator.py,sha256=hEW081VHfx4xzSks4BeCZ-uBxzg2wDhrYmY1xRIthYw,1645
43
+ bobframes/reports/overdraw.py,sha256=-qs9eVETX9Y0WKKq-a93Itbe7imdZzd0POIFtrsxFxo,12335
44
+ bobframes/reports/pass_gpu.py,sha256=wXwdkyqJVF8DHVhzjElJv4hlsYc60wBO44L_kukSsW4,7707
45
+ bobframes/reports/shader_hotlist.py,sha256=TbDgMiEg3ck3JTAbE6EJ_-oKHa0Cm20ZKCo8l94cZEc,9236
46
+ bobframes/reports/trend_table.py,sha256=ZeE7-UUFzkphuu4Br31usB9ADsVPeo3n4FYwnTphRqw,17442
47
+ bobframes/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
48
+ bobframes/tests/_render_util.py,sha256=RNWg4ZLXo8kQtgK2HmHDzt1aS95iYcZChCG0kMOEo08,3240
49
+ bobframes/tests/make_synthetic.py,sha256=7LPCPrIyg8vBayyqQTFCdrxxYVN3uZYhI9kjbfsODyI,7016
50
+ bobframes/tests/smoke.py,sha256=KY7vEXrgscg37KzOSMgzKvupVAXUFvcMW-C5MdqrFEM,7698
51
+ bobframes/tests/test_determinism.py,sha256=0Q35vHf6EEF-_hA6FGbNcKFSgu3E5_tTa1z7IS3vO1U,778
52
+ bobframes/tests/test_discovery.py,sha256=LVAR0zrgmoSIoe0FnJ0K8OOn5x_NwXKgc5_mAy145V0,4110
53
+ bobframes/tests/test_hardening.py,sha256=I4SRkTbivhm2X74VfkCQxQnQomul3yLE1LIQgJJayW4,5156
54
+ bobframes/tests/test_parity.py,sha256=FFiibA45jLvmflOPNgyE0oaHVoybXRPLdtcQzwQXowE,878
55
+ bobframes/tests/test_perf.py,sha256=G05Ep9jb9HVdXX0aLR-WWlQ36aVumYmm8LH3P9_vX5I,612
56
+ bobframes/tests/test_replay_drift.py,sha256=3RGm34IPBi1klP9Nnfs5fH-kh7B-LmVuta24m_RDsqQ,5283
57
+ bobframes/tests/test_schemas.py,sha256=KTgq_v8AJWQ1GN6nGOd0uYkK1gHiFpo0B6sfCUlH7oA,999
58
+ bobframes/tests/test_schemas_unit.py,sha256=cH0Om2Ab-KMr9xAapfnw8Zqy4idJ0cwX2mNeWPlPaT0,2188
59
+ bobframes/tests/test_stable_keys.py,sha256=_4ZwCWzRypck2SmDMFg1-GIUE5igTz_vFjPVMiyPkBA,2781
60
+ bobframes/tests/data/golden/index.html,sha256=MMRreJE4p1K9IYMMhgdATr9KTsPVEHSv7ClGsYGhpmk,45715
61
+ bobframes/tests/data/golden/_reports/draws_by_class.html,sha256=HA8Tuel63Z1_U7_uCySiUTvBSJRif4SC0ADD3jQB-b8,33195
62
+ bobframes/tests/data/golden/_reports/index.html,sha256=PkhHRqD25sc0X5sOYjJpN5lh9vzXFIp8VoKcVZdigB8,32452
63
+ bobframes/tests/data/golden/_reports/instancing_opportunities.html,sha256=iLrOXb4hcEWnkE5JHU25bqYM-gdut39npTi7epMq-Wo,48587
64
+ bobframes/tests/data/golden/_reports/overdraw.html,sha256=zNLLqbSAK0wGg1c-hKtjrePKpknl7Bp3tpGpjAlvaY8,31958
65
+ bobframes/tests/data/golden/_reports/pass_gpu.html,sha256=RpciESyLvUVF1sNAIzSHKjTcw4ZAAlwfWvlRsB0SskA,46194
66
+ bobframes/tests/data/golden/_reports/shader_hotlist.html,sha256=3leSvrr_hwrZHrjopwSUleSWoVhShnng_fACtFiUfsQ,48816
67
+ bobframes/tests/data/golden/_reports/trend_table.html,sha256=DsH5ZqhpwoKdvQfj6k9uzGqvHWeUKpAEs0WTbcoxrcc,34202
68
+ bobframes/tests/data/golden/_reports/drill/District 01/2026-05-28_r110600/index.html,sha256=Nq2icYTPRYDXXeAh90N31jlkTqvXvbNuHKSZlFOTmTs,307053
69
+ bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/_manifest.json,sha256=O4FW0wVCGPB1pZ1slCmoa0aC5iW56mCwIP_uiPRcoLM,1003
70
+ bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/buffers.parquet,sha256=x51w53un4U81dUyTK0eeChR9pZ1IxGSuAqyrrXHMNR8,10573
71
+ bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/clears.parquet,sha256=vCGqNYH4XrH6Y7yxh8N-wVoJAbMGYIbHE5cGa2Ytm68,5125
72
+ bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/counters_per_event.parquet,sha256=m9nZ2rEdUIOy4pNR5oQBb0yuOjNR1FY_UUt8ZZ49XyI,3154
73
+ bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/descriptor_access.parquet,sha256=d2ijWYjxJ2hlfDDjynBOamP6YiEqB7NvecnA-5Fw5rk,3892
74
+ bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/dispatches.parquet,sha256=Ldme9wpZ8KsZn2et4DDJ7vJ8y5dDK2fIAUrzMFLst2g,6980
75
+ bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/draw_bindings.parquet,sha256=-x19L686BDDPKwEW7MdoWcUxS1PDazrSizDjDEMtQew,3672
76
+ bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/draws.parquet,sha256=xqT0kkalbhgwKCjeSs4N8Low3KvExhzeE7op_HCBjEI,23112
77
+ bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/events.parquet,sha256=6zKqAyUUoYMjHmCINPaXZxoHMfgwYk6peAPGKaRm0Go,9624
78
+ bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/fbos.parquet,sha256=AOYER6f2rg126J8Lgo95tchuDHmmoJ3pFRIelihTmzw,7826
79
+ bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/frame_totals.parquet,sha256=LlonlN5QzphIFuRg3mk2-tutnVDrU34VA6BsCvn4aWA,13410
80
+ bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/ibo_samples.parquet,sha256=mWF_-EohUUmJMOydziPPVoz6iYq_JK2g1eXkNg-Bl_Y,2650
81
+ bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/indirect_args.parquet,sha256=i51x2N6xzTYW1XgYHuuW1puEGPWO_zfn4fZalLuQWXU,2916
82
+ bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/passes.parquet,sha256=jWqCPPHctmcb04kPSzsNYaoPWATy9PUstHIaRppIn8I,12749
83
+ bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/pixel_history.parquet,sha256=xIxm7x2Hg-2hEGYC_IprTOCgtPe_At-33_wfbbgwCCs,9051
84
+ bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/post_vs_samples.parquet,sha256=zx-FJe0pvE9qsXkpMrrSfgfLDgoumHMfbDcFWAdTqLE,4350
85
+ bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/program_transitions.parquet,sha256=VZfIbel1Wo74eyH28ZxDA1Spbg5A5MP-IC0rUyyFyn8,2700
86
+ bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/programs.parquet,sha256=GbsFudOX-SLDBDFO8rrlbKonMDYM1ftrW2uberfKxWU,11981
87
+ bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/render_targets.parquet,sha256=BBYG6IB0pkYNQVSyEMwK9zMm8UnP-_0uP2Z9kvFVZN4,11617
88
+ bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/resource_creation.parquet,sha256=7cmAFcAr-oawKQqjGPSJE62PiuGBx_mBOunulBggGhM,3552
89
+ bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/rt_event_timeline.parquet,sha256=jf3auh8mqub3Xk21QcE7B2fF9YL3100vQBMAQILYqUw,3585
90
+ bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/samplers.parquet,sha256=tlUMz5PJ4Sdm5rXDaJ1jdNd_TU33-pa4X_NdAGnMqRw,8281
91
+ bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/shaders.parquet,sha256=RUucRqlaUeDWyEBN9RkGJMcbfVOTIkIYObGyz-ToKdw,12533
92
+ bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/state_change_events.parquet,sha256=0TMP9IjQP_nt97msilap2mMerJ1m-QzHUuChpM4jck4,3825
93
+ bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/texture_samples.parquet,sha256=fFX1vOfZkSuQshrQdLyi4dwQFOPhiAMWVRjsV5sfnXM,4458
94
+ bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/textures.parquet,sha256=matPx0bQ1tE900fLgaFxS-HjPPM9RR2aRqb6InvxqQs,11521
95
+ bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/vbo_samples.parquet,sha256=HMGtL9zYfg__0aL0vHLFv7UucmZIDDUJ-MVWlj1MQH8,7695
96
+ bobframes/tests/data/synthetic/_data/District 01/2026-05-27_r110565/vertex_inputs.parquet,sha256=Evl1JYIJa77FmxzJXfSvKqBuauvyVvDEvHAGGzG_org,5517
97
+ bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/_manifest.json,sha256=YjyIxcgzjlhOBa4zimGkNffUR-K34cWzCqiGOm_cDqY,1003
98
+ bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/buffers.parquet,sha256=qc1WLcCumbMJrRTpAUV0ssP6b4p1RicV6aaxkTHfKBU,10535
99
+ bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/clears.parquet,sha256=PDXWj-F0pnoIAo8Whw1Gm1a4yx3oWROZFVDUoizdGP4,5124
100
+ bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/counters_per_event.parquet,sha256=tB31crTrtRQ4t6pyu-QDE9HspmXi6DvgsJxHanpn66Y,3169
101
+ bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/descriptor_access.parquet,sha256=A_DUUFNgGjz7CcB4Jv_UENEf5233ZvrpK2V5Y8LS5bI,3877
102
+ bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/dispatches.parquet,sha256=dXJFa19zB3CbVURrtdOtKtDRzkhoH6p4gyYUK5_W-vM,6988
103
+ bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/draw_bindings.parquet,sha256=Jk9nx2iLHn2B0VbaXcW3fY_EvCLoBgCYFPF6JPZBZag,3653
104
+ bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/draws.parquet,sha256=UpsJDkH-_qW2g0vuf6AqO1WHhPi-sDg4lSxf6OlLPDA,23953
105
+ bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/events.parquet,sha256=fmzPDxIxX0CBZWCHv7ctyhpB1VSH3i-liHKeyQhYk8Q,9635
106
+ bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/fbos.parquet,sha256=ZaVJUgkawpjaeU61FtgVFJPoLOZAop5iy38VdtU0Gbs,7854
107
+ bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/frame_totals.parquet,sha256=3QHze-H76vpdOLU7P1U8I57am-kv__AXrJgUQTWhbqQ,13417
108
+ bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/ibo_samples.parquet,sha256=EVOwMY96B79-9XfQtYCNXlPzgKPqkQ96AqH-5CBmNFA,2650
109
+ bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/indirect_args.parquet,sha256=i51x2N6xzTYW1XgYHuuW1puEGPWO_zfn4fZalLuQWXU,2916
110
+ bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/passes.parquet,sha256=3LZdtBwnCsMTYMtmKOu7HZrt-LKP37NnC26UQlhb07U,12655
111
+ bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/pixel_history.parquet,sha256=1qsrD62zUktk8blVbmQtLd_GXHHe8Sg7avj0Ej-ux8I,9021
112
+ bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/post_vs_samples.parquet,sha256=TU1Vv1w_ichoHxU62WbFrsV4WykX8IfFRUySnAENnUo,4367
113
+ bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/program_transitions.parquet,sha256=PRMNHTMY0fd_ClBclem6fQIANVurz3zY-2u8jomiGRo,2703
114
+ bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/programs.parquet,sha256=02fiExQd-UU8Le59Cu5T6xp4m5ds83NHHZQduNUimWI,12022
115
+ bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/render_targets.parquet,sha256=RxDMD5xQfCmfcBGllhJXucNd-87lLHTsFGUK2EKTqjg,11620
116
+ bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/resource_creation.parquet,sha256=-4qNadpVnrUrFlHhxKAQBHCKsxNHNzjOaZon2ziTKs0,3552
117
+ bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/rt_event_timeline.parquet,sha256=gEnecXgBdfLF6wgKg_EWEaOscSzpGx3DcpDJwZTQ7Cc,3587
118
+ bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/samplers.parquet,sha256=5Jkf4cl6gKmdotlU1FO1rP4MqkvCoN0KUDLOj3_Nk20,8281
119
+ bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/shaders.parquet,sha256=EhoO1umTTDgu2GsTWJKM-B09dEQjJtOx4ENBHD5pLys,12504
120
+ bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/state_change_events.parquet,sha256=z1Vaze5LK4nwajHEBccELpx8GqyGinWnqnXx6jPKjbE,3823
121
+ bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/texture_samples.parquet,sha256=HdAYZDlD_2H-CtpR5Z56DtFEPLHLUwZDX6zh8isO_Fc,4458
122
+ bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/textures.parquet,sha256=0bY4-R-8OwE2LC37_SbY4qipviKXK_DOxhs2MZC4XAE,11530
123
+ bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/vbo_samples.parquet,sha256=IWxgDC1XRFqxx5NDYxhQjlgkNDsrOxMzAQVTnSM0UnM,8905
124
+ bobframes/tests/data/synthetic/_data/District 01/2026-05-28_r110600/vertex_inputs.parquet,sha256=PNDTahleTWIdxv7gAVovWYaTaTBndPqmhUW_-YEucL8,5518
125
+ bobframes/replay/replay_main.py,sha256=Xf3we3GKGrCP9uUbe_mAstawAqIqykdONl4p6XNhpz8,96954
126
+ bobframes-0.1.0.dist-info/METADATA,sha256=lsMR4NCzm4BATc3f5B-czRB9WnUsm_vEkqbRjR1BsF8,6793
127
+ bobframes-0.1.0.dist-info/WHEEL,sha256=QccIxa26bgl1E6uMy58deGWi-0aeIkkangHcxk2kWfw,87
128
+ bobframes-0.1.0.dist-info/entry_points.txt,sha256=NEYpiZNWy0k-3h8vDyxCBxp2yEwOgvekwmzYlEyXC-c,49
129
+ bobframes-0.1.0.dist-info/licenses/LICENSE,sha256=03hXmfO8te8gTlJFcSd40wqgdwLmHmTpz0-sqH9L9lA,1089
130
+ bobframes-0.1.0.dist-info/RECORD,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: hatchling 1.29.0
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ bobframes = bobframes.cli:main
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Siva Subramanyam, Mayhem Studios
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.