[Bf-blender-cvs] [b891c72d2da] blender-v3.2-release: Fix T97575: Toggling fullscreen causes compositor recalc

Campbell Barton noreply at git.blender.org
Thu May 5 15:39:50 CEST 2022


Commit: b891c72d2da6c0e04569baac32da23c8b736aacf
Author: Campbell Barton
Date:   Thu May 5 17:33:10 2022 +1000
Branches: blender-v3.2-release
https://developer.blender.org/rBb891c72d2da6c0e04569baac32da23c8b736aacf

Fix T97575: Toggling fullscreen causes compositor recalc

The root of the issue is that compositor is using refresh mechanism
to handle recalc.

The safest fix which does not require deep refactor is to check to
whether node space was tagged for refresh from listener (currently
it is listeners which are responsible for tackling compositor tree
recalc).

Differential Revision: https://developer.blender.org/D14856

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

M	source/blender/editors/space_node/node_intern.hh
M	source/blender/editors/space_node/space_node.cc

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

diff --git a/source/blender/editors/space_node/node_intern.hh b/source/blender/editors/space_node/node_intern.hh
index 10d4ad36d95..4157176cd68 100644
--- a/source/blender/editors/space_node/node_intern.hh
+++ b/source/blender/editors/space_node/node_intern.hh
@@ -74,8 +74,14 @@ struct SpaceNode_Runtime {
   /** Mouse position for drawing socket-less links and adding nodes. */
   float2 cursor;
 
-  /** For auto compositing. */
-  bool recalc;
+  /* Indicates that the compositing tree in the space needs to be re-evaluated using the
+   * auto-compositing pipeline.
+   * Takes priority over the regular compsiting. */
+  bool recalc_auto_compositing;
+
+  /* Indicates that the compositing int the space  tree needs to be re-evaluated using
+   * regular compositing pipeline. */
+  bool recalc_regular_compositing;
 
   /** Temporary data for modal linking operator. */
   std::unique_ptr<bNodeLinkDrag> linkdrag;
diff --git a/source/blender/editors/space_node/space_node.cc b/source/blender/editors/space_node/space_node.cc
index 34f357ae5c3..296cd1ff133 100644
--- a/source/blender/editors/space_node/space_node.cc
+++ b/source/blender/editors/space_node/space_node.cc
@@ -324,6 +324,39 @@ static bool any_node_uses_id(const bNodeTree *ntree, const ID *id)
   return false;
 }
 
+/**
+ * Tag the space to recalculate the compositing tree using auto-compositing pipeline.
+ *
+ * Will check the space to be using a compsiting tree, and check whether auto-compositing
+ * is enabled. If the checks do not pass then the function has no affect. */
+static void node_area_tag_recalc_auto_compositing(SpaceNode *snode, ScrArea *area)
+{
+  if (!ED_node_is_compositor(snode)) {
+    return;
+  }
+
+  if (snode->flag & SNODE_AUTO_RENDER) {
+    snode->runtime->recalc_auto_compositing = true;
+    ED_area_tag_refresh(area);
+  }
+}
+
+/**
+ * Tag the space to recalculate the current tree.
+ *
+ * For all node trees this will do `snode_set_context()` which takes care of setting an active
+ * tree. This will be done in the area refresh callback.
+ *
+ * For compositor tree this will additionally start of the compositor job. */
+static void node_area_tag_tree_recalc(SpaceNode *snode, ScrArea *area)
+{
+  if (ED_node_is_compositor(snode)) {
+    snode->runtime->recalc_regular_compositing = true;
+  }
+
+  ED_area_tag_refresh(area);
+}
+
 static void node_area_listener(const wmSpaceTypeListenerParams *params)
 {
   ScrArea *area = params->area;
@@ -346,25 +379,20 @@ static void node_area_listener(const wmSpaceTypeListenerParams *params)
             UI_view2d_center_set(&region->v2d, path->view_center[0], path->view_center[1]);
           }
 
-          ED_area_tag_refresh(area);
+          node_area_tag_tree_recalc(snode, area);
           break;
         }
         case ND_FRAME:
-          ED_area_tag_refresh(area);
+          node_area_tag_tree_recalc(snode, area);
           break;
         case ND_COMPO_RESULT:
           ED_area_tag_redraw(area);
           break;
         case ND_TRANSFORM_DONE:
-          if (ED_node_is_compositor(snode)) {
-            if (snode->flag & SNODE_AUTO_RENDER) {
-              snode->runtime->recalc = true;
-              ED_area_tag_refresh(area);
-            }
-          }
+          node_area_tag_recalc_auto_compositing(snode, area);
           break;
         case ND_LAYER_CONTENT:
-          ED_area_tag_refresh(area);
+          node_area_tag_tree_recalc(snode, area);
           break;
       }
       break;
@@ -373,46 +401,46 @@ static void node_area_listener(const wmSpaceTypeListenerParams *params)
     case NC_MATERIAL:
       if (ED_node_is_shader(snode)) {
         if (wmn->data == ND_SHADING) {
-          ED_area_tag_refresh(area);
+          node_area_tag_tree_recalc(snode, area);
         }
         else if (wmn->data == ND_SHADING_DRAW) {
-          ED_area_tag_refresh(area);
+          node_area_tag_tree_recalc(snode, area);
         }
         else if (wmn->data == ND_SHADING_LINKS) {
-          ED_area_tag_refresh(area);
+          node_area_tag_tree_recalc(snode, area);
         }
       }
       break;
     case NC_TEXTURE:
       if (ED_node_is_shader(snode) || ED_node_is_texture(snode)) {
         if (wmn->data == ND_NODES) {
-          ED_area_tag_refresh(area);
+          node_area_tag_tree_recalc(snode, area);
         }
       }
       break;
     case NC_WORLD:
       if (ED_node_is_shader(snode) && shader_type == SNODE_SHADER_WORLD) {
-        ED_area_tag_refresh(area);
+        node_area_tag_tree_recalc(snode, area);
       }
       break;
     case NC_OBJECT:
       if (ED_node_is_shader(snode)) {
         if (wmn->data == ND_OB_SHADING) {
-          ED_area_tag_refresh(area);
+          node_area_tag_tree_recalc(snode, area);
         }
       }
       else if (ED_node_is_geometry(snode)) {
         /* Rather strict check: only redraw when the reference matches the current editor's ID. */
         if (wmn->data == ND_MODIFIER) {
           if (wmn->reference == snode->id || snode->id == nullptr) {
-            ED_area_tag_refresh(area);
+            node_area_tag_tree_recalc(snode, area);
           }
         }
       }
       break;
     case NC_SPACE:
       if (wmn->data == ND_SPACE_NODE) {
-        ED_area_tag_refresh(area);
+        node_area_tag_tree_recalc(snode, area);
       }
       else if (wmn->data == ND_SPACE_NODE_VIEW) {
         ED_area_tag_redraw(area);
@@ -420,7 +448,7 @@ static void node_area_listener(const wmSpaceTypeListenerParams *params)
       break;
     case NC_NODE:
       if (wmn->action == NA_EDITED) {
-        ED_area_tag_refresh(area);
+        node_area_tag_tree_recalc(snode, area);
       }
       else if (wmn->action == NA_SELECTED) {
         ED_area_tag_redraw(area);
@@ -429,14 +457,14 @@ static void node_area_listener(const wmSpaceTypeListenerParams *params)
     case NC_SCREEN:
       switch (wmn->data) {
         case ND_ANIMPLAY:
-          ED_area_tag_refresh(area);
+          node_area_tag_tree_recalc(snode, area);
           break;
       }
       break;
     case NC_MASK:
       if (wmn->action == NA_EDITED) {
         if (snode->nodetree && snode->nodetree->type == NTREE_COMPOSIT) {
-          ED_area_tag_refresh(area);
+          node_area_tag_tree_recalc(snode, area);
         }
       }
       break;
@@ -447,7 +475,7 @@ static void node_area_listener(const wmSpaceTypeListenerParams *params)
           /* Without this check drawing on an image could become very slow when the compositor is
            * open. */
           if (any_node_uses_id(snode->nodetree, (ID *)wmn->reference)) {
-            ED_area_tag_refresh(area);
+            node_area_tag_tree_recalc(snode, area);
           }
         }
       }
@@ -457,7 +485,7 @@ static void node_area_listener(const wmSpaceTypeListenerParams *params)
       if (wmn->action == NA_EDITED) {
         if (ED_node_is_compositor(snode)) {
           if (any_node_uses_id(snode->nodetree, (ID *)wmn->reference)) {
-            ED_area_tag_refresh(area);
+            node_area_tag_tree_recalc(snode, area);
           }
         }
       }
@@ -465,12 +493,12 @@ static void node_area_listener(const wmSpaceTypeListenerParams *params)
 
     case NC_LINESTYLE:
       if (ED_node_is_shader(snode) && shader_type == SNODE_SHADER_LINESTYLE) {
-        ED_area_tag_refresh(area);
+        node_area_tag_tree_recalc(snode, area);
       }
       break;
     case NC_WM:
       if (wmn->data == ND_UNDO) {
-        ED_area_tag_refresh(area);
+        node_area_tag_tree_recalc(snode, area);
       }
       break;
     case NC_GPENCIL:
@@ -493,11 +521,13 @@ static void node_area_refresh(const struct bContext *C, ScrArea *area)
       Scene *scene = (Scene *)snode->id;
       if (scene->use_nodes) {
         /* recalc is set on 3d view changes for auto compo */
-        if (snode->runtime->recalc) {
-          snode->runtime->recalc = false;
+        if (snode->runtime->recalc_auto_compositing) {
+          snode->runtime->recalc_auto_compositing = false;
+          snode->runtime->recalc_regular_compositing = false;
           node_render_changed_exec((struct bContext *)C, nullptr);
         }
-        else {
+        else if (snode->runtime->recalc_regular_compositing) {
+          snode->runtime->recalc_regular_compositing = false;
           ED_node_composite_job(C, snode->nodetree, scene);
         }
       }



More information about the Bf-blender-cvs mailing list