Changeset View
Changeset View
Standalone View
Standalone View
source/blender/blenkernel/intern/subdiv_foreach.c
| Show First 20 Lines • Show All 1,832 Lines • ▼ Show 20 Lines | |||||
| static void subdiv_foreach_boundary_edges_task(void *__restrict userdata, | static void subdiv_foreach_boundary_edges_task(void *__restrict userdata, | ||||
| const int edge_index, | const int edge_index, | ||||
| const TaskParallelTLS *__restrict tls) | const TaskParallelTLS *__restrict tls) | ||||
| { | { | ||||
| SubdivForeachTaskContext *ctx = userdata; | SubdivForeachTaskContext *ctx = userdata; | ||||
| subdiv_foreach_boundary_edges(ctx, tls->userdata_chunk, edge_index); | subdiv_foreach_boundary_edges(ctx, tls->userdata_chunk, edge_index); | ||||
| } | } | ||||
| static void subdiv_foreach_finalize(void *__restrict userdata, void *__restrict userdata_chunk) | static void subdiv_foreach_free(const void *__restrict userdata, void *__restrict userdata_chunk) | ||||
| { | { | ||||
| SubdivForeachTaskContext *ctx = userdata; | const SubdivForeachTaskContext *ctx = userdata; | ||||
| ctx->foreach_context->user_data_tls_free(userdata_chunk); | ctx->foreach_context->user_data_tls_free(userdata_chunk); | ||||
| } | } | ||||
| bool BKE_subdiv_foreach_subdiv_geometry(Subdiv *subdiv, | bool BKE_subdiv_foreach_subdiv_geometry(Subdiv *subdiv, | ||||
| const SubdivForeachContext *context, | const SubdivForeachContext *context, | ||||
| const SubdivToMeshSettings *mesh_settings, | const SubdivToMeshSettings *mesh_settings, | ||||
| const Mesh *coarse_mesh) | const Mesh *coarse_mesh) | ||||
| { | { | ||||
| Show All 16 Lines | bool BKE_subdiv_foreach_subdiv_geometry(Subdiv *subdiv, | ||||
| subdiv_foreach_single_thread_tasks(&ctx); | subdiv_foreach_single_thread_tasks(&ctx); | ||||
| /* Threaded traversal of the rest of topology. */ | /* Threaded traversal of the rest of topology. */ | ||||
| TaskParallelSettings parallel_range_settings; | TaskParallelSettings parallel_range_settings; | ||||
| BLI_parallel_range_settings_defaults(¶llel_range_settings); | BLI_parallel_range_settings_defaults(¶llel_range_settings); | ||||
| parallel_range_settings.userdata_chunk = context->user_data_tls; | parallel_range_settings.userdata_chunk = context->user_data_tls; | ||||
| parallel_range_settings.userdata_chunk_size = context->user_data_tls_size; | parallel_range_settings.userdata_chunk_size = context->user_data_tls_size; | ||||
| parallel_range_settings.min_iter_per_thread = 1; | parallel_range_settings.min_iter_per_thread = 1; | ||||
| if (context->user_data_tls_free != NULL) { | if (context->user_data_tls_free != NULL) { | ||||
| parallel_range_settings.func_finalize = subdiv_foreach_finalize; | parallel_range_settings.func_free = subdiv_foreach_free; | ||||
| } | } | ||||
| /* TODO(sergey): Possible optimization is to have a single pool and push all | /* TODO(sergey): Possible optimization is to have a single pool and push all | ||||
| * the tasks into it. | * the tasks into it. | ||||
| * NOTE: Watch out for callbacks which needs to run for loose geometry as they | * NOTE: Watch out for callbacks which needs to run for loose geometry as they | ||||
| * currently are relying on the fact that face/grid callbacks will tag non- | * currently are relying on the fact that face/grid callbacks will tag non- | ||||
| * loose geometry. */ | * loose geometry. */ | ||||
| Show All 26 Lines | |||||