diff options
author | Richard Antalik <richardantalik@gmail.com> | 2019-09-14 03:21:54 +0300 |
---|---|---|
committer | Richard Antalik <richardantalik@gmail.com> | 2019-09-14 03:24:42 +0300 |
commit | ab3a9dc1ed28d44bd71f5e255da74ef4d6f1fdbf (patch) | |
tree | 957e85faac06300afcb8bb76087c0683f0a45496 /source/blender/blenkernel/intern/sequencer.c | |
parent | 0547a7753643f45861306542857d97215ecb2c4f (diff) |
VSE: prefetching
When enabled prefetching(preview panel>view settings), a pernament running job
is created, that will render frames in the background until the cache is full.
If the cache is not filled fast enough, prefetch job suspends itself
at the last moment and will wait until it has chance to "catch up".
Effectively this will decouple rendering to separate thread, so rendering
itself is a bit faster.
Cache recycling behavior will be changed to "free furthest frame to the left
of playhead if possible, otherwise rightmost frame".
Reviewed By: brecht
Differential Revision: https://developer.blender.org/D5386
Diffstat (limited to 'source/blender/blenkernel/intern/sequencer.c')
-rw-r--r-- | source/blender/blenkernel/intern/sequencer.c | 25 |
1 files changed, 21 insertions, 4 deletions
diff --git a/source/blender/blenkernel/intern/sequencer.c b/source/blender/blenkernel/intern/sequencer.c index 14096335626..2e36982f7d8 100644 --- a/source/blender/blenkernel/intern/sequencer.c +++ b/source/blender/blenkernel/intern/sequencer.c @@ -112,6 +112,8 @@ static ImBuf *seq_render_mask(const SeqRenderData *context, Mask *mask, float nr static int seq_num_files(Scene *scene, char views_format, const bool is_multiview); static void seq_anim_add_suffix(Scene *scene, struct anim *anim, const int view_id); +static ThreadMutex seq_render_mutex = BLI_MUTEX_INITIALIZER; + /* **** XXX ******** */ #define SELECT 1 ListBase seqbase_clipboard; @@ -483,6 +485,7 @@ void BKE_sequencer_editing_free(Scene *scene, const bool do_id_user) return; } + BKE_sequencer_prefetch_free(scene); BKE_sequencer_cache_destruct(scene); SEQ_BEGIN (ed, seq) { @@ -492,7 +495,6 @@ void BKE_sequencer_editing_free(Scene *scene, const bool do_id_user) SEQ_END; BLI_freelistN(&ed->metastack); - MEM_freeN(ed); scene->ed = NULL; @@ -635,6 +637,8 @@ void BKE_sequencer_new_render_data(Main *bmain, r_context->is_proxy_render = false; r_context->view_id = 0; r_context->gpu_offscreen = NULL; + r_context->task_id = SEQ_TASK_MAIN_RENDER; + r_context->is_prefetch_render = false; } /* ************************* iterator ************************** */ @@ -4092,18 +4096,29 @@ ImBuf *BKE_sequencer_give_ibuf(const SeqRenderData *context, float cfra, int cha out = BKE_sequencer_cache_get(context, seq_arr[count - 1], cfra, SEQ_CACHE_STORE_FINAL_OUT); } - BKE_sequencer_cache_free_temp_cache(context->scene, 0, cfra); + BKE_sequencer_cache_free_temp_cache(context->scene, context->task_id, cfra); clock_t begin = seq_estimate_render_cost_begin(); float cost = 0; if (count && !out) { + BLI_mutex_lock(&seq_render_mutex); out = seq_render_strip_stack(context, &state, seqbasep, cfra, chanshown); cost = seq_estimate_render_cost_end(context->scene, begin); - BKE_sequencer_cache_put_if_possible( - context, seq_arr[count - 1], cfra, SEQ_CACHE_STORE_FINAL_OUT, out, cost); + + if (context->is_prefetch_render) { + BKE_sequencer_cache_put( + context, seq_arr[count - 1], cfra, SEQ_CACHE_STORE_FINAL_OUT, out, cost); + } + else { + BKE_sequencer_cache_put_if_possible( + context, seq_arr[count - 1], cfra, SEQ_CACHE_STORE_FINAL_OUT, out, cost); + } + BLI_mutex_unlock(&seq_render_mutex); } + BKE_sequencer_prefetch_start(context, cfra, cost); + return out; } @@ -4334,6 +4349,7 @@ static void sequence_invalidate_cache(Scene *scene, } sequence_do_invalidate_dependent(scene, seq, &ed->seqbase); + BKE_sequencer_prefetch_stop(scene); } void BKE_sequence_invalidate_cache_raw(Scene *scene, Sequence *seq) @@ -4419,6 +4435,7 @@ void BKE_sequencer_free_imbuf(Scene *scene, ListBase *seqbase, bool for_render) Sequence *seq; BKE_sequencer_cache_cleanup(scene); + BKE_sequencer_prefetch_stop(scene); for (seq = seqbase->first; seq; seq = seq->next) { if (for_render && CFRA >= seq->startdisp && CFRA <= seq->enddisp) { |