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
8
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
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
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. */
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_TYPE_META
@ SEQ_TYPE_SCENE
@ SEQ_CACHE_ALL_TYPES
@ SEQ_CACHE_STORE_PREPROCESSED
@ SEQ_CACHE_STORE_RAW
@ SEQ_CACHE_STORE_FINAL_OUT
@ SEQ_CACHE_PREFETCH_ENABLE
@ SEQ_SCENE_STRIPS
@ SEQ_CACHE_SHOW
Contains defines and structs used throughout the imbuf module.
Read Guarded memory(de)allocation.
Group Output data from inside of a node group A color picker Mix two input colors RGB to Convert a color s luminance to a grayscale value Generate a normal vector and a dot product Brightness Control the brightness and contrast of the input color Vector Map input vector components with curves Camera Retrieve information about the camera and how it relates to the current shading point s position Clamp a value between a minimum and a maximum Vector Perform vector math operation Invert Invert a producing a negative Combine Generate a color from its and blue channels(Deprecated)") DefNode(ShaderNode
#define C
Definition RandGen.cpp:29
@ 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
struct wmTimer * animtimer