diff options
author | Jeroen Bakker <jbakker> | 2021-06-15 16:31:17 +0300 |
---|---|---|
committer | Jeroen Bakker <jeroen@blender.org> | 2021-06-15 16:31:34 +0300 |
commit | 174ed69c1ba8cb8ca7ac39d41922bc203f78326f (patch) | |
tree | 547312bc79a8ce1e415f09f6d4966594e223a483 /source/blender/draw/intern/draw_cache_extract_mesh.cc | |
parent | 7c8b9c7a9aceed5186657fb0ac11cb844f16fec6 (diff) |
DrawManager: Cache material offsets.
When using multiple materials in a single mesh the most time is spend in
counting the offsets of each material for the sorting.
This patch moves the counting of the offsets to render mesh data and
caches it as long as the geometry doesn't change.
This patch doesn't include multithreading of this code.
Reviewed By: mano-wii
Differential Revision: https://developer.blender.org/D11612
Diffstat (limited to 'source/blender/draw/intern/draw_cache_extract_mesh.cc')
-rw-r--r-- | source/blender/draw/intern/draw_cache_extract_mesh.cc | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/source/blender/draw/intern/draw_cache_extract_mesh.cc b/source/blender/draw/intern/draw_cache_extract_mesh.cc index c6b749fe11a..021565fceac 100644 --- a/source/blender/draw/intern/draw_cache_extract_mesh.cc +++ b/source/blender/draw/intern/draw_cache_extract_mesh.cc @@ -498,11 +498,15 @@ static struct TaskNode *extract_task_node_create(struct TaskGraph *task_graph, * \{ */ struct MeshRenderDataUpdateTaskData { MeshRenderData *mr = nullptr; + MeshBufferExtractionCache *cache = nullptr; eMRIterType iter_type; eMRDataType data_flag; - MeshRenderDataUpdateTaskData(MeshRenderData *mr, eMRIterType iter_type, eMRDataType data_flag) - : mr(mr), iter_type(iter_type), data_flag(data_flag) + MeshRenderDataUpdateTaskData(MeshRenderData *mr, + MeshBufferExtractionCache *cache, + eMRIterType iter_type, + eMRDataType data_flag) + : mr(mr), cache(cache), iter_type(iter_type), data_flag(data_flag) { } @@ -533,15 +537,17 @@ static void mesh_extract_render_data_node_exec(void *__restrict task_data) mesh_render_data_update_normals(mr, data_flag); mesh_render_data_update_looptris(mr, iter_type, data_flag); + mesh_render_data_update_mat_offsets(mr, update_task_data->cache, data_flag); } static struct TaskNode *mesh_extract_render_data_node_create(struct TaskGraph *task_graph, MeshRenderData *mr, + MeshBufferExtractionCache *cache, const eMRIterType iter_type, const eMRDataType data_flag) { MeshRenderDataUpdateTaskData *task_data = new MeshRenderDataUpdateTaskData( - mr, iter_type, data_flag); + mr, cache, iter_type, data_flag); struct TaskNode *task_node = BLI_task_graph_node_create( task_graph, @@ -702,7 +708,7 @@ static void mesh_buffer_cache_create_requested(struct TaskGraph *task_graph, #endif struct TaskNode *task_node_mesh_render_data = mesh_extract_render_data_node_create( - task_graph, mr, iter_type, data_flag); + task_graph, mr, extraction_cache, iter_type, data_flag); /* Simple heuristic. */ const bool use_thread = (mr->loop_len + mr->loop_loose_len) > MIM_RANGE_LEN; |