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:
-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);
}
}
}