[Bf-blender-cvs] [e4c6da29b22] master: Draw Cache: use threading for Mesh extract lines

Germano Cavalcante noreply at git.blender.org
Wed Jun 9 14:07:20 CEST 2021


Commit: e4c6da29b2297cbf331bb3ac891959dbcc00ee73
Author: Germano Cavalcante
Date:   Wed Jun 9 08:48:46 2021 -0300
Branches: master
https://developer.blender.org/rBe4c6da29b2297cbf331bb3ac891959dbcc00ee73

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

===================================================================

M	source/blender/draw/intern/mesh_extractors/extract_mesh_ibo_lines.cc

===================================================================

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<GPUIndexBufBuilder *>(_userdata);
+  GPUIndexBufBuilder *sub_builder = static_cast<GPUIndexBufBuilder *>(
+      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<GPUIndexBufBuilder *>(_userdata);
+  GPUIndexBufBuilder *sub_builder = static_cast<GPUIndexBufBuilder *>(_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;
 }



More information about the Bf-blender-cvs mailing list