Fix T65185: Cycles viewport render no refreshing overlays properly
authorBrecht Van Lommel <brechtvanlommel@gmail.com>
Sun, 2 Jun 2019 00:14:56 +0000 (02:14 +0200)
committerBrecht Van Lommel <brechtvanlommel@gmail.com>
Sun, 2 Jun 2019 10:47:52 +0000 (12:47 +0200)
Don't rely on detecting view matrix changes to refresh depth buffer, instead
detect redraw tags coming from progressive render samples.

source/blender/draw/engines/external/external_engine.c
source/blender/editors/include/ED_screen.h
source/blender/editors/screen/area.c
source/blender/editors/sculpt_paint/paint_vertex.c
source/blender/editors/sculpt_paint/sculpt.c
source/blender/makesdna/DNA_screen_types.h
source/blender/windowmanager/intern/wm_draw.c

index 9512304..f6646ca 100644 (file)
@@ -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,
 };
index a7a95a4..fc43144 100644 (file)
@@ -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);
index c74841b..e5bbeaf 100644 (file)
@@ -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;
+      }
     }
   }
 }
index 439c237..7dfe6f4 100644 (file)
@@ -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)
index 4e5c2a7..c0af72a 100644 (file)
@@ -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);
     }
   }
 }
index 8ac73d3..0319993 100644 (file)
@@ -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. */
index 6b6a04c..56fc381 100644 (file)
@@ -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);
     }
   }
 }