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:
parent
2d861122e1
commit
43ccbe353f
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -226,6 +226,7 @@ typedef struct {
|
|||
struct BMLog *bm_log;
|
||||
|
||||
struct SculptUndoNode *unode;
|
||||
int datatype;
|
||||
float (*coords)[3];
|
||||
short (*normals)[3];
|
||||
const float *vmasks;
|
||||
|
|
|
@ -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]);
|
||||
|
||||
|
|
|
@ -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(
|
||||
|
|
Loading…
Reference in New Issue