diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2019-01-07 17:34:59 +0300 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2019-01-07 19:14:19 +0300 |
commit | e637e8dcc6a2fa459afdea550f2d47dabd5cadb7 (patch) | |
tree | 6a536c6fe344ab9dc2ad687405a6a3bf5ad26665 /source/blender | |
parent | 1b15eb7e71b3fbc9422aada31693c9e750506db6 (diff) |
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.
Diffstat (limited to 'source/blender')
-rw-r--r-- | source/blender/blenkernel/intern/subdiv_foreach.c | 32 |
1 files changed, 21 insertions, 11 deletions
diff --git a/source/blender/blenkernel/intern/subdiv_foreach.c b/source/blender/blenkernel/intern/subdiv_foreach.c index 48ce252c788..b81f2a08b33 100644 --- a/source/blender/blenkernel/intern/subdiv_foreach.c +++ b/source/blender/blenkernel/intern/subdiv_foreach.c @@ -466,14 +466,15 @@ static void subdiv_foreach_every_corner_vertices_special( 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) { return; } const Mesh *coarse_mesh = ctx->coarse_mesh; 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++) { const MPoly *coarse_poly = &coarse_mpoly[poly_index]; 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_tls_free(tls); } /* Traverse of edge vertices. They are coming from coarse edges. */ @@ -689,14 +689,15 @@ static void subdiv_foreach_every_edge_vertices_special( 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) { return; } const Mesh *coarse_mesh = ctx->coarse_mesh; 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++) { const MPoly *coarse_poly = &coarse_mpoly[poly_index]; 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_tls_free(tls); } /* 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. */ +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( void *__restrict userdata, const int poly_index, @@ -2008,11 +2021,8 @@ bool BKE_subdiv_foreach_subdiv_geometry( return false; } } - /* Single threaded passes to average displacement on the corner vertices - * and boundary edges. - */ - subdiv_foreach_every_corner_vertices(&ctx); - subdiv_foreach_every_edge_vertices(&ctx); + /* Run all the code which is not supposed to be run from threads. */ + subdiv_foreach_single_thread_tasks(&ctx); /* Threaded traversal of the rest of topology. */ ParallelRangeSettings parallel_range_settings; BLI_parallel_range_settings_defaults(¶llel_range_settings); |