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/mesh_extractors/extract_mesh_ibo_tris.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/mesh_extractors/extract_mesh_ibo_tris.cc')
-rw-r--r-- | source/blender/draw/intern/mesh_extractors/extract_mesh_ibo_tris.cc | 47 |
1 files changed, 5 insertions, 42 deletions
diff --git a/source/blender/draw/intern/mesh_extractors/extract_mesh_ibo_tris.cc b/source/blender/draw/intern/mesh_extractors/extract_mesh_ibo_tris.cc index 70b46481b51..ec968fa33da 100644 --- a/source/blender/draw/intern/mesh_extractors/extract_mesh_ibo_tris.cc +++ b/source/blender/draw/intern/mesh_extractors/extract_mesh_ibo_tris.cc @@ -33,7 +33,7 @@ namespace blender::draw { struct MeshExtract_Tri_Data { GPUIndexBufBuilder elb; - int *tri_mat_start; + const int *tri_mat_start; int *tri_mat_end; }; @@ -43,45 +43,9 @@ static void extract_tris_init(const MeshRenderData *mr, void *tls_data) { MeshExtract_Tri_Data *data = static_cast<MeshExtract_Tri_Data *>(tls_data); - - size_t mat_tri_idx_size = sizeof(int) * mr->mat_len; - data->tri_mat_start = static_cast<int *>(MEM_callocN(mat_tri_idx_size, __func__)); - data->tri_mat_end = static_cast<int *>(MEM_callocN(mat_tri_idx_size, __func__)); - - int *mat_tri_len = data->tri_mat_start; - /* Count how many triangle for each material. */ - if (mr->extract_type == MR_EXTRACT_BMESH) { - BMIter iter; - BMFace *efa; - BM_ITER_MESH (efa, &iter, mr->bm, BM_FACES_OF_MESH) { - if (!BM_elem_flag_test(efa, BM_ELEM_HIDDEN)) { - int mat = min_ii(efa->mat_nr, mr->mat_len - 1); - mat_tri_len[mat] += efa->len - 2; - } - } - } - else { - const MPoly *mp = mr->mpoly; - for (int mp_index = 0; mp_index < mr->poly_len; mp_index++, mp++) { - if (!(mr->use_hide && (mp->flag & ME_HIDE))) { - int mat = min_ii(mp->mat_nr, mr->mat_len - 1); - mat_tri_len[mat] += mp->totloop - 2; - } - } - } - /* Accumulate triangle lengths per material to have correct offsets. */ - int ofs = mat_tri_len[0]; - mat_tri_len[0] = 0; - for (int i = 1; i < mr->mat_len; i++) { - int tmp = mat_tri_len[i]; - mat_tri_len[i] = ofs; - ofs += tmp; - } - - memcpy(data->tri_mat_end, mat_tri_len, mat_tri_idx_size); - - int visible_tri_tot = ofs; - GPU_indexbuf_init(&data->elb, GPU_PRIM_TRIS, visible_tri_tot, mr->loop_len); + data->tri_mat_start = mr->mat_offsets.tri; + data->tri_mat_end = static_cast<int *>(MEM_dupallocN(data->tri_mat_start)); + GPU_indexbuf_init(&data->elb, GPU_PRIM_TRIS, mr->mat_offsets.visible_tri_len, mr->loop_len); } static void extract_tris_iter_looptri_bm(const MeshRenderData *mr, @@ -146,7 +110,6 @@ static void extract_tris_finish(const MeshRenderData *mr, GPU_indexbuf_create_subrange_in_place(mbc_final->tris_per_mat[i], ibo, start, len); } } - MEM_freeN(data->tri_mat_start); MEM_freeN(data->tri_mat_end); } @@ -157,7 +120,7 @@ constexpr MeshExtract create_extractor_tris() extractor.iter_looptri_bm = extract_tris_iter_looptri_bm; extractor.iter_looptri_mesh = extract_tris_iter_looptri_mesh; extractor.finish = extract_tris_finish; - extractor.data_type = MR_DATA_NONE; + extractor.data_type = MR_DATA_MAT_OFFSETS; extractor.data_size = sizeof(MeshExtract_Tri_Data); extractor.use_threading = false; extractor.mesh_buffer_offset = offsetof(MeshBufferCache, ibo.tris); |