[Bf-blender-cvs] [8982a315b76] master: Add more timing hooks for boolean.

Howard Trickey noreply at git.blender.org
Sat Dec 5 13:49:32 CET 2020


Commit: 8982a315b76e70ecf244243c3002d46ca73761f8
Author: Howard Trickey
Date:   Sat Dec 5 07:48:41 2020 -0500
Branches: master
https://developer.blender.org/rB8982a315b76e70ecf244243c3002d46ca73761f8

Add more timing hooks for boolean.

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

M	source/blender/blenlib/intern/mesh_intersect.cc
M	source/blender/bmesh/tools/bmesh_boolean.cc
M	source/blender/modifiers/intern/MOD_boolean.c

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

diff --git a/source/blender/blenlib/intern/mesh_intersect.cc b/source/blender/blenlib/intern/mesh_intersect.cc
index 64ea25ccc90..ab956c5c735 100644
--- a/source/blender/blenlib/intern/mesh_intersect.cc
+++ b/source/blender/blenlib/intern/mesh_intersect.cc
@@ -2178,8 +2178,8 @@ static void calc_overlap_itts_range_func(void *__restrict userdata,
 }
 
 /**
- * Fill in itt_map with the vector of ITT_values that result from intersecting the triangles in ov.
- * Use a canonical order for triangles: (a,b) where  a < b.
+ * Fill in itt_map with the vector of ITT_values that result from intersecting the triangles in
+ * ov. Use a canonical order for triangles: (a,b) where  a < b.
  */
 static void calc_overlap_itts(Map<std::pair<int, int>, ITT_value> &itt_map,
                               const IMesh &tm,
diff --git a/source/blender/bmesh/tools/bmesh_boolean.cc b/source/blender/bmesh/tools/bmesh_boolean.cc
index 6031e160c8c..bfb093c569f 100644
--- a/source/blender/bmesh/tools/bmesh_boolean.cc
+++ b/source/blender/bmesh/tools/bmesh_boolean.cc
@@ -30,6 +30,10 @@
 #include "bmesh_boolean.h"
 #include "bmesh_edgesplit.h"
 
+#include "PIL_time.h"
+
+// #define PERF_DEBUG
+
 namespace blender::meshintersect {
 
 #ifdef WITH_GMP
@@ -354,7 +358,14 @@ static bool bmesh_boolean(BMesh *bm,
 {
   IMeshArena arena;
   IMesh m_triangulated;
+#  ifdef PERF_DEBUG
+  double start_time = PIL_check_seconds_timer();
+#  endif
   IMesh m_in = mesh_from_bm(bm, looptris, looptris_tot, &m_triangulated, &arena);
+#  ifdef PERF_DEBUG
+  double mesh_time = PIL_check_seconds_timer();
+  std::cout << "bmesh_boolean, imesh_from_bm done, time = " << mesh_time - start_time << "\n";
+#  endif
   std::function<int(int)> shape_fn;
   if (use_self && boolean_mode == BoolOpType::None) {
     /* Unary knife operation. Want every face where test_fn doesn't return -1. */
@@ -379,7 +390,16 @@ static bool bmesh_boolean(BMesh *bm,
   }
   IMesh m_out = boolean_mesh(
       m_in, boolean_mode, nshapes, shape_fn, use_self, &m_triangulated, &arena);
+#  ifdef PERF_DEBUG
+  double boolean_time = PIL_check_seconds_timer();
+  std::cout << "boolean done, time = " << boolean_time - mesh_time << "\n";
+#  endif
   bool any_change = apply_mesh_output_to_bmesh(bm, m_out, keep_hidden);
+#  ifdef PERF_DEBUG
+  double apply_mesh_time = PIL_check_seconds_timer();
+  std::cout << "applied boolean output to bmesh, time = " << apply_mesh_time - boolean_time
+            << "\n";
+#  endif
   if (use_separate_all) {
     /* We are supposed to separate all faces that are incident on intersection edges. */
     BM_mesh_edgesplit(bm, false, true, false);
diff --git a/source/blender/modifiers/intern/MOD_boolean.c b/source/blender/modifiers/intern/MOD_boolean.c
index 4152e8633e5..0513d3af13a 100644
--- a/source/blender/modifiers/intern/MOD_boolean.c
+++ b/source/blender/modifiers/intern/MOD_boolean.c
@@ -630,7 +630,15 @@ static Mesh *modifyMesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh *
 
     Object *operand_ob = bmd->object;
 
+#ifdef DEBUG_TIME
+    TIMEIT_BLOCK_INIT(operand_get_evaluated_mesh);
+    TIMEIT_BLOCK_START(operand_get_evaluated_mesh);
+#endif
     mesh_operand_ob = BKE_modifier_get_evaluated_mesh_from_evaluated_object(operand_ob, false);
+#ifdef DEBUG_TIME
+    TIMEIT_BLOCK_END(operand_get_evaluated_mesh);
+    TIMEIT_BLOCK_STATS(operand_get_evaluated_mesh);
+#endif
 
     if (mesh_operand_ob) {
       /* XXX This is utterly non-optimal, we may go from a bmesh to a mesh back to a bmesh!
@@ -642,11 +650,35 @@ static Mesh *modifyMesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh *
       result = get_quick_mesh(object, mesh, operand_ob, mesh_operand_ob, bmd->operation);
 
       if (result == NULL) {
+#ifdef DEBUG_TIME
+        TIMEIT_BLOCK_INIT(object_BMD_mesh_bm_create);
+        TIMEIT_BLOCK_START(object_BMD_mesh_bm_create);
+#endif
         bm = BMD_mesh_bm_create(mesh, object, mesh_operand_ob, operand_ob, &is_flip);
+#ifdef DEBUG_TIME
+        TIMEIT_BLOCK_END(object_BMD_mesh_bm_create);
+        TIMEIT_BLOCK_STATS(object_BMD_mesh_bm_create);
+#endif
 
+#ifdef DEBUG_TIME
+        TIMEIT_BLOCK_INIT(BMD_mesh_intersection);
+        TIMEIT_BLOCK_START(BMD_mesh_intersection);
+#endif
         BMD_mesh_intersection(bm, md, ctx, mesh_operand_ob, object, operand_ob, is_flip);
+#ifdef DEBUG_TIME
+        TIMEIT_BLOCK_END(BMD_mesh_intersection);
+        TIMEIT_BLOCK_STATS(BMD_mesh_intersection);
+#endif
 
+#ifdef DEBUG_TIME
+        TIMEIT_BLOCK_INIT(BKE_mesh_from_bmesh_for_eval_nomain);
+        TIMEIT_BLOCK_START(BKE_mesh_from_bmesh_for_eval_nomain);
+#endif
         result = BKE_mesh_from_bmesh_for_eval_nomain(bm, NULL, mesh);
+#ifdef DEBUG_TIME
+        TIMEIT_BLOCK_END(BKE_mesh_from_bmesh_for_eval_nomain);
+        TIMEIT_BLOCK_STATS(BKE_mesh_from_bmesh_for_eval_nomain);
+#endif
         BM_mesh_free(bm);
         result->runtime.cd_dirty_vert |= CD_MASK_NORMAL;
       }



More information about the Bf-blender-cvs mailing list