Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Sharybin <sergey.vfx@gmail.com>2015-11-16 16:20:41 +0300
committerSergey Sharybin <sergey.vfx@gmail.com>2015-11-16 16:20:41 +0300
commit57a3163096199b336840fcf30a0dc78782c42d96 (patch)
tree70cf187f706150260d06cc51b80c1e14b759a819 /source/blender
parent5576524e880305595f75cb523d5f5a07cfcd9824 (diff)
Speedup OpenGL sequencer animation rendering
The idea is to avoid having roundtrip from byte to float and back to byte buffer and use render result's byte buffer to store result of sequencer rendering. This actually matches to what regular render pipeline is doing and this gives around 2-3 times speedup of sequencer export on a simple scenes.
Diffstat (limited to 'source/blender')
-rw-r--r--source/blender/editors/render/render_opengl.c35
-rw-r--r--source/blender/render/extern/include/RE_pipeline.h3
-rw-r--r--source/blender/render/intern/include/render_result.h2
-rw-r--r--source/blender/render/intern/source/pipeline.c2
-rw-r--r--source/blender/render/intern/source/render_result.c2
5 files changed, 19 insertions, 25 deletions
diff --git a/source/blender/editors/render/render_opengl.c b/source/blender/editors/render/render_opengl.c
index 2b23b683af0..04c1d682cde 100644
--- a/source/blender/editors/render/render_opengl.c
+++ b/source/blender/editors/render/render_opengl.c
@@ -282,29 +282,22 @@ static void screen_opengl_render_doit(OGLRender *oglrender, RenderResult *rr)
ibuf = BKE_sequencer_give_ibuf(&context, CFRA, chanshown);
if (ibuf) {
- ImBuf *linear_ibuf;
-
- BLI_assert((oglrender->sizex == ibuf->x) && (oglrender->sizey == ibuf->y));
-
- linear_ibuf = IMB_dupImBuf(ibuf);
+ ImBuf *out = IMB_dupImBuf(ibuf);
IMB_freeImBuf(ibuf);
-
- if (linear_ibuf->rect_float == NULL) {
- /* internally sequencer working in display space and stores both bytes and float buffers in that space.
- * It is possible that byte->float onversion didn't happen in sequencer (e.g. when adding image sequence/movie
- * into sequencer) there'll be only byte buffer. Create float buffer from existing byte buffer, making it linear
- */
-
- IMB_float_from_rect(linear_ibuf);
+ /* OpenGL render is considered to be preview and should be
+ * as fast as possible. So currently we're making sure sequencer
+ * result is always byte to simplify color management pipeline.
+ *
+ * TODO(sergey): In the case of output to float container (EXR)
+ * it actually makes sense to keep float buffer instead.
+ */
+ if (out->rect_float != NULL) {
+ IMB_rect_from_float(out);
+ imb_freerectfloatImBuf(out);
}
- else {
- /* ensure float buffer is in linear space, not in display space */
- BKE_sequencer_imbuf_from_sequencer_space(scene, linear_ibuf);
- }
-
- memcpy(rectf, linear_ibuf->rect_float, sizeof(float) * 4 * oglrender->sizex * oglrender->sizey);
-
- IMB_freeImBuf(linear_ibuf);
+ BLI_assert((oglrender->sizex == ibuf->x) && (oglrender->sizey == ibuf->y));
+ RE_render_result_rect_from_ibuf(rr, &scene->r, out, oglrender->view_id);
+ IMB_freeImBuf(out);
}
if (gpd) {
diff --git a/source/blender/render/extern/include/RE_pipeline.h b/source/blender/render/extern/include/RE_pipeline.h
index 99e0bd7b62f..96ac8aa8c5a 100644
--- a/source/blender/render/extern/include/RE_pipeline.h
+++ b/source/blender/render/extern/include/RE_pipeline.h
@@ -231,6 +231,9 @@ struct RenderStats *RE_GetStats(struct Render *re);
void RE_ResultGet32(struct Render *re, unsigned int *rect);
void RE_AcquiredResultGet32(struct Render *re, struct RenderResult *result, unsigned int *rect, const int view_id);
+void RE_render_result_rect_from_ibuf(struct RenderResult *rr, struct RenderData *rd,
+ struct ImBuf *ibuf, const int view_id);
+
struct RenderLayer *RE_GetRenderLayer(struct RenderResult *rr, const char *name);
float *RE_RenderLayerGetPass(volatile struct RenderLayer *rl, int passtype, const char *viewname);
diff --git a/source/blender/render/intern/include/render_result.h b/source/blender/render/intern/include/render_result.h
index 90ad0fa30d7..2619ac76d59 100644
--- a/source/blender/render/intern/include/render_result.h
+++ b/source/blender/render/intern/include/render_result.h
@@ -97,8 +97,6 @@ bool render_result_exr_file_cache_read(struct Render *re);
/* Combined Pixel Rect */
struct ImBuf *render_result_rect_to_ibuf(struct RenderResult *rr, struct RenderData *rd, const int view_id);
-void render_result_rect_from_ibuf(struct RenderResult *rr, struct RenderData *rd,
- struct ImBuf *ibuf, const int view_id);
void render_result_rect_fill_zero(struct RenderResult *rr, const int view_id);
void render_result_rect_get_pixels(struct RenderResult *rr,
diff --git a/source/blender/render/intern/source/pipeline.c b/source/blender/render/intern/source/pipeline.c
index a9f754c05cd..71154ce12bb 100644
--- a/source/blender/render/intern/source/pipeline.c
+++ b/source/blender/render/intern/source/pipeline.c
@@ -2658,7 +2658,7 @@ static void do_render_seq(Render *re)
if (ibuf_arr[view_id]) {
/* copy ibuf into combined pixel rect */
- render_result_rect_from_ibuf(rr, &re->r, ibuf_arr[view_id], view_id);
+ RE_render_result_rect_from_ibuf(rr, &re->r, ibuf_arr[view_id], view_id);
if (ibuf_arr[view_id]->metadata && (re->r.stamp & R_STAMP_STRIPMETA)) {
/* ensure render stamp info first */
diff --git a/source/blender/render/intern/source/render_result.c b/source/blender/render/intern/source/render_result.c
index d323c4004b6..19b049ee1da 100644
--- a/source/blender/render/intern/source/render_result.c
+++ b/source/blender/render/intern/source/render_result.c
@@ -1527,7 +1527,7 @@ ImBuf *render_result_rect_to_ibuf(RenderResult *rr, RenderData *rd, const int vi
return ibuf;
}
-void render_result_rect_from_ibuf(RenderResult *rr, RenderData *UNUSED(rd), ImBuf *ibuf, const int view_id)
+void RE_render_result_rect_from_ibuf(RenderResult *rr, RenderData *UNUSED(rd), ImBuf *ibuf, const int view_id)
{
RenderView *rv = RE_RenderViewGetById(rr, view_id);