Make silent render failures loud, off the hot path - #339
Merged
Conversation
|
The latest updates on your projects. Learn more about Argos notifications ↗︎
|
Four mistakes all produce an identical blank frame and only one said anything. A debug diagnostic on the zero-draw path names the cause it can distinguish, and degenerate cameras assert with the fix, including the degrees-for-radians field of view every other engine invites. All inside assert, so release pays nothing.
A skinned upload and setCustomAttribute took any length and rendered garbage. Both check the byte count now. A mesh also recomputes bounds when its primitive geometry is replaced, instead of over-culling until a manual dirty call.
The web shim swallowed a bind to a uniform or texture name the shader does not declare, so a typo sampled whatever was bound last, wrong on web only. It throws now, from the same reflection native reads.
A clip bound to the wrong node plays while nothing moves. Binding zero of a non-empty clip's channels now asserts in debug, naming the wanted nodes so a name mismatch is visible. Partial binds stay silent.
The redundant hook invocation is byte-identical to a web build, which needs that bundle, so it cannot be skipped at this layer. Document the constraint and lock it with a test that flips if the invoker ever names the platform.
bdero
force-pushed
the
bdero/silent-failures
branch
from
August 18, 2026 16:28
ba49988 to
4e2fd0b
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
A batch of silent-failure fixes from the same measurement work behind #338. Each turns a mistake that produced wrong or missing output with no diagnostic into something that says what went wrong, keeping the fix off the release hot paths.
The highest-leverage one is a "nothing was drawn" diagnostic. Four separate mistakes all produce an identical blank frame and only one previously said anything, so a debug-only diagnostic on the zero-draw path now names the cause it can distinguish. Alongside it, degenerate cameras assert (including a field of view passed in degrees, the classic cross-engine slip), the web backend throws on a bind to a shader slot that does not exist instead of silently sampling the wrong texture, skinned uploads and custom attributes reject a buffer that does not match the vertex count, a mesh recomputes bounds when its geometry is replaced, and an animation clip that binds none of its channels asserts.
Every per-frame check is inside
assertor a one-shot latched print, so release builds pay nothing on the render loop. The throwing checks are upload-time, once per resource.Also documents why a native build ships an unused GLES shader bundle: the redundant hook invocation is byte-identical to a web build, which needs that bundle, so it cannot be skipped at this layer. A test locks the finding and will flip if a future Flutter names the platform on that input. The real fix belongs upstream.
Rides the unreleased 0.22.0.