[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