Fix possible concurency issue in mesh normals computation.

Failure in own code from last December, thanks @sergey for finding it.

To be backported to 2.79a.
This commit is contained in:
Bastien Montagne 2018-01-31 12:30:39 +01:00
parent 87608e66e1
commit f309becf2d
Notes: blender-bot 2023-02-14 06:17:12 +01:00
Referenced by issue #53683, 2.79a release
1 changed files with 5 additions and 11 deletions

View File

@ -253,16 +253,6 @@ static void mesh_calc_normals_poly_prepare_cb(
}
}
static void mesh_calc_normals_poly_accum_cb(
void *__restrict userdata,
const int lidx,
const ParallelRangeTLS *__restrict UNUSED(tls))
{
MeshCalcNormalsData *data = userdata;
add_v3_v3(data->vnors[data->mloop[lidx].v], data->lnors_weighted[lidx]);
}
static void mesh_calc_normals_poly_finalize_cb(
void *__restrict userdata,
const int vidx,
@ -327,7 +317,11 @@ void BKE_mesh_calc_normals_poly(
BLI_task_parallel_range(0, numPolys, &data, mesh_calc_normals_poly_prepare_cb, &settings);
/* Actually accumulate weighted loop normals into vertex ones. */
BLI_task_parallel_range(0, numLoops, &data, mesh_calc_normals_poly_accum_cb, &settings);
/* Unfortunately, not possible to thread that (not in a reasonable, totally lock- and barrier-free fashion),
* since several loops will point to the same vertex... */
for (int lidx = 0; lidx < numLoops; lidx++) {
add_v3_v3(vnors[mloop[lidx].v], data.lnors_weighted[lidx]);
}
/* Normalize and validate computed vertex normals. */
BLI_task_parallel_range(0, numVerts, &data, mesh_calc_normals_poly_finalize_cb, &settings);