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:
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
|
@ -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,
|
||||
};
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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. */
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue