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:
authorRichard Antalik <richardantalik@gmail.com>2019-05-23 21:52:28 +0300
committerRichard Antalik <richardantalik@gmail.com>2019-05-23 21:52:28 +0300
commitfd51d2f97cbe0117e8939396f196366a0043849e (patch)
treeb0d1c8c41fa1cf0332cac64424b0b20191069411 /source/blender/blenkernel/intern/seqcache.c
parent1fd7b380f4cf8a0489b405de2819f228a4da5ea2 (diff)
VSE: minimal cache invalidation
Diffstat (limited to 'source/blender/blenkernel/intern/seqcache.c')
-rw-r--r--source/blender/blenkernel/intern/seqcache.c35
1 files changed, 32 insertions, 3 deletions
diff --git a/source/blender/blenkernel/intern/seqcache.c b/source/blender/blenkernel/intern/seqcache.c
index f77b3e99e30..6f5b5f90d37 100644
--- a/source/blender/blenkernel/intern/seqcache.c
+++ b/source/blender/blenkernel/intern/seqcache.c
@@ -476,7 +476,10 @@ void BKE_sequencer_cache_cleanup(Scene *scene)
seq_cache_unlock(scene);
}
-void BKE_sequencer_cache_cleanup_sequence(Scene *scene, Sequence *seq)
+void BKE_sequencer_cache_cleanup_sequence(Scene *scene,
+ Sequence *seq,
+ Sequence *seq_changed,
+ int invalidate_types)
{
SeqCache *cache = seq_cache_get_from_scene(scene);
if (!cache) {
@@ -485,14 +488,40 @@ void BKE_sequencer_cache_cleanup_sequence(Scene *scene, Sequence *seq)
seq_cache_lock(scene);
+ int range_start = seq_changed->startdisp;
+ int range_end = seq_changed->enddisp;
+
+ if (seq->startdisp > range_start) {
+ range_start = seq->startdisp;
+ }
+
+ if (seq->enddisp < range_end) {
+ range_end = seq->enddisp;
+ }
+
+ int invalidate_composite = invalidate_types & SEQ_CACHE_STORE_FINAL_OUT;
+ int invalidate_source = invalidate_types & (SEQ_CACHE_STORE_RAW | SEQ_CACHE_STORE_PREPROCESSED |
+ SEQ_CACHE_STORE_COMPOSITE);
+
GHashIterator gh_iter;
BLI_ghashIterator_init(&gh_iter, cache->hash);
while (!BLI_ghashIterator_done(&gh_iter)) {
SeqCacheKey *key = BLI_ghashIterator_getKey(&gh_iter);
BLI_ghashIterator_step(&gh_iter);
- if (key->seq == seq) {
- /* Relink keys, so we don't end up with orphaned keys */
+ int key_cfra = key->seq->start + key->nfra;
+
+ /* clean all final and composite in intersection of seq and seq_changed */
+ if (key->type & invalidate_composite && key_cfra >= range_start && key_cfra <= range_end) {
+ if (key->link_next || key->link_prev) {
+ seq_cache_relink_keys(key->link_next, key->link_prev);
+ }
+
+ BLI_ghash_remove(cache->hash, key, seq_cache_keyfree, seq_cache_valfree);
+ }
+
+ if (key->type & invalidate_source && key->seq == seq && key_cfra >= seq_changed->startdisp &&
+ key_cfra <= seq_changed->enddisp) {
if (key->link_next || key->link_prev) {
seq_cache_relink_keys(key->link_next, key->link_prev);
}