Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source/blender/draw/intern/draw_cache_impl_mesh.c22
1 files changed, 21 insertions, 1 deletions
diff --git a/source/blender/draw/intern/draw_cache_impl_mesh.c b/source/blender/draw/intern/draw_cache_impl_mesh.c
index 12c6a715685..abc45f5e0a2 100644
--- a/source/blender/draw/intern/draw_cache_impl_mesh.c
+++ b/source/blender/draw/intern/draw_cache_impl_mesh.c
@@ -969,6 +969,7 @@ void DRW_mesh_batch_cache_free_old(Mesh *me, int ctime)
void DRW_mesh_batch_cache_create_requested(
Object *ob, Mesh *me, const Scene *scene, const bool is_paint_mode, const bool use_hide)
{
+ GPUIndexBuf **saved_elem_ranges = NULL;
const ToolSettings *ts = NULL;
if (scene) {
ts = scene->toolsettings;
@@ -1031,6 +1032,17 @@ void DRW_mesh_batch_cache_create_requested(
GPU_VERTBUF_DISCARD_SAFE(mbuffercache->vbo.vcol);
}
}
+ /* XXX save element buffer to avoid recreating them.
+ * This is only if the cd_needed changes so it is ok to keep them.*/
+ if (cache->surface_per_mat[0]->elem) {
+ saved_elem_ranges = MEM_callocN(sizeof(saved_elem_ranges) * cache->mat_len, __func__);
+ for (int i = 0; i < cache->mat_len; ++i) {
+ saved_elem_ranges[i] = cache->surface_per_mat[i]->elem;
+ /* Avoid deletion as the batch is owner. */
+ cache->surface_per_mat[i]->elem = NULL;
+ cache->surface_per_mat[i]->owns_flag &= ~GPU_BATCH_OWNS_INDEX;
+ }
+ }
/* We can't discard batches at this point as they have been
* referenced for drawing. Just clear them in place. */
for (int i = 0; i < cache->mat_len; ++i) {
@@ -1151,7 +1163,13 @@ void DRW_mesh_batch_cache_create_requested(
/* Per Material */
for (int i = 0; i < cache->mat_len; ++i) {
if (DRW_batch_requested(cache->surface_per_mat[i], GPU_PRIM_TRIS)) {
- DRW_ibo_request(cache->surface_per_mat[i], &mbufcache->ibo.tris);
+ if (saved_elem_ranges && saved_elem_ranges[i]) {
+ /* XXX assign old element buffer range (it did not change).*/
+ GPU_batch_elembuf_set(cache->surface_per_mat[i], saved_elem_ranges[i], true);
+ }
+ else {
+ DRW_ibo_request(cache->surface_per_mat[i], &mbufcache->ibo.tris);
+ }
/* Order matters. First ones override latest vbos' attribs. */
DRW_vbo_request(cache->surface_per_mat[i], &mbufcache->vbo.lnor);
DRW_vbo_request(cache->surface_per_mat[i], &mbufcache->vbo.pos_nor);
@@ -1170,6 +1188,8 @@ void DRW_mesh_batch_cache_create_requested(
}
}
+ MEM_SAFE_FREE(saved_elem_ranges);
+
mbufcache = (do_cage) ? &cache->cage : &cache->final;
/* Edit Mesh */