92 if (scene && scene->
ed) {
134 if (
STREQ(strip->
name, strip_orig->name)) {
140 if (match !=
nullptr) {
158 return pfjob ? &pfjob->
context :
nullptr;
163 Scene *scene = context->scene;
164 if (context->is_prefetch_render) {
166 if (context !=
nullptr) {
167 scene = context->scene;
175 Scene *scene = context->scene;
176 if (context->is_prefetch_render) {
178 if (context !=
nullptr) {
179 scene = context->scene;
195 int timeline_start =
PSFRA;
196 int timeline_end =
PEFRA;
197 if (new_frame >= timeline_end) {
199 new_frame = timeline_start + new_frame - timeline_end;
212 *r_start = std::numeric_limits<int>::min();
213 *r_end = std::numeric_limits<int>::min();
216 if (pfjob ==
nullptr) {
223 *r_start = pfjob->
cfra;
264 int cfra = pfjob->
scene->
r.cfra;
267 if (cfra > pfjob->
cfra) {
268 int delta = cfra - pfjob->
cfra;
276 if (cfra < pfjob->cfra) {
303 for (
Scene *scene =
static_cast<Scene *
>(
G.main->scenes.first); scene;
304 scene =
static_cast<Scene *
>(scene->id.next))
336 context->preview_render_size,
347 context->preview_render_size,
367 pfjob->
scene = scene;
377 if (ms_orig !=
nullptr) {
434 scene, channels, seqbase, timeline_frame, 0);
437 for (
Strip *strip : rendered_strips) {
440 scene, &strip->channels, &strip->seqbase, scene_strips, timeline_frame,
state))
446 if (
state.strips_rendering_seqbase.contains(strip)) {
451 strip->scene !=
nullptr &&
editing_get(strip->scene))
453 state.strips_rendering_seqbase.add(strip);
455 const Scene *target_scene = strip->scene;
457 if (target_ed ==
nullptr) {
462 int target_timeline_frame =
give_frame_index(scene, strip, timeline_frame) +
463 target_scene->
r.sfra;
466 target_ed->current_channels(),
467 target_ed->current_strips(),
469 target_timeline_frame,
475 for (
Strip *seq_scene : scene_strips) {
581 if (!context->scene->ed) {
584 pfjob = MEM_new<PrefetchJob>(
"PrefetchJob");
585 context->scene->ed->prefetch_job = pfjob;
592 pfjob->
scene = context->scene;
595 pfjob->
bmain = context->bmain;
621 Scene *scene = context->scene;
623 bool has_strips = bool(
ed->current_strips()->first);
625 if (!context->is_prefetch_render && !context->is_proxy_render) {
626 bool playing = context->is_playing;
627 bool scrubbing = context->is_scrubbing;
647 bool playing = screen->
animtimer !=
nullptr;
656 if (running && !playing && !suspended && showing_cache) {
AnimData * BKE_animdata_from_id(const ID *id)
AnimationEvalContext BKE_animsys_eval_context_construct(struct Depsgraph *depsgraph, float eval_time) ATTR_WARN_UNUSED_RESULT
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)
void BKE_main_free(Main *bmain)
#define LISTBASE_FOREACH(type, var, list)
void BLI_mutex_end(ThreadMutex *mutex)
void BLI_threadpool_remove(struct ListBase *threadbase, void *callerdata)
void BLI_condition_wait(ThreadCondition *cond, ThreadMutex *mutex)
void BLI_threadpool_init(struct ListBase *threadbase, void *(*do_thread)(void *), int tot)
void BLI_mutex_init(ThreadMutex *mutex)
pthread_cond_t ThreadCondition
void BLI_condition_end(ThreadCondition *cond)
void BLI_threadpool_end(struct ListBase *threadbase)
void BLI_condition_notify_one(ThreadCondition *cond)
void BLI_condition_init(ThreadCondition *cond)
void BLI_mutex_lock(ThreadMutex *mutex)
void BLI_mutex_unlock(ThreadMutex *mutex)
void BLI_threadpool_insert(struct ListBase *threadbase, void *callerdata)
pthread_mutex_t ThreadMutex
void DEG_ids_clear_recalc(Depsgraph *depsgraph, bool backup)
Depsgraph * DEG_graph_new(Main *bmain, Scene *scene, ViewLayer *view_layer, eEvaluationMode mode)
void DEG_graph_free(Depsgraph *graph)
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_PREFETCH_ENABLE
void IMB_freeImBuf(ImBuf *ibuf)
Read Guarded memory(de)allocation.
ValueIterator values() const &
void add_multiple(Span< Key > keys)
static void seq_prefetch_update_active_seqbase(PrefetchJob *pfjob)
void prefetch_stop(Scene *scene)
blender::Map< const Scene *, VectorSet< Strip * > > & lookup_strips_by_scene_map_get(Editing *ed)
static PrefetchJob * seq_prefetch_job_get(Scene *scene)
ImBuf * render_give_ibuf(const RenderData *context, float timeline_frame, int chanshown)
bool seq_prefetch_job_is_running(Scene *scene)
ListBase * channels_displayed_get(const Editing *ed)
bool prefetch_need_redraw(const bContext *C, Scene *scene)
bool relations_render_loop_check(Strip *strip_main, Strip *strip)
static void seq_prefetch_update_depsgraph(PrefetchJob *pfjob)
static bool seq_prefetch_must_skip_frame(PrefetchJob *pfjob, ListBase *channels, ListBase *seqbase)
static void seq_prefetch_init_depsgraph(PrefetchJob *pfjob)
float give_frame_index(const Scene *scene, const Strip *strip, float timeline_frame)
Editing * editing_get(const Scene *scene)
void seq_prefetch_free(Scene *scene)
static PrefetchJob * seq_prefetch_start_ex(const RenderData *context, float cfra)
@ SEQ_TASK_PREFETCH_RENDER
static void seq_prefetch_resume(Scene *scene)
static RenderData * get_original_context(const RenderData *context)
static int seq_prefetch_cfra(PrefetchJob *pfjob)
void seq_prefetch_start(const RenderData *context, float timeline_frame)
MetaStack * meta_stack_active_get(const Editing *ed)
static bool seq_prefetch_need_suspend(PrefetchJob *pfjob)
void render_new_render_data(Main *bmain, Depsgraph *depsgraph, Scene *scene, int rectx, int recty, eSpaceSeq_Proxy_RenderSize preview_render_size, Render *render, RenderData *r_context)
static void seq_prefetch_update_area(PrefetchJob *pfjob)
static AnimationEvalContext seq_prefetch_anim_eval_context(PrefetchJob *pfjob)
static bool seq_prefetch_job_is_waiting(Scene *scene)
Scene * prefetch_get_original_scene_and_strip(const RenderData *context, const Strip *&strip)
static blender::VectorSet< Strip * > query_scene_strips(Editing *ed)
static void * seq_prefetch_frames(void *job)
static void seq_prefetch_do_suspend(PrefetchJob *pfjob)
static Strip * original_strip_get(const Strip *strip, ListBase *seqbase)
bool evict_caches_if_full(Scene *scene)
static void seq_prefetch_update_context(const RenderData *context)
ListBase * active_seqbase_get(const Editing *ed)
Vector< Strip * > seq_shown_strips_get(const Scene *scene, ListBase *channels, ListBase *seqbase, const int timeline_frame, const int chanshown)
static void seq_prefetch_update_scene(Scene *scene)
static bool seq_prefetch_scene_strip_is_rendered(const Scene *scene, ListBase *channels, ListBase *seqbase, blender::Span< Strip * > scene_strips, int timeline_frame, SeqRenderState state)
static void seq_prefetch_job_scrubbing_set(Scene *scene, bool is_scrubbing)
Scene * prefetch_get_original_scene(const RenderData *context)
static void seq_prefetch_free_depsgraph(PrefetchJob *pfjob)
void seq_prefetch_get_time_range(Scene *scene, int *r_start, int *r_end)
static bool seq_prefetch_is_cache_full(Scene *scene)
PrefetchJob * prefetch_job
Strip * current_meta_strip
struct SequencerCacheOverlay cache_overlay
struct wmTimer * animtimer
ThreadMutex prefetch_suspend_mutex
int num_frames_prefetched
ThreadCondition prefetch_suspend_cond