[Bf-blender-cvs] [9a197a1185d] temp_bmesh_multires: Sculpt dyntopo: Temp fix for nasty GCC compiler bug on linux.

Joseph Eagar noreply at git.blender.org
Sun Aug 22 21:53:08 CEST 2021


Commit: 9a197a1185d1bb0943afe3335365da6fca30ecc5
Author: Joseph Eagar
Date:   Sun Aug 22 12:51:53 2021 -0700
Branches: temp_bmesh_multires
https://developer.blender.org/rB9a197a1185d1bb0943afe3335365da6fca30ecc5

Sculpt dyntopo: Temp fix for nasty GCC compiler bug on linux.

I'll file a bug report with GCC tomorrow.

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

M	source/blender/blenkernel/intern/pbvh_bmesh.c
M	source/blender/bmesh/intern/bmesh_mesh_convert.c
M	source/blender/editors/sculpt_paint/sculpt_dyntopo.c

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

diff --git a/source/blender/blenkernel/intern/pbvh_bmesh.c b/source/blender/blenkernel/intern/pbvh_bmesh.c
index f3874c8af4f..cc660a2e610 100644
--- a/source/blender/blenkernel/intern/pbvh_bmesh.c
+++ b/source/blender/blenkernel/intern/pbvh_bmesh.c
@@ -3700,7 +3700,7 @@ static void free_meshtest(MeshTest *m)
 
 #define SMOOTH_TEST_STEPS 20
 
-void pbvh_bmesh_smooth_test(BMesh *bm, PBVH *pbvh)
+double pbvh_bmesh_smooth_test(BMesh *bm, PBVH *pbvh)
 {
   double average = 0.0f;
   double average_tot = 0.0f;
@@ -3762,9 +3762,10 @@ void pbvh_bmesh_smooth_test(BMesh *bm, PBVH *pbvh)
   }
 
   printf("time: %.5f\n", average / average_tot);
+  return average / average_tot;
 }
 
-void pbvh_meshtest2_smooth_test(MeshTest2 *m2, PBVH *pbvh)
+double pbvh_meshtest2_smooth_test(MeshTest2 *m2, PBVH *pbvh)
 {
   double average = 0.0f;
   double average_tot = 0.0f;
@@ -3829,9 +3830,10 @@ void pbvh_meshtest2_smooth_test(MeshTest2 *m2, PBVH *pbvh)
   }
 
   printf("time: %.5f\n", average / average_tot);
+  return average / average_tot;
 }
 
-void pbvh_meshtest_smooth_test(MeshTest *m, PBVH *pbvh)
+double pbvh_meshtest_smooth_test(MeshTest *m, PBVH *pbvh)
 {
   double average = 0.0f;
   double average_tot = 0.0f;
@@ -3902,6 +3904,7 @@ void pbvh_meshtest_smooth_test(MeshTest *m, PBVH *pbvh)
   }
 
   printf("time: %.5f\n", average / average_tot);
+  return average / average_tot;
 }
 
 void pbvh_bmesh_cache_test(CacheParams *params, BMesh **r_bm, PBVH **r_pbvh_out)
@@ -3909,6 +3912,10 @@ void pbvh_bmesh_cache_test(CacheParams *params, BMesh **r_bm, PBVH **r_pbvh_out)
   // build mesh
   const int steps = 325;
 
+  printf("== Starting Test ==\n");
+
+  printf("building test mesh. . .");
+
   BMAllocTemplate templ = {0, 0, 0, 0};
 
   BMesh *bm = BM_mesh_create(&templ,
@@ -4052,8 +4059,38 @@ void pbvh_bmesh_cache_test(CacheParams *params, BMesh **r_bm, PBVH **r_pbvh_out)
   BM_mesh_elem_table_ensure(bm, BM_VERT | BM_FACE);
   BM_mesh_elem_index_ensure(bm, BM_VERT | BM_EDGE | BM_FACE);
 
+  int loop_size = sizeof(BMLoop) - sizeof(void *) * 4;
+
+  size_t s1 = 0, s2 = 0, s3 = 0;
+  s1 = sizeof(BMVert) * (size_t)bm->totvert + sizeof(BMEdge) * (size_t)bm->totedge +
+       sizeof(BMLoop) * (size_t)bm->totloop + sizeof(BMFace) * (size_t)bm->totface;
+  s2 = sizeof(MeshVert2) * (size_t)bm->totvert + sizeof(MeshEdge2) * (size_t)bm->totedge +
+       sizeof(MeshLoop2) * (size_t)bm->totloop + sizeof(MeshFace2) * (size_t)bm->totface;
+  s3 = (size_t)loop_size * (size_t)bm->totvert + sizeof(BMEdge) * (size_t)bm->totedge +
+       sizeof(BMLoop) * (size_t)bm->totloop + sizeof(BMFace) * (size_t)bm->totface;
+
+  double times[4];
+  char *names[4];
+
+  int cd_overhead = 0;
+  CustomData *cdatas[4] = {&bm->vdata, &bm->edata, &bm->ldata, &bm->pdata};
+  int ctots[4] = {bm->totvert, bm->totedge, bm->totloop, bm->totface};
+  for (int i = 0; i < 4; i++) {
+    cd_overhead += cdatas[i]->totsize * ctots[i];
+  }
+
+  s1 += cd_overhead;
+  s2 += cd_overhead;
+
+  printf("    bmesh mem size: %.2fmb %.2mb\n",
+         (float)s1 / 1024.0f / 1024.0f,
+         (float)s3 / 1024.0f / 1024.0f);
+  printf("meshtest2 mem size: %.2fmb\n", (float)s2 / 1024.0f / 1024.0f);
+
   printf("= BMesh random order\n");
-  pbvh_bmesh_smooth_test(bm, pbvh);
+  times[0] = pbvh_bmesh_smooth_test(bm, pbvh);
+  names[0] = "random order";
+
   BMesh *bm2 = BKE_pbvh_reorder_bmesh(pbvh);
 
   printf("= BMesh vertex cluster order\n");
@@ -4063,19 +4100,22 @@ void pbvh_bmesh_cache_test(CacheParams *params, BMesh **r_bm, PBVH **r_pbvh_out)
   BM_mesh_elem_table_ensure(bm2, BM_VERT | BM_FACE);
   BM_mesh_elem_index_ensure(bm2, BM_VERT | BM_EDGE | BM_FACE);
 
-  pbvh_bmesh_smooth_test(bm2, pbvh);
+  times[1] = pbvh_bmesh_smooth_test(bm2, pbvh);
+  names[1] = "vertex cluser";
 
   printf("= Pure data-oriented (struct of arrays)\n");
   MeshTest *m = meshtest_from_bm(bm2);
 
-  pbvh_meshtest_smooth_test(m, pbvh);
+  times[2] = pbvh_meshtest_smooth_test(m, pbvh);
+  names[2] = "data-oriented";
 
   free_meshtest(m);
 
   printf("= Object-oriented but with integer indices instead of pointers\n");
   MeshTest2 *m2 = meshtest2_from_bm(bm2);
 
-  pbvh_meshtest2_smooth_test(m2, pbvh);
+  times[3] = pbvh_meshtest2_smooth_test(m2, pbvh);
+  names[3] = "integer indices";
 
   free_meshtest2(m2);
 
@@ -4096,6 +4136,14 @@ void pbvh_bmesh_cache_test(CacheParams *params, BMesh **r_bm, PBVH **r_pbvh_out)
   else {
     BKE_pbvh_free(pbvh);
   }
+
+  printf("\n== Times ==\n");
+
+  for (int i = 0; i < ARRAY_SIZE(times); i++) {
+    printf("  %s : %.2f\n", names[i], times[i]);
+  }
+
+  printf("== Test Finished ==\n");
 }
 
 void pbvh_bmesh_do_cache_test()
diff --git a/source/blender/bmesh/intern/bmesh_mesh_convert.c b/source/blender/bmesh/intern/bmesh_mesh_convert.c
index e8072cc4e69..0417db3f8d5 100644
--- a/source/blender/bmesh/intern/bmesh_mesh_convert.c
+++ b/source/blender/bmesh/intern/bmesh_mesh_convert.c
@@ -228,10 +228,26 @@ void BM_enter_multires_space(Object *ob, BMesh *bm, int space)
  *
  * \warning This function doesn't calculate face normals.
  */
+
+/* joeedh:
+GCC under linux is doing something very weird.  In the line below:
+
+  MultiresModifierData *mmd = ob ? get_multires_modifier(NULL, ob, true) : NULL;
+
+ob is evaulating to true when optimizations are on.  The following code:
+
+  printf("ob: %p, %s\n", ob, ob ? "true" : "false");
+
+will print (nil), true.  Very strange!
+*/
+
+#ifdef __GNUC__
+__attribute__((optimize("O0")))
+#endif
 void BM_mesh_bm_from_me(Object *ob,
-                        BMesh *bm,
-                        const Mesh *me,
-                        const struct BMeshFromMeshParams *params)
+                                    BMesh *bm,
+                                    const Mesh *me,
+                                    const struct BMeshFromMeshParams *params)
 {
   const bool is_new = !(bm->totvert || (bm->vdata.totlayer || bm->edata.totlayer ||
                                         bm->pdata.totlayer || bm->ldata.totlayer));
diff --git a/source/blender/editors/sculpt_paint/sculpt_dyntopo.c b/source/blender/editors/sculpt_paint/sculpt_dyntopo.c
index b913121ae09..5871e0a800d 100644
--- a/source/blender/editors/sculpt_paint/sculpt_dyntopo.c
+++ b/source/blender/editors/sculpt_paint/sculpt_dyntopo.c
@@ -731,7 +731,6 @@ void SCULPT_dynamic_topology_enable_ex(Main *bmain, Depsgraph *depsgraph, Scene
   /* Dynamic topology doesn't ensure selection state is valid, so remove T36280. */
   BKE_mesh_mselect_clear(me);
 
-  /* Create triangles-only BMesh. */
 #if 1
   ss->bm = BM_mesh_create(&allocsize,
                           &((struct BMeshCreateParams){.use_toolflags = false,
@@ -1009,17 +1008,14 @@ static int sculpt_dynamic_topology_toggle_exec(bContext *C, wmOperator *UNUSED(o
   return OPERATOR_FINISHED;
 }
 
-
 static int dyntopo_error_popup(bContext *C, wmOperatorType *ot, enum eDynTopoWarnFlag flag)
 {
   uiPopupMenu *pup = UI_popup_menu_begin(C, IFACE_("Error!"), ICON_ERROR);
   uiLayout *layout = UI_popup_menu_layout(pup);
 
-  
   if (flag & DYNTOPO_ERROR_MULTIRES) {
     const char *msg_error = TIP_("Multires modifier detected; cannot enable dyntopo.");
-    const char *msg = TIP_(
-        "Dyntopo and multires cannot be mixed.");
+    const char *msg = TIP_("Dyntopo and multires cannot be mixed.");
 
     uiItemL(layout, msg_error, ICON_INFO);
     uiItemL(layout, msg, ICON_NONE);
@@ -1125,7 +1121,8 @@ static int sculpt_dynamic_topology_toggle_invoke(bContext *C,
 
     if (flag & DYNTOPO_ERROR_MULTIRES) {
       return dyntopo_error_popup(C, op->type, flag);
-    } else if (flag) {
+    }
+    else if (flag) {
       /* The mesh has customdata that will be lost, let the user confirm this is OK. */
       return dyntopo_warning_popup(C, op->type, flag);
     }



More information about the Bf-blender-cvs mailing list