diff options
-rw-r--r-- | source/blender/draw/engines/external/external_engine.c | 35 | ||||
-rw-r--r-- | source/blender/editors/include/ED_screen.h | 2 | ||||
-rw-r--r-- | source/blender/editors/screen/area.c | 31 | ||||
-rw-r--r-- | source/blender/editors/sculpt_paint/paint_vertex.c | 2 | ||||
-rw-r--r-- | source/blender/editors/sculpt_paint/sculpt.c | 2 | ||||
-rw-r--r-- | source/blender/makesdna/DNA_screen_types.h | 4 | ||||
-rw-r--r-- | source/blender/windowmanager/intern/wm_draw.c | 6 |
7 files changed, 33 insertions, 49 deletions
diff --git a/source/blender/draw/engines/external/external_engine.c b/source/blender/draw/engines/external/external_engine.c index 9512304b94b..f6646ca575e 100644 --- a/source/blender/draw/engines/external/external_engine.c +++ b/source/blender/draw/engines/external/external_engine.c @@ -88,7 +88,6 @@ typedef struct EXTERNAL_PrivateData { /* Do we need to update the depth or can we reuse the last calculated texture. */ bool update_depth; - bool view_updated; float last_persmat[4][4]; } EXTERNAL_PrivateData; /* Transient data */ @@ -99,7 +98,7 @@ static void external_engine_init(void *vedata) { EXTERNAL_StorageList *stl = ((EXTERNAL_Data *)vedata)->stl; const DRWContextState *draw_ctx = DRW_context_state_get(); - RegionView3D *rv3d = draw_ctx->rv3d; + ARegion *ar = draw_ctx->ar; /* Depth prepass */ if (!e_data.depth_sh) { @@ -110,27 +109,12 @@ static void external_engine_init(void *vedata) /* Alloc transient pointers */ stl->g_data = MEM_mallocN(sizeof(*stl->g_data), __func__); stl->g_data->update_depth = true; - stl->g_data->view_updated = false; - } - - if (stl->g_data->update_depth == false) { - if (rv3d && rv3d->rflag & RV3D_NAVIGATING) { - stl->g_data->update_depth = true; - } } - if (stl->g_data->view_updated) { + /* Progressive render samples are tagged with no rebuild, in that case we + * can skip updating the depth buffer */ + if (!(ar && (ar->do_draw & RGN_DRAW_NO_REBUILD))) { stl->g_data->update_depth = true; - stl->g_data->view_updated = false; - } - - { - float persmat[4][4]; - DRW_view_persmat_get(NULL, persmat, false); - if (!equals_m4m4(persmat, stl->g_data->last_persmat)) { - stl->g_data->update_depth = true; - copy_m4_m4(stl->g_data->last_persmat, persmat); - } } } @@ -271,15 +255,6 @@ static void external_draw_scene(void *vedata) } } -static void external_view_update(void *vedata) -{ - EXTERNAL_Data *data = vedata; - EXTERNAL_StorageList *stl = data->stl; - if (stl && stl->g_data) { - stl->g_data->view_updated = true; - } -} - static void external_engine_free(void) { /* All shaders are builtin. */ @@ -299,7 +274,7 @@ static DrawEngineType draw_engine_external_type = { &external_cache_finish, NULL, &external_draw_scene, - &external_view_update, + NULL, NULL, NULL, }; diff --git a/source/blender/editors/include/ED_screen.h b/source/blender/editors/include/ED_screen.h index a7a95a4a659..fc43144417a 100644 --- a/source/blender/editors/include/ED_screen.h +++ b/source/blender/editors/include/ED_screen.h @@ -73,7 +73,7 @@ void ED_region_pixelspace(struct ARegion *ar); void ED_region_update_rect(struct ARegion *ar); void ED_region_init(struct ARegion *ar); void ED_region_tag_redraw(struct ARegion *ar); -void ED_region_tag_redraw_partial(struct ARegion *ar, const struct rcti *rct); +void ED_region_tag_redraw_partial(struct ARegion *ar, const struct rcti *rct, bool rebuild); void ED_region_tag_redraw_overlay(struct ARegion *ar); void ED_region_tag_redraw_no_rebuild(struct ARegion *ar); void ED_region_tag_refresh_ui(struct ARegion *ar); diff --git a/source/blender/editors/screen/area.c b/source/blender/editors/screen/area.c index c74841b3ede..e5bbeafd89d 100644 --- a/source/blender/editors/screen/area.c +++ b/source/blender/editors/screen/area.c @@ -687,26 +687,33 @@ void ED_region_tag_redraw_no_rebuild(ARegion *ar) void ED_region_tag_refresh_ui(ARegion *ar) { if (ar) { - ar->do_draw |= RGN_DRAW_REFRESH_UI; + ar->do_draw |= RGN_REFRESH_UI; } } -void ED_region_tag_redraw_partial(ARegion *ar, const rcti *rct) +void ED_region_tag_redraw_partial(ARegion *ar, const rcti *rct, bool rebuild) { if (ar && !(ar->do_draw & RGN_DRAWING)) { - if (!(ar->do_draw & (RGN_DRAW | RGN_DRAW_NO_REBUILD | RGN_DRAW_PARTIAL))) { - /* no redraw set yet, set partial region */ - ar->do_draw |= RGN_DRAW_PARTIAL; - ar->drawrct = *rct; - } - else if (ar->drawrct.xmin != ar->drawrct.xmax) { - BLI_assert((ar->do_draw & RGN_DRAW_PARTIAL) != 0); - /* partial redraw already set, expand region */ + if (ar->do_draw & RGN_DRAW_PARTIAL) { + /* Partial redraw already set, expand region. */ BLI_rcti_union(&ar->drawrct, rct); + if (rebuild) { + ar->do_draw &= ~RGN_DRAW_NO_REBUILD; + } + } + else if (ar->do_draw & (RGN_DRAW | RGN_DRAW_NO_REBUILD)) { + /* Full redraw already requested. */ + if (rebuild) { + ar->do_draw &= ~RGN_DRAW_NO_REBUILD; + } } else { - BLI_assert((ar->do_draw & (RGN_DRAW | RGN_DRAW_NO_REBUILD)) != 0); - /* Else, full redraw is already requested, nothing to do here. */ + /* No redraw set yet, set partial region. */ + ar->drawrct = *rct; + ar->do_draw |= RGN_DRAW_PARTIAL; + if (!rebuild) { + ar->do_draw |= RGN_DRAW_NO_REBUILD; + } } } } diff --git a/source/blender/editors/sculpt_paint/paint_vertex.c b/source/blender/editors/sculpt_paint/paint_vertex.c index 439c237cd57..7dfe6f4c137 100644 --- a/source/blender/editors/sculpt_paint/paint_vertex.c +++ b/source/blender/editors/sculpt_paint/paint_vertex.c @@ -2336,7 +2336,7 @@ static void wpaint_stroke_update_step(bContext *C, struct PaintStroke *stroke, P r.ymin += vc->ar->winrct.ymin - 2; r.ymax += vc->ar->winrct.ymin + 2; } - ED_region_tag_redraw_partial(vc->ar, &r); + ED_region_tag_redraw_partial(vc->ar, &r, true); } static void wpaint_stroke_done(const bContext *C, struct PaintStroke *stroke) diff --git a/source/blender/editors/sculpt_paint/sculpt.c b/source/blender/editors/sculpt_paint/sculpt.c index 4e5c2a74023..c0af72a69cb 100644 --- a/source/blender/editors/sculpt_paint/sculpt.c +++ b/source/blender/editors/sculpt_paint/sculpt.c @@ -5227,7 +5227,7 @@ static void sculpt_flush_update_step(bContext *C) r.xmax += ar->winrct.xmin + 2; r.ymin += ar->winrct.ymin - 2; r.ymax += ar->winrct.ymin + 2; - ED_region_tag_redraw_partial(ar, &r); + ED_region_tag_redraw_partial(ar, &r, true); } } } diff --git a/source/blender/makesdna/DNA_screen_types.h b/source/blender/makesdna/DNA_screen_types.h index 8ac73d3ae7a..0319993631c 100644 --- a/source/blender/makesdna/DNA_screen_types.h +++ b/source/blender/makesdna/DNA_screen_types.h @@ -646,7 +646,9 @@ enum { /* Redraw only part of region, for sculpting and painting to get smoother * stroke painting on heavy meshes. */ RGN_DRAW_PARTIAL = 2, - /* For outliner, to do faster redraw without rebuilding outliner tree. */ + /* For outliner, to do faster redraw without rebuilding outliner tree. + * For 3D viewport, to display a new progressive render sample without + * while other buffers and overlays remain unchanged. */ RGN_DRAW_NO_REBUILD = 4, /* Set while region is being drawn. */ diff --git a/source/blender/windowmanager/intern/wm_draw.c b/source/blender/windowmanager/intern/wm_draw.c index 6b6a04cacad..56fc38160f0 100644 --- a/source/blender/windowmanager/intern/wm_draw.c +++ b/source/blender/windowmanager/intern/wm_draw.c @@ -205,16 +205,16 @@ static void wm_region_test_render_do_draw(const Scene *scene, /* do partial redraw when possible */ if (ED_view3d_calc_render_border(scene, depsgraph, v3d, ar, &border_rect)) { - ED_region_tag_redraw_partial(ar, &border_rect); + ED_region_tag_redraw_partial(ar, &border_rect, false); } else { - ED_region_tag_redraw(ar); + ED_region_tag_redraw_no_rebuild(ar); } engine->flag &= ~RE_ENGINE_DO_DRAW; } else if (viewport && GPU_viewport_do_update(viewport)) { - ED_region_tag_redraw(ar); + ED_region_tag_redraw_no_rebuild(ar); } } } |