From 9170d08854796f8595c9f6cebe85827a71e86e19 Mon Sep 17 00:00:00 2001 From: Vito Caputo Date: Sat, 2 Sep 2023 23:37:28 -0700 Subject: til,til_fb: introduce a noop_per_cpu fragmenter This is intended to perhaps be of use for threaded rendering that don't actually produce pixels during their render phase, but still need n_cpus fragments to dispatch the parallel work keying off the fragment.number. Such a renderer might then put its pixels on-screen serially @ finish_frame(), or maybe the rendering functions will get a return value to trigger multi-pass rendering on the same tick. --- src/til_fb.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) (limited to 'src/til_fb.c') diff --git a/src/til_fb.c b/src/til_fb.c index b6e98dd..78bae4d 100644 --- a/src/til_fb.c +++ b/src/til_fb.c @@ -646,6 +646,56 @@ void * til_fb_context(til_fb_t *fb) /* helpers for fragmenting incrementally */ +int til_fb_fragment_noop_single(const til_fb_fragment_t *fragment, unsigned n_fragments, unsigned number, til_fb_fragment_t *res_fragment) +{ + assert(fragment); + assert(res_fragment); + + if (number >= n_fragments) + return 0; + + if (fragment->texture) { + assert(res_fragment->texture); + assert(fragment->frame_width == fragment->texture->frame_width); + assert(fragment->frame_height == fragment->texture->frame_height); + assert(fragment->width == fragment->texture->width); + assert(fragment->height == fragment->texture->height); + assert(fragment->x == fragment->texture->x); + assert(fragment->y == fragment->texture->y); + + *(res_fragment->texture) = (til_fb_fragment_t){ + .buf = fragment->texture->buf, + .x = fragment->x, + .y = fragment->y, + .width = fragment->width, + .height = fragment->height, + .frame_width = fragment->frame_width, + .frame_height = fragment->frame_height, + .stride = fragment->texture->stride, + .pitch = fragment->texture->pitch, + .cleared = fragment->texture->cleared, + }; + } + + *res_fragment = (til_fb_fragment_t){ + .texture = fragment->texture ? res_fragment->texture : NULL, + .buf = fragment->buf, + .x = fragment->x, + .y = fragment->y, + .width = fragment->width, + .height = fragment->height, + .frame_width = fragment->frame_width, + .frame_height = fragment->frame_height, + .stride = fragment->stride, + .pitch = fragment->pitch, + .number = number, + .cleared = fragment->cleared, + }; + + return 1; +} + + int til_fb_fragment_slice_single(const til_fb_fragment_t *fragment, unsigned n_fragments, unsigned number, til_fb_fragment_t *res_fragment) { unsigned slice = MAX(fragment->height / n_fragments, 1); -- cgit v1.2.1