[Bf-blender-cvs] [c158dd560e5] master: WM: reduce CPU use while idle in ED_view3d_datamask

Campbell Barton noreply at git.blender.org
Fri Jan 13 07:56:29 CET 2023


Commit: c158dd560e5399d8bfa7386790e7b43c9f91db8e
Author: Campbell Barton
Date:   Fri Jan 13 17:48:54 2023 +1100
Branches: master
https://developer.blender.org/rBc158dd560e5399d8bfa7386790e7b43c9f91db8e

WM: reduce CPU use while idle in ED_view3d_datamask

When idle, each 3D view made two calls CTX_data_mode_enum(C) from the
WM_main loop. While not causing problems it complicated troubleshooting
high CPU use while idle in other areas.

Access the object via the view layer, giving approx 40x speedup.

===================================================================

M	source/blender/editors/include/ED_view3d.h
M	source/blender/editors/render/render_opengl.cc
M	source/blender/editors/space_view3d/view3d_draw.cc
M	source/blender/windowmanager/intern/wm_event_system.cc

===================================================================

diff --git a/source/blender/editors/include/ED_view3d.h b/source/blender/editors/include/ED_view3d.h
index 12313b3d244..35930d1a9b4 100644
--- a/source/blender/editors/include/ED_view3d.h
+++ b/source/blender/editors/include/ED_view3d.h
@@ -1104,15 +1104,13 @@ char ED_view3d_lock_view_from_index(int index);
 char ED_view3d_axis_view_opposite(char view);
 bool ED_view3d_lock(struct RegionView3D *rv3d);
 
-void ED_view3d_datamask(const struct bContext *C,
-                        const struct Scene *scene,
+void ED_view3d_datamask(const struct ViewLayer *view_layer,
                         const struct View3D *v3d,
                         struct CustomData_MeshMasks *r_cddata_masks);
 /**
  * Goes over all modes and view3d settings.
  */
-void ED_view3d_screen_datamask(const struct bContext *C,
-                               const struct Scene *scene,
+void ED_view3d_screen_datamask(const struct ViewLayer *view_layer,
                                const struct bScreen *screen,
                                struct CustomData_MeshMasks *r_cddata_masks);
 
diff --git a/source/blender/editors/render/render_opengl.cc b/source/blender/editors/render/render_opengl.cc
index d5e3d1171cd..d91f1a09beb 100644
--- a/source/blender/editors/render/render_opengl.cc
+++ b/source/blender/editors/render/render_opengl.cc
@@ -809,7 +809,7 @@ static bool screen_opengl_render_init(bContext *C, wmOperator *op)
            0,
            sizeof(oglrender->scene->customdata_mask_modal));
     ED_view3d_datamask(
-        C, oglrender->scene, oglrender->v3d, &oglrender->scene->customdata_mask_modal);
+        oglrender->view_layer, oglrender->v3d, &oglrender->scene->customdata_mask_modal);
 
     /* apply immediately in case we're rendering from a script,
      * running notifiers again will overwrite */
diff --git a/source/blender/editors/space_view3d/view3d_draw.cc b/source/blender/editors/space_view3d/view3d_draw.cc
index 91bfc104f5b..95407afbeda 100644
--- a/source/blender/editors/space_view3d/view3d_draw.cc
+++ b/source/blender/editors/space_view3d/view3d_draw.cc
@@ -2407,11 +2407,13 @@ void ED_view3d_depths_free(ViewDepths *depths)
 /** \name Custom-data Utilities
  * \{ */
 
-void ED_view3d_datamask(const bContext *C,
-                        const Scene * /*scene*/,
+void ED_view3d_datamask(const ViewLayer *view_layer,
                         const View3D *v3d,
                         CustomData_MeshMasks *r_cddata_masks)
 {
+  /* NOTE(@campbellbarton): as this function runs continuously while idle
+   * (from #wm_event_do_depsgraph) take care to avoid expensive lookups.
+   * While they won't hurt performance noticeably, they will increase CPU usage while idle. */
   if (ELEM(v3d->shading.type, OB_TEXTURE, OB_MATERIAL, OB_RENDER)) {
     r_cddata_masks->lmask |= CD_MASK_PROP_FLOAT2 | CD_MASK_PROP_BYTE_COLOR;
     r_cddata_masks->vmask |= CD_MASK_ORCO | CD_MASK_PROP_COLOR;
@@ -2426,26 +2428,38 @@ void ED_view3d_datamask(const bContext *C,
     }
   }
 
-  if ((CTX_data_mode_enum(C) == CTX_MODE_EDIT_MESH) &&
-      (v3d->overlay.edit_flag & V3D_OVERLAY_EDIT_WEIGHT)) {
-    r_cddata_masks->vmask |= CD_MASK_MDEFORMVERT;
-  }
-  if (CTX_data_mode_enum(C) == CTX_MODE_SCULPT) {
-    r_cddata_masks->vmask |= CD_MASK_PAINT_MASK;
+  Object *obact = BKE_view_layer_active_object_get(view_layer);
+  if (obact) {
+    switch (obact->type) {
+      case OB_MESH: {
+        switch (obact->mode) {
+          case OB_MODE_EDIT: {
+            if (v3d->overlay.edit_flag & V3D_OVERLAY_EDIT_WEIGHT) {
+              r_cddata_masks->vmask |= CD_MASK_MDEFORMVERT;
+            }
+            break;
+          }
+          case OB_MODE_SCULPT: {
+            r_cddata_masks->vmask |= CD_MASK_PAINT_MASK;
+            break;
+          }
+        }
+        break;
+      }
+    }
   }
 }
 
-void ED_view3d_screen_datamask(const bContext *C,
-                               const Scene *scene,
+void ED_view3d_screen_datamask(const ViewLayer *view_layer,
                                const bScreen *screen,
                                CustomData_MeshMasks *r_cddata_masks)
 {
   CustomData_MeshMasks_update(r_cddata_masks, &CD_MASK_BAREMESH);
 
-  /* Check if we need tfaces & mcols due to view mode. */
+  /* Check if we need UV or color data due to the view mode. */
   LISTBASE_FOREACH (const ScrArea *, area, &screen->areabase) {
     if (area->spacetype == SPACE_VIEW3D) {
-      ED_view3d_datamask(C, scene, static_cast<View3D *>(area->spacedata.first), r_cddata_masks);
+      ED_view3d_datamask(view_layer, static_cast<View3D *>(area->spacedata.first), r_cddata_masks);
     }
   }
 }
diff --git a/source/blender/windowmanager/intern/wm_event_system.cc b/source/blender/windowmanager/intern/wm_event_system.cc
index 14812c4335d..df1bdfdc4aa 100644
--- a/source/blender/windowmanager/intern/wm_event_system.cc
+++ b/source/blender/windowmanager/intern/wm_event_system.cc
@@ -423,10 +423,10 @@ void wm_event_do_depsgraph(bContext *C, bool is_after_open_file)
   /* Combine data-masks so one window doesn't disable UVs in another T26448. */
   CustomData_MeshMasks win_combine_v3d_datamask = {0};
   LISTBASE_FOREACH (wmWindow *, win, &wm->windows) {
-    const Scene *scene = WM_window_get_active_scene(win);
+    const ViewLayer *view_layer = WM_window_get_active_view_layer(win);
     const bScreen *screen = WM_window_get_active_screen(win);
 
-    ED_view3d_screen_datamask(C, scene, screen, &win_combine_v3d_datamask);
+    ED_view3d_screen_datamask(view_layer, screen, &win_combine_v3d_datamask);
   }
   /* Update all the dependency graphs of visible view layers. */
   LISTBASE_FOREACH (wmWindow *, win, &wm->windows) {



More information about the Bf-blender-cvs mailing list