diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2018-01-05 12:18:44 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2018-01-05 12:25:28 +0300 |
commit | 9a00d57371afd28ff3afe43c941bda2c76fea66f (patch) | |
tree | 5c124fc0bc5f81d3c133690c16a448afae32cad4 /source/blender | |
parent | 9be32ac5fed2b3d40fe12f31667b58ed1f9da623 (diff) |
DRW: Add viewport argument to DRW_draw_render_loop_offscreen
This way we can have persistent data accross different calls.
Diffstat (limited to 'source/blender')
-rw-r--r-- | source/blender/draw/DRW_engine.h | 4 | ||||
-rw-r--r-- | source/blender/draw/intern/draw_manager.c | 21 | ||||
-rw-r--r-- | source/blender/editors/include/ED_view3d.h | 3 | ||||
-rw-r--r-- | source/blender/editors/space_view3d/view3d_draw.c | 18 | ||||
-rw-r--r-- | source/blender/editors/space_view3d/view3d_draw_legacy.c | 2 |
5 files changed, 34 insertions, 14 deletions
diff --git a/source/blender/draw/DRW_engine.h b/source/blender/draw/DRW_engine.h index 7efd9639874..3f09f38147e 100644 --- a/source/blender/draw/DRW_engine.h +++ b/source/blender/draw/DRW_engine.h @@ -44,6 +44,7 @@ struct ViewportEngineData; struct View3D; struct rcti; struct GPUOffScreen; +struct GPUViewport; struct RenderEngineType; struct WorkSpace; @@ -96,7 +97,8 @@ void DRW_draw_render_loop_offscreen( struct RenderEngineType *engine_type, struct ARegion *ar, struct View3D *v3d, const bool draw_background, - struct GPUOffScreen *ofs); + struct GPUOffScreen *ofs, + struct GPUViewport *viewport); void DRW_draw_select_loop( struct Depsgraph *graph, struct ARegion *ar, struct View3D *v3d, diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c index ca109e37d3d..91fc7047a69 100644 --- a/source/blender/draw/intern/draw_manager.c +++ b/source/blender/draw/intern/draw_manager.c @@ -3523,9 +3523,11 @@ void DRW_draw_render_loop( DRW_draw_render_loop_ex(graph, engine_type, ar, v3d, NULL); } +/* @viewport CAN be NULL, in this case we create one. */ void DRW_draw_render_loop_offscreen( struct Depsgraph *graph, RenderEngineType *engine_type, - ARegion *ar, View3D *v3d, const bool draw_background, GPUOffScreen *ofs) + ARegion *ar, View3D *v3d, const bool draw_background, GPUOffScreen *ofs, + GPUViewport *viewport) { RegionView3D *rv3d = ar->regiondata; @@ -3533,7 +3535,12 @@ void DRW_draw_render_loop_offscreen( void *backup_viewport = rv3d->viewport; { /* backup (_never_ use rv3d->viewport) */ - rv3d->viewport = GPU_viewport_create_from_offscreen(ofs); + if (viewport == NULL) { + rv3d->viewport = GPU_viewport_create_from_offscreen(ofs); + } + else { + rv3d->viewport = viewport; + } } /* Reset before using it. */ @@ -3544,10 +3551,12 @@ void DRW_draw_render_loop_offscreen( /* restore */ { - /* don't free data owned by 'ofs' */ - GPU_viewport_clear_from_offscreen(rv3d->viewport); - GPU_viewport_free(rv3d->viewport); - MEM_freeN(rv3d->viewport); + if (viewport == NULL) { + /* don't free data owned by 'ofs' */ + GPU_viewport_clear_from_offscreen(rv3d->viewport); + GPU_viewport_free(rv3d->viewport); + MEM_freeN(rv3d->viewport); + } rv3d->viewport = backup_viewport; } diff --git a/source/blender/editors/include/ED_view3d.h b/source/blender/editors/include/ED_view3d.h index 69061bdcd26..a7a66b1275f 100644 --- a/source/blender/editors/include/ED_view3d.h +++ b/source/blender/editors/include/ED_view3d.h @@ -70,6 +70,7 @@ struct wmWindowManager; struct GPUFX; struct GPUOffScreen; struct GPUFXSettings; +struct GPUViewport; struct WorkSpace; enum eGPUFXFlags; @@ -380,7 +381,7 @@ void ED_view3d_draw_offscreen( struct ViewLayer *view_layer, struct View3D *v3d, struct ARegion *ar, int winx, int winy, float viewmat[4][4], float winmat[4][4], bool do_bgpic, bool do_sky, bool is_persp, const char *viewname, struct GPUFX *fx, struct GPUFXSettings *fx_settings, - struct GPUOffScreen *ofs); + struct GPUOffScreen *ofs, struct GPUViewport *viewport); void ED_view3d_draw_setup_view( struct wmWindow *win, const struct EvaluationContext *eval_ctx, struct Scene *scene, struct ARegion *ar, struct View3D *v3d, float viewmat[4][4], float winmat[4][4], const struct rcti *rect); diff --git a/source/blender/editors/space_view3d/view3d_draw.c b/source/blender/editors/space_view3d/view3d_draw.c index f9d84387302..f07f988d930 100644 --- a/source/blender/editors/space_view3d/view3d_draw.c +++ b/source/blender/editors/space_view3d/view3d_draw.c @@ -1966,7 +1966,7 @@ void ED_view3d_draw_offscreen( float viewmat[4][4], float winmat[4][4], bool do_bgpic, bool do_sky, bool is_persp, const char *viewname, GPUFX *fx, GPUFXSettings *fx_settings, - GPUOffScreen *ofs) + GPUOffScreen *ofs, GPUViewport *viewport) { bool do_compositing = false; RegionView3D *rv3d = ar->regiondata; @@ -2060,7 +2060,7 @@ void ED_view3d_draw_offscreen( /* XXX, should take depsgraph as arg */ Depsgraph *depsgraph = BKE_scene_get_depsgraph(scene, view_layer, false); BLI_assert(depsgraph != NULL); - DRW_draw_render_loop_offscreen(depsgraph, eval_ctx->engine_type, ar, v3d, do_sky, ofs); + DRW_draw_render_loop_offscreen(depsgraph, eval_ctx->engine_type, ar, v3d, do_sky, ofs, viewport); } /* restore size */ @@ -2159,7 +2159,7 @@ ImBuf *ED_view3d_draw_offscreen_imbuf( ED_view3d_draw_offscreen( eval_ctx, scene, view_layer, v3d, ar, sizex, sizey, NULL, winmat, draw_background, draw_sky, !is_ortho, viewname, - fx, &fx_settings, ofs); + fx, &fx_settings, ofs, NULL); if (ibuf->rect_float) { GPU_offscreen_read_pixels(ofs, GL_FLOAT, ibuf->rect_float); @@ -2175,6 +2175,7 @@ ImBuf *ED_view3d_draw_offscreen_imbuf( float winmat_jitter[4][4]; float *rect_temp = (ibuf->rect_float) ? ibuf->rect_float : MEM_mallocN(sizex * sizey * sizeof(float[4]), "rect_temp"); float *accum_buffer = MEM_mallocN(sizex * sizey * sizeof(float[4]), "accum_buffer"); + GPUViewport *viewport = GPU_viewport_create_from_offscreen(ofs); BLI_jitter_init(jit_ofs, samples); @@ -2182,7 +2183,7 @@ ImBuf *ED_view3d_draw_offscreen_imbuf( ED_view3d_draw_offscreen( eval_ctx, scene, view_layer, v3d, ar, sizex, sizey, NULL, winmat, draw_background, draw_sky, !is_ortho, viewname, - fx, &fx_settings, ofs); + fx, &fx_settings, ofs, viewport); GPU_offscreen_read_pixels(ofs, GL_FLOAT, accum_buffer); /* skip the first sample */ @@ -2196,7 +2197,7 @@ ImBuf *ED_view3d_draw_offscreen_imbuf( ED_view3d_draw_offscreen( eval_ctx, scene, view_layer, v3d, ar, sizex, sizey, NULL, winmat_jitter, draw_background, draw_sky, !is_ortho, viewname, - fx, &fx_settings, ofs); + fx, &fx_settings, ofs, viewport); GPU_offscreen_read_pixels(ofs, GL_FLOAT, rect_temp); unsigned int i = sizex * sizey * 4; @@ -2205,6 +2206,13 @@ ImBuf *ED_view3d_draw_offscreen_imbuf( } } + { + /* don't free data owned by 'ofs' */ + GPU_viewport_clear_from_offscreen(viewport); + GPU_viewport_free(viewport); + MEM_freeN(viewport); + } + if (ibuf->rect_float == NULL) { MEM_freeN(rect_temp); } diff --git a/source/blender/editors/space_view3d/view3d_draw_legacy.c b/source/blender/editors/space_view3d/view3d_draw_legacy.c index ffb7c3dc612..5702c32a344 100644 --- a/source/blender/editors/space_view3d/view3d_draw_legacy.c +++ b/source/blender/editors/space_view3d/view3d_draw_legacy.c @@ -1423,7 +1423,7 @@ static void gpu_update_lamps_shadows_world(const EvaluationContext *eval_ctx, Sc ED_view3d_draw_offscreen( eval_ctx, scene, eval_ctx->view_layer, v3d, &ar, winsize, winsize, viewmat, winmat, false, false, true, - NULL, NULL, NULL, NULL); + NULL, NULL, NULL, NULL, NULL); GPU_lamp_shadow_buffer_unbind(shadow->lamp); v3d->drawtype = drawtype; |