diff options
author | Vito Caputo <vcaputo@pengaru.com> | 2020-09-25 18:47:25 -0700 |
---|---|---|
committer | Vito Caputo <vcaputo@pengaru.com> | 2020-09-25 20:54:34 -0700 |
commit | d9db2680298c01a82b768dc19e75bf4f2ef1b56e (patch) | |
tree | 1e52d4cbfa4747bc0cb8f405881d5575a0db9b7e | |
parent | db9cc3ab1037ed98d2c6c9dbf44c60d08ca696c2 (diff) |
fb: track zeroed state in fb_fragment_t
This adds a bit flag for tracking if the fragment has been zeroed
since its last flip/present.
When a fresh frame comes back from flipping, its zeroed state is
reset to false.
When fb_fragment_zero() is called, it checks if zeroed is true,
and skips the zeroing if so.
If zeroed is false, fb_fragment_zero() will zero the fragment and
set the zeroed flag to 1.
This change is preparatory for layering the output of modules in
a compositing fashion. Not all modules are amenable to being
used as upper layers, since they inherently fill the screen with
new pixels every frame. Those modules make good bottom or bg
layers. Other modules perform fb_fragment_zero() every frame
and add relatively few pixels atop a clean slate. These modules
make good candidates for upper layers where this change becomes
relevant.
-rw-r--r-- | src/fb.c | 2 | ||||
-rw-r--r-- | src/fb.h | 6 | ||||
-rw-r--r-- | src/modules/montage/montage.c | 1 |
3 files changed, 9 insertions, 0 deletions
@@ -191,6 +191,7 @@ static inline _fb_page_t * _fb_page_get(fb_t *fb) pthread_mutex_unlock(&fb->inactive_mutex); page->next = NULL; + page->public_page.fragment.zeroed = 0; return page; } @@ -329,6 +330,7 @@ int fb_fragment_slice_single(const fb_fragment_t *fragment, unsigned n_fragments res_fragment->stride = fragment->stride; res_fragment->pitch = fragment->pitch; res_fragment->number = number; + res_fragment->zeroed = fragment->zeroed; return 1; } @@ -19,6 +19,7 @@ typedef struct fb_fragment_t { unsigned stride; /* number of bytes from the end of one row to the start of the next */ unsigned pitch; /* number of bytes separating y from y + 1, including any padding */ unsigned number; /* this fragment's number as produced by fragmenting */ + unsigned zeroed:1; /* if this fragment has been zeroed since last flip */ } fb_fragment_t; /* This is a page handle object for page flip submission/life-cycle. @@ -92,9 +93,14 @@ static inline void fb_fragment_zero(fb_fragment_t *fragment) { void *buf = fragment->buf; + if (fragment->zeroed) + return; + /* TODO: there should be a fast-path for non-divided fragments where there's no stride to skip */ for (int y = 0; y < fragment->height; y++, buf += fragment->pitch) memset(buf, 0, fragment->pitch - fragment->stride); + + fragment->zeroed = 1; } #endif diff --git a/src/modules/montage/montage.c b/src/modules/montage/montage.c index d7dd55f..99c3e66 100644 --- a/src/modules/montage/montage.c +++ b/src/modules/montage/montage.c @@ -146,6 +146,7 @@ static int montage_fragment_tile(const fb_fragment_t *fragment, unsigned tile_wi res_fragment->stride = fragment->stride + ((fragment->width - res_fragment->width) * 4); res_fragment->pitch = fragment->pitch; res_fragment->number = number; + res_fragment->zeroed = fragment->zeroed; return 1; } |