summaryrefslogtreecommitdiff
path: root/src/modules
diff options
context:
space:
mode:
authorVito Caputo <vcaputo@pengaru.com>2022-05-29 09:59:39 -0700
committerVito Caputo <vcaputo@pengaru.com>2022-05-29 10:16:16 -0700
commit6d1d7f95529d826ea916ac80d236f5e8616daf64 (patch)
tree57ccc80e35ca5223b6b6ce6bf9daa476a03de58f /src/modules
parentcfe4e1196bb63824a3e56b84f5485a7c6cf04490 (diff)
*: pivot to til_module_context_t
- modules now allocate their contexts using til_module_context_new() instead of [cm]alloc(). - modules simply embed til_module_context_t at the start of their respective private context structs, if they do anything with contexts - modules that do nothing with contexts (lack a create_context() method), will now *always* get a til_module_context_t supplied to their other methods regardless of their create_context() presence. So even if you don't have a create_context(), your prepare_frame() and/or render_fragment() methods can still access seed and n_cpus from within the til_module_context_t passed in as context, *always*. - modules that *do* have a create_context() method, implying they have their own private context type, will have to cast the til_module_context_t supplied to the other methods to their private context type. By embedding the til_module_context_t at the *start* of their private context struct, a simple cast is all that's needed. If it's placed somewhere else, more annoying container_of() style macros are needed - this is strongly discouraged, just put it at the start of struct. - til_module_create_context() now takes n_cpus, which may be set to 0 for automatically assigning the number of threads in its place. Any non-zero value is treated as an explicit n_cpus, primarily intended for setting it to 1 for single-threaded contexts necessary when embedded within an already-threaded composite module. - modules like montage which open-coded a single-threaded render are now using the same til_module_render_fragment() as everything else, since til_module_create_context() is accepting n_cpus. - til_module_create_context() now produces a real type, not void *, that is til_module_context_t *. All the other module context functions now operate on this type, and since til_module_context_t.module tracks the module this context relates to, those functions no longer require both the module and context be passed in. This is especially helpful for compositing modules which do a lot of module context creation and destruction; the module handle is now only needed to create the contexts. Everything else operating on that context only needs the single context pointer, not module+context pairs, which was unnecessarily annoying. - if your module's context can be destroyed with a simple free(), without any deeper knowledge or freeing of nested pointers, you can now simply omit destroy_context() altogether. When destroy_context() is missing, til_module_context_free() will automatically use libc's free() on the pointer returned from your create_context() (or on the pointer that was automatically created if you omitted create_context() too, for the bare til_module_context_t that got created on your behalf anyways). For the most part, these changes don't affect module creation. In some ways this eases module creation by making it more convenient access seed and n_cpus if you had no further requirement for a context struct. In other ways it's slightly annoying to have to do type-casts when you're working with your own context type, since before it was all void* and didn't require casts when assigning to your typed context variables. The elimination for requiring a destroy_context() method in simple free() of private context scenarios removes some boilerplate in simple cases. I think it's a wash for module writers, or maybe a slight win for the simple cases.
Diffstat (limited to 'src/modules')
-rw-r--r--src/modules/blinds/blinds.c23
-rw-r--r--src/modules/checkers/checkers.c25
-rw-r--r--src/modules/compose/compose.c43
-rw-r--r--src/modules/drizzle/drizzle.c24
-rw-r--r--src/modules/flui2d/flui2d.c25
-rw-r--r--src/modules/julia/julia.c35
-rw-r--r--src/modules/meta2d/meta2d.c36
-rw-r--r--src/modules/montage/montage.c61
-rw-r--r--src/modules/pixbounce/pixbounce.c20
-rw-r--r--src/modules/plasma/plasma.c25
-rw-r--r--src/modules/plato/plato.c33
-rw-r--r--src/modules/ray/ray.c29
-rw-r--r--src/modules/roto/roto.c25
-rw-r--r--src/modules/rtv/rtv.c38
-rw-r--r--src/modules/shapes/shapes.c39
-rw-r--r--src/modules/snow/snow.c29
-rw-r--r--src/modules/sparkler/sparkler.c20
-rw-r--r--src/modules/spiro/spiro.c29
-rw-r--r--src/modules/stars/stars.c43
-rw-r--r--src/modules/submit/submit.c32
-rw-r--r--src/modules/swab/swab.c28
-rw-r--r--src/modules/swarm/swarm.c29
-rw-r--r--src/modules/voronoi/voronoi.c20
23 files changed, 319 insertions, 392 deletions
diff --git a/src/modules/blinds/blinds.c b/src/modules/blinds/blinds.c
index 8f32054..e717bb3 100644
--- a/src/modules/blinds/blinds.c
+++ b/src/modules/blinds/blinds.c
@@ -6,6 +6,7 @@
#include "til.h"
#include "til_fb.h"
+#include "til_module_context.h"
/* Copyright (C) 2017-2022 Vito Caputo <vcaputo@pengaru.com> */
@@ -25,7 +26,8 @@ typedef struct blinds_setup_t {
} blinds_setup_t;
typedef struct blinds_context_t {
- blinds_setup_t setup;
+ til_module_context_t til_module_context;
+ blinds_setup_t setup;
} blinds_context_t;
@@ -35,28 +37,20 @@ static blinds_setup_t blinds_default_setup = {
};
-static void * blinds_create_context(unsigned seed, unsigned ticks, unsigned n_cpus, til_setup_t *setup)
+static til_module_context_t * blinds_create_context(unsigned seed, unsigned ticks, unsigned n_cpus, til_setup_t *setup)
{
blinds_context_t *ctxt;
if (!setup)
setup = &blinds_default_setup.til_setup;
- ctxt = calloc(1, sizeof(blinds_context_t));
+ ctxt = til_module_context_new(sizeof(blinds_context_t), seed, n_cpus);
if (!ctxt)
return NULL;
ctxt->setup = *(blinds_setup_t *)setup;
- return ctxt;
-}
-
-
-static void blinds_destroy_context(void *context)
-{
- blinds_context_t *ctxt = context;
-
- free(ctxt);
+ return &ctxt->til_module_context;
}
@@ -89,9 +83,9 @@ static inline void draw_blind_vertical(til_fb_fragment_t *fragment, unsigned col
/* draw blinds over the fragment */
-static void blinds_render_fragment(void *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)
{
- blinds_context_t *ctxt = context;
+ blinds_context_t *ctxt = (blinds_context_t *)context;
static float rr;
@@ -194,7 +188,6 @@ static int blinds_setup(const til_settings_t *settings, til_setting_t **res_sett
til_module_t blinds_module = {
.create_context = blinds_create_context,
- .destroy_context = blinds_destroy_context,
.render_fragment = blinds_render_fragment,
.setup = blinds_setup,
.name = "blinds",
diff --git a/src/modules/checkers/checkers.c b/src/modules/checkers/checkers.c
index e911089..079df4d 100644
--- a/src/modules/checkers/checkers.c
+++ b/src/modules/checkers/checkers.c
@@ -20,6 +20,7 @@
#include "til.h"
#include "til_fb.h"
+#include "til_module_context.h"
#define CHECKERS_DEFAULT_SIZE 32
@@ -49,6 +50,7 @@ typedef struct checkers_setup_t {
} checkers_setup_t;
typedef struct checkers_context_t {
+ til_module_context_t til_module_context;
checkers_setup_t setup;
} checkers_context_t;
@@ -61,38 +63,32 @@ static checkers_setup_t checkers_default_setup = {
};
-static void * checkers_create_context(unsigned seed, unsigned ticks, unsigned n_cpus, til_setup_t *setup)
+static til_module_context_t * checkers_create_context(unsigned seed, unsigned ticks, unsigned n_cpus, til_setup_t *setup)
{
checkers_context_t *ctxt;
if (!setup)
setup = &checkers_default_setup.til_setup;
- ctxt = calloc(1, sizeof(checkers_context_t));
+ ctxt = til_module_context_new(sizeof(checkers_context_t), seed, n_cpus);
if (!ctxt)
return NULL;
ctxt->setup = *(checkers_setup_t *)setup;
- return ctxt;
+ return &ctxt->til_module_context;
}
-static void checkers_destroy_context(void *context)
+static int checkers_fragmenter(til_module_context_t *context, const til_fb_fragment_t *fragment, unsigned number, til_fb_fragment_t *res_fragment)
{
- free(context);
-}
-
-
-static int checkers_fragmenter(void *context, unsigned n_cpus, const til_fb_fragment_t *fragment, unsigned number, til_fb_fragment_t *res_fragment)
-{
- checkers_context_t *ctxt = context;
+ checkers_context_t *ctxt = (checkers_context_t *)context;
return til_fb_fragment_tile_single(fragment, ctxt->setup.size, number, res_fragment);
}
-static void checkers_prepare_frame(void *context, unsigned ticks, unsigned n_cpus, til_fb_fragment_t *fragment, til_fragmenter_t *res_fragmenter)
+static void checkers_prepare_frame(til_module_context_t *context, unsigned ticks, til_fb_fragment_t *fragment, til_fragmenter_t *res_fragmenter)
{
*res_fragmenter = checkers_fragmenter;
}
@@ -109,9 +105,9 @@ static inline unsigned hash(unsigned x)
}
-static void checkers_render_fragment(void *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)
{
- checkers_context_t *ctxt = context;
+ checkers_context_t *ctxt = (checkers_context_t *)context;
int state;
switch (ctxt->setup.pattern) {
@@ -293,7 +289,6 @@ static int checkers_setup(const til_settings_t *settings, til_setting_t **res_se
til_module_t checkers_module = {
.create_context = checkers_create_context,
- .destroy_context = checkers_destroy_context,
.prepare_frame = checkers_prepare_frame,
.render_fragment = checkers_render_fragment,
.setup = checkers_setup,
diff --git a/src/modules/compose/compose.c b/src/modules/compose/compose.c
index dfe3794..7415150 100644
--- a/src/modules/compose/compose.c
+++ b/src/modules/compose/compose.c
@@ -4,6 +4,7 @@
#include "til.h"
#include "til_fb.h"
+#include "til_module_context.h"
#include "til_settings.h"
#include "til_util.h"
@@ -26,12 +27,12 @@
typedef struct compose_layer_t {
const til_module_t *module;
- void *module_ctxt;
+ til_module_context_t *module_ctxt;
char *settings;
} compose_layer_t;
typedef struct compose_context_t {
- unsigned n_cpus;
+ til_module_context_t til_module_context;
til_fb_fragment_t texture_fb;
compose_layer_t texture;
@@ -46,9 +47,9 @@ typedef struct compose_setup_t {
char *layers[];
} compose_setup_t;
-static void * compose_create_context(unsigned seed, unsigned ticks, unsigned n_cpus, til_setup_t *setup);
-static void compose_destroy_context(void *context);
-static void compose_prepare_frame(void *context, unsigned ticks, unsigned n_cpus, til_fb_fragment_t *fragment, til_fragmenter_t *res_fragmenter);
+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_prepare_frame(til_module_context_t *context, unsigned ticks, til_fb_fragment_t *fragment, til_fragmenter_t *res_fragmenter);
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 = {
@@ -66,7 +67,7 @@ til_module_t compose_module = {
};
-static void * compose_create_context(unsigned seed, unsigned ticks, unsigned n_cpus, til_setup_t *setup)
+static til_module_context_t * compose_create_context(unsigned seed, unsigned ticks, unsigned n_cpus, til_setup_t *setup)
{
compose_context_t *ctxt;
size_t n;
@@ -76,12 +77,10 @@ static void * compose_create_context(unsigned seed, unsigned ticks, unsigned n_c
for (n = 0; ((compose_setup_t *)setup)->layers[n]; n++);
- ctxt = calloc(1, sizeof(compose_context_t) + n * sizeof(compose_layer_t));
+ ctxt = til_module_context_new(sizeof(compose_context_t) + n * sizeof(compose_layer_t), seed, n_cpus);
if (!ctxt)
return NULL;
- ctxt->n_cpus = n_cpus;
-
for (size_t i = 0; i < n; i++) {
const til_module_t *layer_module;
til_setup_t *layer_setup = NULL;
@@ -90,7 +89,7 @@ static void * compose_create_context(unsigned seed, unsigned ticks, unsigned n_c
(void) til_module_randomize_setup(layer_module, &layer_setup, NULL);
ctxt->layers[i].module = layer_module;
- (void) til_module_create_context(layer_module, rand_r(&seed), ticks, layer_setup, &ctxt->layers[i].module_ctxt);
+ (void) til_module_create_context(layer_module, rand_r(&seed), ticks, 0, layer_setup, &ctxt->layers[i].module_ctxt);
til_setup_free(layer_setup);
ctxt->n_layers++;
@@ -102,23 +101,23 @@ static void * compose_create_context(unsigned seed, unsigned ticks, unsigned n_c
ctxt->texture.module = til_lookup_module(((compose_setup_t *)setup)->texture);
(void) til_module_randomize_setup(ctxt->texture.module, &texture_setup, NULL);
- (void) til_module_create_context(ctxt->texture.module, rand_r(&seed), ticks, texture_setup, &ctxt->texture.module_ctxt);
+ (void) til_module_create_context(ctxt->texture.module, rand_r(&seed), ticks, 0, texture_setup, &ctxt->texture.module_ctxt);
til_setup_free(texture_setup);
}
- return ctxt;
+ return &ctxt->til_module_context;
}
-static void compose_destroy_context(void *context)
+static void compose_destroy_context(til_module_context_t *context)
{
- compose_context_t *ctxt = context;
+ compose_context_t *ctxt = (compose_context_t *)context;
for (int i = 0; i < ctxt->n_layers; i++)
- til_module_destroy_context(ctxt->layers[i].module, ctxt->layers[i].module_ctxt);
+ til_module_context_free(ctxt->layers[i].module_ctxt);
if (ctxt->texture.module)
- til_module_destroy_context(ctxt->texture.module, ctxt->texture.module_ctxt);
+ til_module_context_free(ctxt->texture.module_ctxt);
free(ctxt->texture_fb.buf);
@@ -126,9 +125,9 @@ static void compose_destroy_context(void *context)
}
-static void compose_prepare_frame(void *context, unsigned ticks, unsigned n_cpus, til_fb_fragment_t *fragment, til_fragmenter_t *res_fragmenter)
+static void compose_prepare_frame(til_module_context_t *context, unsigned ticks, til_fb_fragment_t *fragment, til_fragmenter_t *res_fragmenter)
{
- compose_context_t *ctxt = context;
+ compose_context_t *ctxt = (compose_context_t *)context;
if (ctxt->texture.module) {
if (!ctxt->texture_fb.buf ||
@@ -147,20 +146,20 @@ static void compose_prepare_frame(void *context, unsigned ticks, unsigned n_cpus
}
ctxt->texture_fb.cleared = 0;
- til_module_render(ctxt->texture.module, ctxt->texture.module_ctxt, ticks, &ctxt->texture_fb);
+ til_module_render(ctxt->texture.module_ctxt, ticks, &ctxt->texture_fb);
- til_module_render(ctxt->layers[0].module, ctxt->layers[0].module_ctxt, ticks, fragment);
+ 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_module_render(ctxt->layers[i].module, ctxt->layers[i].module_ctxt, ticks, &textured);
+ til_module_render(ctxt->layers[i].module_ctxt, ticks, &textured);
}
} else {
for (size_t i = 0; i < ctxt->n_layers; i++)
- til_module_render(ctxt->layers[i].module, ctxt->layers[i].module_ctxt, ticks, fragment);
+ til_module_render(ctxt->layers[i].module_ctxt, ticks, fragment);
}
}
diff --git a/src/modules/drizzle/drizzle.c b/src/modules/drizzle/drizzle.c
index 21d4fbf..b23fba8 100644
--- a/src/modules/drizzle/drizzle.c
+++ b/src/modules/drizzle/drizzle.c
@@ -20,6 +20,7 @@
#include "til.h"
#include "til_fb.h"
+#include "til_module_context.h"
#include "puddle/puddle.h"
@@ -41,8 +42,9 @@ typedef struct drizzle_setup_t {
} drizzle_setup_t;
typedef struct drizzle_context_t {
- puddle_t *puddle;
- drizzle_setup_t setup;
+ til_module_context_t til_module_context;
+ puddle_t *puddle;
+ drizzle_setup_t setup;
} drizzle_context_t;
static drizzle_setup_t drizzle_default_setup = {
@@ -72,14 +74,14 @@ static inline uint32_t color_to_uint32(v3f_t color) {
}
-static void * drizzle_create_context(unsigned seed, unsigned ticks, unsigned n_cpus, til_setup_t *setup)
+static til_module_context_t * drizzle_create_context(unsigned seed, unsigned ticks, unsigned n_cpus, til_setup_t *setup)
{
drizzle_context_t *ctxt;
if (!setup)
setup = &drizzle_default_setup.til_setup;
- ctxt = calloc(1, sizeof(drizzle_context_t));
+ ctxt = til_module_context_new(sizeof(drizzle_context_t), seed, n_cpus);
if (!ctxt)
return NULL;
@@ -91,22 +93,22 @@ static void * drizzle_create_context(unsigned seed, unsigned ticks, unsigned n_c
ctxt->setup = *(drizzle_setup_t *)setup;
- return ctxt;
+ return &ctxt->til_module_context;
}
-static void drizzle_destroy_context(void *context)
+static void drizzle_destroy_context(til_module_context_t *context)
{
- drizzle_context_t *ctxt = context;
+ drizzle_context_t *ctxt = (drizzle_context_t *)context;
puddle_free(ctxt->puddle);
free(ctxt);
}
-static void drizzle_prepare_frame(void *context, unsigned ticks, unsigned n_cpus, til_fb_fragment_t *fragment, til_fragmenter_t *res_fragmenter)
+static void drizzle_prepare_frame(til_module_context_t *context, unsigned ticks, til_fb_fragment_t *fragment, til_fragmenter_t *res_fragmenter)
{
- drizzle_context_t *ctxt = context;
+ drizzle_context_t *ctxt = (drizzle_context_t *)context;
*res_fragmenter = til_fragmenter_slice_per_cpu;
@@ -128,9 +130,9 @@ static void drizzle_prepare_frame(void *context, unsigned ticks, unsigned n_cpus
}
-static void drizzle_render_fragment(void *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)
{
- drizzle_context_t *ctxt = context;
+ drizzle_context_t *ctxt = (drizzle_context_t *)context;
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 4f87b54..df980ba 100644
--- a/src/modules/flui2d/flui2d.c
+++ b/src/modules/flui2d/flui2d.c
@@ -6,6 +6,7 @@
#include "til.h"
#include "til_fb.h"
+#include "til_module_context.h"
#include "til_settings.h"
@@ -186,6 +187,7 @@ typedef struct flui2d_setup_t {
} flui2d_setup_t;
typedef struct flui2d_context_t {
+ til_module_context_t til_module_context;
flui2d_t fluid;
flui2d_emitters_t emitters;
float clockstep;
@@ -243,7 +245,7 @@ static void gamma_init(float gamma)
}
-static void * flui2d_create_context(unsigned seed, unsigned ticks, unsigned n_cpus, til_setup_t *setup)
+static til_module_context_t * flui2d_create_context(unsigned seed, unsigned ticks, unsigned n_cpus, til_setup_t *setup)
{
static int initialized;
flui2d_context_t *ctxt;
@@ -251,7 +253,7 @@ static void * flui2d_create_context(unsigned seed, unsigned ticks, unsigned n_cp
if (!setup)
setup = &flui2d_default_setup.til_setup;
- ctxt = calloc(1, sizeof(flui2d_context_t));
+ ctxt = til_module_context_new(sizeof(flui2d_context_t), seed, n_cpus);
if (!ctxt)
return NULL;
@@ -266,20 +268,14 @@ static void * flui2d_create_context(unsigned seed, unsigned ticks, unsigned n_cp
ctxt->emitters = ((flui2d_setup_t *)setup)->emitters;
ctxt->clockstep = ((flui2d_setup_t *)setup)->clockstep;
- return ctxt;
-}
-
-
-static void flui2d_destroy_context(void *context)
-{
- free(context);
+ return &ctxt->til_module_context;
}
/* Prepare a frame for concurrent drawing of fragment using multiple fragments */
-static void flui2d_prepare_frame(void *context, unsigned ticks, unsigned n_cpus, til_fb_fragment_t *fragment, til_fragmenter_t *res_fragmenter)
+static void flui2d_prepare_frame(til_module_context_t *context, unsigned ticks, til_fb_fragment_t *fragment, til_fragmenter_t *res_fragmenter)
{
- flui2d_context_t *ctxt = context;
+ flui2d_context_t *ctxt = (flui2d_context_t *)context;
float r = (ticks % (unsigned)(2 * M_PI * 1000)) * .001f;
*res_fragmenter = til_fragmenter_tile64;
@@ -336,9 +332,9 @@ static void flui2d_prepare_frame(void *context, unsigned ticks, unsigned n_cpus,
/* Draw a the flui2d densities */
-static void flui2d_render_fragment(void *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)
{
- flui2d_context_t *ctxt = context;
+ flui2d_context_t *ctxt = (flui2d_context_t *)context;
for (int y = fragment->y; y < fragment->y + fragment->height; y++) {
int y0, y1;
@@ -542,11 +538,10 @@ static int flui2d_setup(const til_settings_t *settings, til_setting_t **res_sett
til_module_t flui2d_module = {
.create_context = flui2d_create_context,
- .destroy_context = flui2d_destroy_context,
.prepare_frame = flui2d_prepare_frame,
.render_fragment = flui2d_render_fragment,
+ .setup = flui2d_setup,
.name = "flui2d",
.description = "Fluid dynamics simulation in 2D (threaded (poorly))",
.author = "Vito Caputo <vcaputo@pengaru.com>",
- .setup = flui2d_setup,
};
diff --git a/src/modules/julia/julia.c b/src/modules/julia/julia.c
index d9cfdff..dd11f25 100644
--- a/src/modules/julia/julia.c
+++ b/src/modules/julia/julia.c
@@ -5,6 +5,7 @@
#include "til.h"
#include "til_fb.h"
+#include "til_module_context.h"
/* Copyright (C) 2017 Vito Caputo <vcaputo@pengaru.com> */
@@ -13,12 +14,13 @@
/* TODO: explore using C99 complex.h and its types? */
typedef struct julia_context_t {
- float rr;
- float realscale;
- float imagscale;
- float creal;
- float cimag;
- float threshold;
+ til_module_context_t til_module_context;
+ float rr;
+ float realscale;
+ float imagscale;
+ float creal;
+ float cimag;
+ float threshold;
} julia_context_t;
static uint32_t colors[] = {
@@ -65,26 +67,20 @@ static uint32_t colors[] = {
};
-static void * julia_create_context(unsigned seed, unsigned ticks, unsigned n_cpus, til_setup_t *setup)
+static til_module_context_t * julia_create_context(unsigned seed, unsigned ticks, unsigned n_cpus, til_setup_t *setup)
{
julia_context_t *ctxt;
- ctxt = calloc(1, sizeof(julia_context_t));
+ ctxt = til_module_context_new(sizeof(julia_context_t), seed, n_cpus);
if (!ctxt)
return NULL;
ctxt->rr = ((float)rand_r(&seed)) / (float)RAND_MAX * 100.f;
- return ctxt;
+ return &ctxt->til_module_context;
}
-static void julia_destroy_context(void *context)
-{
- free(context);
-
-}
-
static inline unsigned julia_iter(float real, float imag, float creal, float cimag, unsigned max_iters, float threshold)
{
unsigned i;
@@ -110,9 +106,9 @@ 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(void *context, unsigned ticks, unsigned n_cpus, til_fb_fragment_t *fragment, til_fragmenter_t *res_fragmenter)
+static void julia_prepare_frame(til_module_context_t *context, unsigned ticks, til_fb_fragment_t *fragment, til_fragmenter_t *res_fragmenter)
{
- julia_context_t *ctxt = context;
+ julia_context_t *ctxt = (julia_context_t *)context;
*res_fragmenter = til_fragmenter_slice_per_cpu;
@@ -137,9 +133,9 @@ static void julia_prepare_frame(void *context, unsigned ticks, unsigned n_cpus,
/* Draw a morphing Julia set */
-static void julia_render_fragment(void *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)
{
- julia_context_t *ctxt = context;
+ julia_context_t *ctxt = (julia_context_t *)context;
unsigned x, y;
unsigned width = fragment->width, height = fragment->height;
uint32_t *buf = fragment->buf;
@@ -160,7 +156,6 @@ static void julia_render_fragment(void *context, unsigned ticks, unsigned cpu, t
til_module_t julia_module = {
.create_context = julia_create_context,
- .destroy_context = julia_destroy_context,
.prepare_frame = julia_prepare_frame,
.render_fragment = julia_render_fragment,
.name = "julia",
diff --git a/src/modules/meta2d/meta2d.c b/src/modules/meta2d/meta2d.c
index d1063de..eb816d0 100644
--- a/src/modules/meta2d/meta2d.c
+++ b/src/modules/meta2d/meta2d.c
@@ -21,6 +21,7 @@
#include "til.h"
#include "til_fb.h"
+#include "til_module_context.h"
#include "din/din.h"
@@ -30,16 +31,17 @@
#define META2D_NUM_BALLS 10
typedef struct meta2d_ball_t {
- v2f_t position;
- float radius;
- v3f_t color;
+ v2f_t position;
+ float radius;
+ v3f_t color;
} meta2d_ball_t;
typedef struct meta2d_context_t {
- unsigned n;
- din_t *din_a, *din_b;
- float din_t;
- meta2d_ball_t balls[META2D_NUM_BALLS];
+ til_module_context_t til_module_context;
+ unsigned n;
+ din_t *din_a, *din_b;
+ float din_t;
+ meta2d_ball_t balls[META2D_NUM_BALLS];
} meta2d_context_t;
@@ -65,11 +67,13 @@ static inline uint32_t color_to_uint32(v3f_t color) {
}
-static void * meta2d_create_context(unsigned seed, unsigned ticks, unsigned n_cpus, til_setup_t *setup)
+static til_module_context_t * meta2d_create_context(unsigned seed, unsigned ticks, unsigned n_cpus, til_setup_t *setup)
{
meta2d_context_t *ctxt;
- ctxt = calloc(1, sizeof(meta2d_context_t));
+ ctxt = til_module_context_new(sizeof(meta2d_context_t), seed, n_cpus);
+ if (!ctxt)
+ return NULL;
/* perlin noise is used for some organic-ish random movement of the balls */
ctxt->din_a = din_new(10, 10, META2D_NUM_BALLS + 2);
@@ -84,13 +88,13 @@ static void * meta2d_create_context(unsigned seed, unsigned ticks, unsigned n_cp
v3f_rand(&ball->color, &(v3f_t){0.f, 0.f, 0.f}, &(v3f_t){1.f, 1.f, 1.f});
}
- return ctxt;
+ return &ctxt->til_module_context;
}
-static void meta2d_destroy_context(void *context)
+static void meta2d_destroy_context(til_module_context_t *context)
{
- meta2d_context_t *ctxt = context;
+ meta2d_context_t *ctxt = (meta2d_context_t *)context;
din_free(ctxt->din_a);
din_free(ctxt->din_b);
@@ -98,9 +102,9 @@ static void meta2d_destroy_context(void *context)
}
-static void meta2d_prepare_frame(void *context, unsigned ticks, unsigned n_cpus, til_fb_fragment_t *fragment, til_fragmenter_t *res_fragmenter)
+static void meta2d_prepare_frame(til_module_context_t *context, unsigned ticks, til_fb_fragment_t *fragment, til_fragmenter_t *res_fragmenter)
{
- meta2d_context_t *ctxt = context;
+ meta2d_context_t *ctxt = (meta2d_context_t *)context;
*res_fragmenter = til_fragmenter_slice_per_cpu;
@@ -175,9 +179,9 @@ static void meta2d_prepare_frame(void *context, unsigned ticks, unsigned n_cpus,
}
-static void meta2d_render_fragment(void *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)
{
- meta2d_context_t *ctxt = context;
+ 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;
diff --git a/src/modules/montage/montage.c b/src/modules/montage/montage.c
index 1b79de5..443fcaa 100644
--- a/src/modules/montage/montage.c
+++ b/src/modules/montage/montage.c
@@ -4,21 +4,22 @@
#include "til.h"
#include "til_fb.h"
+#include "til_module_context.h"
#include "til_util.h"
/* Copyright (C) 2019 - Vito Caputo <vcaputo@pengaru.com> */
typedef struct montage_context_t {
+ til_module_context_t til_module_context;
const til_module_t **modules;
- void **contexts;
+ til_module_context_t **contexts;
size_t n_modules;
} montage_context_t;
-static void setup_next_module(montage_context_t *ctxt);
-static void * montage_create_context(unsigned seed, unsigned ticks, unsigned n_cpus, til_setup_t *setup);
-static void montage_destroy_context(void *context);
-static void montage_prepare_frame(void *context, unsigned ticks, unsigned n_cpus, til_fb_fragment_t *fragment, til_fragmenter_t *res_fragmenter);
-static void montage_render_fragment(void *context, unsigned ticks, unsigned cpu, til_fb_fragment_t *fragment);
+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_fragmenter_t *res_fragmenter);
+static void montage_render_fragment(til_module_context_t *context, unsigned ticks, unsigned cpu, til_fb_fragment_t *fragment);
til_module_t montage_module = {
@@ -31,13 +32,13 @@ til_module_t montage_module = {
};
-static void * montage_create_context(unsigned seed, unsigned ticks, unsigned n_cpus, til_setup_t *setup)
+static til_module_context_t * montage_create_context(unsigned seed, unsigned ticks, unsigned n_cpus, til_setup_t *setup)
{
const til_module_t **modules, *rtv_module, *compose_module;
size_t n_modules;
montage_context_t *ctxt;
- ctxt = calloc(1, sizeof(montage_context_t));
+ ctxt = til_module_context_new(sizeof(montage_context_t), seed, n_cpus);
if (!ctxt)
return NULL;
@@ -89,22 +90,22 @@ static void * montage_create_context(unsigned seed, unsigned ticks, unsigned n_c
(void) til_module_randomize_setup(module, &setup, NULL);
- if (module->create_context) /* FIXME errors */
- ctxt->contexts[i] = module->create_context(rand_r(&seed), ticks, 1, setup);
+ /* FIXME errors */
+ (void) til_module_create_context(module, rand_r(&seed), ticks, 1, setup, &ctxt->contexts[i]);
til_setup_free(setup);
}
- return ctxt;
+ return &ctxt->til_module_context;
}
-static void montage_destroy_context(void *context)
+static void montage_destroy_context(til_module_context_t *context)
{
- montage_context_t *ctxt = context;
+ montage_context_t *ctxt = (montage_context_t *)context;
for (int i = 0; i < ctxt->n_modules; i++)
- til_module_destroy_context(ctxt->modules[i], ctxt->contexts[i]);
+ til_module_context_free(ctxt->contexts[i]);
free(ctxt->contexts);
free(ctxt->modules);
@@ -112,7 +113,6 @@ static void montage_destroy_context(void *context)
}
-
/* this is a hacked up derivative of til_fb_fragment_tile_single() */
static int montage_fragment_tile(const til_fb_fragment_t *fragment, unsigned tile_width, unsigned tile_height, unsigned number, til_fb_fragment_t *res_fragment)
{
@@ -164,9 +164,9 @@ static int montage_fragment_tile(const til_fb_fragment_t *fragment, unsigned til
* 1. it divides the frame into subfragments for threaded rendering
* 2. it determines which modules will be rendered where via fragment->number
*/
-static int montage_fragmenter(void *context, unsigned n_cpus, const til_fb_fragment_t *fragment, unsigned number, til_fb_fragment_t *res_fragment)
+static int montage_fragmenter(til_module_context_t *context, const til_fb_fragment_t *fragment, unsigned number, til_fb_fragment_t *res_fragment)
{
- montage_context_t *ctxt = context;
+ montage_context_t *ctxt = (montage_context_t *)context;
float root = sqrtf(ctxt->n_modules);
unsigned tile_width = fragment->frame_width / ceilf(root); /* screens are wide, always give excess to the width */
unsigned tile_height = fragment->frame_height / rintf(root); /* only give to the height when fraction is >= .5f */
@@ -183,18 +183,15 @@ static int montage_fragmenter(void *context, unsigned n_cpus, const til_fb_fragm
}
-
-static void montage_prepare_frame(void *context, unsigned ticks, unsigned n_cpus, til_fb_fragment_t *fragment, til_fragmenter_t *res_fragmenter)
+static void montage_prepare_frame(til_module_context_t *context, unsigned ticks, til_fb_fragment_t *fragment, til_fragmenter_t *res_fragmenter)
{
- montage_context_t *ctxt = context;
-
*res_fragmenter = montage_fragmenter;
}
-static void montage_render_fragment(void *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)
{
- montage_context_t *ctxt = context;
+ montage_context_t *ctxt = (montage_context_t *)context;
const til_module_t *module = ctxt->modules[fragment->number];
if (fragment->number >= ctxt->n_modules) {
@@ -203,21 +200,5 @@ static void montage_render_fragment(void *context, unsigned ticks, unsigned cpu,
return;
}
- /* since we're *already* in a threaded render of tiles, no further
- * threading within the montage tiles is desirable, so the per-module
- * render is done explicitly serially here in an open-coded ad-hoc
- * fashion for now. FIXME TODO: move this into rototiller.c
- */
- if (module->prepare_frame) {
- til_fragmenter_t fragmenter;
- unsigned fragnum = 0;
- til_fb_fragment_t frag;
-
- module->prepare_frame(ctxt->contexts[fragment->number], ticks, 1, fragment, &fragmenter);
-
- while (fragmenter(ctxt->contexts[fragment->number], 1, fragment, fragnum++, &frag))
- module->render_fragment(ctxt->contexts[fragment->number], ticks, 0, &frag);
- } else if (module->render_fragment)
- module->render_fragment(ctxt->contexts[fragment->number], ticks, 0, fragment);
+ til_module_render(ctxt->contexts[fragment->number], ticks, fragment);
}
-
diff --git a/src/modules/pixbounce/pixbounce.c b/src/modules/pixbounce/pixbounce.c
index 99a8519..827615e 100644
--- a/src/modules/pixbounce/pixbounce.c
+++ b/src/modules/pixbounce/pixbounce.c
@@ -3,6 +3,7 @@
#include <unistd.h>
#include "til.h"
+#include "til_module_context.h"
#include "draw.h"
/* Copyright (C) 2018-22 Philip J. Freeman <elektron@halo.nu> */
@@ -225,13 +226,13 @@ pixbounce_pixmap_t pixbounce_pixmap[] = {
typedef struct pixbounce_context_t {
+ til_module_context_t til_module_context;
int x, y;
int x_dir, y_dir;
pixbounce_pixmap_t *pix;
uint32_t color;
float pixmap_size_factor;
int multiplier;
-
} pixbounce_context_t;
static uint32_t pick_color()
@@ -239,11 +240,11 @@ static uint32_t pick_color()
return makergb(rand()%256, rand()%256, rand()%256, 1);
}
-static void * pixbounce_create_context(unsigned seed, unsigned ticks, unsigned n_cpus, til_setup_t *setup)
+static til_module_context_t * pixbounce_create_context(unsigned seed, unsigned ticks, unsigned n_cpus, til_setup_t *setup)
{
pixbounce_context_t *ctxt;
- ctxt = malloc(sizeof(pixbounce_context_t));
+ ctxt = til_module_context_new(sizeof(pixbounce_context_t), seed, n_cpus);
if (!ctxt)
return NULL;
@@ -256,18 +257,12 @@ static void * pixbounce_create_context(unsigned seed, unsigned ticks, unsigned n
ctxt->pixmap_size_factor = ((((pixbounce_setup_t *)setup)->pixmap_size)*55 + 22 )/ 100;
ctxt->multiplier = 1;
- return ctxt;
-}
-
-static void pixbounce_destroy_context(void *context)
-{
- pixbounce_context_t *ctxt = context;
- free(context);
+ return &ctxt->til_module_context;
}
-static void pixbounce_render_fragment(void *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)
{
- pixbounce_context_t *ctxt = context;
+ pixbounce_context_t *ctxt = (pixbounce_context_t *)context;
int width = fragment->width, height = fragment->height;
@@ -417,7 +412,6 @@ int pixbounce_setup(const til_settings_t *settings, til_setting_t **res_setting,
til_module_t pixbounce_module = {
.create_context = pixbounce_create_context,
- .destroy_context = pixbounce_destroy_context,
.render_fragment = pixbounce_render_fragment,
.setup = pixbounce_setup,
.name = "pixbounce",
diff --git a/src/modules/plasma/plasma.c b/src/modules/plasma/plasma.c
index dfcbd15..56f1176 100644
--- a/src/modules/plasma/plasma.c
+++ b/src/modules/plasma/plasma.c
@@ -5,6 +5,7 @@
#include "til.h"
#include "til_fb.h"
+#include "til_module_context.h"
/* Copyright (C) 2017 Vito Caputo <vcaputo@pengaru.com> */
@@ -31,7 +32,8 @@ typedef struct color_t {
static int32_t costab[FIXED_TRIG_LUT_SIZE], sintab[FIXED_TRIG_LUT_SIZE];
typedef struct plasma_context_t {
- unsigned rr;
+ til_module_context_t til_module_context;
+ unsigned rr;
} plasma_context_t;
@@ -51,7 +53,7 @@ static void init_plasma(int32_t *costab, int32_t *sintab)
}
-static void * plasma_create_context(unsigned seed, unsigned ticks, unsigned n_cpus, til_setup_t *setup)
+static til_module_context_t * plasma_create_context(unsigned seed, unsigned ticks, unsigned n_cpus, til_setup_t *setup)
{
static int initialized;
plasma_context_t *ctxt;
@@ -62,26 +64,20 @@ static void * plasma_create_context(unsigned seed, unsigned ticks, unsigned n_cp
init_plasma(costab, sintab);
}
- ctxt = calloc(1, sizeof(plasma_context_t));
+ ctxt = til_module_context_new(sizeof(plasma_context_t), seed, n_cpus);
if (!ctxt)
return NULL;
ctxt->rr = rand_r(&seed);
- return ctxt;
-}
-
-
-static void plasma_destroy_context(void *context)
-{
- free(context);
+ return &ctxt->til_module_context;
}
/* Prepare a frame for concurrent drawing of fragment using multiple fragments */
-static void plasma_prepare_frame(void *context, unsigned ticks, unsigned n_cpus, til_fb_fragment_t *fragment, til_fragmenter_t *res_fragmenter)
+static void plasma_prepare_frame(til_module_context_t *context, unsigned ticks, til_fb_fragment_t *fragment, til_fragmenter_t *res_fragmenter)
{
- plasma_context_t *ctxt = context;
+ plasma_context_t *ctxt = (plasma_context_t *)context;
*res_fragmenter = til_fragmenter_slice_per_cpu;
ctxt->rr += 3;
@@ -89,9 +85,9 @@ static void plasma_prepare_frame(void *context, unsigned ticks, unsigned n_cpus,
/* Draw a plasma effect */
-static void plasma_render_fragment(void *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)
{
- plasma_context_t *ctxt = context;
+ 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;
@@ -160,7 +156,6 @@ static void plasma_render_fragment(void *context, unsigned ticks, unsigned cpu,
til_module_t plasma_module = {
.create_context = plasma_create_context,
- .destroy_context = plasma_destroy_context,
.prepare_frame = plasma_prepare_frame,
.render_fragment = plasma_render_fragment,
.name = "plasma",
diff --git a/src/modules/plato/plato.c b/src/modules/plato/plato.c
index 2ca3478..c22a6c4 100644
--- a/src/modules/plato/plato.c
+++ b/src/modules/plato/plato.c
@@ -46,21 +46,23 @@
#include "til.h"
#include "til_fb.h"
+#include "til_module_context.h"
typedef struct plato_context_t {
- float r;
+ til_module_context_t til_module_context;
+ float r;
} plato_context_t;
typedef struct v3f_t {
- float x, y, z;
+ float x, y, z;
} v3f_t;
typedef struct polyhedron_t {
- const char *name;
- unsigned edge_cnt, vertex_cnt;
- unsigned n_vertices; /* size of vertices[] which enumerates all vertices in face order */
- v3f_t vertices[];
+ const char *name;
+ unsigned edge_cnt, vertex_cnt;
+ unsigned n_vertices; /* size of vertices[] which enumerates all vertices in face order */
+ v3f_t vertices[];
} polyhedron_t;
@@ -608,29 +610,21 @@ static void draw_polyhedron(const polyhedron_t *polyhedron, m4f_t *transform, ti
}
-static void * plato_create_context(unsigned seed, unsigned ticks, unsigned n_cpus, til_setup_t *setup)
+static til_module_context_t * plato_create_context(unsigned seed, unsigned ticks, unsigned n_cpus, til_setup_t *setup)
{
plato_context_t *ctxt;
- ctxt = calloc(1, sizeof(plato_context_t));
+ ctxt = til_module_context_new(sizeof(plato_context_t), seed, n_cpus);
if (!ctxt)
return NULL;
- return ctxt;
+ return &ctxt->til_module_context;
}
-static void plato_destroy_context(void *context)
+static void plato_render_fragment(til_module_context_t *context, unsigned ticks, unsigned cpu, til_fb_fragment_t *fragment)
{
- plato_context_t *ctxt = context;
-
- free(ctxt);
-}
-
-
-static void plato_render_fragment(void *context, unsigned ticks, unsigned cpu, til_fb_fragment_t *fragment)
-{
- plato_context_t *ctxt = context;
+ plato_context_t *ctxt = (plato_context_t *)context;
ctxt->r += .015f;
til_fb_fragment_clear(fragment);
@@ -666,7 +660,6 @@ static void plato_render_fragment(void *context, unsigned ticks, unsigned cpu, t
til_module_t plato_module = {
.create_context = plato_create_context,
- .destroy_context = plato_destroy_context,
.render_fragment = plato_render_fragment,
.name = "plato",
.description = "Platonic solids rendered in 3D",
diff --git a/src/modules/ray/ray.c b/src/modules/ray/ray.c
index 14ef45f..84e4eb2 100644
--- a/src/modules/ray/ray.c
+++ b/src/modules/ray/ray.c
@@ -4,6 +4,7 @@
#include "til.h"
#include "til_fb.h"
+#include "til_module_context.h"
#include "til_util.h"
#include "ray/ray_camera.h"
@@ -126,26 +127,27 @@ static float r;
typedef struct ray_context_t {
- ray_render_t *render;
+ til_module_context_t til_module_context;
+ ray_render_t *render;
} ray_context_t;
-static void * ray_create_context(unsigned seed, unsigned ticks, unsigned n_cpus, til_setup_t *setup)
+static til_module_context_t * ray_create_context(unsigned seed, unsigned ticks, unsigned n_cpus, til_setup_t *setup)
{
- return calloc(1, sizeof(ray_context_t));
-}
+ ray_context_t *ctxt;
+ ctxt = til_module_context_new(sizeof(ray_context_t), seed, n_cpus);
+ if (!ctxt)
+ return NULL;
-static void ray_destroy_context(void *context)
-{
- free(context);
+ return &ctxt->til_module_context;
}
/* prepare a frame for concurrent rendering */
-static void ray_prepare_frame(void *context, unsigned ticks, unsigned n_cpus, til_fb_fragment_t *fragment, til_fragmenter_t *res_fragmenter)
+static void ray_prepare_frame(til_module_context_t *context, unsigned ticks, til_fb_fragment_t *fragment, til_fragmenter_t *res_fragmenter)
{
- ray_context_t *ctxt = context;
+ ray_context_t *ctxt = (ray_context_t *)context;
*res_fragmenter = til_fragmenter_tile64;
#if 1
@@ -175,17 +177,17 @@ static void ray_prepare_frame(void *context, unsigned ticks, unsigned n_cpus, ti
/* ray trace a simple scene into the fragment */
-static void ray_render_fragment(void *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)
{
- ray_context_t *ctxt = context;
+ ray_context_t *ctxt = (ray_context_t *)context;
ray_render_trace_fragment(ctxt->render, fragment);
}
-static void ray_finish_frame(void *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)
{
- ray_context_t *ctxt = context;
+ ray_context_t *ctxt = (ray_context_t *)context;
ray_render_free(ctxt->render);
}
@@ -193,7 +195,6 @@ static void ray_finish_frame(void *context, unsigned ticks, til_fb_fragment_t *f
til_module_t ray_module = {
.create_context = ray_create_context,
- .destroy_context = ray_destroy_context,
.prepare_frame = ray_prepare_frame,
.render_fragment = ray_render_fragment,
.finish_frame = ray_finish_frame,
diff --git a/src/modules/roto/roto.c b/src/modules/roto/roto.c
index 8908bd2..cc69103 100644
--- a/src/modules/roto/roto.c
+++ b/src/modules/roto/roto.c
@@ -5,6 +5,7 @@
#include "til.h"
#include "til_fb.h"
+#include "til_module_context.h"
/* Copyright (C) 2016 Vito Caputo <vcaputo@pengaru.com> */
@@ -24,31 +25,26 @@ typedef struct color_t {
} color_t;
typedef struct roto_context_t {
- unsigned r, rr;
+ til_module_context_t til_module_context;
+ unsigned r, rr;
} roto_context_t;
static int32_t costab[FIXED_TRIG_LUT_SIZE], sintab[FIXED_TRIG_LUT_SIZE];
static uint8_t texture[256][256];
static color_t palette[2];
-static void * roto_create_context(unsigned seed, unsigned ticks, unsigned n_cpus, til_setup_t *setup)
+static til_module_context_t * roto_create_context(unsigned seed, unsigned ticks, unsigned n_cpus, til_setup_t *setup)
{
roto_context_t *ctxt;
- ctxt = calloc(1, sizeof(roto_context_t));
+ ctxt = til_module_context_new(sizeof(roto_context_t), seed, n_cpus);
if (!ctxt)
return NULL;
ctxt->r = rand_r(&seed);
ctxt->rr = rand_r(&seed);
- return ctxt;
-}
-
-
-static void roto_destroy_context(void *context)
-{
- free(context);
+ return &ctxt->til_module_context;
}
@@ -178,9 +174,9 @@ 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(void *context, unsigned ticks, unsigned n_cpus, til_fb_fragment_t *fragment, til_fragmenter_t *res_fragmenter)
+static void roto_prepare_frame(til_module_context_t *context, unsigned ticks, til_fb_fragment_t *fragment, til_fragmenter_t *res_fragmenter)
{
- roto_context_t *ctxt = context;
+ roto_context_t *ctxt = (roto_context_t *)context;
static int initialized;
if (!initialized) {
@@ -198,9 +194,9 @@ static void roto_prepare_frame(void *context, unsigned ticks, unsigned n_cpus, t
/* Draw a rotating checkered 256x256 texture into fragment. */
-static void roto_render_fragment(void *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)
{
- roto_context_t *ctxt = context;
+ roto_context_t *ctxt = (roto_context_t *)context;
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;
int x, y, frame_width = fragment->frame_width, frame_height = fragment->frame_height;
uint32_t *buf = fragment->buf;
@@ -248,7 +244,6 @@ static void roto_render_fragment(void *context, unsigned ticks, unsigned cpu, ti
til_module_t roto_module = {
.create_context = roto_create_context,
- .destroy_context = roto_destroy_context,
.prepare_frame = roto_prepare_frame,
.render_fragment = roto_render_fragment,
.name = "roto",
diff --git a/src/modules/rtv/rtv.c b/src/modules/rtv/rtv.c
index d60a4cd..fe68903 100644
--- a/src/modules/rtv/rtv.c
+++ b/src/modules/rtv/rtv.c
@@ -3,6 +3,7 @@
#include "til.h"
#include "til_fb.h"
+#include "til_module_context.h"
#include "til_settings.h"
#include "til_util.h"
@@ -24,7 +25,7 @@
typedef struct rtv_channel_t {
const til_module_t *module;
- void *module_ctxt;
+ til_module_context_t *module_ctxt;
til_setup_t *module_setup;
time_t last_on_time, cumulative_time;
char *settings_as_arg;
@@ -33,6 +34,7 @@ typedef struct rtv_channel_t {
} rtv_channel_t;
typedef struct rtv_context_t {
+ til_module_context_t til_module_context;
time_t next_switch, next_hide_caption;
rtv_channel_t *channel, *last_channel;
txt_t *caption;
@@ -59,10 +61,10 @@ typedef struct rtv_setup_t {
} rtv_setup_t;
static void setup_next_channel(rtv_context_t *ctxt, unsigned ticks);
-static void * rtv_create_context(unsigned seed, unsigned ticks, unsigned n_cpus, til_setup_t *setup);
-static void rtv_destroy_context(void *context);
-static void rtv_prepare_frame(void *context, unsigned ticks, unsigned n_cpus, til_fb_fragment_t *fragment, til_fragmenter_t *res_fragmenter);
-static void rtv_finish_frame(void *context, unsigned ticks, til_fb_fragment_t *fragment);
+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_prepare_frame(til_module_context_t *context, unsigned ticks, til_fb_fragment_t *fragment, til_fragmenter_t *res_fragmenter);
+static void rtv_finish_frame(til_module_context_t *context, unsigned ticks, til_fb_fragment_t *fragment);
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 = {
@@ -117,7 +119,7 @@ static void cleanup_channel(rtv_context_t *ctxt)
ctxt->channel->cumulative_time = 0;
- ctxt->channel->module_ctxt = til_module_destroy_context(ctxt->channel->module, ctxt->channel->module_ctxt);
+ ctxt->channel->module_ctxt = til_module_context_free(ctxt->channel->module_ctxt);
free(ctxt->channel->settings_as_arg);
ctxt->channel->settings_as_arg = NULL;
@@ -186,7 +188,7 @@ static void setup_next_channel(rtv_context_t *ctxt, unsigned ticks)
}
if (!ctxt->channel->module_ctxt)
- (void) til_module_create_context(ctxt->channel->module, rand(), ticks, ctxt->channel->module_setup, &ctxt->channel->module_ctxt);
+ (void) til_module_create_context(ctxt->channel->module, rand(), ticks, 0, ctxt->channel->module_setup, &ctxt->channel->module_ctxt);
ctxt->channel->last_on_time = now;
}
@@ -213,7 +215,7 @@ static int rtv_should_skip_module(const rtv_setup_t *setup, const til_module_t *
}
-static void * rtv_create_context(unsigned seed, unsigned ticks, unsigned n_cpus, til_setup_t *setup)
+static til_module_context_t * rtv_create_context(unsigned seed, unsigned ticks, unsigned n_cpus, til_setup_t *setup)
{
rtv_context_t *ctxt;
const til_module_t **modules;
@@ -230,7 +232,7 @@ static void * rtv_create_context(unsigned seed, unsigned ticks, unsigned n_cpus,
n_channels++;
}
- ctxt = calloc(1, sizeof(rtv_context_t) + n_channels * sizeof(rtv_channel_t));
+ ctxt = til_module_context_new(sizeof(rtv_context_t) + n_channels * sizeof(rtv_channel_t), seed, n_cpus);
if (!ctxt)
return NULL;
@@ -242,7 +244,7 @@ static void * rtv_create_context(unsigned seed, unsigned ticks, unsigned n_cpus,
ctxt->snow_channel.module = &rtv_none_module;
if (((rtv_setup_t *)setup)->snow_module) {
ctxt->snow_channel.module = til_lookup_module(((rtv_setup_t *)setup)->snow_module);
- (void) til_module_create_context(ctxt->snow_channel.module, rand_r(&seed), ticks, NULL, &ctxt->snow_channel.module_ctxt);
+ (void) til_module_create_context(ctxt->snow_channel.module, rand_r(&seed), ticks, 0, NULL, &ctxt->snow_channel.module_ctxt);
}
for (size_t i = 0; i < n_modules; i++) {
@@ -252,13 +254,13 @@ static void * rtv_create_context(unsigned seed, unsigned ticks, unsigned n_cpus,
setup_next_channel(ctxt, ticks);
- return ctxt;
+ return &ctxt->til_module_context;
}
-static void rtv_destroy_context(void *context)
+static void rtv_destroy_context(til_module_context_t *context)
{
- rtv_context_t *ctxt = context;
+ rtv_context_t *ctxt = (rtv_context_t *)context;
/* TODO FIXME: cleanup better, snow module etc */
cleanup_channel(ctxt);
@@ -266,9 +268,9 @@ static void rtv_destroy_context(void *context)
}
-static void rtv_prepare_frame(void *context, unsigned ticks, unsigned n_cpus, til_fb_fragment_t *fragment, til_fragmenter_t *res_fragmenter)
+static void rtv_prepare_frame(til_module_context_t *context, unsigned ticks, til_fb_fragment_t *fragment, til_fragmenter_t *res_fragmenter)
{
- rtv_context_t *ctxt = context;
+ rtv_context_t *ctxt = (rtv_context_t *)context;
time_t now = time(NULL);
if (now >= ctxt->next_switch)
@@ -277,13 +279,13 @@ static void rtv_prepare_frame(void *context, unsigned ticks, unsigned n_cpus, ti
if (now >= ctxt->next_hide_caption)
ctxt->caption = NULL;
- til_module_render(ctxt->channel->module, ctxt->channel->module_ctxt, ticks, fragment);
+ til_module_render(ctxt->channel->module_ctxt, ticks, fragment);
}
-static void rtv_finish_frame(void *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)
{
- rtv_context_t *ctxt = context;
+ rtv_context_t *ctxt = (rtv_context_t *)context;
if (!ctxt->caption)
return;
diff --git a/src/modules/shapes/shapes.c b/src/modules/shapes/shapes.c
index a746f77..8a1da6e 100644
--- a/src/modules/shapes/shapes.c
+++ b/src/modules/shapes/shapes.c
@@ -57,6 +57,7 @@
#include "til.h"
#include "til_fb.h"
+#include "til_module_context.h"
#define SHAPES_DEFAULT_TYPE SHAPES_TYPE_PINWHEEL
#define SHAPES_DEFAULT_SCALE 1
@@ -76,18 +77,19 @@ typedef enum shapes_type_t {
} shapes_type_t;
typedef struct shapes_setup_t {
- til_setup_t til_setup;
- shapes_type_t type;
- float scale;
- float pinch;
- float pinch_spin;
- unsigned n_pinches;
- unsigned n_points;
- float spin;
+ til_setup_t til_setup;
+ shapes_type_t type;
+ float scale;
+ float pinch;
+ float pinch_spin;
+ unsigned n_pinches;
+ unsigned n_points;
+ float spin;
} shapes_setup_t;
typedef struct shapes_context_t {
- shapes_setup_t setup;
+ til_module_context_t til_module_context;
+ shapes_setup_t setup;
} shapes_context_t;
@@ -96,34 +98,26 @@ static shapes_setup_t shapes_default_setup = {
};
-static void * shapes_create_context(unsigned seed, unsigned ticks, unsigned n_cpus, til_setup_t *setup)
+static til_module_context_t * shapes_create_context(unsigned seed, unsigned ticks, unsigned n_cpus, til_setup_t *setup)
{
shapes_context_t *ctxt;
if (!setup)
setup = &shapes_default_setup.til_setup;
- ctxt = calloc(1, sizeof(shapes_context_t));
+ ctxt = til_module_context_new(sizeof(shapes_context_t), seed, n_cpus);
if (!ctxt)
return NULL;
ctxt->setup = *(shapes_setup_t *)setup;
- return ctxt;
+ return &ctxt->til_module_context;
}
-static void shapes_destroy_context(void *context)
+static void shapes_render_fragment(til_module_context_t *context, unsigned ticks, unsigned cpu, til_fb_fragment_t *fragment)
{
- shapes_context_t *ctxt = context;
-
- free(ctxt);
-}
-
-
-static void shapes_render_fragment(void *context, unsigned ticks, unsigned cpu, til_fb_fragment_t *fragment)
-{
- shapes_context_t *ctxt = context;
+ shapes_context_t *ctxt = (shapes_context_t *)context;
unsigned size = MIN(fragment->width, fragment->height) * ctxt->setup.scale;
unsigned xoff = (fragment->width - size) >> 1;
unsigned yoff = (fragment->height - size) >> 1;
@@ -495,7 +489,6 @@ static int shapes_setup(const til_settings_t *settings, til_setting_t **res_sett
til_module_t shapes_module = {
.create_context = shapes_create_context,
- .destroy_context = shapes_destroy_context,
.render_fragment = shapes_render_fragment,
.setup = shapes_setup,
.name = "shapes",
diff --git a/src/modules/snow/snow.c b/src/modules/snow/snow.c
index bf0aee0..767459e 100644
--- a/src/modules/snow/snow.c
+++ b/src/modules/snow/snow.c
@@ -4,52 +4,48 @@
#include "til.h"
#include "til_fb.h"
+#include "til_module_context.h"
/* Copyright (C) 2019 - Vito Caputo <vcaputo@pengaru.com> */
/* This implements white noise / snow just using rand() */
typedef union snow_seed_t {
- char __padding[256]; /* prevent seeds sharing a cache-line */
- unsigned seed;
+ char __padding[256]; /* prevent seeds sharing a cache-line */
+ unsigned seed;
} snow_seed_t;
typedef struct snow_context_t {
- unsigned unused;
- snow_seed_t seeds[];
+ til_module_context_t til_module_context;
+ unsigned unused;
+ snow_seed_t seeds[];
} snow_context_t;
-static void * snow_create_context(unsigned seed, unsigned ticks, unsigned n_cpus, til_setup_t *setup)
+static til_module_context_t * snow_create_context(unsigned seed, unsigned ticks, unsigned n_cpus, til_setup_t *setup)
{
snow_context_t *ctxt;
- ctxt = calloc(1, sizeof(snow_context_t) + n_cpus * sizeof(snow_seed_t));
+ ctxt = til_module_context_new(sizeof(snow_context_t) + n_cpus * sizeof(snow_seed_t), seed, n_cpus);
if (!ctxt)
return NULL;
for (unsigned i = 0; i < n_cpus; i++)
ctxt->seeds[i].seed = rand_r(&seed);
- return ctxt;
+ return &ctxt->til_module_context;
}
-static void snow_destroy_context(void *context)
-{
- free(context);
-}
-
-
-static void snow_prepare_frame(void *context, unsigned ticks, unsigned n_cpus, til_fb_fragment_t *fragment, til_fragmenter_t *res_fragmenter)
+static void snow_prepare_frame(til_module_context_t *context, unsigned ticks, til_fb_fragment_t *fragment, til_fragmenter_t *res_fragmenter)
{
*res_fragmenter = til_fragmenter_slice_per_cpu;
}
-static void snow_render_fragment(void *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)
{
- snow_context_t *ctxt = context;
+ snow_context_t *ctxt = (snow_context_t *)context;
unsigned *seed = &ctxt->seeds[cpu].seed;
for (unsigned y = fragment->y; y < fragment->y + fragment->height; y++) {
@@ -68,7 +64,6 @@ static void snow_render_fragment(void *context, unsigned ticks, unsigned cpu, ti
til_module_t snow_module = {
.create_context = snow_create_context,
- .destroy_context = snow_destroy_context,
.prepare_frame = snow_prepare_frame,
.render_fragment = snow_render_fragment,
.name = "snow",
diff --git a/src/modules/sparkler/sparkler.c b/src/modules/sparkler/sparkler.c
index 10d8638..8c8348b 100644
--- a/src/modules/sparkler/sparkler.c
+++ b/src/modules/sparkler/sparkler.c
@@ -6,6 +6,7 @@
#include "til.h"
#include "til_fb.h"
+#include "til_module_context.h"
#include "til_util.h"
#include "particles.h"
@@ -25,6 +26,7 @@ typedef struct sparkler_setup_t {
} sparkler_setup_t;
typedef struct sparkler_context_t {
+ til_module_context_t til_module_context;
particles_t *particles;
sparkler_setup_t setup;
} sparkler_context_t;
@@ -33,14 +35,14 @@ extern particle_ops_t simple_ops;
static sparkler_setup_t sparkler_default_setup;
-static void * sparkler_create_context(unsigned seed, unsigned ticks, unsigned n_cpus, til_setup_t *setup)
+static til_module_context_t * sparkler_create_context(unsigned seed, unsigned ticks, unsigned n_cpus, til_setup_t *setup)
{
sparkler_context_t *ctxt;
if (!setup)
setup = &sparkler_default_setup.til_setup;
- ctxt = calloc(1, sizeof(sparkler_context_t));
+ ctxt = til_module_context_new(sizeof(sparkler_context_t), seed, n_cpus);
if (!ctxt)
return NULL;
@@ -59,22 +61,22 @@ static void * sparkler_create_context(unsigned seed, unsigned ticks, unsigned n_
particles_add_particles(ctxt->particles, NULL, &simple_ops, INIT_PARTS);
- return ctxt;
+ return &ctxt->til_module_context;
}
-static void sparkler_destroy_context(void *context)
+static void sparkler_destroy_context(til_module_context_t *context)
{
- sparkler_context_t *ctxt = context;
+ sparkler_context_t *ctxt = (sparkler_context_t *)context;
particles_free(ctxt->particles);
free(ctxt);
}
-static void sparkler_prepare_frame(void *context, unsigned ticks, unsigned n_cpus, til_fb_fragment_t *fragment, til_fragmenter_t *res_fragmenter)
+static void sparkler_prepare_frame(til_module_context_t *context, unsigned ticks, til_fb_fragment_t *fragment, til_fragmenter_t *res_fragmenter)
{
- sparkler_context_t *ctxt = context;
+ sparkler_context_t *ctxt = (sparkler_context_t *)context;
*res_fragmenter = til_fragmenter_slice_per_cpu;
@@ -88,9 +90,9 @@ static void sparkler_prepare_frame(void *context, unsigned ticks, unsigned n_cpu
/* Render a 3D particle system */
-static void sparkler_render_fragment(void *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)
{
- sparkler_context_t *ctxt = context;
+ sparkler_context_t *ctxt = (sparkler_context_t *)context;
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 a2adb7b..39868f6 100644
--- a/src/modules/spiro/spiro.c
+++ b/src/modules/spiro/spiro.c
@@ -6,6 +6,7 @@
#include "til.h"
#include "til_fb.h"
+#include "til_module_context.h"
#include "draw.h"
@@ -22,19 +23,20 @@ Spirograph Emulator
*/
typedef struct spiro_context_t {
- float r;
- int r_dir;
- float p;
- int p_dir;
+ til_module_context_t til_module_context;
+ float r;
+ int r_dir;
+ float p;
+ int p_dir;
} spiro_context_t;
-static void * spiro_create_context(unsigned seed, unsigned ticks, unsigned n_cpus, til_setup_t *setup)
+static til_module_context_t * spiro_create_context(unsigned seed, unsigned ticks, unsigned n_cpus, til_setup_t *setup)
{
spiro_context_t *ctxt;
float z;
- ctxt = malloc(sizeof(spiro_context_t));
+ ctxt = til_module_context_new(sizeof(spiro_context_t), seed, n_cpus);
if (!ctxt)
return NULL;
@@ -48,20 +50,12 @@ static void * spiro_create_context(unsigned seed, unsigned ticks, unsigned n_cpu
#ifdef DEBUG
printf("spiro: initial context: r=%f, dir=%i, p=%f, dir=%i\n", ctxt->r, ctxt->r_dir, ctxt->p, ctxt->p_dir);
#endif
- return ctxt;
+ return &ctxt->til_module_context;
}
-static void spiro_destroy_context(void *context)
+static void spiro_render_fragment(til_module_context_t *context, unsigned ticks, unsigned cpu, til_fb_fragment_t *fragment)
{
- spiro_context_t *ctxt = context;
-
- free(context);
-}
-
-
-static void spiro_render_fragment(void *context, unsigned ticks, unsigned cpu, til_fb_fragment_t *fragment)
-{
- spiro_context_t *ctxt = context;
+ spiro_context_t *ctxt = (spiro_context_t *)context;
int width = fragment->width, height = fragment->height;
@@ -145,7 +139,6 @@ static void spiro_render_fragment(void *context, unsigned ticks, unsigned cpu, t
til_module_t spiro_module = {
.create_context = spiro_create_context,
- .destroy_context = spiro_destroy_context,
.render_fragment = spiro_render_fragment,
.name = "spiro",
.description = "Spirograph emulator",
diff --git a/src/modules/stars/stars.c b/src/modules/stars/stars.c
index 5506559..31f4ead 100644
--- a/src/modules/stars/stars.c
+++ b/src/modules/stars/stars.c
@@ -10,6 +10,7 @@
#include "til.h"
#include "til_fb.h"
+#include "til_module_context.h"
#include "til_settings.h"
#include "draw.h"
@@ -18,26 +19,26 @@
#define DEFAULT_ROT_ADJ .00003
-struct points
-{
- float x, y, z;
- struct points *next;
+struct points {
+ float x, y, z;
+ struct points *next;
};
typedef struct stars_context_t {
- struct points* points;
- float rot_adj;
- float rot_rate;
- float rot_angle;
- float offset_x;
- float offset_y;
- float offset_angle;
- unsigned seed;
+ til_module_context_t til_module_context;
+ struct points* points;
+ float rot_adj;
+ float rot_rate;
+ float rot_angle;
+ float offset_x;
+ float offset_y;
+ float offset_angle;
+ unsigned seed;
} stars_context_t;
typedef struct stars_setup_t {
- til_setup_t til_setup;
- float rot_adj;
+ til_setup_t til_setup;
+ float rot_adj;
} stars_setup_t;
static stars_setup_t stars_default_setup = {
@@ -50,7 +51,7 @@ float get_random_unit_coord(unsigned *seed) {
}
-static void * stars_create_context(unsigned seed, unsigned ticks, unsigned n_cpus, til_setup_t *setup)
+static til_module_context_t * stars_create_context(unsigned seed, unsigned ticks, unsigned n_cpus, til_setup_t *setup)
{
stars_context_t *ctxt;
float z;
@@ -59,7 +60,7 @@ static void * stars_create_context(unsigned seed, unsigned ticks, unsigned n_cpu
if (!setup)
setup = &stars_default_setup.til_setup;
- ctxt = malloc(sizeof(stars_context_t));
+ ctxt = til_module_context_new(sizeof(stars_context_t), seed, n_cpus);
if (!ctxt)
return NULL;
@@ -85,12 +86,12 @@ static void * stars_create_context(unsigned seed, unsigned ticks, unsigned n_cpu
ctxt->points = p_ptr;
}
}
- return ctxt;
+ return &ctxt->til_module_context;
}
-static void stars_destroy_context(void *context)
+static void stars_destroy_context(til_module_context_t *context)
{
- stars_context_t *ctxt = context;
+ stars_context_t *ctxt = (stars_context_t *)context;
struct points* p_ptr;
struct points* last_ptr=NULL;
@@ -108,9 +109,9 @@ static void stars_destroy_context(void *context)
}
-static void stars_render_fragment(void *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)
{
- stars_context_t *ctxt = context;
+ stars_context_t *ctxt = (stars_context_t *)context;
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 fa7a95c..1573688 100644
--- a/src/modules/submit/submit.c
+++ b/src/modules/submit/submit.c
@@ -22,6 +22,7 @@
#include "til.h"
#include "til_fb.h"
+#include "til_module_context.h"
#include "til_settings.h"
#include "til_util.h"
@@ -49,12 +50,13 @@ static color_t colors[NUM_PLAYERS + 1] = {
typedef struct submit_context_t {
- grid_t *grid;
- grid_player_t *players[NUM_PLAYERS];
- uint32_t seq;
- uint32_t game_winner;
- unsigned bilerp:1;
- uint8_t cells[GRID_SIZE * GRID_SIZE];
+ til_module_context_t til_module_context;
+ grid_t *grid;
+ grid_player_t *players[NUM_PLAYERS];
+ uint32_t seq;
+ uint32_t game_winner;
+ unsigned bilerp:1;
+ uint8_t cells[GRID_SIZE * GRID_SIZE];
} submit_context_t;
typedef struct submit_setup_t {
@@ -265,36 +267,36 @@ static void setup_grid(submit_context_t *ctxt)
}
-static void * submit_create_context(unsigned seed, unsigned ticks, unsigned n_cpus, til_setup_t *setup)
+static til_module_context_t * submit_create_context(unsigned seed, unsigned ticks, unsigned n_cpus, til_setup_t *setup)
{
submit_context_t *ctxt;
if (!setup)
setup = &submit_default_setup.til_setup;
- ctxt = calloc(1, sizeof(submit_context_t));
+ ctxt = til_module_context_new(sizeof(submit_context_t), seed, n_cpus);
if (!ctxt)
return NULL;
ctxt->bilerp = ((submit_setup_t *)setup)->bilerp;
setup_grid(ctxt);
- return ctxt;
+ return &ctxt->til_module_context;
}
-static void submit_destroy_context(void *context)
+static void submit_destroy_context(til_module_context_t *context)
{
- submit_context_t *ctxt = context;
+ submit_context_t *ctxt = (submit_context_t *)context;
grid_free(ctxt->grid);
free(ctxt);
}
-static void submit_prepare_frame(void *context, unsigned ticks, unsigned n_cpus, til_fb_fragment_t *fragment, til_fragmenter_t *res_fragmenter)
+static void submit_prepare_frame(til_module_context_t *context, unsigned ticks, til_fb_fragment_t *fragment, til_fragmenter_t *res_fragmenter)
{
- submit_context_t *ctxt = context;
+ submit_context_t *ctxt = (submit_context_t *)context;
*res_fragmenter = til_fragmenter_tile64;
@@ -313,9 +315,9 @@ static void submit_prepare_frame(void *context, unsigned ticks, unsigned n_cpus,
}
-static void submit_render_fragment(void *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)
{
- submit_context_t *ctxt = context;
+ submit_context_t *ctxt = (submit_context_t *)context;
if (!ctxt->bilerp)
draw_grid(ctxt, fragment);
diff --git a/src/modules/swab/swab.c b/src/modules/swab/swab.c
index e81fec9..8566fa3 100644
--- a/src/modules/swab/swab.c
+++ b/src/modules/swab/swab.c
@@ -23,22 +23,24 @@
#include "til.h"
#include "til_fb.h"
+#include "til_module_context.h"
#include "til_util.h"
#include "din/din.h"
typedef struct swab_context_t {
- din_t *din;
- float r;
+ til_module_context_t til_module_context;
+ din_t *din;
+ float r;
} swab_context_t;
typedef struct color_t {
- float r,g,b;
+ float r,g,b;
} color_t;
typedef struct v3f_t {
- float x, y, z;
+ float x, y, z;
} v3f_t;
@@ -64,11 +66,11 @@ static inline uint32_t color_to_uint32(color_t color) {
}
-static void * swab_create_context(unsigned seed, unsigned ticks, unsigned n_cpus, til_setup_t *setup)
+static til_module_context_t * swab_create_context(unsigned seed, unsigned ticks, unsigned n_cpus, til_setup_t *setup)
{
swab_context_t *ctxt;
- ctxt = calloc(1, sizeof(swab_context_t));
+ ctxt = til_module_context_new(sizeof(swab_context_t), seed, n_cpus);
if (!ctxt)
return NULL;
@@ -78,22 +80,22 @@ static void * swab_create_context(unsigned seed, unsigned ticks, unsigned n_cpus
return NULL;
}
- return ctxt;
+ return &ctxt->til_module_context;
}
-static void swab_destroy_context(void *context)
+static void swab_destroy_context(til_module_context_t *context)
{
- swab_context_t *ctxt = context;
+ swab_context_t *ctxt = (swab_context_t *)context;
din_free(ctxt->din);
free(ctxt);
}
-static void swab_prepare_frame(void *context, unsigned ticks, unsigned n_cpus, til_fb_fragment_t *fragment, til_fragmenter_t *res_fragmenter)
+static void swab_prepare_frame(til_module_context_t *context, unsigned ticks, til_fb_fragment_t *fragment, til_fragmenter_t *res_fragmenter)
{
- swab_context_t *ctxt = context;
+ swab_context_t *ctxt = (swab_context_t *)context;
*res_fragmenter = til_fragmenter_tile64;
@@ -101,9 +103,9 @@ static void swab_prepare_frame(void *context, unsigned ticks, unsigned n_cpus, t
}
-static void swab_render_fragment(void *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)
{
- swab_context_t *ctxt = context;
+ swab_context_t *ctxt = (swab_context_t *)context;
float cos_r = cos(ctxt->r);
float sin_r = sin(ctxt->r);
float z1 = cos_r;
diff --git a/src/modules/swarm/swarm.c b/src/modules/swarm/swarm.c
index d45c926..14d82ed 100644
--- a/src/modules/swarm/swarm.c
+++ b/src/modules/swarm/swarm.c
@@ -27,6 +27,7 @@
#include "til.h"
#include "til_fb.h"
+#include "til_module_context.h"
typedef struct v3f_t {
float x, y, z;
@@ -53,10 +54,11 @@ typedef struct swarm_setup_t {
} swarm_setup_t;
typedef struct swarm_context_t {
- v3f_t color;
- float ztweak;
- swarm_setup_t setup;
- boid_t boids[];
+ til_module_context_t til_module_context;
+ v3f_t color;
+ float ztweak;
+ swarm_setup_t setup;
+ boid_t boids[];
} swarm_context_t;
#define SWARM_SIZE (32 * 1024)
@@ -179,14 +181,14 @@ static inline uint32_t color_to_uint32(v3f_t color) {
}
-static void * swarm_create_context(unsigned seed, unsigned ticks, unsigned n_cpus, til_setup_t *setup)
+static til_module_context_t * swarm_create_context(unsigned seed, unsigned ticks, unsigned n_cpus, til_setup_t *setup)
{
swarm_context_t *ctxt;
if (!setup)
setup = &swarm_default_setup.til_setup;
- ctxt = calloc(1, sizeof(swarm_context_t) + sizeof(*(ctxt->boids)) * SWARM_SIZE);
+ ctxt = til_module_context_new(sizeof(swarm_context_t) + sizeof(*(ctxt->boids)) * SWARM_SIZE, seed, n_cpus);
if (!ctxt)
return NULL;
@@ -195,15 +197,7 @@ static void * swarm_create_context(unsigned seed, unsigned ticks, unsigned n_cpu
for (unsigned i = 0; i < SWARM_SIZE; i++)
boid_randomize(&ctxt->boids[i]);
- return ctxt;
-}
-
-
-static void swarm_destroy_context(void *context)
-{
- swarm_context_t *ctxt = context;
-
- free(ctxt);
+ return &ctxt->til_module_context;
}
@@ -407,9 +401,9 @@ static void swarm_draw_as_lines(swarm_context_t *ctxt, til_fb_fragment_t *fragme
}
-static void swarm_render_fragment(void *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)
{
- swarm_context_t *ctxt = context;
+ swarm_context_t *ctxt = (swarm_context_t *)context;
swarm_update(ctxt, ticks);
@@ -469,7 +463,6 @@ static int swarm_setup(const til_settings_t *settings, til_setting_t **res_setti
til_module_t swarm_module = {
.create_context = swarm_create_context,
- .destroy_context = swarm_destroy_context,
.render_fragment = swarm_render_fragment,
.setup = swarm_setup,
.name = "swarm",
diff --git a/src/modules/voronoi/voronoi.c b/src/modules/voronoi/voronoi.c
index adb180d..9365015 100644
--- a/src/modules/voronoi/voronoi.c
+++ b/src/modules/voronoi/voronoi.c
@@ -5,6 +5,7 @@
#include "til.h"
#include "til_fb.h"
+#include "til_module_context.h"
#include "til_util.h"
#include "v2f.h"
@@ -42,6 +43,7 @@ typedef struct voronoi_distances_t {
} voronoi_distances_t;
typedef struct voronoi_context_t {
+ til_module_context_t til_module_context;
unsigned seed;
voronoi_setup_t setup;
voronoi_distances_t distances;
@@ -78,14 +80,14 @@ static void voronoi_randomize(voronoi_context_t *ctxt)
}
-static void * voronoi_create_context(unsigned seed, unsigned ticks, unsigned n_cpus, til_setup_t *setup)
+static til_module_context_t * voronoi_create_context(unsigned seed, unsigned ticks, unsigned n_cpus, til_setup_t *setup)
{
voronoi_context_t *ctxt;
if (!setup)
setup = &voronoi_default_setup.til_setup;
- ctxt = calloc(1, sizeof(voronoi_context_t) + ((voronoi_setup_t *)setup)->n_cells * sizeof(voronoi_cell_t));
+ ctxt = til_module_context_new(sizeof(voronoi_context_t) + ((voronoi_setup_t *)setup)->n_cells * sizeof(voronoi_cell_t), seed, n_cpus);
if (!ctxt)
return NULL;
@@ -94,13 +96,13 @@ static void * voronoi_create_context(unsigned seed, unsigned ticks, unsigned n_c
voronoi_randomize(ctxt);
- return ctxt;
+ return &ctxt->til_module_context;
}
-static void voronoi_destroy_context(void *context)
+static void voronoi_destroy_context(til_module_context_t *context)
{
- voronoi_context_t *ctxt = context;
+ voronoi_context_t *ctxt = (voronoi_context_t *)context;
free(ctxt->distances.buf);
free(ctxt);
@@ -279,9 +281,9 @@ static void voronoi_sample_colors(voronoi_context_t *ctxt, til_fb_fragment_t *fr
}
-static void voronoi_prepare_frame(void *context, unsigned ticks, unsigned n_cpus, til_fb_fragment_t *fragment, til_fragmenter_t *res_fragmenter)
+static void voronoi_prepare_frame(til_module_context_t *context, unsigned ticks, til_fb_fragment_t *fragment, til_fragmenter_t *res_fragmenter)
{
- voronoi_context_t *ctxt = context;
+ voronoi_context_t *ctxt = (voronoi_context_t *)context;
*res_fragmenter = til_fragmenter_tile64;
@@ -312,9 +314,9 @@ static void voronoi_prepare_frame(void *context, unsigned ticks, unsigned n_cpus
}
-static void voronoi_render_fragment(void *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)
{
- voronoi_context_t *ctxt = context;
+ voronoi_context_t *ctxt = (voronoi_context_t *)context;
for (int y = 0; y < fragment->height; y++) {
for (int x = 0; x < fragment->width; x++) {
© All Rights Reserved