From 616081ff60e05aa10a7d7c6867fb9a38ac9e7c4e Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Sun, 19 Mar 2023 22:39:19 -0400 Subject: [PATCH 1/5] Mesh: Simplify mesh triangle length counting --- .../blenlib/BLI_enumerable_thread_specific.hh | 3 +- .../draw_cache_extract_mesh_render_data.cc | 123 +++++++++--------- 2 files changed, 64 insertions(+), 62 deletions(-) diff --git a/source/blender/blenlib/BLI_enumerable_thread_specific.hh b/source/blender/blenlib/BLI_enumerable_thread_specific.hh index a5bd79d5826..b22e0b9ac2f 100644 --- a/source/blender/blenlib/BLI_enumerable_thread_specific.hh +++ b/source/blender/blenlib/BLI_enumerable_thread_specific.hh @@ -19,12 +19,13 @@ # undef NOMINMAX # endif # endif +#else +# include "BLI_map.hh" #endif #include #include -#include "BLI_map.hh" #include "BLI_utility_mixins.hh" namespace blender::threading { diff --git a/source/blender/draw/intern/draw_cache_extract_mesh_render_data.cc b/source/blender/draw/intern/draw_cache_extract_mesh_render_data.cc index a9f72572f11..0c7237835fc 100644 --- a/source/blender/draw/intern/draw_cache_extract_mesh_render_data.cc +++ b/source/blender/draw/intern/draw_cache_extract_mesh_render_data.cc @@ -11,8 +11,10 @@ #include "BLI_array.hh" #include "BLI_bitmap.h" +#include "BLI_enumerable_thread_specific.hh" #include "BLI_math.h" #include "BLI_task.h" +#include "BLI_task.hh" #include "BKE_attribute.hh" #include "BKE_editmesh.h" @@ -169,90 +171,87 @@ void mesh_render_data_update_loose_geom(MeshRenderData *mr, * Contains polygon indices sorted based on their material. * \{ */ -static void mesh_render_data_mat_tri_len_bm_range_fn(void *__restrict userdata, - const int iter, - const TaskParallelTLS *__restrict tls) -{ - MeshRenderData *mr = static_cast(userdata); - int *mat_tri_len = static_cast(tls->userdata_chunk); +namespace blender::draw { - BMesh *bm = mr->bm; - BMFace *efa = BM_face_at_index(bm, iter); - if (!BM_elem_flag_test(efa, BM_ELEM_HIDDEN)) { - int mat = clamp_i(efa->mat_nr, 0, mr->mat_len - 1); - mat_tri_len[mat] += efa->len - 2; - } +static void accumululate_material_counts_bm( + const BMesh &bm, threading::EnumerableThreadSpecific> &all_tri_counts) +{ + threading::parallel_for(IndexRange(bm.totface), 4096, [&](const IndexRange range) { + Array &tri_counts = all_tri_counts.local(); + const short last_index = tri_counts.size() - 1; + for (const int i : range) { + const BMFace &face = *BM_face_at_index(&const_cast(bm), i); + if (!BM_elem_flag_test(&face, BM_ELEM_HIDDEN)) { + const short mat = std::clamp(face.mat_nr, 0, last_index); + tri_counts[mat] += face.len - 2; + } + } + }); } -static void mesh_render_data_mat_tri_len_mesh_range_fn(void *__restrict userdata, - const int iter, - const TaskParallelTLS *__restrict tls) +static void accumululate_material_counts_mesh( + const MeshRenderData &mr, threading::EnumerableThreadSpecific> &all_tri_counts) { - MeshRenderData *mr = static_cast(userdata); - int *mat_tri_len = static_cast(tls->userdata_chunk); - - const MPoly &poly = mr->polys[iter]; - if (!(mr->use_hide && mr->hide_poly && mr->hide_poly[iter])) { - const int mat = mr->material_indices ? - clamp_i(mr->material_indices[iter], 0, mr->mat_len - 1) : - 0; - mat_tri_len[mat] += poly.totloop - 2; + if (!mr.material_indices) { + all_tri_counts.local().first() = poly_to_tri_count(mr.poly_len, mr.loop_len); + return; } -} -static void mesh_render_data_mat_tri_len_reduce_fn(const void *__restrict userdata, - void *__restrict chunk_join, - void *__restrict chunk) -{ - const MeshRenderData *mr = static_cast(userdata); - int *dst_mat_len = static_cast(chunk_join); - int *src_mat_len = static_cast(chunk); - for (int i = 0; i < mr->mat_len; i++) { - dst_mat_len[i] += src_mat_len[i]; - } -} - -static void mesh_render_data_mat_tri_len_build_threaded(MeshRenderData *mr, - int face_len, - TaskParallelRangeFunc range_func, - blender::MutableSpan mat_tri_len) -{ - TaskParallelSettings settings; - BLI_parallel_range_settings_defaults(&settings); - settings.userdata_chunk = mat_tri_len.data(); - settings.userdata_chunk_size = mat_tri_len.as_span().size_in_bytes(); - settings.min_iter_per_thread = MIN_RANGE_LEN; - settings.func_reduce = mesh_render_data_mat_tri_len_reduce_fn; - BLI_task_parallel_range(0, face_len, mr, range_func, &settings); + const Span polys = mr.polys; + const Span material_indices(mr.material_indices, mr.poly_len); + threading::parallel_for(material_indices.index_range(), 4096, [&](const IndexRange range) { + Array &tri_counts = all_tri_counts.local(); + const int last_index = tri_counts.size() - 1; + if (mr.use_hide && mr.hide_poly) { + for (const int i : range) { + if (!mr.hide_poly[i]) { + const int mat = std::clamp(material_indices[i], 0, last_index); + tri_counts[mat] += ME_POLY_TRI_TOT(&polys[i]); + } + } + } + else { + for (const int i : range) { + const int mat = std::clamp(material_indices[i], 0, last_index); + tri_counts[mat] += ME_POLY_TRI_TOT(&polys[i]); + } + } + }); } /* Count how many triangles for each material. */ -static void mesh_render_data_mat_tri_len_build(MeshRenderData *mr, - blender::MutableSpan mat_tri_len) +static void mesh_render_data_mat_tri_len_build(const MeshRenderData &mr, + MutableSpan mat_tri_len) { - if (mr->extract_type == MR_EXTRACT_BMESH) { - BMesh *bm = mr->bm; - mesh_render_data_mat_tri_len_build_threaded( - mr, bm->totface, mesh_render_data_mat_tri_len_bm_range_fn, mat_tri_len); + threading::EnumerableThreadSpecific> all_tri_counts( + [&]() { return Array(mr.mat_len, 0); }); + + if (mr.extract_type == MR_EXTRACT_BMESH) { + accumululate_material_counts_bm(*mr.bm, all_tri_counts); } else { - mesh_render_data_mat_tri_len_build_threaded( - mr, mr->poly_len, mesh_render_data_mat_tri_len_mesh_range_fn, mat_tri_len); + accumululate_material_counts_mesh(mr, all_tri_counts); + } + + mat_tri_len.fill(0); + for (const Span counts : all_tri_counts) { + for (const int i : mat_tri_len.index_range()) { + mat_tri_len[i] += counts[i]; + } } } static void mesh_render_data_polys_sorted_build(MeshRenderData *mr, MeshBufferCache *cache) { - using namespace blender; cache->poly_sorted.tri_first_index.reinitialize(mr->poly_len); cache->poly_sorted.mat_tri_len.reinitialize(mr->mat_len); - mesh_render_data_mat_tri_len_build(mr, cache->poly_sorted.mat_tri_len); + mesh_render_data_mat_tri_len_build(*mr, cache->poly_sorted.mat_tri_len); const Span mat_tri_len = cache->poly_sorted.mat_tri_len; /* Apply offset. */ int visible_tri_len = 0; - blender::Array mat_tri_offs(mr->mat_len); + Array mat_tri_offs(mr->mat_len); { for (int i = 0; i < mr->mat_len; i++) { mat_tri_offs[i] = visible_tri_len; @@ -303,12 +302,14 @@ static void mesh_render_data_polys_sorted_ensure(MeshRenderData *mr, MeshBufferC mesh_render_data_polys_sorted_build(mr, cache); } +} // namespace blender::draw + void mesh_render_data_update_polys_sorted(MeshRenderData *mr, MeshBufferCache *cache, const eMRDataType data_flag) { if (data_flag & MR_DATA_POLYS_SORTED) { - mesh_render_data_polys_sorted_ensure(mr, cache); + blender::draw::mesh_render_data_polys_sorted_ensure(mr, cache); mr->poly_sorted = &cache->poly_sorted; } } -- 2.30.2 From bebcacf1040ba1cf3adf2e705a52260cba654020 Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Mon, 20 Mar 2023 18:35:33 -0400 Subject: [PATCH 2/5] Fix build error --- .../blender/draw/intern/draw_cache_extract_mesh_render_data.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/draw/intern/draw_cache_extract_mesh_render_data.cc b/source/blender/draw/intern/draw_cache_extract_mesh_render_data.cc index 0c7237835fc..0c63da1f330 100644 --- a/source/blender/draw/intern/draw_cache_extract_mesh_render_data.cc +++ b/source/blender/draw/intern/draw_cache_extract_mesh_render_data.cc @@ -234,7 +234,7 @@ static void mesh_render_data_mat_tri_len_build(const MeshRenderData &mr, } mat_tri_len.fill(0); - for (const Span counts : all_tri_counts) { + for (const Array &counts : all_tri_counts) { for (const int i : mat_tri_len.index_range()) { mat_tri_len[i] += counts[i]; } -- 2.30.2 From 0b5fbc964c16d1ac7024d3f753b81d805207e7dd Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Mon, 27 Mar 2023 19:26:52 -0400 Subject: [PATCH 3/5] Change grain size back to 1024 --- .../draw/intern/draw_cache_extract_mesh_render_data.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/blender/draw/intern/draw_cache_extract_mesh_render_data.cc b/source/blender/draw/intern/draw_cache_extract_mesh_render_data.cc index 9b409069767..2aad5e2a200 100644 --- a/source/blender/draw/intern/draw_cache_extract_mesh_render_data.cc +++ b/source/blender/draw/intern/draw_cache_extract_mesh_render_data.cc @@ -176,7 +176,7 @@ namespace blender::draw { static void accumululate_material_counts_bm( const BMesh &bm, threading::EnumerableThreadSpecific> &all_tri_counts) { - threading::parallel_for(IndexRange(bm.totface), 4096, [&](const IndexRange range) { + threading::parallel_for(IndexRange(bm.totface), 1024, [&](const IndexRange range) { Array &tri_counts = all_tri_counts.local(); const short last_index = tri_counts.size() - 1; for (const int i : range) { @@ -199,7 +199,7 @@ static void accumululate_material_counts_mesh( const Span polys = mr.polys; const Span material_indices(mr.material_indices, mr.poly_len); - threading::parallel_for(material_indices.index_range(), 4096, [&](const IndexRange range) { + threading::parallel_for(material_indices.index_range(), 1024, [&](const IndexRange range) { Array &tri_counts = all_tri_counts.local(); const int last_index = tri_counts.size() - 1; if (mr.use_hide && mr.hide_poly) { -- 2.30.2 From 437666362abf9b39c239494cb3ecffa7613cd612 Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Fri, 12 May 2023 12:04:26 -0400 Subject: [PATCH 4/5] Cleanup --- .../draw/intern/draw_cache_extract_mesh_render_data.cc | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/source/blender/draw/intern/draw_cache_extract_mesh_render_data.cc b/source/blender/draw/intern/draw_cache_extract_mesh_render_data.cc index ef7d5bcd6ff..bd1036b632a 100644 --- a/source/blender/draw/intern/draw_cache_extract_mesh_render_data.cc +++ b/source/blender/draw/intern/draw_cache_extract_mesh_render_data.cc @@ -218,13 +218,15 @@ static Array mesh_render_data_mat_tri_len_build(const MeshRenderData &mr) accumululate_material_counts_mesh(mr, all_tri_counts); } - Array mat_tri_len(mr.mat_len, 0); + Array &mat_tri_len = all_tri_counts.local(); for (const Array &counts : all_tri_counts) { - for (const int i : mat_tri_len.index_range()) { - mat_tri_len[i] += counts[i]; + if (&counts != &mat_tri_len) { + for (const int i : mat_tri_len.index_range()) { + mat_tri_len[i] += counts[i]; + } } } - return mat_tri_len; + return std::move(mat_tri_len); } static void mesh_render_data_polys_sorted_build(MeshRenderData *mr, MeshBufferCache *cache) -- 2.30.2 From dd09f8c44fb790db2f232f5c68548dce7e68b2fe Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Wed, 2 Aug 2023 23:00:25 -0400 Subject: [PATCH 5/5] Cleanup --- .../blender/draw/intern/draw_cache_extract_mesh_render_data.cc | 3 --- 1 file changed, 3 deletions(-) diff --git a/source/blender/draw/intern/draw_cache_extract_mesh_render_data.cc b/source/blender/draw/intern/draw_cache_extract_mesh_render_data.cc index 99145e5e0a1..065e37c093c 100644 --- a/source/blender/draw/intern/draw_cache_extract_mesh_render_data.cc +++ b/source/blender/draw/intern/draw_cache_extract_mesh_render_data.cc @@ -11,10 +11,7 @@ #include "MEM_guardedalloc.h" #include "BLI_array.hh" -#include "BLI_bitmap.h" #include "BLI_enumerable_thread_specific.hh" -#include "BLI_math.h" -#include "BLI_task.h" #include "BLI_task.hh" #include "BKE_attribute.hh" -- 2.30.2