diff options
author | Vito Caputo <vcaputo@pengaru.com> | 2017-12-10 09:51:36 -0800 |
---|---|---|
committer | Vito Caputo <vcaputo@pengaru.com> | 2017-12-10 12:15:20 -0800 |
commit | 1d73823602297ab490dc4222f63c1845f84a9e98 (patch) | |
tree | b50a8e27d1dcdf861270e63ed117b8c3be18ac32 | |
parent | 3249e0e65e7a9361eb3604d46496182fda9f83c0 (diff) |
rototiller: introduce module.finish_frame()
Add a hook for post-render serialized frame completion,
some of the renderers may have state to cleanup after rendering
a frame.
A future commit may change add a return value to control flow for
features like multi-pass rendering within a given module.
The raytracer for example may want to add concurrently executed
post filters, and having a non-void return from finish_frame()
would be a tidy way to tell rototiller "go back to prepare->render
for this context" as many times as necessary, keeping the pass state
in the context.
For now its return is void however, as I just need a cleanup hook
as the raytracer becomes more stateful per frame with a BIH spatial
index in the works.
-rw-r--r-- | src/rototiller.c | 9 | ||||
-rw-r--r-- | src/rototiller.h | 1 |
2 files changed, 7 insertions, 3 deletions
diff --git a/src/rototiller.c b/src/rototiller.c index c0a755b..079b0d4 100644 --- a/src/rototiller.c +++ b/src/rototiller.c @@ -70,10 +70,13 @@ static void module_render_page_threaded(rototiller_module_t *module, void *conte static void module_render_page(rototiller_module_t *module, void *context, threads_t *threads, fb_page_t *page) { - if (!module->prepare_frame) - return module->render_fragment(context, &page->fragment); + if (module->prepare_frame) + module_render_page_threaded(module, context, threads, page); + else + module->render_fragment(context, &page->fragment); - module_render_page_threaded(module, context, threads, page); + if (module->finish_frame) + module->finish_frame(context, &page->fragment); } diff --git a/src/rototiller.h b/src/rototiller.h index beafc52..84b3842 100644 --- a/src/rototiller.h +++ b/src/rototiller.h @@ -12,6 +12,7 @@ typedef struct rototiller_module_t { void (*destroy_context)(void *context); void (*prepare_frame)(void *context, unsigned n_cpus, fb_fragment_t *fragment, rototiller_fragmenter_t *res_fragmenter); void (*render_fragment)(void *context, fb_fragment_t *fragment); + void (*finish_frame)(void *context, fb_fragment_t *fragment); char *name; char *description; char *author; |