[Bf-blender-cvs] [7934336d803] sculpt-dev: Sculpt-dev: fix various memory corruption errors

Joseph Eagar noreply at git.blender.org
Tue Sep 20 23:16:08 CEST 2022


Commit: 7934336d8036622ea592a421f11bbbe7a97942af
Author: Joseph Eagar
Date:   Tue Sep 20 14:15:49 2022 -0700
Branches: sculpt-dev
https://developer.blender.org/rB7934336d8036622ea592a421f11bbbe7a97942af

Sculpt-dev: fix various memory corruption errors

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

M	source/blender/blenkernel/intern/customdata.cc
M	source/blender/blenkernel/intern/dyntopo.c
M	source/blender/blenkernel/intern/mesh_remesh_voxel.cc
M	source/blender/blenkernel/intern/paint.cc
M	source/blender/blenkernel/intern/pbvh.c
M	source/blender/blenkernel/intern/pbvh_bmesh.c
M	source/blender/blenlib/intern/BLI_mempool.c
M	source/blender/bmesh/intern/bmesh_interp.c
M	source/blender/editors/sculpt_paint/sculpt_dyntopo.c

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

diff --git a/source/blender/blenkernel/intern/customdata.cc b/source/blender/blenkernel/intern/customdata.cc
index 571fcb86f1c..02a1cdbae54 100644
--- a/source/blender/blenkernel/intern/customdata.cc
+++ b/source/blender/blenkernel/intern/customdata.cc
@@ -2818,21 +2818,39 @@ void CustomData_free_typemask(CustomData *data, const int totelem, eCustomDataMa
   CustomData_reset(data);
 }
 
-static void customData_update_offsets(CustomData *data)
+ATTR_NO_OPT static void customData_update_offsets(CustomData *data)
 {
   const LayerTypeInfo *typeInfo;
   int offset = 0;
 
   // sort by alignment
-  int aligns[] = {16, 8, 12, 6, 4, 2, 1};
+  int aligns[] = {16, 8, 4, 2, 1};
   BLI_bitmap *donemap = BLI_BITMAP_NEW_ALLOCA(data->totlayer);
+  int alignment = 0;
 
   // do large structs first
   for (int j = 0; j < data->totlayer; j++) {
     typeInfo = layerType_getInfo(data->layers[j].type);
-    if (typeInfo->size > 16 || typeInfo->size == 10) {
-      int size = (int)typeInfo->size;
+    int size = (int)typeInfo->size;
+
+    /* Float vectors get 4-byte alignment. */
+    if (ELEM(data->layers[j].type, CD_PROP_COLOR, CD_PROP_FLOAT2, CD_PROP_FLOAT3)) {
+      alignment = 4;
+    }
+    else if (size > 4) {
+      alignment = 8;
+    }
+    else if (size > 2) {
+      alignment = 4;
+    }
+    else if (size > 1) {
+      alignment = 2;
+    }
+    else {
+      alignment = 1;
+    }
 
+    if (size > 16 || size == 10) {
       BLI_BITMAP_SET(donemap, j, true);
 
       // align to 8-byte boundary
@@ -2862,7 +2880,7 @@ static void customData_update_offsets(CustomData *data)
       typeInfo = layerType_getInfo(data->layers[j].type);
       int size = (int)typeInfo->size;
 
-      if (i < ARRAY_SIZE(aligns) && typeInfo->size != aligns[i]) {
+      if (i < ARRAY_SIZE(aligns) && (size % aligns[i]) != 0) {
         continue;
       }
 
@@ -2872,6 +2890,11 @@ static void customData_update_offsets(CustomData *data)
 
       BLI_BITMAP_SET(donemap, j, true);
 
+      int align2 = aligns[i] - (offset % aligns[i]);
+      if (align2 != aligns[i]) {
+        offset += align2;
+      }
+
       data->layers[j].offset = offset;
       offset += size;
 
@@ -2881,6 +2904,10 @@ static void customData_update_offsets(CustomData *data)
     }
   }
 
+  if (offset % alignment != 0) {
+    offset += alignment - (offset % alignment);
+  }
+
   data->totsize = offset;
 
   CustomData_update_typemap(data);
diff --git a/source/blender/blenkernel/intern/dyntopo.c b/source/blender/blenkernel/intern/dyntopo.c
index 91343b26ce5..e9d67099bed 100644
--- a/source/blender/blenkernel/intern/dyntopo.c
+++ b/source/blender/blenkernel/intern/dyntopo.c
@@ -1280,7 +1280,7 @@ static void pbvh_bmesh_vert_remove(PBVH *pbvh, BMVert *v)
   BM_FACES_OF_VERT_ITER_END;
 }
 
-static void pbvh_bmesh_face_remove(
+ATTR_NO_OPT static void pbvh_bmesh_face_remove(
     PBVH *pbvh, BMFace *f, bool log_face, bool check_verts, bool ensure_ownership_transfer)
 {
   PBVHNode *f_node = pbvh_bmesh_node_from_face(pbvh, f);
diff --git a/source/blender/blenkernel/intern/mesh_remesh_voxel.cc b/source/blender/blenkernel/intern/mesh_remesh_voxel.cc
index edd62d94662..ced959e2558 100644
--- a/source/blender/blenkernel/intern/mesh_remesh_voxel.cc
+++ b/source/blender/blenkernel/intern/mesh_remesh_voxel.cc
@@ -300,15 +300,18 @@ Mesh *BKE_mesh_remesh_instant_meshes(const Mesh *input_mesh,
   std::vector<RemeshEdge> edges;
   const float(*normals)[3] = BKE_mesh_vertex_normals_ensure(input_mesh);
 
+  const MVert *input_mvert = input_mesh->verts();
+  const MEdge *input_medge = input_mesh->edges();
+
   for (int i : IndexRange(totverts)) {
-    copy_v3_v3(verts[i].co, input_mesh->mvert[i].co);
+    copy_v3_v3(verts[i].co, input_mvert[i].co);
     copy_v3_v3(verts[i].no, normals[i]);
   }
 
   int *fsets = (int *)CustomData_get_layer(&input_mesh->pdata, CD_SCULPT_FACE_SETS);
 
   for (const int i : IndexRange(input_mesh->totedge)) {
-    MEdge *me = input_mesh->medge + i;
+    const MEdge *me = input_medge + i;
     MeshElemMap *mep = epmap + i;
 
     bool ok = mep->count == 1;
@@ -346,7 +349,7 @@ Mesh *BKE_mesh_remesh_instant_meshes(const Mesh *input_mesh,
         copy_v3_v3(d2, dirs[me->v2].color);
 
         // edge vec
-        sub_v3_v3v3(vec, input_mesh->mvert[me->v2].co, input_mesh->mvert[me->v1].co);
+        sub_v3_v3v3(vec, input_mvert[me->v2].co, input_mvert[me->v1].co);
         normalize_v3(vec);
 
         // build edge normal
@@ -421,8 +424,13 @@ Mesh *BKE_mesh_remesh_instant_meshes(const Mesh *input_mesh,
 
   float(*newNormals)[3] = BKE_mesh_vertex_normals_for_write(mesh);
 
+  MVert *mesh_mvert = mesh->verts_for_write();
+  MEdge *mesh_medge = mesh->edges_for_write();
+  MLoop *mesh_mloop = mesh->loops_for_write();
+  MPoly *mesh_mpoly = mesh->polys_for_write();
+
   for (int i : IndexRange(remesh.totoutvert)) {
-    MVert *mv = mesh->mvert + i;
+    MVert *mv = mesh_mvert + i;
     RemeshVertex *v = remesh.outverts + i;
 
     copy_v3_v3(mv->co, v->co);
@@ -435,11 +443,11 @@ Mesh *BKE_mesh_remesh_instant_meshes(const Mesh *input_mesh,
   }
 
   int li = 0;
-  MLoop *ml = mesh->mloop;
+  MLoop *ml = mesh_mloop;
 
   for (int i : IndexRange(remesh.totoutface)) {
     RemeshOutFace *f = remesh.outfaces + i;
-    MPoly *mp = mesh->mpoly + i;
+    MPoly *mp = mesh_mpoly + i;
 
     mp->loopstart = li;
     mp->totloop = f->totvert;
diff --git a/source/blender/blenkernel/intern/paint.cc b/source/blender/blenkernel/intern/paint.cc
index 04519165f63..e4204a19ed4 100644
--- a/source/blender/blenkernel/intern/paint.cc
+++ b/source/blender/blenkernel/intern/paint.cc
@@ -1549,6 +1549,7 @@ void BKE_sculptsession_free(Object *ob)
 
     if (!ss->pbvh) {
       BKE_pbvh_pmap_release(ss->pmap);
+      ss->pmap = NULL;
     }
 
     sculptsession_free_pbvh(ob);
@@ -2536,12 +2537,13 @@ static PBVH *build_pbvh_from_regular_mesh(Object *ob, Mesh *me_eval_deform, bool
 
     BKE_mesh_recalc_looptri(
         loops.data(), polys.data(), verts.data(), me->totloop, me->totpoly, looptri);
+    BKE_sculptsession_check_sculptverts(ss, pbvh, me->totvert);
 
     BKE_pbvh_build_mesh(pbvh,
                         me,
-                        me->mpoly,
-                        me->mloop,
-                        me->mvert,
+                        me->polys().data(),
+                        me->loops().data(),
+                        me->verts_for_write().data(),
                         ss->msculptverts,
                         me->totvert,
                         &me->vdata,
@@ -3120,7 +3122,21 @@ static int sculpt_attr_elem_count_get(Object *ob, eAttrDomain domain)
 
   switch (domain) {
     case ATTR_DOMAIN_POINT:
-      return BKE_sculptsession_vertex_count(ss);
+      /* Cannot rely on prescence of ss->pbvh. */
+
+      if (ss->bm) {
+        return ss->bm->totvert;
+      }
+      else if (ss->subdiv_ccg) {
+        CCGKey key;
+        BKE_subdiv_ccg_key_top_level(&key, ss->subdiv_ccg);
+        return ss->subdiv_ccg->num_grids * key.grid_area;
+      }
+      else {
+        Mesh *me = BKE_object_get_original_mesh(ob);
+
+        return me->totvert;
+      }
       break;
     case ATTR_DOMAIN_FACE:
       return ss->totfaces;
@@ -3185,7 +3201,7 @@ static bool sculpt_attribute_create(SculptSession *ss,
     return true;
   }
 
-  switch (BKE_pbvh_type(ss->pbvh)) {
+  switch (pbvhtype) {
     case PBVH_BMESH: {
       CustomData *cdata = NULL;
       out->data_for_bmesh = true;
@@ -3478,6 +3494,16 @@ static void sculptsession_bmesh_add_layers(Object *ob)
   ss->attrs.sculpt_vert = sculpt_attribute_ensure_ex(
       ob, ATTR_DOMAIN_POINT, CD_DYNTOPO_VERT, "", &params, PBVH_BMESH, false);
 
+  if (!ss->attrs.face_areas) {
+    ss->attrs.face_areas = sculpt_attribute_ensure_ex(ob,
+                                                      ATTR_DOMAIN_FACE,
+                                                      CD_PROP_FLOAT,
+                                                      SCULPT_ATTRIBUTE_NAME(face_areas),
+                                                      &params,
+                                                      PBVH_BMESH,
+                                                      false);
+  }
+
   ss->attrs.dyntopo_node_id_vertex = sculpt_attribute_ensure_ex(
       ob,
       ATTR_DOMAIN_POINT,
@@ -3603,6 +3629,10 @@ void BKE_sculpt_attribute_destroy_temporary_all(Object *ob)
 
 bool BKE_sculpt_attribute_destroy(Object *ob, SculptAttribute *attr)
 {
+  if (!attr || !attr->used) {
+    return false;
+  }
+
   SculptSession *ss = ob->sculpt;
   eAttrDomain domain = attr->domain;
 
diff --git a/source/blender/blenkernel/intern/pbvh.c b/source/blender/blenkernel/intern/pbvh.c
index 1cb19617412..bdb583c7301 100644
--- a/source/blender/blenkernel/intern/pbvh.c
+++ b/source/blender/blenkernel/intern/pbvh.c
@@ -625,7 +625,7 @@ void BKE_pbvh_set_sculpt_verts(PBVH *pbvh, MSculptVert *sverts)
   pbvh->msculptverts = sverts;
 }
 
-void BKE_pbvh_build_mesh(PBVH *pbvh,
+ATTR_NO_OPT void BKE_pbvh_build_mesh(PBVH *pbvh,
                          Mesh *mesh,
                          const MPoly *mpoly,
                          const MLoop *mloop,
@@ -644,6 +644,10 @@ void BKE_pbvh_build_mesh(PBVH *pbvh,
   BBC *prim_bbc = NULL;
   BB cb;
 
+  if (pbvh->pmap != pmap) {
+    BKE_pbvh_pmap_aquire(pmap);
+  }
+
   pbvh->pmap = pmap;
   pbvh->face_areas = face_areas;
   pbvh->mesh = mesh;
@@ -5163,7 +5167,11 @@ bool BKE_pbvh_pmap_release(SculptPMap *pmap)
 
   pmap->refcount--;
 
-  if (pmap->refcount == 0) {
+  //if (pmap->refcount < 0) {
+  //  printf("%s: error!\n", __func__);
+  //}
+
+  if (1 && pmap->refcount == 0) {
     MEM_SAFE_FREE(pmap->pmap);
     MEM_SAFE_FREE(pmap->pmap_mem);
     MEM_SAFE_FREE(pmap);
diff --git a/source/blender/blenkernel/intern/pbvh_bmesh.c b/source/blender/blenkernel/intern/pbvh_bmesh.c
index b1b9877bfa8..291fdd69642 100644
--- a/source/blender/blenkernel/intern/pbvh_bmesh.c
+++ b/source/blender/blenkernel/intern/pbvh_bmesh.c
@@ -230,11 +230,11 @@ ATTR_NO_OPT void pbvh_bmesh_pbvh_bmesh_check_nodes(PBVH *pbvh)
 /****************************** Building ******************************/
 
 /* Update node data after splitting */
-static void pbvh_bmesh_node_finalize(PBVH *pbvh,
-                      

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list