summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVito Caputo <vcaputo@pengaru.com>2023-08-29 11:47:45 -0700
committerVito Caputo <vcaputo@pengaru.com>2023-08-29 11:47:45 -0700
commit5ba2147e2db913fa0ba79daf49d58d2f4d35a9a7 (patch)
tree1b6f5c60fb2b0e095e66093c6a0c526f82227b71
parenteba46d3c401a57c7ca2f95baa0312bfb09543ed0 (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.
-rw-r--r--src/main.c4
-rw-r--r--src/til_fb.c8
-rw-r--r--src/til_fb.h2
3 files changed, 10 insertions, 4 deletions
diff --git a/src/main.c b/src/main.c
index e51ad5e..e8a166a 100644
--- a/src/main.c
+++ b/src/main.c
@@ -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);
© All Rights Reserved