Merge branch 'blender-v2.83-release'
This commit is contained in:
commit
f5c682045d
@ -1217,6 +1217,11 @@ void BKE_sequencer_cache_cleanup_sequence(Scene *scene,
|
||||
struct ImBuf *BKE_sequencer_cache_get(
|
||||
const SeqRenderData *context, Sequence *seq, float cfra, int type, bool skip_disk_cache)
|
||||
{
|
||||
|
||||
if (context->skip_cache || context->is_proxy_render || !seq) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
Scene *scene = context->scene;
|
||||
|
||||
if (context->is_prefetch_render) {
|
||||
@ -1314,6 +1319,10 @@ void BKE_sequencer_cache_put(const SeqRenderData *context,
|
||||
float cost,
|
||||
bool skip_disk_cache)
|
||||
{
|
||||
if (i == NULL || context->skip_cache || context->is_proxy_render || !seq) {
|
||||
return;
|
||||
}
|
||||
|
||||
Scene *scene = context->scene;
|
||||
|
||||
if (context->is_prefetch_render) {
|
||||
@ -1322,10 +1331,6 @@ void BKE_sequencer_cache_put(const SeqRenderData *context,
|
||||
seq = BKE_sequencer_prefetch_get_original_sequence(seq, scene);
|
||||
}
|
||||
|
||||
if (i == NULL || context->skip_cache || context->is_proxy_render || !seq) {
|
||||
return;
|
||||
}
|
||||
|
||||
/* Prevent reinserting, it breaks cache key linking. */
|
||||
ImBuf *test = BKE_sequencer_cache_get(context, seq, cfra, type, true);
|
||||
if (test) {
|
||||
|
@ -179,12 +179,17 @@ static bool seq_prefetch_is_cache_full(Scene *scene)
|
||||
return BKE_sequencer_cache_recycle_item(pfjob->scene) == false;
|
||||
}
|
||||
|
||||
static float seq_prefetch_cfra(PrefetchJob *pfjob)
|
||||
{
|
||||
return pfjob->cfra + pfjob->num_frames_prefetched;
|
||||
}
|
||||
|
||||
void BKE_sequencer_prefetch_get_time_range(Scene *scene, int *start, int *end)
|
||||
{
|
||||
PrefetchJob *pfjob = seq_prefetch_job_get(scene);
|
||||
|
||||
*start = pfjob->cfra;
|
||||
*end = pfjob->cfra + pfjob->num_frames_prefetched;
|
||||
*end = seq_prefetch_cfra(pfjob);
|
||||
}
|
||||
|
||||
static void seq_prefetch_free_depsgraph(PrefetchJob *pfjob)
|
||||
@ -198,8 +203,7 @@ static void seq_prefetch_free_depsgraph(PrefetchJob *pfjob)
|
||||
|
||||
static void seq_prefetch_update_depsgraph(PrefetchJob *pfjob)
|
||||
{
|
||||
DEG_evaluate_on_framechange(
|
||||
pfjob->bmain_eval, pfjob->depsgraph, pfjob->cfra + pfjob->num_frames_prefetched);
|
||||
DEG_evaluate_on_framechange(pfjob->bmain_eval, pfjob->depsgraph, seq_prefetch_cfra(pfjob));
|
||||
}
|
||||
|
||||
static void seq_prefetch_init_depsgraph(PrefetchJob *pfjob)
|
||||
@ -347,7 +351,7 @@ static bool seq_prefetch_do_skip_frame(Scene *scene)
|
||||
{
|
||||
Editing *ed = scene->ed;
|
||||
PrefetchJob *pfjob = seq_prefetch_job_get(scene);
|
||||
float cfra = pfjob->cfra + pfjob->num_frames_prefetched;
|
||||
float cfra = seq_prefetch_cfra(pfjob);
|
||||
Sequence *seq_arr[MAXSEQ + 1];
|
||||
int count = BKE_sequencer_get_shown_sequences(ed->seqbasep, cfra, 0, seq_arr);
|
||||
SeqRenderData *ctx = &pfjob->context_cpy;
|
||||
@ -403,18 +407,37 @@ static bool seq_prefetch_do_skip_frame(Scene *scene)
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool seq_prefetch_need_suspend(PrefetchJob *pfjob)
|
||||
{
|
||||
return seq_prefetch_is_cache_full(pfjob->scene) || seq_prefetch_is_scrubbing(pfjob->bmain) ||
|
||||
(seq_prefetch_cfra(pfjob) >= pfjob->scene->r.efra);
|
||||
}
|
||||
|
||||
static void seq_prefetch_do_suspend(PrefetchJob *pfjob)
|
||||
{
|
||||
BLI_mutex_lock(&pfjob->prefetch_suspend_mutex);
|
||||
while (seq_prefetch_need_suspend(pfjob) &&
|
||||
(pfjob->scene->ed->cache_flag & SEQ_CACHE_PREFETCH_ENABLE) && !pfjob->stop) {
|
||||
pfjob->waiting = true;
|
||||
BLI_condition_wait(&pfjob->prefetch_suspend_cond, &pfjob->prefetch_suspend_mutex);
|
||||
seq_prefetch_update_area(pfjob);
|
||||
}
|
||||
pfjob->waiting = false;
|
||||
BLI_mutex_unlock(&pfjob->prefetch_suspend_mutex);
|
||||
}
|
||||
|
||||
static void *seq_prefetch_frames(void *job)
|
||||
{
|
||||
PrefetchJob *pfjob = (PrefetchJob *)job;
|
||||
|
||||
while (pfjob->cfra + pfjob->num_frames_prefetched <= pfjob->scene->r.efra) {
|
||||
while (seq_prefetch_cfra(pfjob) <= pfjob->scene->r.efra) {
|
||||
pfjob->scene_eval->ed->prefetch_job = NULL;
|
||||
|
||||
seq_prefetch_update_depsgraph(pfjob);
|
||||
AnimData *adt = BKE_animdata_from_id(&pfjob->context_cpy.scene->id);
|
||||
BKE_animsys_evaluate_animdata(&pfjob->context_cpy.scene->id,
|
||||
adt,
|
||||
pfjob->cfra + pfjob->num_frames_prefetched,
|
||||
seq_prefetch_cfra(pfjob),
|
||||
ADT_RECALC_ALL,
|
||||
false);
|
||||
|
||||
@ -431,26 +454,17 @@ static void *seq_prefetch_frames(void *job)
|
||||
continue;
|
||||
}
|
||||
|
||||
ImBuf *ibuf = BKE_sequencer_give_ibuf(
|
||||
&pfjob->context_cpy, pfjob->cfra + pfjob->num_frames_prefetched, 0);
|
||||
ImBuf *ibuf = BKE_sequencer_give_ibuf(&pfjob->context_cpy, seq_prefetch_cfra(pfjob), 0);
|
||||
BKE_sequencer_cache_free_temp_cache(
|
||||
pfjob->scene, pfjob->context.task_id, pfjob->cfra + pfjob->num_frames_prefetched);
|
||||
pfjob->scene, pfjob->context.task_id, seq_prefetch_cfra(pfjob));
|
||||
IMB_freeImBuf(ibuf);
|
||||
|
||||
/* suspend thread */
|
||||
BLI_mutex_lock(&pfjob->prefetch_suspend_mutex);
|
||||
while ((seq_prefetch_is_cache_full(pfjob->scene) || seq_prefetch_is_scrubbing(pfjob->bmain)) &&
|
||||
pfjob->scene->ed->cache_flag & SEQ_CACHE_PREFETCH_ENABLE && !pfjob->stop) {
|
||||
pfjob->waiting = true;
|
||||
BLI_condition_wait(&pfjob->prefetch_suspend_cond, &pfjob->prefetch_suspend_mutex);
|
||||
seq_prefetch_update_area(pfjob);
|
||||
}
|
||||
pfjob->waiting = false;
|
||||
BLI_mutex_unlock(&pfjob->prefetch_suspend_mutex);
|
||||
/* Suspend thread if there is nothing to be prefetched. */
|
||||
seq_prefetch_do_suspend(pfjob);
|
||||
|
||||
/* Avoid "collision" with main thread, but make sure to fetch at least few frames */
|
||||
if (pfjob->num_frames_prefetched > 5 &&
|
||||
(pfjob->cfra + pfjob->num_frames_prefetched - pfjob->scene->r.cfra) < 2) {
|
||||
(seq_prefetch_cfra(pfjob) - pfjob->scene->r.cfra) < 2) {
|
||||
break;
|
||||
}
|
||||
|
||||
@ -463,7 +477,7 @@ static void *seq_prefetch_frames(void *job)
|
||||
}
|
||||
|
||||
BKE_sequencer_cache_free_temp_cache(
|
||||
pfjob->scene, pfjob->context.task_id, pfjob->cfra + pfjob->num_frames_prefetched);
|
||||
pfjob->scene, pfjob->context.task_id, seq_prefetch_cfra(pfjob));
|
||||
pfjob->running = false;
|
||||
pfjob->scene_eval->ed->prefetch_job = NULL;
|
||||
|
||||
@ -520,10 +534,12 @@ void BKE_sequencer_prefetch_start(const SeqRenderData *context, float cfra, floa
|
||||
seq_prefetch_resume(scene);
|
||||
/* conditions to start:
|
||||
* prefetch enabled, prefetch not running, not scrubbing,
|
||||
* not playing and rendering-expensive footage, cache storage enabled, has strips to render
|
||||
* not playing and rendering-expensive footage, cache storage enabled, has strips to render,
|
||||
* not rendering.
|
||||
*/
|
||||
if ((ed->cache_flag & SEQ_CACHE_PREFETCH_ENABLE) && !running && !scrubbing &&
|
||||
!(playing && cost > 0.9) && ed->cache_flag & SEQ_CACHE_ALL_TYPES && has_strips) {
|
||||
!(playing && cost > 0.9) && ed->cache_flag & SEQ_CACHE_ALL_TYPES && has_strips &&
|
||||
!G.is_rendering) {
|
||||
|
||||
seq_prefetch_start(context, cfra);
|
||||
}
|
||||
|
@ -5559,7 +5559,7 @@ static int ui_do_but_BLOCK(bContext *C, uiBut *but, uiHandleButtonData *data, co
|
||||
}
|
||||
else if (but->type == UI_BTYPE_MENU) {
|
||||
if (ELEM(event->type, WHEELDOWNMOUSE, WHEELUPMOUSE) && event->ctrl) {
|
||||
const int direction = (event->type == WHEELDOWNMOUSE) ? -1 : 1;
|
||||
const int direction = (event->type == WHEELDOWNMOUSE) ? 1 : -1;
|
||||
|
||||
data->value = ui_but_menu_step(but, direction);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user