[Bf-blender-cvs] [bfa3dc91b75] master: Depsgraph: Implement 'ID_RECALC_GEOMETRY_DEFORM'

Germano Cavalcante noreply at git.blender.org
Mon Jul 12 23:06:15 CEST 2021


Commit: bfa3dc91b75407b063f2ac991b176d98c050f92d
Author: Germano Cavalcante
Date:   Tue Jun 29 09:34:50 2021 -0300
Branches: master
https://developer.blender.org/rBbfa3dc91b75407b063f2ac991b176d98c050f92d

Depsgraph: Implement 'ID_RECALC_GEOMETRY_DEFORM'

During a mesh transformation in edit mode (Move, Rotate...), only part of
the batch cache needs to be updated.

This commit allows only update only the drawn batches seen in
`BKE_object_data_eval_batch_cache_deform_tag` if the new
`ID_RECALC_GEOMETRY_DEFORM` flag is used.

This new flag is used in the transforms operation for edit-mesh and
results in 1.6x overall speedup in heavy subdiv cube.

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

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

M	source/blender/blenkernel/BKE_mesh_types.h
M	source/blender/blenkernel/BKE_object.h
M	source/blender/blenkernel/intern/object_update.c
M	source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
M	source/blender/depsgraph/intern/builder/deg_builder_relations.cc
M	source/blender/depsgraph/intern/depsgraph_tag.cc
M	source/blender/depsgraph/intern/eval/deg_eval_flush.cc
M	source/blender/depsgraph/intern/node/deg_node_operation.cc
M	source/blender/depsgraph/intern/node/deg_node_operation.h
M	source/blender/draw/intern/draw_cache_impl_mesh.c
M	source/blender/editors/transform/transform_convert_mesh.c
M	source/blender/makesdna/DNA_ID.h

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

diff --git a/source/blender/blenkernel/BKE_mesh_types.h b/source/blender/blenkernel/BKE_mesh_types.h
index aed8c44a031..b223d3872ff 100644
--- a/source/blender/blenkernel/BKE_mesh_types.h
+++ b/source/blender/blenkernel/BKE_mesh_types.h
@@ -27,6 +27,7 @@ typedef enum eMeshBatchDirtyMode {
   BKE_MESH_BATCH_DIRTY_SELECT,
   BKE_MESH_BATCH_DIRTY_SELECT_PAINT,
   BKE_MESH_BATCH_DIRTY_SHADING,
+  BKE_MESH_BATCH_DIRTY_DEFORM,
   BKE_MESH_BATCH_DIRTY_UVEDIT_ALL,
   BKE_MESH_BATCH_DIRTY_UVEDIT_SELECT,
 } eMeshBatchDirtyMode;
diff --git a/source/blender/blenkernel/BKE_object.h b/source/blender/blenkernel/BKE_object.h
index 4724e6dfab6..a16822fd7dd 100644
--- a/source/blender/blenkernel/BKE_object.h
+++ b/source/blender/blenkernel/BKE_object.h
@@ -374,6 +374,10 @@ void BKE_object_runtime_free_data(struct Object *object);
 
 void BKE_object_batch_cache_dirty_tag(struct Object *ob);
 void BKE_object_data_batch_cache_dirty_tag(struct ID *object_data);
+void BKE_object_data_eval_batch_cache_dirty_tag(struct Depsgraph *depsgraph,
+                                                struct ID *object_data);
+void BKE_object_data_eval_batch_cache_deform_tag(struct Depsgraph *depsgraph,
+                                                 struct ID *object_data);
 
 /* this function returns a superset of the scenes selection based on relationships */
 
diff --git a/source/blender/blenkernel/intern/object_update.c b/source/blender/blenkernel/intern/object_update.c
index 7e15ac5de5d..7cdea14e9bd 100644
--- a/source/blender/blenkernel/intern/object_update.c
+++ b/source/blender/blenkernel/intern/object_update.c
@@ -388,12 +388,31 @@ void BKE_object_batch_cache_dirty_tag(Object *ob)
   BKE_object_data_batch_cache_dirty_tag(ob->data);
 }
 
+void BKE_object_data_eval_batch_cache_dirty_tag(Depsgraph *depsgraph, ID *object_data)
+{
+  DEG_debug_print_eval(depsgraph, __func__, object_data->name, object_data);
+  BKE_object_data_batch_cache_dirty_tag(object_data);
+}
+
+void BKE_object_data_eval_batch_cache_deform_tag(Depsgraph *depsgraph, ID *object_data)
+{
+  DEG_debug_print_eval(depsgraph, __func__, object_data->name, object_data);
+  switch (GS(object_data->name)) {
+    case ID_ME:
+      BKE_mesh_batch_cache_dirty_tag((Mesh *)object_data, BKE_MESH_BATCH_DIRTY_DEFORM);
+      break;
+    default:
+      /* Only mesh is currently supported. Fallback to dirty all for other datablocks types. */
+      BKE_object_data_batch_cache_dirty_tag(object_data);
+      break;
+  }
+}
+
 void BKE_object_eval_uber_data(Depsgraph *depsgraph, Scene *scene, Object *ob)
 {
   DEG_debug_print_eval(depsgraph, __func__, ob->id.name, ob);
   BLI_assert(ob->type != OB_ARMATURE);
   BKE_object_handle_data_update(depsgraph, scene, ob);
-  BKE_object_batch_cache_dirty_tag(ob);
 }
 
 void BKE_object_eval_ptcache_reset(Depsgraph *depsgraph, Scene *scene, Object *object)
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
index 56168739fae..c8179fb1eff 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
@@ -1495,7 +1495,7 @@ void DepsgraphNodeBuilder::build_object_data_geometry(Object *object, bool is_ob
   add_operation_node(
       &object->id,
       NodeType::BATCH_CACHE,
-      OperationCode::GEOMETRY_SELECT_UPDATE,
+      OperationCode::BATCH_UPDATE_SELECT,
       [object_cow](::Depsgraph *depsgraph) { BKE_object_select_update(depsgraph, object_cow); });
 }
 
@@ -1516,33 +1516,37 @@ void DepsgraphNodeBuilder::build_object_data_geometry_datablock(ID *obdata, bool
   if (key) {
     build_shapekeys(key);
   }
-  /* Nodes for result of obdata's evaluation, and geometry
-   * evaluation on object. */
+
+  /* Geometry evaluation. */
+  /* Entry operation, takes care of initialization, and some other
+   * relations which needs to be run prior to actual geometry evaluation. */
+  op_node = add_operation_node(obdata, NodeType::GEOMETRY, OperationCode::GEOMETRY_EVAL_INIT);
+  op_node->set_as_entry();
+
+  add_operation_node(obdata, NodeType::GEOMETRY, OperationCode::GEOMETRY_EVAL_DEFORM);
+
   const ID_Type id_type = GS(obdata->name);
   switch (id_type) {
     case ID_ME: {
-      op_node = add_operation_node(obdata,
-                                   NodeType::GEOMETRY,
-                                   OperationCode::GEOMETRY_EVAL,
-                                   [obdata_cow](::Depsgraph *depsgraph) {
-                                     BKE_mesh_eval_geometry(depsgraph, (Mesh *)obdata_cow);
-                                   });
-      op_node->set_as_entry();
+      add_operation_node(obdata,
+                         NodeType::GEOMETRY,
+                         OperationCode::GEOMETRY_EVAL,
+                         [obdata_cow](::Depsgraph *depsgraph) {
+                           BKE_mesh_eval_geometry(depsgraph, (Mesh *)obdata_cow);
+                         });
       break;
     }
     case ID_MB: {
-      op_node = add_operation_node(obdata, NodeType::GEOMETRY, OperationCode::GEOMETRY_EVAL);
-      op_node->set_as_entry();
+      add_operation_node(obdata, NodeType::GEOMETRY, OperationCode::GEOMETRY_EVAL);
       break;
     }
     case ID_CU: {
-      op_node = add_operation_node(obdata,
-                                   NodeType::GEOMETRY,
-                                   OperationCode::GEOMETRY_EVAL,
-                                   [obdata_cow](::Depsgraph *depsgraph) {
-                                     BKE_curve_eval_geometry(depsgraph, (Curve *)obdata_cow);
-                                   });
-      op_node->set_as_entry();
+      add_operation_node(obdata,
+                         NodeType::GEOMETRY,
+                         OperationCode::GEOMETRY_EVAL,
+                         [obdata_cow](::Depsgraph *depsgraph) {
+                           BKE_curve_eval_geometry(depsgraph, (Curve *)obdata_cow);
+                         });
       /* Make sure objects used for bevel.taper are in the graph.
        * NOTE: This objects might be not linked to the scene. */
       Curve *cu = (Curve *)obdata;
@@ -1558,47 +1562,41 @@ void DepsgraphNodeBuilder::build_object_data_geometry_datablock(ID *obdata, bool
       break;
     }
     case ID_LT: {
-      op_node = add_operation_node(obdata,
-                                   NodeType::GEOMETRY,
-                                   OperationCode::GEOMETRY_EVAL,
-                                   [obdata_cow](::Depsgraph *depsgraph) {
-                                     BKE_lattice_eval_geometry(depsgraph, (Lattice *)obdata_cow);
-                                   });
-      op_node->set_as_entry();
+      add_operation_node(obdata,
+                         NodeType::GEOMETRY,
+                         OperationCode::GEOMETRY_EVAL,
+                         [obdata_cow](::Depsgraph *depsgraph) {
+                           BKE_lattice_eval_geometry(depsgraph, (Lattice *)obdata_cow);
+                         });
       break;
     }
 
     case ID_GD: {
       /* GPencil evaluation operations. */
-      op_node = add_operation_node(obdata,
-                                   NodeType::GEOMETRY,
-                                   OperationCode::GEOMETRY_EVAL,
-                                   [obdata_cow](::Depsgraph *depsgraph) {
-                                     BKE_gpencil_frame_active_set(depsgraph,
-                                                                  (bGPdata *)obdata_cow);
-                                   });
-      op_node->set_as_entry();
+      add_operation_node(obdata,
+                         NodeType::GEOMETRY,
+                         OperationCode::GEOMETRY_EVAL,
+                         [obdata_cow](::Depsgraph *depsgraph) {
+                           BKE_gpencil_frame_active_set(depsgraph, (bGPdata *)obdata_cow);
+                         });
       break;
     }
     case ID_HA: {
-      op_node = add_operation_node(obdata, NodeType::GEOMETRY, OperationCode::GEOMETRY_EVAL);
-      op_node->set_as_entry();
+      add_operation_node(obdata, NodeType::GEOMETRY, OperationCode::GEOMETRY_EVAL);
       break;
     }
     case ID_PT: {
-      op_node = add_operation_node(obdata, NodeType::GEOMETRY, OperationCode::GEOMETRY_EVAL);
-      op_node->set_as_entry();
+      add_operation_node(obdata, NodeType::GEOMETRY, OperationCode::GEOMETRY_EVAL);
       break;
     }
     case ID_VO: {
       /* Volume frame update. */
-      op_node = add_operation_node(obdata,
-                                   NodeType::GEOMETRY,
-                                   OperationCode::GEOMETRY_EVAL,
-                                   [obdata_cow](::Depsgraph *depsgraph) {
-                                     BKE_volume_eval_geometry(depsgraph, (Volume *)obdata_cow);
-                                   });
-      op_node->set_as_entry();
+      add_operation_node(obdata,
+                         NodeType::GEOMETRY,
+                         OperationCode::GEOMETRY_EVAL,
+                         [obdata_cow](::Depsgraph *depsgraph) {
+                           BKE_volume_eval_geometry(depsgraph, (Volume *)obdata_cow);
+                         });
       break;
     }
     default:
@@ -1612,10 +1610,22 @@ void DepsgraphNodeBuilder::build_object_data_geometry_datablock(ID *obdata, bool
   /* Batch cache. */
   add_operation_node(obdata,
                      NodeType::BATCH_CACHE,
-                     OperationCode::GEOMETRY_SELECT_UPDATE,
+                     OperationCode::BATCH_UPDATE_SELECT,
                      [obdata_cow](::Depsgraph *depsgraph) {
                        BKE_object_data_select_update(depsgraph, obdata_cow);
                      });
+  add_operation_node(obdata,
+                     NodeType::BATCH_CACHE,
+                     OperationCode::BATCH_UPDATE_DEFORM,
+                     [obdata_cow](::Depsgraph *depsgraph) {
+                       BKE_object_data_eval_batch_cache_deform_tag(depsgraph, obdata_cow);
+                     });
+  add_operation_node(obdata,
+                     NodeType::BATCH_CACHE,
+                     OperationCode::BATCH_UPDATE_ALL,
+                     [obdata_co

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list