summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVito Caputo <vcaputo@pengaru.com>2022-06-14 02:28:36 -0700
committerVito Caputo <vcaputo@pengaru.com>2022-08-07 06:51:36 -0700
commit5a0776f1fdc6b7780cd21d568150e804347a6f8a (patch)
tree646f1c6e73cd9d7cb63306a840879a0a64aebbed
parent4eb5f55bb0087769e47d0dc745a831440c5041fe (diff)
til: til_fb_fragment_t **fragment_ptr all the things
Preparatory commit for enabling cloneable/swappable fragments There's an outstanding issue with the til_fb_page_t submission, see comments. Doesn't matter for now since cloning doesn't happen yet, but will need to be addressed before they do.
-rw-r--r--src/main.c19
-rw-r--r--src/modules/blinds/blinds.c3
-rw-r--r--src/modules/checkers/checkers.c9
-rw-r--r--src/modules/compose/compose.c23
-rw-r--r--src/modules/drizzle/drizzle.c6
-rw-r--r--src/modules/flui2d/flui2d.c9
-rw-r--r--src/modules/julia/julia.c8
-rw-r--r--src/modules/meta2d/meta2d.c12
-rw-r--r--src/modules/moire/moire.c14
-rw-r--r--src/modules/montage/montage.c11
-rw-r--r--src/modules/pixbounce/pixbounce.c5
-rw-r--r--src/modules/plasma/plasma.c22
-rw-r--r--src/modules/plato/plato.c5
-rw-r--r--src/modules/ray/ray.c12
-rw-r--r--src/modules/roto/roto.c8
-rw-r--r--src/modules/rtv/rtv.c13
-rw-r--r--src/modules/shapes/shapes.c4
-rw-r--r--src/modules/snow/snow.c8
-rw-r--r--src/modules/sparkler/sparkler.c6
-rw-r--r--src/modules/spiro/spiro.c10
-rw-r--r--src/modules/stars/stars.c6
-rw-r--r--src/modules/submit/submit.c5
-rw-r--r--src/modules/swab/swab.c20
-rw-r--r--src/modules/swarm/swarm.c5
-rw-r--r--src/modules/voronoi/voronoi.c6
-rw-r--r--src/til.c30
-rw-r--r--src/til.h8
-rw-r--r--src/til_threads.c20
-rw-r--r--src/til_threads.h2
29 files changed, 182 insertions, 127 deletions
diff --git a/src/main.c b/src/main.c
index 7f6557b..8648b8e 100644
--- a/src/main.c
+++ b/src/main.c
@@ -319,15 +319,28 @@ static void * rototiller_thread(void *_rt)
struct timeval now;
for (;;) {
- til_fb_page_t *page;
- unsigned ticks;
+ til_fb_page_t *page;
+ til_fb_fragment_t *fragment;
+ unsigned ticks;
page = til_fb_page_get(rt->fb);
+ fragment = &page->fragment;
gettimeofday(&now, NULL);
ticks = get_ticks(&rt->start_tv, &now, rt->ticks_offset);
- til_module_render(rt->module_context, ticks, &page->fragment);
+ /* XXX FIXME this needs refactoring, maybe til_fb_fragment_ops_t needs
+ * to implement the page_put, then til_fb_page_get() just returns a
+ * fragment with a put method.
+ *
+ * I've hacked it for now, but it's broken once cloning becomes a thing
+ * because we assume that page contains fragment @ put time. When a
+ * clone could have replaced the fragment, and it's the replacement page
+ * that must be submitted. what makes a page? being submittable, so
+ * maybe just make submit another op on the fragment and get rid of the
+ * til_fb_page_t type altogether... hacked to build for now.
+ */
+ til_module_render(rt->module_context, ticks, &fragment);
til_fb_page_put(rt->fb, page);
}
diff --git a/src/modules/blinds/blinds.c b/src/modules/blinds/blinds.c
index aa71ddd..d3cddf2 100644
--- a/src/modules/blinds/blinds.c
+++ b/src/modules/blinds/blinds.c
@@ -83,9 +83,10 @@ static inline void draw_blind_vertical(til_fb_fragment_t *fragment, unsigned col
/* draw blinds over the fragment */
-static void blinds_render_fragment(til_module_context_t *context, unsigned ticks, unsigned cpu, til_fb_fragment_t *fragment)
+static void blinds_render_fragment(til_module_context_t *context, unsigned ticks, unsigned cpu, til_fb_fragment_t **fragment_ptr)
{
blinds_context_t *ctxt = (blinds_context_t *)context;
+ til_fb_fragment_t *fragment = *fragment_ptr;
static float rr;
diff --git a/src/modules/checkers/checkers.c b/src/modules/checkers/checkers.c
index 20ecd63..32b5aa3 100644
--- a/src/modules/checkers/checkers.c
+++ b/src/modules/checkers/checkers.c
@@ -200,9 +200,10 @@ static int checkers_fragmenter(til_module_context_t *context, const til_fb_fragm
}
-static void checkers_prepare_frame(til_module_context_t *context, unsigned ticks, til_fb_fragment_t *fragment, til_frame_plan_t *res_frame_plan)
+static void checkers_prepare_frame(til_module_context_t *context, unsigned ticks, til_fb_fragment_t **fragment_ptr, til_frame_plan_t *res_frame_plan)
{
checkers_context_t *ctxt = (checkers_context_t *)context;
+ til_fb_fragment_t *fragment = *fragment_ptr;
/* XXX: note cpu_affinity is required when fill_module is used, to ensure module_contexts
* have a stable relationship to fragnum. Otherwise the output would be unstable because the
@@ -227,9 +228,11 @@ static inline unsigned hash(unsigned x)
}
-static void checkers_render_fragment(til_module_context_t *context, unsigned ticks, unsigned cpu, til_fb_fragment_t *fragment)
+static void checkers_render_fragment(til_module_context_t *context, unsigned ticks, unsigned cpu, til_fb_fragment_t **fragment_ptr)
{
checkers_context_t *ctxt = (checkers_context_t *)context;
+ til_fb_fragment_t *fragment = *fragment_ptr;
+
uint32_t color = ctxt->setup.color, flags = 0;
checkers_fill_t fill = ctxt->setup.fill;
int state;
@@ -293,7 +296,7 @@ static void checkers_render_fragment(til_module_context_t *context, unsigned tic
til_fb_fragment_fill(fragment, flags, color);
else {
/* TODO: we need a way to send down color and flags, and use the module render as a brush of sorts */
- til_module_render(ctxt->fill_module_contexts[cpu], ticks, fragment);
+ til_module_render(ctxt->fill_module_contexts[cpu], ticks, fragment_ptr);
}
}
}
diff --git a/src/modules/compose/compose.c b/src/modules/compose/compose.c
index ff32ac4..922a9b9 100644
--- a/src/modules/compose/compose.c
+++ b/src/modules/compose/compose.c
@@ -49,7 +49,7 @@ typedef struct compose_setup_t {
static til_module_context_t * compose_create_context(unsigned seed, unsigned ticks, unsigned n_cpus, til_setup_t *setup);
static void compose_destroy_context(til_module_context_t *context);
-static void compose_render_fragment(til_module_context_t *context, unsigned ticks, unsigned cpu, til_fb_fragment_t *fragment);
+static void compose_render_fragment(til_module_context_t *context, unsigned ticks, unsigned cpu, til_fb_fragment_t **fragment_ptr);
static int compose_setup(const til_settings_t *settings, til_setting_t **res_setting, const til_setting_desc_t **res_desc, til_setup_t **res_setup);
static compose_setup_t compose_default_setup = {
@@ -125,9 +125,10 @@ static void compose_destroy_context(til_module_context_t *context)
}
-static void compose_render_fragment(til_module_context_t *context, unsigned ticks, unsigned cpu, til_fb_fragment_t *fragment)
+static void compose_render_fragment(til_module_context_t *context, unsigned ticks, unsigned cpu, til_fb_fragment_t **fragment_ptr)
{
compose_context_t *ctxt = (compose_context_t *)context;
+ til_fb_fragment_t *fragment = *fragment_ptr, *texture = &ctxt->texture_fb;
if (ctxt->texture.module) {
if (!ctxt->texture_fb.buf ||
@@ -146,21 +147,23 @@ static void compose_render_fragment(til_module_context_t *context, unsigned tick
}
ctxt->texture_fb.cleared = 0;
- til_module_render(ctxt->texture.module_ctxt, ticks, &ctxt->texture_fb);
-
- til_module_render(ctxt->layers[0].module_ctxt, ticks, fragment);
+ /* XXX: if when snapshotting becomes a thing, ctxt->texture_fb is snapshottable, this will likely break as-is */
+ til_module_render(ctxt->texture.module_ctxt, ticks, &texture);
+ til_module_render(ctxt->layers[0].module_ctxt, ticks, &fragment);
for (size_t i = 1; i < ctxt->n_layers; i++) {
- til_fb_fragment_t textured = *fragment;
-
- textured.texture = &ctxt->texture_fb;
+ til_fb_fragment_t *old_texture = fragment->texture;
- til_module_render(ctxt->layers[i].module_ctxt, ticks, &textured);
+ fragment->texture = texture;
+ til_module_render(ctxt->layers[i].module_ctxt, ticks, &fragment);
+ fragment->texture = old_texture;
}
} else {
for (size_t i = 0; i < ctxt->n_layers; i++)
- til_module_render(ctxt->layers[i].module_ctxt, ticks, fragment);
+ til_module_render(ctxt->layers[i].module_ctxt, ticks, &fragment);
}
+
+ *fragment_ptr = fragment;
}
diff --git a/src/modules/drizzle/drizzle.c b/src/modules/drizzle/drizzle.c
index ec97d16..fff59bd 100644
--- a/src/modules/drizzle/drizzle.c
+++ b/src/modules/drizzle/drizzle.c
@@ -106,7 +106,7 @@ static void drizzle_destroy_context(til_module_context_t *context)
}
-static void drizzle_prepare_frame(til_module_context_t *context, unsigned ticks, til_fb_fragment_t *fragment, til_frame_plan_t *res_frame_plan)
+static void drizzle_prepare_frame(til_module_context_t *context, unsigned ticks, til_fb_fragment_t **fragment_ptr, til_frame_plan_t *res_frame_plan)
{
drizzle_context_t *ctxt = (drizzle_context_t *)context;
@@ -130,9 +130,11 @@ static void drizzle_prepare_frame(til_module_context_t *context, unsigned ticks,
}
-static void drizzle_render_fragment(til_module_context_t *context, unsigned ticks, unsigned cpu, til_fb_fragment_t *fragment)
+static void drizzle_render_fragment(til_module_context_t *context, unsigned ticks, unsigned cpu, til_fb_fragment_t **fragment_ptr)
{
drizzle_context_t *ctxt = (drizzle_context_t *)context;
+ til_fb_fragment_t *fragment = *fragment_ptr;
+
float xf = 1.f / (float)fragment->frame_width;
float yf = 1.f / (float)fragment->frame_height;
v2f_t coord;
diff --git a/src/modules/flui2d/flui2d.c b/src/modules/flui2d/flui2d.c
index cb249c3..5272e4d 100644
--- a/src/modules/flui2d/flui2d.c
+++ b/src/modules/flui2d/flui2d.c
@@ -273,10 +273,12 @@ static til_module_context_t * flui2d_create_context(unsigned seed, unsigned tick
/* Prepare a frame for concurrent drawing of fragment using multiple fragments */
-static void flui2d_prepare_frame(til_module_context_t *context, unsigned ticks, til_fb_fragment_t *fragment, til_frame_plan_t *res_frame_plan)
+static void flui2d_prepare_frame(til_module_context_t *context, unsigned ticks, til_fb_fragment_t **fragment_ptr, til_frame_plan_t *res_frame_plan)
{
flui2d_context_t *ctxt = (flui2d_context_t *)context;
- float r = (ticks % (unsigned)(2 * M_PI * 1000)) * .001f;
+ til_fb_fragment_t *fragment = *fragment_ptr;
+
+ float r = (ticks % (unsigned)(2 * M_PI * 1000)) * .001f;
*res_frame_plan = (til_frame_plan_t){ .fragmenter = til_fragmenter_tile64 };
@@ -332,9 +334,10 @@ static void flui2d_prepare_frame(til_module_context_t *context, unsigned ticks,
/* Draw a the flui2d densities */
-static void flui2d_render_fragment(til_module_context_t *context, unsigned ticks, unsigned cpu, til_fb_fragment_t *fragment)
+static void flui2d_render_fragment(til_module_context_t *context, unsigned ticks, unsigned cpu, til_fb_fragment_t **fragment_ptr)
{
flui2d_context_t *ctxt = (flui2d_context_t *)context;
+ til_fb_fragment_t *fragment = *fragment_ptr;
for (int y = fragment->y; y < fragment->y + fragment->height; y++) {
int y0, y1;
diff --git a/src/modules/julia/julia.c b/src/modules/julia/julia.c
index aa05dd8..2668061 100644
--- a/src/modules/julia/julia.c
+++ b/src/modules/julia/julia.c
@@ -106,7 +106,7 @@ static inline unsigned julia_iter(float real, float imag, float creal, float cim
/* Prepare a frame for concurrent drawing of fragment using multiple fragments */
-static void julia_prepare_frame(til_module_context_t *context, unsigned ticks, til_fb_fragment_t *fragment, til_frame_plan_t *res_frame_plan)
+static void julia_prepare_frame(til_module_context_t *context, unsigned ticks, til_fb_fragment_t **fragment_ptr, til_frame_plan_t *res_frame_plan)
{
julia_context_t *ctxt = (julia_context_t *)context;
@@ -133,9 +133,11 @@ static void julia_prepare_frame(til_module_context_t *context, unsigned ticks, t
/* Draw a morphing Julia set */
-static void julia_render_fragment(til_module_context_t *context, unsigned ticks, unsigned cpu, til_fb_fragment_t *fragment)
+static void julia_render_fragment(til_module_context_t *context, unsigned ticks, unsigned cpu, til_fb_fragment_t **fragment_ptr)
{
- julia_context_t *ctxt = (julia_context_t *)context;
+ julia_context_t *ctxt = (julia_context_t *)context;
+ til_fb_fragment_t *fragment = *fragment_ptr;
+
unsigned x, y;
unsigned width = fragment->width, height = fragment->height;
uint32_t *buf = fragment->buf;
diff --git a/src/modules/meta2d/meta2d.c b/src/modules/meta2d/meta2d.c
index b7b6708..8af3981 100644
--- a/src/modules/meta2d/meta2d.c
+++ b/src/modules/meta2d/meta2d.c
@@ -101,7 +101,7 @@ static void meta2d_destroy_context(til_module_context_t *context)
}
-static void meta2d_prepare_frame(til_module_context_t *context, unsigned ticks, til_fb_fragment_t *fragment, til_frame_plan_t *res_frame_plan)
+static void meta2d_prepare_frame(til_module_context_t *context, unsigned ticks, til_fb_fragment_t **fragment_ptr, til_frame_plan_t *res_frame_plan)
{
meta2d_context_t *ctxt = (meta2d_context_t *)context;
@@ -178,12 +178,14 @@ static void meta2d_prepare_frame(til_module_context_t *context, unsigned ticks,
}
-static void meta2d_render_fragment(til_module_context_t *context, unsigned ticks, unsigned cpu, til_fb_fragment_t *fragment)
+static void meta2d_render_fragment(til_module_context_t *context, unsigned ticks, unsigned cpu, til_fb_fragment_t **fragment_ptr)
{
meta2d_context_t *ctxt = (meta2d_context_t *)context;
- float xf = 2.f / (float)fragment->frame_width;
- float yf = 2.f / (float)fragment->frame_height;
- v2f_t coord;
+ til_fb_fragment_t *fragment = *fragment_ptr;
+
+ float xf = 2.f / (float)fragment->frame_width;
+ float yf = 2.f / (float)fragment->frame_height;
+ v2f_t coord;
for (int y = fragment->y; y < fragment->y + fragment->height; y++) {
coord.y = yf * (float)y - 1.f;
diff --git a/src/modules/moire/moire.c b/src/modules/moire/moire.c
index ceeefe0..d528f8c 100644
--- a/src/modules/moire/moire.c
+++ b/src/modules/moire/moire.c
@@ -71,7 +71,7 @@ static til_module_context_t * moire_create_context(unsigned seed, unsigned ticks
}
-static void moire_prepare_frame(til_module_context_t *context, unsigned ticks, til_fb_fragment_t *fragment, til_frame_plan_t *res_frame_plan)
+static void moire_prepare_frame(til_module_context_t *context, unsigned ticks, til_fb_fragment_t **fragment_ptr, til_frame_plan_t *res_frame_plan)
{
moire_context_t *ctxt = (moire_context_t *)context;
@@ -84,12 +84,14 @@ static void moire_prepare_frame(til_module_context_t *context, unsigned ticks, t
}
-static void moire_render_fragment(til_module_context_t *context, unsigned ticks, unsigned cpu, til_fb_fragment_t *fragment)
+static void moire_render_fragment(til_module_context_t *context, unsigned ticks, unsigned cpu, til_fb_fragment_t **fragment_ptr)
{
- moire_context_t *ctxt = (moire_context_t *)context;
- float xf = 2.f / (float)fragment->frame_width;
- float yf = 2.f / (float)fragment->frame_height;
- float cx, cy;
+ moire_context_t *ctxt = (moire_context_t *)context;
+ til_fb_fragment_t *fragment = *fragment_ptr;
+
+ float xf = 2.f / (float)fragment->frame_width;
+ float yf = 2.f / (float)fragment->frame_height;
+ float cx, cy;
/* TODO: optimize */
cy = yf * (float)fragment->y - 1.f;
diff --git a/src/modules/montage/montage.c b/src/modules/montage/montage.c
index 7991e3f..eaf8be7 100644
--- a/src/modules/montage/montage.c
+++ b/src/modules/montage/montage.c
@@ -18,8 +18,8 @@ typedef struct montage_context_t {
static til_module_context_t * montage_create_context(unsigned seed, unsigned ticks, unsigned n_cpus, til_setup_t *setup);
static void montage_destroy_context(til_module_context_t *context);
-static void montage_prepare_frame(til_module_context_t *context, unsigned ticks, til_fb_fragment_t *fragment, til_frame_plan_t *res_frame_plan);
-static void montage_render_fragment(til_module_context_t *context, unsigned ticks, unsigned cpu, til_fb_fragment_t *fragment);
+static void montage_prepare_frame(til_module_context_t *context, unsigned ticks, til_fb_fragment_t **fragment_ptr, til_frame_plan_t *res_frame_plan);
+static void montage_render_fragment(til_module_context_t *context, unsigned ticks, unsigned cpu, til_fb_fragment_t **fragment_ptr);
til_module_t montage_module = {
@@ -184,15 +184,16 @@ static int montage_fragmenter(til_module_context_t *context, const til_fb_fragme
}
-static void montage_prepare_frame(til_module_context_t *context, unsigned ticks, til_fb_fragment_t *fragment, til_frame_plan_t *res_frame_plan)
+static void montage_prepare_frame(til_module_context_t *context, unsigned ticks, til_fb_fragment_t **fragment_ptr, til_frame_plan_t *res_frame_plan)
{
*res_frame_plan = (til_frame_plan_t){ .fragmenter = montage_fragmenter };
}
-static void montage_render_fragment(til_module_context_t *context, unsigned ticks, unsigned cpu, til_fb_fragment_t *fragment)
+static void montage_render_fragment(til_module_context_t *context, unsigned ticks, unsigned cpu, til_fb_fragment_t **fragment_ptr)
{
montage_context_t *ctxt = (montage_context_t *)context;
+ til_fb_fragment_t *fragment = *fragment_ptr;
if (fragment->number >= ctxt->n_modules) {
til_fb_fragment_clear(fragment);
@@ -200,5 +201,5 @@ static void montage_render_fragment(til_module_context_t *context, unsigned tick
return;
}
- til_module_render(ctxt->contexts[fragment->number], ticks, fragment);
+ til_module_render(ctxt->contexts[fragment->number], ticks, fragment_ptr);
}
diff --git a/src/modules/pixbounce/pixbounce.c b/src/modules/pixbounce/pixbounce.c
index d200ad6..6a6bfb3 100644
--- a/src/modules/pixbounce/pixbounce.c
+++ b/src/modules/pixbounce/pixbounce.c
@@ -260,9 +260,10 @@ static til_module_context_t * pixbounce_create_context(unsigned seed, unsigned t
return &ctxt->til_module_context;
}
-static void pixbounce_render_fragment(til_module_context_t *context, unsigned ticks, unsigned cpu, til_fb_fragment_t *fragment)
+static void pixbounce_render_fragment(til_module_context_t *context, unsigned ticks, unsigned cpu, til_fb_fragment_t **fragment_ptr)
{
- pixbounce_context_t *ctxt = (pixbounce_context_t *)context;
+ pixbounce_context_t *ctxt = (pixbounce_context_t *)context;
+ til_fb_fragment_t *fragment = *fragment_ptr;
int width = fragment->width, height = fragment->height;
diff --git a/src/modules/plasma/plasma.c b/src/modules/plasma/plasma.c
index 8cc4fda..b58e34f 100644
--- a/src/modules/plasma/plasma.c
+++ b/src/modules/plasma/plasma.c
@@ -75,7 +75,7 @@ static til_module_context_t * plasma_create_context(unsigned seed, unsigned tick
/* Prepare a frame for concurrent drawing of fragment using multiple fragments */
-static void plasma_prepare_frame(til_module_context_t *context, unsigned ticks, til_fb_fragment_t *fragment, til_frame_plan_t *res_frame_plan)
+static void plasma_prepare_frame(til_module_context_t *context, unsigned ticks, til_fb_fragment_t **fragment_ptr, til_frame_plan_t *res_frame_plan)
{
plasma_context_t *ctxt = (plasma_context_t *)context;
@@ -85,17 +85,19 @@ static void plasma_prepare_frame(til_module_context_t *context, unsigned ticks,
/* Draw a plasma effect */
-static void plasma_render_fragment(til_module_context_t *context, unsigned ticks, unsigned cpu, til_fb_fragment_t *fragment)
+static void plasma_render_fragment(til_module_context_t *context, unsigned ticks, unsigned cpu, til_fb_fragment_t **fragment_ptr)
{
plasma_context_t *ctxt = (plasma_context_t *)context;
- int xstep = PLASMA_WIDTH / fragment->frame_width;
- int ystep = PLASMA_HEIGHT / fragment->frame_height;
- unsigned width = fragment->width * xstep, height = fragment->height * ystep;
- int fw2 = FIXED_NEW(width / 2), fh2 = FIXED_NEW(height / 2);
- int x, y, cx, cy, dx2, dy2;
- uint32_t *buf = fragment->buf;
- color_t c = { .r = 0, .g = 0, .b = 0 }, cscale;
- unsigned rr2, rr6, rr8, rr16, rr20, rr12;
+ til_fb_fragment_t *fragment = *fragment_ptr;
+
+ int xstep = PLASMA_WIDTH / fragment->frame_width;
+ int ystep = PLASMA_HEIGHT / fragment->frame_height;
+ unsigned width = fragment->width * xstep, height = fragment->height * ystep;
+ int fw2 = FIXED_NEW(width / 2), fh2 = FIXED_NEW(height / 2);
+ int x, y, cx, cy, dx2, dy2;
+ uint32_t *buf = fragment->buf;
+ color_t c = { .r = 0, .g = 0, .b = 0 }, cscale;
+ unsigned rr2, rr6, rr8, rr16, rr20, rr12;
rr2 = ctxt->rr * 2;
rr6 = ctxt->rr * 6;
diff --git a/src/modules/plato/plato.c b/src/modules/plato/plato.c
index 43d9bdd..f56bef8 100644
--- a/src/modules/plato/plato.c
+++ b/src/modules/plato/plato.c
@@ -622,9 +622,10 @@ static til_module_context_t * plato_create_context(unsigned seed, unsigned ticks
}
-static void plato_render_fragment(til_module_context_t *context, unsigned ticks, unsigned cpu, til_fb_fragment_t *fragment)
+static void plato_render_fragment(til_module_context_t *context, unsigned ticks, unsigned cpu, til_fb_fragment_t **fragment_ptr)
{
- plato_context_t *ctxt = (plato_context_t *)context;
+ plato_context_t *ctxt = (plato_context_t *)context;
+ til_fb_fragment_t *fragment = *fragment_ptr;
ctxt->r += (float)(ticks - context->ticks) * .001f;
context->ticks = ticks;
diff --git a/src/modules/ray/ray.c b/src/modules/ray/ray.c
index ead6636..9814dcc 100644
--- a/src/modules/ray/ray.c
+++ b/src/modules/ray/ray.c
@@ -145,9 +145,10 @@ static til_module_context_t * ray_create_context(unsigned seed, unsigned ticks,
/* prepare a frame for concurrent rendering */
-static void ray_prepare_frame(til_module_context_t *context, unsigned ticks, til_fb_fragment_t *fragment, til_frame_plan_t *res_frame_plan)
+static void ray_prepare_frame(til_module_context_t *context, unsigned ticks, til_fb_fragment_t **fragment_ptr, til_frame_plan_t *res_frame_plan)
{
- ray_context_t *ctxt = (ray_context_t *)context;
+ ray_context_t *ctxt = (ray_context_t *)context;
+ til_fb_fragment_t *fragment = *fragment_ptr;
*res_frame_plan = (til_frame_plan_t){ .fragmenter = til_fragmenter_tile64 };
#if 1
@@ -177,15 +178,16 @@ static void ray_prepare_frame(til_module_context_t *context, unsigned ticks, til
/* ray trace a simple scene into the fragment */
-static void ray_render_fragment(til_module_context_t *context, unsigned ticks, unsigned cpu, til_fb_fragment_t *fragment)
+static void ray_render_fragment(til_module_context_t *context, unsigned ticks, unsigned cpu, til_fb_fragment_t **fragment_ptr)
{
- ray_context_t *ctxt = (ray_context_t *)context;
+ ray_context_t *ctxt = (ray_context_t *)context;
+ til_fb_fragment_t *fragment = *fragment_ptr;
ray_render_trace_fragment(ctxt->render, fragment);
}
-static void ray_finish_frame(til_module_context_t *context, unsigned ticks, til_fb_fragment_t *fragment)
+static void ray_finish_frame(til_module_context_t *context, unsigned ticks, til_fb_fragment_t **fragment_ptr)
{
ray_context_t *ctxt = (ray_context_t *)context;
diff --git a/src/modules/roto/roto.c b/src/modules/roto/roto.c
index a8ee45d..e2abea3 100644
--- a/src/modules/roto/roto.c
+++ b/src/modules/roto/roto.c
@@ -174,7 +174,7 @@ static void init_roto(uint8_t texture[256][256], int32_t *costab, int32_t *sinta
/* prepare a frame for concurrent rendering */
-static void roto_prepare_frame(til_module_context_t *context, unsigned ticks, til_fb_fragment_t *fragment, til_frame_plan_t *res_frame_plan)
+static void roto_prepare_frame(til_module_context_t *context, unsigned ticks, til_fb_fragment_t **fragment_ptr, til_frame_plan_t *res_frame_plan)
{
roto_context_t *ctxt = (roto_context_t *)context;
static int initialized;
@@ -207,9 +207,11 @@ static void roto_prepare_frame(til_module_context_t *context, unsigned ticks, ti
/* Draw a rotating checkered 256x256 texture into fragment. */
-static void roto_render_fragment(til_module_context_t *context, unsigned ticks, unsigned cpu, til_fb_fragment_t *fragment)
+static void roto_render_fragment(til_module_context_t *context, unsigned ticks, unsigned cpu, til_fb_fragment_t **fragment_ptr)
{
- roto_context_t *ctxt = (roto_context_t *)context;
+ roto_context_t *ctxt = (roto_context_t *)context;
+ til_fb_fragment_t *fragment = *fragment_ptr;
+
int x, y, frame_width = fragment->frame_width, frame_height = fragment->frame_height;
int y_cos_r, y_sin_r, x_cos_r, x_sin_r, x_cos_r_init, x_sin_r_init, cos_r, sin_r;
uint32_t *buf = fragment->buf;
diff --git a/src/modules/rtv/rtv.c b/src/modules/rtv/rtv.c
index 3a8e7fc..13c8da9 100644
--- a/src/modules/rtv/rtv.c
+++ b/src/modules/rtv/rtv.c
@@ -63,8 +63,8 @@ typedef struct rtv_setup_t {
static void setup_next_channel(rtv_context_t *ctxt, unsigned ticks);
static til_module_context_t * rtv_create_context(unsigned seed, unsigned ticks, unsigned n_cpus, til_setup_t *setup);
static void rtv_destroy_context(til_module_context_t *context);
-static void rtv_render_fragment(til_module_context_t *context, unsigned ticks, unsigned cpu, til_fb_fragment_t *fragment);
-static void rtv_finish_frame(til_module_context_t *context, unsigned ticks, til_fb_fragment_t *fragment);
+static void rtv_render_fragment(til_module_context_t *context, unsigned ticks, unsigned cpu, til_fb_fragment_t **fragment_ptr);
+static void rtv_finish_frame(til_module_context_t *context, unsigned ticks, til_fb_fragment_t **fragment_ptr);
static int rtv_setup(const til_settings_t *settings, til_setting_t **res_setting, const til_setting_desc_t **res_desc, til_setup_t **res_setup);
static rtv_setup_t rtv_default_setup = {
@@ -268,7 +268,7 @@ static void rtv_destroy_context(til_module_context_t *context)
}
-static void rtv_render_fragment(til_module_context_t *context, unsigned ticks, unsigned cpu, til_fb_fragment_t *fragment)
+static void rtv_render_fragment(til_module_context_t *context, unsigned ticks, unsigned cpu, til_fb_fragment_t **fragment_ptr)
{
rtv_context_t *ctxt = (rtv_context_t *)context;
time_t now = time(NULL);
@@ -279,13 +279,14 @@ static void rtv_render_fragment(til_module_context_t *context, unsigned ticks, u
if (now >= ctxt->next_hide_caption)
ctxt->caption = NULL;
- til_module_render(ctxt->channel->module_ctxt, ticks, fragment);
+ til_module_render(ctxt->channel->module_ctxt, ticks, fragment_ptr);
}
-static void rtv_finish_frame(til_module_context_t *context, unsigned ticks, til_fb_fragment_t *fragment)
+static void rtv_finish_frame(til_module_context_t *context, unsigned ticks, til_fb_fragment_t **fragment_ptr)
{
- rtv_context_t *ctxt = (rtv_context_t *)context;
+ rtv_context_t *ctxt = (rtv_context_t *)context;
+ til_fb_fragment_t *fragment = *fragment_ptr;
if (!ctxt->caption)
return;
diff --git a/src/modules/shapes/shapes.c b/src/modules/shapes/shapes.c
index 47bb8df..bce0a37 100644
--- a/src/modules/shapes/shapes.c
+++ b/src/modules/shapes/shapes.c
@@ -115,9 +115,11 @@ static til_module_context_t * shapes_create_context(unsigned seed, unsigned tick
}
-static void shapes_render_fragment(til_module_context_t *context, unsigned ticks, unsigned cpu, til_fb_fragment_t *fragment)
+static void shapes_render_fragment(til_module_context_t *context, unsigned ticks, unsigned cpu, til_fb_fragment_t **fragment_ptr)
{
shapes_context_t *ctxt = (shapes_context_t *)context;
+ til_fb_fragment_t *fragment = *fragment_ptr;
+
unsigned size = MIN(fragment->frame_width, fragment->frame_height) * ctxt->setup.scale;
unsigned xoff = (fragment->frame_width - size) >> 1;
unsigned yoff = (fragment->frame_height - size) >> 1;
diff --git a/src/modules/snow/snow.c b/src/modules/snow/snow.c
index a367113..1a171ee 100644
--- a/src/modules/snow/snow.c
+++ b/src/modules/snow/snow.c
@@ -37,15 +37,17 @@ static til_module_context_t * snow_create_context(unsigned seed, unsigned ticks,
}
-static void snow_prepare_frame(til_module_context_t *context, unsigned ticks, til_fb_fragment_t *fragment, til_frame_plan_t *res_frame_plan)
+static void snow_prepare_frame(til_module_context_t *context, unsigned ticks, til_fb_fragment_t **fragment_ptr, til_frame_plan_t *res_frame_plan)
{
*res_frame_plan = (til_frame_plan_t){ .fragmenter = til_fragmenter_slice_per_cpu };
}
-static void snow_render_fragment(til_module_context_t *context, unsigned ticks, unsigned cpu, til_fb_fragment_t *fragment)
+static void snow_render_fragment(til_module_context_t *context, unsigned ticks, unsigned cpu, til_fb_fragment_t **fragment_ptr)
{
- snow_context_t *ctxt = (snow_context_t *)context;
+ snow_context_t *ctxt = (snow_context_t *)context;
+ til_fb_fragment_t *fragment = *fragment_ptr;
+
unsigned *seed = &ctxt->seeds[cpu].seed;
for (unsigned y = fragment->y; y < fragment->y + fragment->height; y++) {
diff --git a/src/modules/sparkler/sparkler.c b/src/modules/sparkler/sparkler.c
index f0f2cb6..339e3e9 100644
--- a/src/modules/sparkler/sparkler.c
+++ b/src/modules/sparkler/sparkler.c
@@ -75,9 +75,10 @@ static void sparkler_destroy_context(til_module_context_t *context)
}
-static void sparkler_prepare_frame(til_module_context_t *context, unsigned ticks, til_fb_fragment_t *fragment, til_frame_plan_t *res_frame_plan)
+static void sparkler_prepare_frame(til_module_context_t *context, unsigned ticks, til_fb_fragment_t **fragment_ptr, til_frame_plan_t *res_frame_plan)
{
sparkler_context_t *ctxt = (sparkler_context_t *)context;
+ til_fb_fragment_t *fragment = *fragment_ptr;
*res_frame_plan = (til_frame_plan_t){ .fragmenter = til_fragmenter_slice_per_cpu };
@@ -91,9 +92,10 @@ static void sparkler_prepare_frame(til_module_context_t *context, unsigned ticks
/* Render a 3D particle system */
-static void sparkler_render_fragment(til_module_context_t *context, unsigned ticks, unsigned cpu, til_fb_fragment_t *fragment)
+static void sparkler_render_fragment(til_module_context_t *context, unsigned ticks, unsigned cpu, til_fb_fragment_t **fragment_ptr)
{
sparkler_context_t *ctxt = (sparkler_context_t *)context;
+ til_fb_fragment_t *fragment = *fragment_ptr;
if (!ctxt->setup.show_bsp_matches)
til_fb_fragment_clear(fragment);
diff --git a/src/modules/spiro/spiro.c b/src/modules/spiro/spiro.c
index 30e5f06..76b3a80 100644
--- a/src/modules/spiro/spiro.c
+++ b/src/modules/spiro/spiro.c
@@ -53,13 +53,13 @@ static til_module_context_t * spiro_create_context(unsigned seed, unsigned ticks
return &ctxt->til_module_context;
}
-static void spiro_render_fragment(til_module_context_t *context, unsigned ticks, unsigned cpu, til_fb_fragment_t *fragment)
+static void spiro_render_fragment(til_module_context_t *context, unsigned ticks, unsigned cpu, til_fb_fragment_t **fragment_ptr)
{
- spiro_context_t *ctxt = (spiro_context_t *)context;
+ spiro_context_t *ctxt = (spiro_context_t *)context;
+ til_fb_fragment_t *fragment = *fragment_ptr;
- int width = fragment->frame_width, height = fragment->frame_height;
-
- int display_R, display_origin_x, display_origin_y;
+ int width = fragment->frame_width, height = fragment->frame_height;
+ int display_R, display_origin_x, display_origin_y;
/* Based on the fragment's dimensions, calculate the origin and radius of the fixed outer
circle, C0. */
diff --git a/src/modules/stars/stars.c b/src/modules/stars/stars.c
index 3a3f90f..8e6a5d0 100644
--- a/src/modules/stars/stars.c
+++ b/src/modules/stars/stars.c
@@ -109,9 +109,11 @@ static void stars_destroy_context(til_module_context_t *context)
}
-static void stars_render_fragment(til_module_context_t *context, unsigned ticks, unsigned cpu, til_fb_fragment_t *fragment)
+static void stars_render_fragment(til_module_context_t *context, unsigned ticks, unsigned cpu, til_fb_fragment_t **fragment_ptr)
{
- stars_context_t *ctxt = (stars_context_t *)context;
+ stars_context_t *ctxt = (stars_context_t *)context;
+ til_fb_fragment_t *fragment = *fragment_ptr;
+
struct points* iterator;
struct points* tmp_ptr;
struct points* last_ptr=NULL;
diff --git a/src/modules/submit/submit.c b/src/modules/submit/submit.c
index daac37b..5f46461 100644
--- a/src/modules/submit/submit.c
+++ b/src/modules/submit/submit.c
@@ -294,7 +294,7 @@ static void submit_destroy_context(til_module_context_t *context)
}
-static void submit_prepare_frame(til_module_context_t *context, unsigned ticks, til_fb_fragment_t *fragment, til_frame_plan_t *res_frame_plan)
+static void submit_prepare_frame(til_module_context_t *context, unsigned ticks, til_fb_fragment_t **fragment_ptr, til_frame_plan_t *res_frame_plan)
{
submit_context_t *ctxt = (submit_context_t *)context;
@@ -317,9 +317,10 @@ static void submit_prepare_frame(til_module_context_t *context, unsigned ticks,
}
-static void submit_render_fragment(til_module_context_t *context, unsigned ticks, unsigned cpu, til_fb_fragment_t *fragment)
+static void submit_render_fragment(til_module_context_t *context, unsigned ticks, unsigned cpu, til_fb_fragment_t **fragment_ptr)
{
submit_context_t *ctxt = (submit_context_t *)context;
+ til_fb_fragment_t *fragment = *fragment_ptr;
if (!ctxt->bilerp)
draw_grid(ctxt, fragment);
diff --git a/src/modules/swab/swab.c b/src/modules/swab/swab.c
index 9047f68..6d1c3d9 100644
--- a/src/modules/swab/swab.c
+++ b/src/modules/swab/swab.c
@@ -93,7 +93,7 @@ static void swab_destroy_context(til_module_context_t *context)
}
-static void swab_prepare_frame(til_module_context_t *context, unsigned ticks, til_fb_fragment_t *fragment, til_frame_plan_t *res_frame_plan)
+static void swab_prepare_frame(til_module_context_t *context, unsigned ticks, til_fb_fragment_t **fragment_ptr, til_frame_plan_t *res_frame_plan)
{
swab_context_t *ctxt = (swab_context_t *)context;
@@ -103,15 +103,17 @@ static void swab_prepare_frame(til_module_context_t *context, unsigned ticks, ti
}
-static void swab_render_fragment(til_module_context_t *context, unsigned ticks, unsigned cpu, til_fb_fragment_t *fragment)
+static void swab_render_fragment(til_module_context_t *context, unsigned ticks, unsigned cpu, til_fb_fragment_t **fragment_ptr)
{
- swab_context_t *ctxt = (swab_context_t *)context;
- float cos_r = cos(ctxt->r);
- float sin_r = sin(ctxt->r);
- float z1 = cos_r;
- float z2 = sin_r;
- float xscale = 1.f / (float)fragment->frame_width;
- float yscale = 1.f / (float)fragment->frame_height;
+ swab_context_t *ctxt = (swab_context_t *)context;
+ til_fb_fragment_t *fragment = *fragment_ptr;
+
+ float cos_r = cos(ctxt->r);
+ float sin_r = sin(ctxt->r);
+ float z1 = cos_r;
+ float z2 = sin_r;
+ float xscale = 1.f / (float)fragment->frame_width;
+ float yscale = 1.f / (float)fragment->frame_height;
for (int y = fragment->y; y < fragment->y + fragment->height; y++) {
float yscaled = (float)y * yscale;
diff --git a/src/modules/swarm/swarm.c b/src/modules/swarm/swarm.c
index 0c58bf9..c896735 100644
--- a/src/modules/swarm/swarm.c
+++ b/src/modules/swarm/swarm.c
@@ -401,9 +401,10 @@ static void swarm_draw_as_lines(swarm_context_t *ctxt, til_fb_fragment_t *fragme
}
-static void swarm_render_fragment(til_module_context_t *context, unsigned ticks, unsigned cpu, til_fb_fragment_t *fragment)
+static void swarm_render_fragment(til_module_context_t *context, unsigned ticks, unsigned cpu, til_fb_fragment_t **fragment_ptr)
{
- swarm_context_t *ctxt = (swarm_context_t *)context;
+ swarm_context_t *ctxt = (swarm_context_t *)context;
+ til_fb_fragment_t *fragment = *fragment_ptr;
swarm_update(ctxt, ticks);
diff --git a/src/modules/voronoi/voronoi.c b/src/modules/voronoi/voronoi.c
index 8e9a0f3..2d1c8e5 100644
--- a/src/modules/voronoi/voronoi.c
+++ b/src/modules/voronoi/voronoi.c
@@ -281,9 +281,10 @@ static void voronoi_sample_colors(voronoi_context_t *ctxt, til_fb_fragment_t *fr
}
-static void voronoi_prepare_frame(til_module_context_t *context, unsigned ticks, til_fb_fragment_t *fragment, til_frame_plan_t *res_frame_plan)
+static void voronoi_prepare_frame(til_module_context_t *context, unsigned ticks, til_fb_fragment_t **fragment_ptr, til_frame_plan_t *res_frame_plan)
{
voronoi_context_t *ctxt = (voronoi_context_t *)context;
+ til_fb_fragment_t *fragment = *fragment_ptr;
*res_frame_plan = (til_frame_plan_t){ .fragmenter = til_fragmenter_tile64 };
@@ -314,9 +315,10 @@ static void voronoi_prepare_frame(til_module_context_t *context, unsigned ticks,
}
-static void voronoi_render_fragment(til_module_context_t *context, unsigned ticks, unsigned cpu, til_fb_fragment_t *fragment)
+static void voronoi_render_fragment(til_module_context_t *context, unsigned ticks, unsigned cpu, til_fb_fragment_t **fragment_ptr)
{
voronoi_context_t *ctxt = (voronoi_context_t *)context;
+ til_fb_fragment_t *fragment = *fragment_ptr;
for (int y = 0; y < fragment->height; y++) {
for (int x = 0; x < fragment->width; x++) {
diff --git a/src/til.c b/src/til.c
index 478d43e..1bc03b4 100644
--- a/src/til.c
+++ b/src/til.c
@@ -100,15 +100,15 @@ void til_shutdown(void)
}
-static void _blank_prepare_frame(til_module_context_t *context, unsigned ticks, til_fb_fragment_t *fragment, til_frame_plan_t *res_frame_plan)
+static void _blank_prepare_frame(til_module_context_t *context, unsigned ticks, til_fb_fragment_t **fragment_ptr, til_frame_plan_t *res_frame_plan)
{
*res_frame_plan = (til_frame_plan_t){ .fragmenter = til_fragmenter_slice_per_cpu };
}
-static void _blank_render_fragment(til_module_context_t *context, unsigned ticks, unsigned cpu, til_fb_fragment_t *fragment)
+static void _blank_render_fragment(til_module_context_t *context, unsigned ticks, unsigned cpu, til_fb_fragment_t **fragment_ptr)
{
- til_fb_fragment_clear(fragment);
+ til_fb_fragment_clear(*fragment_ptr);
}
@@ -162,21 +162,21 @@ void til_get_modules(const til_module_t ***res_modules, size_t *res_n_modules)
}
-static void module_render_fragment(til_module_context_t *context, til_threads_t *threads, unsigned ticks, til_fb_fragment_t *fragment)
+static void module_render_fragment(til_module_context_t *context, til_threads_t *threads, unsigned ticks, til_fb_fragment_t **fragment_ptr)
{
const til_module_t *module;
assert(context);
assert(context->module);
assert(threads);
- assert(fragment);
+ assert(fragment_ptr && *fragment_ptr);
module = context->module;
if (module->prepare_frame) {
til_frame_plan_t frame_plan = {};
- module->prepare_frame(context, ticks, fragment, &frame_plan);
+ module->prepare_frame(context, ticks, fragment_ptr, &frame_plan);
/* XXX: any module which provides prepare_frame() must return a frame_plan.fragmenter,
* and provide render_fragment()
@@ -185,31 +185,31 @@ static void module_render_fragment(til_module_context_t *context, til_threads_t
assert(module->render_fragment);
if (context->n_cpus > 1) {
- til_threads_frame_submit(threads, fragment, &frame_plan, module->render_fragment, context, ticks);
+ til_threads_frame_submit(threads, fragment_ptr, &frame_plan, module->render_fragment, context, ticks);
til_threads_wait_idle(threads);
} else {
unsigned fragnum = 0;
- til_fb_fragment_t frag;
+ til_fb_fragment_t frag, *frag_ptr = &frag;
- while (frame_plan.fragmenter(context, fragment, fragnum++, &frag))
- module->render_fragment(context, ticks, 0, &frag);
+ while (frame_plan.fragmenter(context, *fragment_ptr, fragnum++, &frag))
+ module->render_fragment(context, ticks, 0, &frag_ptr);
}
} else if (module->render_fragment)
- module->render_fragment(context, ticks, 0, fragment);
+ module->render_fragment(context, ticks, 0, fragment_ptr);
if (module->finish_frame)
- module->finish_frame(context, ticks, fragment);
+ module->finish_frame(context, ticks, fragment_ptr);
- fragment->cleared = 1;
+ (*fragment_ptr)->cleared = 1;
}
/* This is a public interface to the threaded module rendering intended for use by
* modules that wish to get the output of other modules for their own use.
*/
-void til_module_render(til_module_context_t *context, unsigned ticks, til_fb_fragment_t *fragment)
+void til_module_render(til_module_context_t *context, unsigned ticks, til_fb_fragment_t **fragment_ptr)
{
- module_render_fragment(context, til_threads, ticks, fragment);
+ module_render_fragment(context, til_threads, ticks, fragment_ptr);
}
diff --git a/src/til.h b/src/til.h
index 7d0d637..5d19ea7 100644
--- a/src/til.h
+++ b/src/til.h
@@ -24,9 +24,9 @@ typedef struct til_knob_t til_knob_t;
typedef struct til_module_t {
til_module_context_t * (*create_context)(unsigned seed, unsigned ticks, unsigned n_cpus, til_setup_t *setup);
void (*destroy_context)(til_module_context_t *context);
- void (*prepare_frame)(til_module_context_t *context, unsigned ticks, til_fb_fragment_t *fragment, til_frame_plan_t *res_frame_plan);
- void (*render_fragment)(til_module_context_t *context, unsigned ticks, unsigned cpu, til_fb_fragment_t *fragment);
- void (*finish_frame)(til_module_context_t *context, unsigned ticks, til_fb_fragment_t *fragment);
+ void (*prepare_frame)(til_module_context_t *context, unsigned ticks, til_fb_fragment_t **fragment_ptr, til_frame_plan_t *res_frame_plan);
+ void (*render_fragment)(til_module_context_t *context, unsigned ticks, unsigned cpu, til_fb_fragment_t **fragment_ptr);
+ void (*finish_frame)(til_module_context_t *context, unsigned ticks, til_fb_fragment_t **fragment_ptr);
int (*setup)(const til_settings_t *settings, til_setting_t **res_setting, const til_setting_desc_t **res_desc, til_setup_t **res_setup);
size_t (*knobs)(til_module_context_t *context, til_knob_t **res_knobs);
char *name;
@@ -40,7 +40,7 @@ void til_quiesce(void);
void til_shutdown(void);
const til_module_t * til_lookup_module(const char *name);
void til_get_modules(const til_module_t ***res_modules, size_t *res_n_modules);
-void til_module_render(til_module_context_t *context, unsigned ticks, til_fb_fragment_t *fragment);
+void til_module_render(til_module_context_t *context, unsigned ticks, til_fb_fragment_t **fragment_ptr);
int til_module_create_context(const til_module_t *module, unsigned seed, unsigned ticks, unsigned n_cpus, til_setup_t *setup, til_module_context_t **res_context);
til_module_context_t * til_module_destroy_context(til_module_context_t *context);
int til_module_setup(til_settings_t *settings, til_setting_t **res_setting, const til_setting_desc_t **res_desc, til_setup_t **res_setup);
diff --git a/src/til_threads.c b/src/til_threads.c
index af4de53..e2c8a97 100644
--- a/src/til_threads.c
+++ b/src/til_threads.c
@@ -22,9 +22,9 @@ typedef struct til_threads_t {
pthread_mutex_t frame_mutex;
pthread_cond_t frame_cond;
- void (*render_fragment_func)(til_module_context_t *context, unsigned ticks, unsigned cpu, til_fb_fragment_t *fragment);
+ void (*render_fragment_func)(til_module_context_t *context, unsigned ticks, unsigned cpu, til_fb_fragment_t **fragment_ptr);
void *context;
- til_fb_fragment_t *fragment;
+ til_fb_fragment_t **fragment_ptr;
til_frame_plan_t frame_plan;
unsigned ticks;
@@ -63,27 +63,27 @@ static void * thread_func(void *_thread)
* which may require a consistent mapping of CPU to fragnum across frames.
*/
for (;;) {
- til_fb_fragment_t fragment;
+ til_fb_fragment_t frag, *frag_ptr = &frag;
while (!__sync_bool_compare_and_swap(&threads->next_fragment, frag_num, frag_num + 1));
- if (!threads->frame_plan.fragmenter(threads->context, threads->fragment, frag_num, &fragment))
+ if (!threads->frame_plan.fragmenter(threads->context, *(threads->fragment_ptr), frag_num, &frag))
break;
- threads->render_fragment_func(threads->context, threads->ticks, thread->id, &fragment);
+ threads->render_fragment_func(threads->context, threads->ticks, thread->id, &frag_ptr);
frag_num += threads->n_threads;
}
} else { /* render *any* available fragment */
for (;;) {
unsigned frag_num;
- til_fb_fragment_t fragment;
+ til_fb_fragment_t frag, *frag_ptr = &frag;
frag_num = __sync_fetch_and_add(&threads->next_fragment, 1);
- if (!threads->frame_plan.fragmenter(threads->context, threads->fragment, frag_num, &fragment))
+ if (!threads->frame_plan.fragmenter(threads->context, *(threads->fragment_ptr), frag_num, &frag))
break;
- threads->render_fragment_func(threads->context, threads->ticks, thread->id, &fragment);
+ threads->render_fragment_func(threads->context, threads->ticks, thread->id, &frag_ptr);
}
}
@@ -112,13 +112,13 @@ void til_threads_wait_idle(til_threads_t *threads)
/* submit a frame's fragments to the threads */
-void til_threads_frame_submit(til_threads_t *threads, til_fb_fragment_t *fragment, til_frame_plan_t *frame_plan, void (*render_fragment_func)(til_module_context_t *context, unsigned ticks, unsigned cpu, til_fb_fragment_t *fragment), til_module_context_t *context, unsigned ticks)
+void til_threads_frame_submit(til_threads_t *threads, til_fb_fragment_t **fragment_ptr, til_frame_plan_t *frame_plan, void (*render_fragment_func)(til_module_context_t *context, unsigned ticks, unsigned cpu, til_fb_fragment_t **fragment_ptr), til_module_context_t *context, unsigned ticks)
{
til_threads_wait_idle(threads); /* XXX: likely non-blocking; already happens pre page flip */
pthread_mutex_lock(&threads->frame_mutex);
pthread_cleanup_push((void (*)(void *))pthread_mutex_unlock, &threads->frame_mutex);
- threads->fragment = fragment;
+ threads->fragment_ptr = fragment_ptr;
threads->frame_plan = *frame_plan;
threads->render_fragment_func = render_fragment_func;
threads->context = context;
diff --git a/src/til_threads.h b/src/til_threads.h
index 329ead9..4e6836d 100644
--- a/src/til_threads.h
+++ b/src/til_threads.h
@@ -7,7 +7,7 @@ typedef struct til_threads_t til_threads_t;
til_threads_t * til_threads_create();
void til_threads_destroy(til_threads_t *threads);
-void til_threads_frame_submit(til_threads_t *threads, til_fb_fragment_t *fragment, til_frame_plan_t *frame_plan, void (*render_fragment_func)(til_module_context_t *context, unsigned ticks, unsigned cpu, til_fb_fragment_t *fragment), til_module_context_t *context, unsigned ticks);
+void til_threads_frame_submit(til_threads_t *threads, til_fb_fragment_t **fragment_ptr, til_frame_plan_t *frame_plan, void (*render_fragment_func)(til_module_context_t *context, unsigned ticks, unsigned cpu, til_fb_fragment_t **fragment_ptr), til_module_context_t *context, unsigned ticks);
void til_threads_wait_idle(til_threads_t *threads);
unsigned til_threads_num_threads(til_threads_t *threads);
© All Rights Reserved