Subdiv: Move single threaded code to a single function
Allows to more easily add more passes which are supposed to be run from a single thread.
This commit is contained in:
@@ -466,14 +466,15 @@ static void subdiv_foreach_every_corner_vertices_special(
|
|||||||
false);
|
false);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void subdiv_foreach_every_corner_vertices(SubdivForeachTaskContext *ctx)
|
static void subdiv_foreach_every_corner_vertices(
|
||||||
|
SubdivForeachTaskContext *ctx,
|
||||||
|
void *tls)
|
||||||
{
|
{
|
||||||
if (ctx->foreach_context->vertex_every_corner == NULL) {
|
if (ctx->foreach_context->vertex_every_corner == NULL) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const Mesh *coarse_mesh = ctx->coarse_mesh;
|
const Mesh *coarse_mesh = ctx->coarse_mesh;
|
||||||
const MPoly *coarse_mpoly = coarse_mesh->mpoly;
|
const MPoly *coarse_mpoly = coarse_mesh->mpoly;
|
||||||
void *tls = subdiv_foreach_tls_alloc(ctx);
|
|
||||||
for (int poly_index = 0; poly_index < coarse_mesh->totpoly; poly_index++) {
|
for (int poly_index = 0; poly_index < coarse_mesh->totpoly; poly_index++) {
|
||||||
const MPoly *coarse_poly = &coarse_mpoly[poly_index];
|
const MPoly *coarse_poly = &coarse_mpoly[poly_index];
|
||||||
if (coarse_poly->totloop == 4) {
|
if (coarse_poly->totloop == 4) {
|
||||||
@@ -483,7 +484,6 @@ static void subdiv_foreach_every_corner_vertices(SubdivForeachTaskContext *ctx)
|
|||||||
subdiv_foreach_every_corner_vertices_special(ctx, tls, coarse_poly);
|
subdiv_foreach_every_corner_vertices_special(ctx, tls, coarse_poly);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
subdiv_foreach_tls_free(tls);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Traverse of edge vertices. They are coming from coarse edges. */
|
/* Traverse of edge vertices. They are coming from coarse edges. */
|
||||||
@@ -689,14 +689,15 @@ static void subdiv_foreach_every_edge_vertices_special(
|
|||||||
false);
|
false);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void subdiv_foreach_every_edge_vertices(SubdivForeachTaskContext *ctx)
|
static void subdiv_foreach_every_edge_vertices(
|
||||||
|
SubdivForeachTaskContext *ctx,
|
||||||
|
void *tls)
|
||||||
{
|
{
|
||||||
if (ctx->foreach_context->vertex_every_edge == NULL) {
|
if (ctx->foreach_context->vertex_every_edge == NULL) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const Mesh *coarse_mesh = ctx->coarse_mesh;
|
const Mesh *coarse_mesh = ctx->coarse_mesh;
|
||||||
const MPoly *coarse_mpoly = coarse_mesh->mpoly;
|
const MPoly *coarse_mpoly = coarse_mesh->mpoly;
|
||||||
void *tls = subdiv_foreach_tls_alloc(ctx);
|
|
||||||
for (int poly_index = 0; poly_index < coarse_mesh->totpoly; poly_index++) {
|
for (int poly_index = 0; poly_index < coarse_mesh->totpoly; poly_index++) {
|
||||||
const MPoly *coarse_poly = &coarse_mpoly[poly_index];
|
const MPoly *coarse_poly = &coarse_mpoly[poly_index];
|
||||||
if (coarse_poly->totloop == 4) {
|
if (coarse_poly->totloop == 4) {
|
||||||
@@ -706,7 +707,6 @@ static void subdiv_foreach_every_edge_vertices(SubdivForeachTaskContext *ctx)
|
|||||||
subdiv_foreach_every_edge_vertices_special(ctx, tls, coarse_poly);
|
subdiv_foreach_every_edge_vertices_special(ctx, tls, coarse_poly);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
subdiv_foreach_tls_free(tls);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Traversal of inner vertices, they are coming from ptex patches. */
|
/* Traversal of inner vertices, they are coming from ptex patches. */
|
||||||
@@ -1950,6 +1950,19 @@ static void subdiv_foreach_vertices_of_loose_edges_task(
|
|||||||
* Subdivision process entry points.
|
* Subdivision process entry points.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
static void subdiv_foreach_single_thread_tasks(SubdivForeachTaskContext *ctx)
|
||||||
|
{
|
||||||
|
/* NOTE: In theory, we can try to skip allocation of TLS here, but in
|
||||||
|
* practice if the callbacks used here are not specified then TLS will not
|
||||||
|
* be requested anyway. */
|
||||||
|
void *tls = subdiv_foreach_tls_alloc(ctx);
|
||||||
|
/* Passes to average displacement on the corner vertices
|
||||||
|
* and boundary edges. */
|
||||||
|
subdiv_foreach_every_corner_vertices(ctx, tls);
|
||||||
|
subdiv_foreach_every_edge_vertices(ctx, tls);
|
||||||
|
subdiv_foreach_tls_free(tls);
|
||||||
|
}
|
||||||
|
|
||||||
static void subdiv_foreach_task(
|
static void subdiv_foreach_task(
|
||||||
void *__restrict userdata,
|
void *__restrict userdata,
|
||||||
const int poly_index,
|
const int poly_index,
|
||||||
@@ -2008,11 +2021,8 @@ bool BKE_subdiv_foreach_subdiv_geometry(
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* Single threaded passes to average displacement on the corner vertices
|
/* Run all the code which is not supposed to be run from threads. */
|
||||||
* and boundary edges.
|
subdiv_foreach_single_thread_tasks(&ctx);
|
||||||
*/
|
|
||||||
subdiv_foreach_every_corner_vertices(&ctx);
|
|
||||||
subdiv_foreach_every_edge_vertices(&ctx);
|
|
||||||
/* Threaded traversal of the rest of topology. */
|
/* Threaded traversal of the rest of topology. */
|
||||||
ParallelRangeSettings parallel_range_settings;
|
ParallelRangeSettings parallel_range_settings;
|
||||||
BLI_parallel_range_settings_defaults(¶llel_range_settings);
|
BLI_parallel_range_settings_defaults(¶llel_range_settings);
|
||||||
|
Reference in New Issue
Block a user