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.
This commit is contained in:
Brecht Van Lommel 2019-06-02 02:14:56 +02:00
parent 114973584d
commit e7e52f7cff
Notes: blender-bot 2023-02-14 09:02:40 +01:00
Referenced by issue #65185, Cycles rendered viewport overlays depth buffer not updating
7 changed files with 33 additions and 49 deletions

View 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,
};

View 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);

View 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;
}
}
}
}

View 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)

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

View 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. */

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