From e4c6da29b2297cbf331bb3ac891959dbcc00ee73 Mon Sep 17 00:00:00 2001 From: Germano Cavalcante Date: Wed, 9 Jun 2021 08:48:46 -0300 Subject: [PATCH] Draw Cache: use threading for Mesh extract lines This is an optimization, but the difference is still not that significant as some extractions are still done in single thread. **Benchmarking** ||before:|after: |---|---|---| |large_mesh_editing:|Average: 14.246502 FPS|Average: 15.438118 FPS ||rdata 9ms iter 31ms (frame 69ms)|rdata 9ms iter 27ms (frame 65ms) |large_mesh_editing_ledge: |Average: 14.913622 FPS|Average: 15.856538 FPS ||rdata 9ms iter 30ms (frame 67ms)|rdata 9ms iter 26ms (frame 63ms) |looptris_test:|Average: 3.970774 FPS|Average: 4.095200 FPS ||rdata 11ms iter 90ms (frame 235ms)|rdata 12ms iter 87ms (frame 229ms) Reviewed By: jbakker Differential Revision: https://developer.blender.org/D11467 --- .../mesh_extractors/extract_mesh_ibo_lines.cc | 25 +++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/source/blender/draw/intern/mesh_extractors/extract_mesh_ibo_lines.cc b/source/blender/draw/intern/mesh_extractors/extract_mesh_ibo_lines.cc index 6237529902b..74a3d3825c5 100644 --- a/source/blender/draw/intern/mesh_extractors/extract_mesh_ibo_lines.cc +++ b/source/blender/draw/intern/mesh_extractors/extract_mesh_ibo_lines.cc @@ -42,6 +42,15 @@ static void *extract_lines_init(const MeshRenderData *mr, return elb; } +static void *extract_lines_task_init(void *_userdata) +{ + GPUIndexBufBuilder *elb = static_cast(_userdata); + GPUIndexBufBuilder *sub_builder = static_cast( + MEM_mallocN(sizeof(*sub_builder), __func__)); + GPU_indexbuf_subbuilder_init(elb, sub_builder); + return sub_builder; +} + static void extract_lines_iter_poly_bm(const MeshRenderData *UNUSED(mr), BMFace *f, const int UNUSED(f_index), @@ -138,6 +147,14 @@ static void extract_lines_iter_ledge_mesh(const MeshRenderData *mr, GPU_indexbuf_set_line_restart(elb, e_index); } +static void extract_lines_task_finish(void *_userdata, void *_task_userdata) +{ + GPUIndexBufBuilder *elb = static_cast(_userdata); + GPUIndexBufBuilder *sub_builder = static_cast(_task_userdata); + GPU_indexbuf_subbuilder_finish(elb, sub_builder); + MEM_freeN(sub_builder); +} + static void extract_lines_finish(const MeshRenderData *UNUSED(mr), struct MeshBatchCache *UNUSED(cache), void *buf, @@ -153,13 +170,15 @@ constexpr MeshExtract create_extractor_lines() { MeshExtract extractor = {0}; extractor.init = extract_lines_init; + extractor.task_init = extract_lines_task_init; extractor.iter_poly_bm = extract_lines_iter_poly_bm; extractor.iter_poly_mesh = extract_lines_iter_poly_mesh; extractor.iter_ledge_bm = extract_lines_iter_ledge_bm; extractor.iter_ledge_mesh = extract_lines_iter_ledge_mesh; + extractor.task_finish = extract_lines_task_finish; extractor.finish = extract_lines_finish; extractor.data_type = MR_DATA_NONE; - extractor.use_threading = false; + extractor.use_threading = true; extractor.mesh_buffer_offset = offsetof(MeshBufferCache, ibo.lines); return extractor; } @@ -197,13 +216,15 @@ constexpr MeshExtract create_extractor_lines_with_lines_loose() { MeshExtract extractor = {0}; extractor.init = extract_lines_init; + extractor.task_init = extract_lines_task_init; extractor.iter_poly_bm = extract_lines_iter_poly_bm; extractor.iter_poly_mesh = extract_lines_iter_poly_mesh; extractor.iter_ledge_bm = extract_lines_iter_ledge_bm; extractor.iter_ledge_mesh = extract_lines_iter_ledge_mesh; + extractor.task_finish = extract_lines_task_finish; extractor.finish = extract_lines_with_lines_loose_finish; extractor.data_type = MR_DATA_NONE; - extractor.use_threading = false; + extractor.use_threading = true; extractor.mesh_buffer_offset = offsetof(MeshBufferCache, ibo.lines); return extractor; }