diff options
author | Vito Caputo <vcaputo@pengaru.com> | 2023-08-29 11:47:45 -0700 |
---|---|---|
committer | Vito Caputo <vcaputo@pengaru.com> | 2023-08-29 11:47:45 -0700 |
commit | 5ba2147e2db913fa0ba79daf49d58d2f4d35a9a7 (patch) | |
tree | 1b6f5c60fb2b0e095e66093c6a0c526f82227b71 /src | |
parent | eba46d3c401a57c7ca2f95baa0312bfb09543ed0 (diff) |
til_fb: return queue delay from til_fb_page_get()
til_fb is triple buffered, but when rendering lags behind the
queue is empty making present-to-delay intervals smaller than
when rendering is keeping up and the queue is kept full.
This returns the duration of the returned pages last
submit-to-present delay, effectively measuring how long a page
can expect to wait to be flipped to/presented currently.
A subsequent commit will apply this delay value to the ticks
supplied to rendering.
Diffstat (limited to 'src')
-rw-r--r-- | src/main.c | 4 | ||||
-rw-r--r-- | src/til_fb.c | 8 | ||||
-rw-r--r-- | src/til_fb.h | 2 |
3 files changed, 10 insertions, 4 deletions
@@ -326,9 +326,9 @@ static void * rototiller_thread(void *_rt) rototiller_t *rt = _rt; while (til_stream_active(rt->stream)) { - unsigned ticks; + unsigned ticks, delay = 0; - rt->fragment = til_fb_page_get(rt->fb); + rt->fragment = til_fb_page_get(rt->fb, &delay); if (!rt->fragment) { til_stream_end(rt->stream); continue; diff --git a/src/til_fb.c b/src/til_fb.c index 02259e8..8760b84 100644 --- a/src/til_fb.c +++ b/src/til_fb.c @@ -420,7 +420,7 @@ static inline _til_fb_page_t * _til_fb_page_get(til_fb_t *fb) /* public interface */ -til_fb_fragment_t * til_fb_page_get(til_fb_t *fb) +til_fb_fragment_t * til_fb_page_get(til_fb_t *fb, unsigned *res_delay_ticks) { _til_fb_page_t *page; @@ -428,6 +428,12 @@ til_fb_fragment_t * til_fb_page_get(til_fb_t *fb) if (!page) return NULL; + if (res_delay_ticks) { + /* TODO: handle overflows, just asserting for now until it rears its head */ + assert(page->presented_ticks >= page->submitted_ticks); + *res_delay_ticks = page->presented_ticks - page->submitted_ticks; + } + return &page->fragment.public; } diff --git a/src/til_fb.h b/src/til_fb.h index 5ad210f..7c6464e 100644 --- a/src/til_fb.h +++ b/src/til_fb.h @@ -47,7 +47,7 @@ typedef struct til_fb_ops_t { int (*page_flip)(til_fb_t *fb, void *context, void *page); } til_fb_ops_t; -til_fb_fragment_t * til_fb_page_get(til_fb_t *fb); +til_fb_fragment_t * til_fb_page_get(til_fb_t *fb, unsigned *res_delay_ticks); void til_fb_fragment_submit(til_fb_fragment_t *fragment); til_fb_fragment_t * til_fb_fragment_snapshot(til_fb_fragment_t **fragment_ptr, int preserve_original); til_fb_fragment_t * til_fb_fragment_reclaim(til_fb_fragment_t *fragment); |