Try to make SCULPT_orig_vert_data_init avoid allocating undo nodes,

which calls into BMLog which, while now threadsafe (ish?) causes
threads to get bogged down in lock contention.
This commit is contained in:
Joseph Eagar 2020-10-30 19:17:03 -07:00
parent 2d861122e1
commit 43ccbe353f
5 changed files with 33 additions and 6 deletions

View File

@ -911,11 +911,29 @@ static bool edge_queue_tri_in_sphere(const EdgeQueue *q, BMFace *f)
/* Get closest point in triangle to sphere center */
BM_face_as_array_vert_tri(f, v_tri);
#if 0
/*
closest_on_tri_to_point_v3 is being slow
*/
float mindis = 1e17;
float dis;
copy_v3_v3(c, q->center);
for (int i=0; i<3; i++) {
dis = len_squared_v3v3(v_tri[i]->co, c);
mindis = MIN2(mindis, dis);
dis = dist_squared_to_line_segment_v3(c, v_tri[i]->co, v_tri[(i+1)%3]->co);
mindis = MIN2(mindis, dis);
}
return mindis <= q->radius_squared;
#else
closest_on_tri_to_point_v3(c, q->center, v_tri[0]->co, v_tri[1]->co, v_tri[2]->co);
/* Check if triangle intersects the sphere */
return len_squared_v3v3(q->center, c) <= q->radius_squared;
#endif
}
static bool edge_queue_tri_in_circle(const EdgeQueue *q, BMFace *f)
@ -2584,7 +2602,7 @@ void BKE_pbvh_build_bmesh(PBVH *pbvh,
pbvh->cd_vcol_offset = CustomData_get_offset(&bm->vdata, CD_PROP_COLOR);
/* TODO: choose leaf limit better */
pbvh->leaf_limit = 3000;
pbvh->leaf_limit = 1000;
BMIter iter;
BMVert *v;

View File

@ -1332,6 +1332,7 @@ void SCULPT_orig_vert_data_unode_init(SculptOrigVertData *data, Object *ob, Scul
data->bm_log = ss->bm_log;
}
else {
data->datatype = data->unode->type;
data->coords = data->unode->co;
data->normals = data->unode->no;
data->vmasks = data->unode->mask;
@ -1345,10 +1346,15 @@ void SCULPT_orig_vert_data_unode_init(SculptOrigVertData *data, Object *ob, Scul
*/
void SCULPT_orig_vert_data_init(SculptOrigVertData *data, Object *ob, PBVHNode *node)
{
SculptUndoNode *unode;
SculptUndoNode *unode = NULL;
data->ss = ob->sculpt;
unode = SCULPT_undo_push_node(ob, node, SCULPT_UNDO_COORDS);
if (!ob->sculpt->bm) {
unode = SCULPT_undo_push_node(ob, node, SCULPT_UNDO_COORDS);
}
SCULPT_orig_vert_data_unode_init(data, ob, unode);
data->datatype = SCULPT_UNDO_COORDS;
}
/**
@ -1356,7 +1362,7 @@ void SCULPT_orig_vert_data_init(SculptOrigVertData *data, Object *ob, PBVHNode *
*/
void SCULPT_orig_vert_data_update(SculptOrigVertData *orig_data, PBVHVertexIter *iter)
{
if (orig_data->unode->type == SCULPT_UNDO_COORDS) {
if (orig_data->datatype == SCULPT_UNDO_COORDS) {
if (orig_data->bm_log) {
orig_data->co = BM_ELEM_CD_GET_VOID_P(iter->bm_vert, orig_data->ss->cd_origco_offset);
@ -1376,7 +1382,7 @@ void SCULPT_orig_vert_data_update(SculptOrigVertData *orig_data, PBVHVertexIter
orig_data->no = orig_data->normals[iter->i];
}
}
else if (orig_data->unode->type == SCULPT_UNDO_COLOR) {
else if (orig_data->datatype == SCULPT_UNDO_COLOR) {
if (orig_data->bm_log) {
orig_data->col = BM_ELEM_CD_GET_VOID_P(iter->bm_vert, orig_data->ss->cd_origvcol_offset);
@ -1386,7 +1392,7 @@ void SCULPT_orig_vert_data_update(SculptOrigVertData *orig_data, PBVHVertexIter
orig_data->col = orig_data->colors[iter->i];
}
}
else if (orig_data->unode->type == SCULPT_UNDO_MASK) {
else if (orig_data->datatype == SCULPT_UNDO_MASK) {
if (orig_data->bm_log) {
orig_data->mask = BM_log_original_mask(orig_data->bm_log, iter->bm_vert);
}

View File

@ -226,6 +226,7 @@ typedef struct {
struct BMLog *bm_log;
struct SculptUndoNode *unode;
int datatype;
float (*coords)[3];
short (*normals)[3];
const float *vmasks;

View File

@ -124,6 +124,7 @@ static void do_paint_brush_task_cb_ex(void *__restrict userdata,
SculptOrigVertData orig_data;
SCULPT_orig_vert_data_init(&orig_data, data->ob, data->nodes[n]);
orig_data.datatype = SCULPT_UNDO_COLOR;
color_buffer = BKE_pbvh_node_color_buffer_get(data->nodes[n]);

View File

@ -932,6 +932,7 @@ void GPU_pbvh_update_attribute_names(CustomData *vdata, CustomData *ldata)
cl += cl->active;
DRW_make_cdlayer_attr_aliases(&g_vbo_id.format, "c", vdata, cl);
GPU_vertformat_alias_add(&g_vbo_id.format, "ac");
}
g_vbo_id.fset = GPU_vertformat_attr_add(