diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2018-09-19 20:36:25 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2018-09-19 21:02:12 +0300 |
commit | 7ad8272952c6465dca67b7ece2e80ab6b51a4ed9 (patch) | |
tree | 91f5c3e988aa9fb4e32629e85e3ef88543c54cf3 | |
parent | 960ab2ab580b58bd12cedd0052773f7bbed4b62f (diff) |
DRW: Only trash UV and tangent data when using BKE_MESH_BATCH_DIRTY_SHADING
This improves the problem encountered when animating materials on static
meshes but does not fix the core issue. See T55326.
-rw-r--r-- | source/blender/draw/intern/draw_cache_impl_mesh.c | 43 |
1 files changed, 23 insertions, 20 deletions
diff --git a/source/blender/draw/intern/draw_cache_impl_mesh.c b/source/blender/draw/intern/draw_cache_impl_mesh.c index 3314030cd5e..fe24ad707c1 100644 --- a/source/blender/draw/intern/draw_cache_impl_mesh.c +++ b/source/blender/draw/intern/draw_cache_impl_mesh.c @@ -1732,6 +1732,27 @@ static MeshBatchCache *mesh_batch_cache_get(Mesh *me) return me->runtime.batch_cache; } +static void mesh_batch_cache_discard_shaded_tri(MeshBatchCache *cache) +{ + GPU_VERTBUF_DISCARD_SAFE(cache->shaded_triangles_data); + if (cache->shaded_triangles_in_order) { + for (int i = 0; i < cache->mat_len; ++i) { + GPU_INDEXBUF_DISCARD_SAFE(cache->shaded_triangles_in_order[i]); + } + } + if (cache->shaded_triangles) { + for (int i = 0; i < cache->mat_len; ++i) { + GPU_BATCH_DISCARD_SAFE(cache->shaded_triangles[i]); + } + } + + MEM_SAFE_FREE(cache->shaded_triangles_in_order); + MEM_SAFE_FREE(cache->shaded_triangles); + + MEM_SAFE_FREE(cache->auto_layer_names); + MEM_SAFE_FREE(cache->auto_layer_is_srgb); +} + void DRW_mesh_batch_cache_dirty_tag(Mesh *me, int mode) { MeshBatchCache *cache = me->runtime.batch_cache; @@ -1763,9 +1784,7 @@ void DRW_mesh_batch_cache_dirty_tag(Mesh *me, int mode) cache->is_dirty = true; break; case BKE_MESH_BATCH_DIRTY_SHADING: - /* TODO: This should only update UV and tangent data, - * and not free the entire cache. */ - cache->is_dirty = true; + mesh_batch_cache_discard_shaded_tri(cache); break; case BKE_MESH_BATCH_DIRTY_SCULPT_COORDS: cache->is_sculpt_points_tag = true; @@ -1877,23 +1896,7 @@ static void mesh_batch_cache_clear(Mesh *me) GPU_VERTBUF_DISCARD_SAFE(cache->edges_face_overlay); DRW_TEXTURE_FREE_SAFE(cache->edges_face_overlay_tx); - GPU_VERTBUF_DISCARD_SAFE(cache->shaded_triangles_data); - if (cache->shaded_triangles_in_order) { - for (int i = 0; i < cache->mat_len; ++i) { - GPU_INDEXBUF_DISCARD_SAFE(cache->shaded_triangles_in_order[i]); - } - } - if (cache->shaded_triangles) { - for (int i = 0; i < cache->mat_len; ++i) { - GPU_BATCH_DISCARD_SAFE(cache->shaded_triangles[i]); - } - } - - MEM_SAFE_FREE(cache->shaded_triangles_in_order); - MEM_SAFE_FREE(cache->shaded_triangles); - - MEM_SAFE_FREE(cache->auto_layer_names); - MEM_SAFE_FREE(cache->auto_layer_is_srgb); + mesh_batch_cache_discard_shaded_tri(cache); if (cache->texpaint_triangles) { for (int i = 0; i < cache->mat_len; ++i) { |