[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, "", ¶ms, 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),
+ ¶ms,
+ 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