Repository navigation
feat(mcp): full per-pass command-bucket capture for olo_render_frame_breakdown (#463) - #470
Conversation
…breakdown (#463) Capture every command-bucket pass that runs in a frame (Scene, Water, Foliage, Decal, ForwardOverlay), not just the scene pass. Relocate the frame-capture commit out of SceneRenderPass::OnFrameEnd (which fired mid-graph, before the other passes ran) into a single central hook in Renderer3D::EndScene after the whole render graph executes. Each command-bucket pass now registers itself (BeginPass(GetName()) + presort snapshot) before any early-return and captures post-sort; per-pass entries accumulate in CapturedFrameData::Passes. All capture calls are if(capturing)-guarded, so the non-capturing render path is unchanged. olo_render_frame_breakdown emits a per-pass `passBreakdowns` array (each tagged by graph pass name) and graphAttribution now reports capturedPassCount and commandBucketPassCount (command-bucket passes that RAN, i.e. non-culled), so capturedPassCount == commandBucketPassCount for a frame in which every command-bucket pass executed. Verified live: ScenePass + FoliagePass captured per-command, invariant holds, culled Water/Decal correctly excluded. Visual-evidence suite passes with a GL context (rendering undisturbed); 29 unit tests pass (incl. 3 new multi-pass). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
Warning Review limit reached
Next review available in: 39 minutes Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available. How can I continue?After more reviews become available, a review can be triggered using the To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews. How do review limits work?CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability. For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window. Please refer docs for additional details. Review details⚙️ Run configurationConfiguration used: Repository UI Review profile: ASSERTIVE Plan: Pro Run ID: 📒 Files selected for processing (11)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Closes the still-deferred half of #316 Part 4 (tracked as #463): per-command capture of every render-graph command-bucket pass, not just the scene pass.
The gap
olo_render_frame_breakdownpreviously captured exactly one pass's bucket — the scene pass — becauseSceneRenderPassdrove theFrameCaptureManagerstate machine and committed the pending frame at its ownOnFrameEnd, before Water / Foliage / Decal / ForwardOverlay ran (each resets its bucket at the end of itsExecute, so a post-frame walk found them empty).Fix
SceneRenderPass::OnFrameEndinto a single central hook,FrameCaptureManager::CommitFrame(), called fromRenderer3D::EndSceneafterRGraph->Execute()— so the pending frame accumulates per-pass buckets across the whole graph before commit.BeginPass(GetName())+ presort snapshot at the top of itsExecute(before any early-return on an empty bucket, so even an empty pass registers), and post-sort after itsSortCommands(). Entries accumulate inCapturedFrameData::Passes; the top-level lists stay the source/scene pass for backward compatibility.if (capturing)-guarded andCommitFrame()is a no-op when not capturing, so the live render path is unchanged when no capture is in flight.Producer (
McpFrameBreakdown.h)passBreakdownsarray — one per-command list per pass, each tagged with its graph pass name, shaped identically to the top-level bucket (sharedShapeBuckethelper).graphAttribution.capturedPassCount= number of per-pass captures;commandBucketPassCount= command-bucket passes that ran (non-culled). For a frame where every command-bucket pass executed,capturedPassCount == commandBucketPassCount. Each graph pass also carries acapturedflag.Acceptance criteria — met
capturedPassCount == commandBucketPassCountfor such a frame (culled bucket passes excluded from the running count so the invariant holds on real frames).Verification
FrameCaptureManager+ 7FrameCapturePipeline(backward-compat) + 15McpFrameBreakdown(incl. 3 new multi-pass tests).SceneRenderEvidence,WaterVisualEvidence×6 angles,FogVisualEvidence) — rendering undisturbed.passBreakdownsreturnedScenePass(24 cmds) +FoliagePass(3 cmds);capturedPassCount=2 == commandBucketPassCount=2; culledWaterPass/DecalPassflaggedcaptured=false, culled=trueand excluded from the count.🤖 Generated with Claude Code