diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2020-02-05 21:32:51 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2020-02-05 21:32:51 +0300 |
commit | cad09e5227df3261662cba4a912605b6ffc671c1 (patch) | |
tree | 764ba8723e982cc2f69e778b8e9282baea29b105 /source/blender/draw/intern | |
parent | 00a0f062410a864e5592ed318ea4228c9dd2b589 (diff) | |
parent | 092deb88b074848c5b252ba6b7bb2d9890c8a2cc (diff) |
Merge branch 'blender-v2.82-release'
Diffstat (limited to 'source/blender/draw/intern')
-rw-r--r-- | source/blender/draw/intern/draw_cache_impl_curve.c | 22 |
1 files changed, 7 insertions, 15 deletions
diff --git a/source/blender/draw/intern/draw_cache_impl_curve.c b/source/blender/draw/intern/draw_cache_impl_curve.c index 25699cd7653..1c3996e2290 100644 --- a/source/blender/draw/intern/draw_cache_impl_curve.c +++ b/source/blender/draw/intern/draw_cache_impl_curve.c @@ -458,16 +458,10 @@ static void curve_batch_cache_init(Curve *cu) #endif cache->cd_used = 0; - cache->mat_len = max_ii(1, cu->totcol); - cache->surf_per_mat_tris = MEM_mallocN(sizeof(*cache->surf_per_mat_tris) * cache->mat_len, + cache->mat_len = DRW_curve_material_count_get(cu); + cache->surf_per_mat_tris = MEM_callocN(sizeof(*cache->surf_per_mat_tris) * cache->mat_len, __func__); - cache->surf_per_mat = MEM_mallocN(sizeof(*cache->surf_per_mat) * cache->mat_len, __func__); - - /* TODO Might be wiser to alloc in one chunk. */ - for (int i = 0; i < cache->mat_len; i++) { - cache->surf_per_mat_tris[i] = MEM_callocN(sizeof(GPUIndexBuf), "GPUIndexBuf"); - cache->surf_per_mat[i] = MEM_callocN(sizeof(GPUBatch), "GPUBatch"); - } + cache->surf_per_mat = MEM_callocN(sizeof(*cache->surf_per_mat) * cache->mat_len, __func__); cache->is_editmode = (cu->editnurb != NULL) || (cu->editfont != NULL); @@ -934,15 +928,13 @@ void DRW_curve_batch_cache_create_requested(Object *ob) /* Verify that all surface batches have needed attribute layers. */ /* TODO(fclem): We could be a bit smarter here and only do it per material. */ - for (int i = 0; i < cache->mat_len; i++) { - if ((cache->cd_used & cache->cd_needed) != cache->cd_needed) { + if ((cache->cd_used & cache->cd_needed) != cache->cd_needed) { + for (int i = 0; i < cache->mat_len; i++) { /* We can't discard batches at this point as they have been * referenced for drawing. Just clear them in place. */ - GPU_batch_clear(cache->surf_per_mat[i]); - memset(cache->surf_per_mat[i], 0, sizeof(*cache->surf_per_mat[i])); + GPU_BATCH_CLEAR_SAFE(cache->surf_per_mat[i]); } - } - if ((cache->cd_used & cache->cd_needed) != cache->cd_needed) { + cache->cd_used |= cache->cd_needed; cache->cd_needed = 0; } |