diff options
author | Vito Caputo <vcaputo@pengaru.com> | 2023-08-07 18:31:21 -0700 |
---|---|---|
committer | Vito Caputo <vcaputo@pengaru.com> | 2023-08-07 18:31:21 -0700 |
commit | f7da47075770a51a8fd6ac14fad96953a1e4a72e (patch) | |
tree | 88dd94e2c659eda90a716b5663c1662d5d22ee32 | |
parent | f2c91ee49e2d4cc9711027cb404076ffba1bad6e (diff) |
modules/checkers: fix radcache partial initialization bug
Running something like:
'--module=checkers,size=64,fill_module=shapes,style=circle --defaults --go'
Would show some artifacts in the top portion of the filled cells
at certain phases of the spining shape. This was introduce by
the radcache, and it's caused by the overhanging tiles on the
perimeter and how their being clipped was carrying into the
radcache contents then used for all subsequent renders.
This commit just makes setting radcache.initialized conditional
on the incoming fragment being a full-frame fragment as a quick
fix. See comment for more info on what to do long-term.
-rw-r--r-- | src/modules/shapes/shapes.c | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/src/modules/shapes/shapes.c b/src/modules/shapes/shapes.c index e96d806..a1a56f7 100644 --- a/src/modules/shapes/shapes.c +++ b/src/modules/shapes/shapes.c @@ -463,6 +463,7 @@ static void shapes_render_fragment(til_module_context_t *context, til_stream_t * static void shapes_finish_frame(til_module_context_t *context, til_stream_t *stream, unsigned int ticks, til_fb_fragment_t **fragment_ptr) { shapes_context_t *ctxt = (shapes_context_t *)context; + til_fb_fragment_t *fragment = *fragment_ptr; /* XXX: note that in rendering, initialized is checked racily and it's entirely possible * for multiple contexts to be rendering and populating the radcache when !initialized @@ -471,8 +472,17 @@ static void shapes_finish_frame(til_module_context_t *context, til_stream_t *str * tri-state that's atomically advanced towards initialized wiht an "intializing" mid-state * that only one renderer can enter, then the others treat "initializing" as !radcache at all * TODO FIXME + * + * XXX: also note the radcache must be prevented from getting considered initialized by a partial + * frame - which happens as checkers::fill_module when the edge cells overhang for centering. + * Those perimeter renders won't populate the radcache fully. This is a band-aid, it would be + * better to let the radcache's initialized area expand so it can accelerate those perimiter + * cases with the partially initialized contents if there's enough there, then once full-frame cells + * happen it just grows with the first one of those. For now this check fixes a bug. FIXME TODO */ - ctxt->radcache->initialized = 1; + if (fragment->width == fragment->frame_width && + fragment->height == fragment->frame_height) + ctxt->radcache->initialized = 1; } |