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
path: root/source
diff options
context:
space:
mode:
authorBrecht Van Lommel <brechtvanlommel@gmail.com>2019-06-02 03:14:56 +0300
committerBrecht Van Lommel <brechtvanlommel@gmail.com>2019-06-02 13:47:52 +0300
commite7e52f7cff3abf36f3a3a0b70c86db5c2ed86324 (patch)
tree17014997161c2343cbe2148d7a7b9ef320d5e900 /source
parent114973584d49daa2020345970b696878ebc49cf7 (diff)
Fix T65185: Cycles viewport render no refreshing overlays properly
Don't rely on detecting view matrix changes to refresh depth buffer, instead detect redraw tags coming from progressive render samples.
Diffstat (limited to 'source')
-rw-r--r--source/blender/draw/engines/external/external_engine.c35
-rw-r--r--source/blender/editors/include/ED_screen.h2
-rw-r--r--source/blender/editors/screen/area.c31
-rw-r--r--source/blender/editors/sculpt_paint/paint_vertex.c2
-rw-r--r--source/blender/editors/sculpt_paint/sculpt.c2
-rw-r--r--source/blender/makesdna/DNA_screen_types.h4
-rw-r--r--source/blender/windowmanager/intern/wm_draw.c6
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);
}
}
}