summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorVito Caputo <vcaputo@pengaru.com>2023-09-02 23:37:28 -0700
committerVito Caputo <vcaputo@pengaru.com>2023-09-04 20:53:36 -0700
commit9170d08854796f8595c9f6cebe85827a71e86e19 (patch)
tree85fd5ed8783f78133a1e57a093f2a9f8f085baa8 /src
parent952e4ac7ea69bb42e266516d78ed72ed68499d3f (diff)
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.
Diffstat (limited to 'src')
-rw-r--r--src/til.c7
-rw-r--r--src/til.h1
-rw-r--r--src/til_fb.c50
-rw-r--r--src/til_fb.h1
4 files changed, 59 insertions, 0 deletions
diff --git a/src/til.c b/src/til.c
index e1f15cc..5a295a5 100644
--- a/src/til.c
+++ b/src/til.c
@@ -629,6 +629,13 @@ int til_module_settings_finalize(const til_module_t *module, const til_settings_
}
+/* generic noop fragmenter that does no subfragmenting at all, producing a whole fragment per-cpu */
+int til_fragmenter_noop_per_cpu(til_module_context_t *context, const til_fb_fragment_t *fragment, unsigned number, til_fb_fragment_t *res_fragment)
+{
+ return til_fb_fragment_noop_single(fragment, context->n_cpus, number, res_fragment);
+}
+
+
/* generic fragmenter using a horizontal slice per cpu according to context->n_cpus */
int til_fragmenter_slice_per_cpu(til_module_context_t *context, const til_fb_fragment_t *fragment, unsigned number, til_fb_fragment_t *res_fragment)
{
diff --git a/src/til.h b/src/til.h
index 36105a8..0d48239 100644
--- a/src/til.h
+++ b/src/til.h
@@ -54,6 +54,7 @@ int til_module_setup_full(const til_settings_t *settings, til_setting_t **res_se
int til_module_setup(const til_settings_t *settings, til_setting_t **res_setting, const til_setting_desc_t **res_desc, til_setup_t **res_setup);
int til_module_settings_randomize(const til_module_t *module, til_settings_t *settings, unsigned seed, til_setup_t **res_setup, char **res_arg);
int til_module_settings_finalize(const til_module_t *module, const til_settings_t *module_settings, til_setup_t **res_setup);
+int til_fragmenter_noop_per_cpu(til_module_context_t *context, const til_fb_fragment_t *fragment, unsigned number, til_fb_fragment_t *res_fragment);
int til_fragmenter_slice_per_cpu(til_module_context_t *context, const til_fb_fragment_t *fragment, unsigned number, til_fb_fragment_t *res_fragment);
int til_fragmenter_slice_per_cpu_x16(til_module_context_t *context, const til_fb_fragment_t *fragment, unsigned number, til_fb_fragment_t *res_fragment);
int til_fragmenter_tile64(til_module_context_t *context, const til_fb_fragment_t *fragment, unsigned number, til_fb_fragment_t *res_fragment);
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);
diff --git a/src/til_fb.h b/src/til_fb.h
index 7c6464e..d346bd7 100644
--- a/src/til_fb.h
+++ b/src/til_fb.h
@@ -59,6 +59,7 @@ void til_fb_halt(til_fb_t *fb);
void * til_fb_context(til_fb_t *fb);
int til_fb_flip(til_fb_t *fb);
void til_fb_fragment_divide(til_fb_fragment_t *fragment, unsigned n_fragments, til_fb_fragment_t fragments[]);
+int til_fb_fragment_noop_single(const til_fb_fragment_t *fragment, unsigned n_fragments, unsigned num, til_fb_fragment_t *res_fragment);
int til_fb_fragment_slice_single(const til_fb_fragment_t *fragment, unsigned n_fragments, unsigned num, til_fb_fragment_t *res_fragment);
int til_fb_fragment_tile_single(const til_fb_fragment_t *fragment, unsigned tile_size, unsigned num, til_fb_fragment_t *res_fragment);
© All Rights Reserved