Blender V4.3
prefetch.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2001-2002 NaN Holding BV. All rights reserved.
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
9#include <cstddef>
10#include <cstdlib>
11#include <cstring>
12
13#include "MEM_guardedalloc.h"
14
15#include "DNA_scene_types.h"
16#include "DNA_screen_types.h"
17#include "DNA_sequence_types.h"
18#include "DNA_space_types.h"
19
20#include "BLI_listbase.h"
21#include "BLI_threads.h"
22
23#include "IMB_imbuf.hh"
24#include "IMB_imbuf_types.hh"
25
26#include "BKE_anim_data.hh"
27#include "BKE_animsys.h"
28#include "BKE_context.hh"
29#include "BKE_global.hh"
30#include "BKE_layer.hh"
31#include "BKE_main.hh"
32
33#include "DEG_depsgraph.hh"
37
38#include "SEQ_channels.hh"
39#include "SEQ_iterator.hh"
40#include "SEQ_prefetch.hh"
41#include "SEQ_relations.hh"
42#include "SEQ_render.hh"
43#include "SEQ_sequencer.hh"
44
45#include "image_cache.hh"
46#include "prefetch.hh"
47#include "render.hh"
48
49struct PrefetchJob {
51
56 Depsgraph *depsgraph;
57
60
62
63 /* context */
68
69 /* prefetch area */
70 float cfra;
72
73 /* Control: */
74 /* Set by prefetch. */
75 bool running;
76 bool waiting;
77 bool stop;
78 /* Set from outside. */
80};
81
83{
84 if (scene && scene->ed) {
85 return scene->ed->prefetch_job;
86 }
87 return nullptr;
88}
89
91{
92 PrefetchJob *pfjob = seq_prefetch_job_get(scene);
93
94 if (!pfjob) {
95 return false;
96 }
97
98 return pfjob->running;
99}
100
101static void seq_prefetch_job_scrubbing_set(Scene *scene, bool is_scrubbing)
102{
103 PrefetchJob *pfjob = seq_prefetch_job_get(scene);
104
105 if (!pfjob) {
106 return;
107 }
108
109 pfjob->is_scrubbing = is_scrubbing;
110}
111
113{
114 PrefetchJob *pfjob = seq_prefetch_job_get(scene);
115
116 if (!pfjob) {
117 return false;
118 }
119
120 return pfjob->waiting;
121}
122
124{
125 LISTBASE_FOREACH (Sequence *, seq_orig, seqbase) {
126 if (STREQ(seq->name, seq_orig->name)) {
127 return seq_orig;
128 }
129
130 if (seq_orig->type == SEQ_TYPE_META) {
132 if (match != nullptr) {
133 return match;
134 }
135 }
136 }
137
138 return nullptr;
139}
140
142{
143 Editing *ed = scene->ed;
145}
146
148{
149 PrefetchJob *pfjob = seq_prefetch_job_get(context->scene);
150
151 return &pfjob->context;
152}
153
155{
156 PrefetchJob *pfjob = seq_prefetch_job_get(scene);
157
158 if (!seq_cache_is_full()) {
159 return false;
160 }
161
162 return seq_cache_recycle_item(pfjob->scene) == false;
163}
164
165static float seq_prefetch_cfra(PrefetchJob *pfjob)
166{
167 return pfjob->cfra + pfjob->num_frames_prefetched;
168}
173
174void seq_prefetch_get_time_range(Scene *scene, int *r_start, int *r_end)
175{
176 PrefetchJob *pfjob = seq_prefetch_job_get(scene);
177
178 *r_start = pfjob->cfra;
179 *r_end = seq_prefetch_cfra(pfjob);
180}
181
183{
184 if (pfjob->depsgraph != nullptr) {
186 }
187 pfjob->depsgraph = nullptr;
188 pfjob->scene_eval = nullptr;
189}
190
195
197{
198 Main *bmain = pfjob->bmain_eval;
199 Scene *scene = pfjob->scene;
200 ViewLayer *view_layer = BKE_view_layer_default_render(scene);
201
202 pfjob->depsgraph = DEG_graph_new(bmain, scene, view_layer, DAG_EVAL_RENDER);
203 DEG_debug_name_set(pfjob->depsgraph, "SEQUENCER PREFETCH");
204
205 /* Make sure there is a correct evaluated scene pointer. */
207
208 /* Update immediately so we have proper evaluated scene. */
210
212 pfjob->scene_eval->ed->cache_flag = 0;
213}
214
216{
217 int cfra = pfjob->scene->r.cfra;
218
219 /* rebase */
220 if (cfra > pfjob->cfra) {
221 int delta = cfra - pfjob->cfra;
222 pfjob->cfra = cfra;
223 pfjob->num_frames_prefetched -= delta;
224
225 if (pfjob->num_frames_prefetched <= 1) {
226 pfjob->num_frames_prefetched = 1;
227 }
228 }
229
230 /* reset */
231 if (cfra < pfjob->cfra) {
232 pfjob->cfra = cfra;
233 pfjob->num_frames_prefetched = 1;
234 }
235}
236
238{
239 /* TODO(Richard): Use wm_jobs for prefetch, or pass main. */
240 for (Scene *scene = static_cast<Scene *>(G.main->scenes.first); scene;
241 scene = static_cast<Scene *>(scene->id.next))
242 {
243 SEQ_prefetch_stop(scene);
244 }
245}
246
248{
249 PrefetchJob *pfjob;
250 pfjob = seq_prefetch_job_get(scene);
251
252 if (!pfjob) {
253 return;
254 }
255
256 pfjob->stop = true;
257
258 while (pfjob->running) {
260 }
261}
262
264{
265 PrefetchJob *pfjob;
266 pfjob = seq_prefetch_job_get(context->scene);
267
269 pfjob->depsgraph,
270 pfjob->scene_eval,
271 context->rectx,
272 context->recty,
273 context->preview_render_size,
274 false,
275 &pfjob->context_cpy);
276 pfjob->context_cpy.is_prefetch_render = true;
278
280 pfjob->depsgraph,
281 pfjob->scene,
282 context->rectx,
283 context->recty,
284 context->preview_render_size,
285 false,
286 &pfjob->context);
287 pfjob->context.is_prefetch_render = false;
288
289 /* Same ID as prefetch context, because context will be swapped, but we still
290 * want to assign this ID to cache entries created in this thread.
291 * This is to allow "temp cache" work correctly for both threads.
292 */
294}
295
297{
298 PrefetchJob *pfjob = seq_prefetch_job_get(scene);
299
300 if (!pfjob) {
301 return;
302 }
303
304 pfjob->scene = scene;
307}
308
310{
312 Editing *ed_eval = SEQ_editing_get(pfjob->scene_eval);
313
314 if (ms_orig != nullptr) {
315 Sequence *meta_eval = seq_prefetch_get_original_sequence(ms_orig->parseq, pfjob->scene_eval);
316 SEQ_seqbase_active_set(ed_eval, &meta_eval->seqbase);
317 }
318 else {
319 SEQ_seqbase_active_set(ed_eval, &ed_eval->seqbase);
320 }
321}
322
323static void seq_prefetch_resume(Scene *scene)
324{
325 PrefetchJob *pfjob = seq_prefetch_job_get(scene);
326
327 if (pfjob && pfjob->waiting) {
329 }
330}
331
333{
334 PrefetchJob *pfjob = seq_prefetch_job_get(scene);
335 if (!pfjob) {
336 return;
337 }
338
339 SEQ_prefetch_stop(scene);
340
341 BLI_threadpool_remove(&pfjob->threads, pfjob);
347 MEM_freeN(pfjob);
348 scene->ed->prefetch_job = nullptr;
349}
350
352 Sequence *seq,
353 bool can_have_final_image)
354{
355 SeqRenderData *ctx = &pfjob->context_cpy;
356 float cfra = seq_prefetch_cfra(pfjob);
357
358 ImBuf *ibuf = seq_cache_get(ctx, seq, cfra, SEQ_CACHE_STORE_PREPROCESSED);
359 if (ibuf != nullptr) {
360 IMB_freeImBuf(ibuf);
361 return true;
362 }
363
364 ibuf = seq_cache_get(ctx, seq, cfra, SEQ_CACHE_STORE_RAW);
365 if (ibuf != nullptr) {
366 IMB_freeImBuf(ibuf);
367 return true;
368 }
369
370 if (!can_have_final_image) {
371 return false;
372 }
373
374 ibuf = seq_cache_get(ctx, seq, cfra, SEQ_CACHE_STORE_FINAL_OUT);
375 if (ibuf != nullptr) {
376 IMB_freeImBuf(ibuf);
377 return true;
378 }
379
380 return false;
381}
382
384 ListBase *channels,
385 ListBase *seqbase,
386 blender::Span<Sequence *> scene_strips,
387 bool is_recursive_check)
388{
389 float cfra = seq_prefetch_cfra(pfjob);
391 pfjob->scene_eval, channels, seqbase, cfra, 0);
392
393 /* Iterate over rendered strips. */
394 for (Sequence *seq : strips) {
395 if (seq->type == SEQ_TYPE_META &&
397 pfjob, &seq->channels, &seq->seqbase, scene_strips, true))
398 {
399 return true;
400 }
401
402 /* Disable prefetching 3D scene strips, but check for disk cache. */
403 if (seq->type == SEQ_TYPE_SCENE && (seq->flag & SEQ_SCENE_STRIPS) == 0 &&
404 !seq_prefetch_seq_has_disk_cache(pfjob, seq, !is_recursive_check))
405 {
406 return true;
407 }
408
409 /* Check if strip is effect of scene strip or uses it as modifier. This is recursive check. */
410 for (Sequence *seq_scene : scene_strips) {
411 if (SEQ_relations_render_loop_check(seq, seq_scene)) {
412 return true;
413 }
414 }
415 }
416 return false;
417}
418
420{
422 LISTBASE_FOREACH (Sequence *, seq, seqbase) {
423 if (seq->type == SEQ_TYPE_SCENE && (seq->flag & SEQ_SCENE_STRIPS) == 0) {
424 strips.add(seq);
425 }
426 }
427 return strips;
428}
429
430/* Prefetch must avoid rendering scene strips, because rendering in background locks UI and can
431 * make it unresponsive for long time periods. */
432static bool seq_prefetch_must_skip_frame(PrefetchJob *pfjob, ListBase *channels, ListBase *seqbase)
433{
435 if (seq_prefetch_scene_strip_is_rendered(pfjob, channels, seqbase, scene_strips, false)) {
436 return true;
437 }
438 return false;
439}
440
442{
443 return seq_prefetch_is_cache_full(pfjob->scene) || pfjob->is_scrubbing ||
444 (seq_prefetch_cfra(pfjob) >= pfjob->scene->r.efra);
445}
446
448{
450 while (seq_prefetch_need_suspend(pfjob) &&
451 (pfjob->scene->ed->cache_flag & SEQ_CACHE_PREFETCH_ENABLE) && !pfjob->stop)
452 {
453 pfjob->waiting = true;
456 }
457 pfjob->waiting = false;
459}
460
461static void *seq_prefetch_frames(void *job)
462{
463 PrefetchJob *pfjob = (PrefetchJob *)job;
464
465 while (seq_prefetch_cfra(pfjob) <= pfjob->scene->r.efra) {
466 pfjob->scene_eval->ed->prefetch_job = nullptr;
467
470 AnimationEvalContext anim_eval_context = seq_prefetch_anim_eval_context(pfjob);
472 &pfjob->context_cpy.scene->id, adt, &anim_eval_context, ADT_RECALC_ALL, false);
473
474 /* This is quite hacky solution:
475 * We need cross-reference original scene with copy for cache.
476 * However depsgraph must not have this data, because it will try to kill this job.
477 * Scene copy don't reference original scene. Perhaps, this could be done by depsgraph.
478 * Set to nullptr before return!
479 */
480 pfjob->scene_eval->ed->prefetch_job = pfjob;
481
484 if (seq_prefetch_must_skip_frame(pfjob, channels, seqbase)) {
485 pfjob->num_frames_prefetched++;
486 /* Break instead of keep looping if the job should be terminated. */
487 if (!(pfjob->scene->ed->cache_flag & SEQ_CACHE_PREFETCH_ENABLE) || pfjob->stop) {
488 break;
489 }
490 continue;
491 }
492
493 ImBuf *ibuf = SEQ_render_give_ibuf(&pfjob->context_cpy, seq_prefetch_cfra(pfjob), 0);
495 IMB_freeImBuf(ibuf);
496
497 /* Suspend thread if there is nothing to be prefetched. */
499
500 /* Avoid "collision" with main thread, but make sure to fetch at least few frames */
501 if (pfjob->num_frames_prefetched > 5 && (seq_prefetch_cfra(pfjob) - pfjob->scene->r.cfra) < 2)
502 {
503 break;
504 }
505
506 if (!(pfjob->scene->ed->cache_flag & SEQ_CACHE_PREFETCH_ENABLE) || pfjob->stop) {
507 break;
508 }
509
511 pfjob->num_frames_prefetched++;
512 }
513
515 pfjob->running = false;
516 pfjob->scene_eval->ed->prefetch_job = nullptr;
517
518 return nullptr;
519}
520
521static PrefetchJob *seq_prefetch_start_ex(const SeqRenderData *context, float cfra)
522{
523 PrefetchJob *pfjob = seq_prefetch_job_get(context->scene);
524
525 if (!pfjob) {
526 if (context->scene->ed) {
527 pfjob = (PrefetchJob *)MEM_callocN(sizeof(PrefetchJob), "PrefetchJob");
528 context->scene->ed->prefetch_job = pfjob;
529
533
534 pfjob->bmain_eval = BKE_main_new();
535 pfjob->scene = context->scene;
537 }
538 }
539 pfjob->bmain = context->bmain;
540
541 pfjob->cfra = cfra;
542 pfjob->num_frames_prefetched = 1;
543
544 pfjob->waiting = false;
545 pfjob->stop = false;
546 pfjob->running = true;
547
548 seq_prefetch_update_scene(context->scene);
551
552 BLI_threadpool_remove(&pfjob->threads, pfjob);
553 BLI_threadpool_insert(&pfjob->threads, pfjob);
554
555 return pfjob;
556}
557
558void seq_prefetch_start(const SeqRenderData *context, float timeline_frame)
559{
560 Scene *scene = context->scene;
561 Editing *ed = scene->ed;
562 bool has_strips = bool(ed->seqbasep->first);
563
564 if (!context->is_prefetch_render && !context->is_proxy_render) {
565 bool playing = context->is_playing;
566 bool scrubbing = context->is_scrubbing;
567 bool running = seq_prefetch_job_is_running(scene);
568 seq_prefetch_job_scrubbing_set(scene, scrubbing);
569 seq_prefetch_resume(scene);
570
571 /* conditions to start:
572 * prefetch enabled, prefetch not running, not scrubbing, not playing,
573 * cache storage enabled, has strips to render, not rendering, not doing modal transform -
574 * important, see D7820. */
575 if ((ed->cache_flag & SEQ_CACHE_PREFETCH_ENABLE) && !running && !scrubbing && !playing &&
576 ed->cache_flag & SEQ_CACHE_ALL_TYPES && has_strips && !G.is_rendering && !G.moving)
577 {
578 seq_prefetch_start_ex(context, timeline_frame);
579 }
580 }
581}
582
584{
585 bScreen *screen = CTX_wm_screen(C);
586 bool playing = screen->animtimer != nullptr;
587 bool scrubbing = screen->scrubbing;
588 bool running = seq_prefetch_job_is_running(scene);
589 bool suspended = seq_prefetch_job_is_waiting(scene);
590
591 SpaceSeq *sseq = CTX_wm_space_seq(C);
592 bool showing_cache = sseq->cache_overlay.flag & SEQ_CACHE_SHOW;
593
594 /* force redraw, when prefetching and using cache view. */
595 if (running && !playing && !suspended && showing_cache) {
596 return true;
597 }
598 /* Sometimes scrubbing flag is set when not scrubbing. In that case I want to catch "event" of
599 * stopping scrubbing */
600 if (scrubbing) {
601 return true;
602 }
603 return false;
604}
AnimData * BKE_animdata_from_id(const ID *id)
Definition anim_data.cc:89
AnimationEvalContext BKE_animsys_eval_context_construct(struct Depsgraph *depsgraph, float eval_time) ATTR_WARN_UNUSED_RESULT
Definition anim_sys.cc:734
@ ADT_RECALC_ALL
void BKE_animsys_evaluate_animdata(struct ID *id, struct AnimData *adt, const struct AnimationEvalContext *anim_eval_context, eAnimData_Recalc recalc, bool flush_to_original)
bScreen * CTX_wm_screen(const bContext *C)
SpaceSeq * CTX_wm_space_seq(const bContext *C)
ViewLayer * BKE_view_layer_default_render(const Scene *scene)
Main * BKE_main_new(void)
Definition main.cc:45
void BKE_main_free(Main *bmain)
Definition main.cc:175
#define LISTBASE_FOREACH(type, var, list)
void BLI_mutex_end(ThreadMutex *mutex)
Definition threads.cc:360
void BLI_threadpool_remove(struct ListBase *threadbase, void *callerdata)
Definition threads.cc:197
void BLI_condition_wait(ThreadCondition *cond, ThreadMutex *mutex)
Definition threads.cc:582
void BLI_threadpool_init(struct ListBase *threadbase, void *(*do_thread)(void *), int tot)
Definition threads.cc:121
void BLI_mutex_init(ThreadMutex *mutex)
Definition threads.cc:340
pthread_cond_t ThreadCondition
void BLI_condition_end(ThreadCondition *cond)
Definition threads.cc:602
void BLI_threadpool_end(struct ListBase *threadbase)
Definition threads.cc:234
void BLI_condition_notify_one(ThreadCondition *cond)
Definition threads.cc:592
void BLI_condition_init(ThreadCondition *cond)
Definition threads.cc:577
void BLI_mutex_lock(ThreadMutex *mutex)
Definition threads.cc:345
void BLI_mutex_unlock(ThreadMutex *mutex)
Definition threads.cc:350
void BLI_threadpool_insert(struct ListBase *threadbase, void *callerdata)
Definition threads.cc:184
pthread_mutex_t ThreadMutex
Definition BLI_threads.h:83
#define STREQ(a, b)
@ DAG_EVAL_RENDER
Depsgraph * DEG_graph_new(Main *bmain, Scene *scene, ViewLayer *view_layer, eEvaluationMode mode)
Definition depsgraph.cc:273
void DEG_graph_free(Depsgraph *graph)
Definition depsgraph.cc:301
void DEG_evaluate_on_framechange(Depsgraph *graph, float frame, DepsgraphEvaluateSyncWriteback sync_writeback=DEG_EVALUATE_SYNC_WRITEBACK_NO)
void DEG_graph_build_for_render_pipeline(Depsgraph *graph)
void DEG_debug_name_set(Depsgraph *depsgraph, const char *name)
Scene * DEG_get_evaluated_scene(const Depsgraph *graph)
@ SEQ_CACHE_ALL_TYPES
@ SEQ_CACHE_STORE_PREPROCESSED
@ SEQ_CACHE_STORE_RAW
@ SEQ_CACHE_STORE_FINAL_OUT
@ SEQ_CACHE_PREFETCH_ENABLE
@ SEQ_TYPE_META
@ SEQ_TYPE_SCENE
@ SEQ_SCENE_STRIPS
@ SEQ_CACHE_SHOW
Contains defines and structs used throughout the imbuf module.
Read Guarded memory(de)allocation.
@ SEQ_TASK_PREFETCH_RENDER
Definition SEQ_render.hh:23
ListBase * SEQ_channels_displayed_get(Editing *ed)
Definition channels.cc:23
bool add(const Key &key)
void IMB_freeImBuf(ImBuf *)
ImBuf * seq_cache_get(const SeqRenderData *context, Sequence *seq, float timeline_frame, int type)
bool seq_cache_is_full()
void seq_cache_free_temp_cache(Scene *scene, short id, int timeline_frame)
bool seq_cache_recycle_item(Scene *scene)
void MEM_freeN(void *vmemh)
Definition mallocn.cc:105
void *(* MEM_callocN)(size_t len, const char *str)
Definition mallocn.cc:42
#define G(x, y, z)
void seq_prefetch_get_time_range(Scene *scene, int *r_start, int *r_end)
Definition prefetch.cc:174
void seq_prefetch_free(Scene *scene)
Definition prefetch.cc:332
bool seq_prefetch_job_is_running(Scene *scene)
Definition prefetch.cc:90
static bool seq_prefetch_must_skip_frame(PrefetchJob *pfjob, ListBase *channels, ListBase *seqbase)
Definition prefetch.cc:432
static void seq_prefetch_update_area(PrefetchJob *pfjob)
Definition prefetch.cc:215
bool SEQ_prefetch_need_redraw(const bContext *C, Scene *scene)
Definition prefetch.cc:583
void SEQ_prefetch_stop(Scene *scene)
Definition prefetch.cc:247
static PrefetchJob * seq_prefetch_start_ex(const SeqRenderData *context, float cfra)
Definition prefetch.cc:521
static bool seq_prefetch_job_is_waiting(Scene *scene)
Definition prefetch.cc:112
static void seq_prefetch_job_scrubbing_set(Scene *scene, bool is_scrubbing)
Definition prefetch.cc:101
static void seq_prefetch_update_depsgraph(PrefetchJob *pfjob)
Definition prefetch.cc:191
static float seq_prefetch_cfra(PrefetchJob *pfjob)
Definition prefetch.cc:165
static void seq_prefetch_do_suspend(PrefetchJob *pfjob)
Definition prefetch.cc:447
void seq_prefetch_start(const SeqRenderData *context, float timeline_frame)
Definition prefetch.cc:558
static void seq_prefetch_update_context(const SeqRenderData *context)
Definition prefetch.cc:263
static bool seq_prefetch_seq_has_disk_cache(PrefetchJob *pfjob, Sequence *seq, bool can_have_final_image)
Definition prefetch.cc:351
static Sequence * sequencer_prefetch_get_original_sequence(Sequence *seq, ListBase *seqbase)
Definition prefetch.cc:123
static PrefetchJob * seq_prefetch_job_get(Scene *scene)
Definition prefetch.cc:82
static void seq_prefetch_update_active_seqbase(PrefetchJob *pfjob)
Definition prefetch.cc:309
void SEQ_prefetch_stop_all()
Definition prefetch.cc:237
static void * seq_prefetch_frames(void *job)
Definition prefetch.cc:461
static AnimationEvalContext seq_prefetch_anim_eval_context(PrefetchJob *pfjob)
Definition prefetch.cc:169
static void seq_prefetch_update_scene(Scene *scene)
Definition prefetch.cc:296
static blender::VectorSet< Sequence * > query_scene_strips(ListBase *seqbase)
Definition prefetch.cc:419
Sequence * seq_prefetch_get_original_sequence(Sequence *seq, Scene *scene)
Definition prefetch.cc:141
static void seq_prefetch_init_depsgraph(PrefetchJob *pfjob)
Definition prefetch.cc:196
static void seq_prefetch_resume(Scene *scene)
Definition prefetch.cc:323
static bool seq_prefetch_scene_strip_is_rendered(PrefetchJob *pfjob, ListBase *channels, ListBase *seqbase, blender::Span< Sequence * > scene_strips, bool is_recursive_check)
Definition prefetch.cc:383
static bool seq_prefetch_is_cache_full(Scene *scene)
Definition prefetch.cc:154
static bool seq_prefetch_need_suspend(PrefetchJob *pfjob)
Definition prefetch.cc:441
static void seq_prefetch_free_depsgraph(PrefetchJob *pfjob)
Definition prefetch.cc:182
SeqRenderData * seq_prefetch_get_original_context(const SeqRenderData *context)
Definition prefetch.cc:147
void SEQ_render_new_render_data(Main *bmain, Depsgraph *depsgraph, Scene *scene, int rectx, int recty, int preview_render_size, int for_render, SeqRenderData *r_context)
Definition render.cc:220
ImBuf * SEQ_render_give_ibuf(const SeqRenderData *context, float timeline_frame, int chanshown)
Definition render.cc:2078
Vector< Sequence * > seq_get_shown_sequences(const Scene *scene, ListBase *channels, ListBase *seqbase, const int timeline_frame, const int chanshown)
Definition render.cc:268
ListBase * SEQ_active_seqbase_get(const Editing *ed)
Definition sequencer.cc:416
void SEQ_seqbase_active_set(Editing *ed, ListBase *seqbase)
Definition sequencer.cc:425
Editing * SEQ_editing_get(const Scene *scene)
Definition sequencer.cc:262
MetaStack * SEQ_meta_stack_active_get(const Editing *ed)
Definition sequencer.cc:448
bool SEQ_relations_render_loop_check(Sequence *seq_main, Sequence *seq)
ListBase seqbase
struct PrefetchJob * prefetch_job
ListBase * seqbasep
void * first
Sequence * parseq
PrefetchJob * prev
Definition prefetch.cc:50
SeqRenderData context_cpy
Definition prefetch.cc:65
ListBase * seqbasep
Definition prefetch.cc:66
Depsgraph * depsgraph
Definition prefetch.cc:56
PrefetchJob * next
Definition prefetch.cc:50
Main * bmain
Definition prefetch.cc:52
ListBase threads
Definition prefetch.cc:61
bool waiting
Definition prefetch.cc:76
SeqRenderData context
Definition prefetch.cc:64
ThreadCondition prefetch_suspend_cond
Definition prefetch.cc:59
int num_frames_prefetched
Definition prefetch.cc:71
float cfra
Definition prefetch.cc:70
Scene * scene_eval
Definition prefetch.cc:55
Scene * scene
Definition prefetch.cc:54
bool running
Definition prefetch.cc:75
Main * bmain_eval
Definition prefetch.cc:53
bool is_scrubbing
Definition prefetch.cc:79
ThreadMutex prefetch_suspend_mutex
Definition prefetch.cc:58
ListBase * seqbasep_cpy
Definition prefetch.cc:67
struct Editing * ed
struct RenderData r
Scene * scene
Definition SEQ_render.hh:29
bool is_prefetch_render
Definition SEQ_render.hh:40
eSeqTaskId task_id
Definition SEQ_render.hh:45
struct SequencerCacheOverlay cache_overlay