Fix T52520: Metaballs in edit mode causes infinite Cycles viewport reset
authorSergey Sharybin <sergey.vfx@gmail.com>
Tue, 30 Jan 2018 13:14:26 +0000 (14:14 +0100)
committerSergey Sharybin <sergey.vfx@gmail.com>
Tue, 30 Jan 2018 13:20:23 +0000 (14:20 +0100)
The issue was introduced by eb016eb as a fix for T41258, which added depsgraph
tagging with zero flag. The comment was saying that it's to make derived caches
to be updated, however bot sure how that could possibly work: tagging ID for
update with 0 flag only sets updated tags in bmain in old dependency graph.

In the new depsgraph, where object data is a part of depsgraph, doing such a
tag forces object to be updated, which re-triggers viewport rendering, which
is causing such an infinite viewport render rest.

Can not reproduce any crashes here, so maybe it's fine to move on with this
change.

source/blender/editors/include/ED_view3d.h
source/blender/editors/object/object_edit.c
source/blender/editors/space_view3d/space_view3d.c
source/blender/editors/space_view3d/view3d_edit.c
source/blender/editors/space_view3d/view3d_view.c
source/blender/makesrna/intern/rna_space.c

index 6e01245e6dcb7fa9123ba571d2fce1ce6c3c3ff4..86de619323cdf697a6466d8e63a75f5ff1be9d0f 100644 (file)
@@ -452,7 +452,7 @@ void ED_view3d_operator_properties_viewmat_get(struct wmOperator *op, int *winx,
 
 /* render */
 void ED_view3d_stop_render_preview(struct wmWindowManager *wm, struct ARegion *ar);
-void ED_view3d_shade_update(struct Main *bmain, struct Scene *scene, struct View3D *v3d, struct ScrArea *sa);
+void ED_view3d_shade_update(struct Main *bmain, struct View3D *v3d, struct ScrArea *sa);
 
 #define V3D_IS_ZBUF(v3d) \
        (((v3d)->flag & V3D_ZBUF_SELECT) && ((v3d)->drawtype > OB_WIRE))
index d7c7976c344a09ced572c48f1d9944eddc3ebd2e..f8210f8a59563bfdff2c6d71308b68f6a6f0cf44 100644 (file)
@@ -398,11 +398,6 @@ static bool ED_object_editmode_load_ex(Main *bmain, Object *obedit, const bool f
                if (freedata) ED_mball_editmball_free(obedit);
        }
 
-       /* Tag update so no access to freed data referenced from
-        * derived cache will happen.
-        */
-       DAG_id_tag_update((ID *)obedit->data, 0);
-
        return true;
 }
 
index 996506a9cf7bbd57d81f8c5936b63cd5ce1a4868..a36b698a04e8d5fb2d329e28099e57ea21b32f38 100644 (file)
@@ -290,7 +290,7 @@ void ED_view3d_stop_render_preview(wmWindowManager *wm, ARegion *ar)
        }
 }
 
-void ED_view3d_shade_update(Main *bmain, Scene *scene, View3D *v3d, ScrArea *sa)
+void ED_view3d_shade_update(Main *bmain, View3D *v3d, ScrArea *sa)
 {
        wmWindowManager *wm = bmain->wm.first;
 
@@ -302,10 +302,6 @@ void ED_view3d_shade_update(Main *bmain, Scene *scene, View3D *v3d, ScrArea *sa)
                                ED_view3d_stop_render_preview(wm, ar);
                }
        }
-       else if (scene->obedit != NULL && scene->obedit->type == OB_MESH) {
-               /* Tag mesh to load edit data. */
-               DAG_id_tag_update(scene->obedit->data, 0);
-       }
 }
 
 /* ******************** default callbacks for view3d space ***************** */
index ebd0bbe01290474509771e710519d368fa140f14..2d002a38a198b1013b1b67c15d5f8d4922a4e783 100644 (file)
@@ -4729,7 +4729,7 @@ static int toggle_render_exec(bContext *C, wmOperator *UNUSED(op))
                v3d->prev_drawtype = v3d->drawtype;
                v3d->drawtype = OB_RENDER;
        }
-       ED_view3d_shade_update(CTX_data_main(C), CTX_data_scene(C), v3d, CTX_wm_area(C));
+       ED_view3d_shade_update(CTX_data_main(C), v3d, CTX_wm_area(C));
        WM_event_add_notifier(C, NC_SPACE | ND_SPACE_VIEW3D, v3d);
        return OPERATOR_FINISHED;
 }
index baeee0e89d75baa0a1346572af7415ddbb1632fa..56f0e39aca0e3a780c485011e4a29b4a44ef0f74 100644 (file)
@@ -1164,7 +1164,7 @@ static bool view3d_localview_init(
        return ok;
 }
 
-static void restore_localviewdata(wmWindowManager *wm, wmWindow *win, Main *bmain, Scene *scene, ScrArea *sa, const int smooth_viewtx)
+static void restore_localviewdata(wmWindowManager *wm, wmWindow *win, Main *bmain, ScrArea *sa, const int smooth_viewtx)
 {
        const bool free = true;
        ARegion *ar;
@@ -1214,7 +1214,7 @@ static void restore_localviewdata(wmWindowManager *wm, wmWindow *win, Main *bmai
                                }
                        }
 
-                       ED_view3d_shade_update(bmain, scene, v3d, sa);
+                       ED_view3d_shade_update(bmain, v3d, sa);
                }
        }
 }
@@ -1231,7 +1231,7 @@ static bool view3d_localview_exit(
                
                locallay = v3d->lay & 0xFF000000;
 
-               restore_localviewdata(wm, win, bmain, scene, sa, smooth_viewtx);
+               restore_localviewdata(wm, win, bmain, sa, smooth_viewtx);
 
                /* for when in other window the layers have changed */
                if (v3d->scenelock) v3d->lay = scene->lay;
index f3a7cd485d90a44cd5516db71d364e710b1b57e5..ca24cdd27ec1b8e08f84ba13d4ddf5d81253c8da 100644 (file)
@@ -535,12 +535,12 @@ static void rna_SpaceView3D_layer_update(Main *bmain, Scene *UNUSED(scene), Poin
        DAG_on_visible_update(bmain, false);
 }
 
-static void rna_SpaceView3D_viewport_shade_update(Main *bmain, Scene *scene, PointerRNA *ptr)
+static void rna_SpaceView3D_viewport_shade_update(Main *bmain, Scene *UNUSED(scene), PointerRNA *ptr)
 {
        View3D *v3d = (View3D *)(ptr->data);
        ScrArea *sa = rna_area_from_space(ptr);
 
-       ED_view3d_shade_update(bmain, scene, v3d, sa);
+       ED_view3d_shade_update(bmain, v3d, sa);
 }
 
 static void rna_SpaceView3D_matcap_update(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr)