Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastian Parborg <darkdefende@gmail.com>2021-08-20 17:30:34 +0300
committerSebastian Parborg <darkdefende@gmail.com>2021-08-25 18:30:39 +0300
commitf49d438ced7c5874dbf43976d9901a462176f541 (patch)
treefae7b745eaf1e793b53119f3ec27c34621727c58 /source/blender/depsgraph
parent796035ad930383c26302ab6a57e8e6c90394603b (diff)
Cleanup and remove SEQ_ALL_BEGIN macro
We now use a for_each function with callback to iterate through all sequences in the scene. This has the benefit that we now only loop over the sequences in the scene once. Before we would loop over them twice and allocate memory to store temporary data. The allocation of temporary data lead to unintentional memory leaks if the code used returns to exit out of the iteration loop. The new for_each callback method doesn't allocate any temporary data and only iterates though all sequences once. Reviewed By: Richard Antalik, Bastien Montagne Differential Revision: http://developer.blender.org/D12278
Diffstat (limited to 'source/blender/depsgraph')
-rw-r--r--source/blender/depsgraph/intern/builder/deg_builder_nodes.cc44
-rw-r--r--source/blender/depsgraph/intern/builder/deg_builder_relations.cc74
-rw-r--r--source/blender/depsgraph/intern/eval/deg_eval_runtime_backup_sequencer.cc48
3 files changed, 97 insertions, 69 deletions
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
index 22bce10937d..a739a0fe337 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
@@ -112,6 +112,7 @@
#include "DEG_depsgraph_build.h"
#include "SEQ_iterator.h"
+#include "SEQ_sequencer.h"
#include "intern/builder/deg_builder.h"
#include "intern/builder/deg_builder_rna.h"
@@ -2032,6 +2033,27 @@ void DepsgraphNodeBuilder::build_simulation(Simulation *simulation)
});
}
+static bool seq_node_build_cb(Sequence *seq, void *user_data)
+{
+ DepsgraphNodeBuilder *nb = (DepsgraphNodeBuilder *)user_data;
+ nb->build_idproperties(seq->prop);
+ if (seq->sound != nullptr) {
+ nb->build_sound(seq->sound);
+ }
+ if (seq->scene != nullptr) {
+ nb->build_scene_parameters(seq->scene);
+ }
+ if (seq->type == SEQ_TYPE_SCENE && seq->scene != nullptr) {
+ if (seq->flag & SEQ_SCENE_STRIPS) {
+ nb->build_scene_sequencer(seq->scene);
+ }
+ ViewLayer *sequence_view_layer = BKE_view_layer_default_render(seq->scene);
+ nb->build_scene_speakers(seq->scene, sequence_view_layer);
+ }
+ /* TODO(sergey): Movie clip, scene, camera, mask. */
+ return true;
+}
+
void DepsgraphNodeBuilder::build_scene_sequencer(Scene *scene)
{
if (scene->ed == nullptr) {
@@ -2046,28 +2068,10 @@ void DepsgraphNodeBuilder::build_scene_sequencer(Scene *scene)
NodeType::SEQUENCER,
OperationCode::SEQUENCES_EVAL,
[scene_cow](::Depsgraph *depsgraph) {
- BKE_scene_eval_sequencer_sequences(depsgraph, scene_cow);
+ SEQ_eval_sequences(depsgraph, scene_cow, &scene_cow->ed->seqbase);
});
/* Make sure data for sequences is in the graph. */
- Sequence *seq;
- SEQ_ALL_BEGIN (scene->ed, seq) {
- build_idproperties(seq->prop);
- if (seq->sound != nullptr) {
- build_sound(seq->sound);
- }
- if (seq->scene != nullptr) {
- build_scene_parameters(seq->scene);
- }
- if (seq->type == SEQ_TYPE_SCENE && seq->scene != nullptr) {
- if (seq->flag & SEQ_SCENE_STRIPS) {
- build_scene_sequencer(seq->scene);
- }
- ViewLayer *sequence_view_layer = BKE_view_layer_default_render(seq->scene);
- build_scene_speakers(seq->scene, sequence_view_layer);
- }
- /* TODO(sergey): Movie clip, scene, camera, mask. */
- }
- SEQ_ALL_END;
+ SEQ_for_each_callback(&scene->ed->seqbase, seq_node_build_cb, this);
}
void DepsgraphNodeBuilder::build_scene_audio(Scene *scene)
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
index d88e9bc9c04..ab3081cb1ae 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
@@ -2769,6 +2769,45 @@ void DepsgraphRelationBuilder::build_simulation(Simulation *simulation)
add_relation(nodetree_key, simulation_eval_key, "NodeTree -> Simulation", 0);
}
+using Seq_build_prop_cb_data = struct Seq_build_prop_cb_data {
+ DepsgraphRelationBuilder *builder;
+ ComponentKey sequencer_key;
+ bool has_audio_strips;
+};
+
+static bool seq_build_prop_cb(Sequence *seq, void *user_data)
+{
+ Seq_build_prop_cb_data *cd = (Seq_build_prop_cb_data *)user_data;
+
+ cd->builder->build_idproperties(seq->prop);
+ if (seq->sound != nullptr) {
+ cd->builder->build_sound(seq->sound);
+ ComponentKey sound_key(&seq->sound->id, NodeType::AUDIO);
+ cd->builder->add_relation(sound_key, cd->sequencer_key, "Sound -> Sequencer");
+ cd->has_audio_strips = true;
+ }
+ if (seq->scene != nullptr) {
+ cd->builder->build_scene_parameters(seq->scene);
+ /* This is to support 3D audio. */
+ cd->has_audio_strips = true;
+ }
+ if (seq->type == SEQ_TYPE_SCENE && seq->scene != nullptr) {
+ if (seq->flag & SEQ_SCENE_STRIPS) {
+ cd->builder->build_scene_sequencer(seq->scene);
+ ComponentKey sequence_scene_audio_key(&seq->scene->id, NodeType::AUDIO);
+ cd->builder->add_relation(
+ sequence_scene_audio_key, cd->sequencer_key, "Sequence Scene Audio -> Sequencer");
+ ComponentKey sequence_scene_key(&seq->scene->id, NodeType::SEQUENCER);
+ cd->builder->add_relation(
+ sequence_scene_key, cd->sequencer_key, "Sequence Scene -> Sequencer");
+ }
+ ViewLayer *sequence_view_layer = BKE_view_layer_default_render(seq->scene);
+ cd->builder->build_scene_speakers(seq->scene, sequence_view_layer);
+ }
+ /* TODO(sergey): Movie clip, camera, mask. */
+ return true;
+}
+
void DepsgraphRelationBuilder::build_scene_sequencer(Scene *scene)
{
if (scene->ed == nullptr) {
@@ -2781,36 +2820,11 @@ void DepsgraphRelationBuilder::build_scene_sequencer(Scene *scene)
ComponentKey scene_audio_key(&scene->id, NodeType::AUDIO);
/* Make sure dependencies from sequences data goes to the sequencer evaluation. */
ComponentKey sequencer_key(&scene->id, NodeType::SEQUENCER);
- Sequence *seq;
- bool has_audio_strips = false;
- SEQ_ALL_BEGIN (scene->ed, seq) {
- build_idproperties(seq->prop);
- if (seq->sound != nullptr) {
- build_sound(seq->sound);
- ComponentKey sound_key(&seq->sound->id, NodeType::AUDIO);
- add_relation(sound_key, sequencer_key, "Sound -> Sequencer");
- has_audio_strips = true;
- }
- if (seq->scene != nullptr) {
- build_scene_parameters(seq->scene);
- /* This is to support 3D audio. */
- has_audio_strips = true;
- }
- if (seq->type == SEQ_TYPE_SCENE && seq->scene != nullptr) {
- if (seq->flag & SEQ_SCENE_STRIPS) {
- build_scene_sequencer(seq->scene);
- ComponentKey sequence_scene_audio_key(&seq->scene->id, NodeType::AUDIO);
- add_relation(sequence_scene_audio_key, sequencer_key, "Sequence Scene Audio -> Sequencer");
- ComponentKey sequence_scene_key(&seq->scene->id, NodeType::SEQUENCER);
- add_relation(sequence_scene_key, sequencer_key, "Sequence Scene -> Sequencer");
- }
- ViewLayer *sequence_view_layer = BKE_view_layer_default_render(seq->scene);
- build_scene_speakers(seq->scene, sequence_view_layer);
- }
- /* TODO(sergey): Movie clip, camera, mask. */
- }
- SEQ_ALL_END;
- if (has_audio_strips) {
+
+ Seq_build_prop_cb_data cb_data = {this, sequencer_key, false};
+
+ SEQ_for_each_callback(&scene->ed->seqbase, seq_build_prop_cb, &cb_data);
+ if (cb_data.has_audio_strips) {
add_relation(sequencer_key, scene_audio_key, "Sequencer -> Audio");
}
}
diff --git a/source/blender/depsgraph/intern/eval/deg_eval_runtime_backup_sequencer.cc b/source/blender/depsgraph/intern/eval/deg_eval_runtime_backup_sequencer.cc
index 34c23740730..166ca37bc35 100644
--- a/source/blender/depsgraph/intern/eval/deg_eval_runtime_backup_sequencer.cc
+++ b/source/blender/depsgraph/intern/eval/deg_eval_runtime_backup_sequencer.cc
@@ -38,33 +38,43 @@ SequencerBackup::SequencerBackup(const Depsgraph *depsgraph) : depsgraph(depsgra
{
}
+static bool seq_init_cb(Sequence *seq, void *user_data)
+{
+ SequencerBackup *sb = (SequencerBackup *)user_data;
+ SequenceBackup sequence_backup(sb->depsgraph);
+ sequence_backup.init_from_sequence(seq);
+ if (!sequence_backup.isEmpty()) {
+ const SessionUUID &session_uuid = seq->runtime.session_uuid;
+ BLI_assert(BLI_session_uuid_is_generated(&session_uuid));
+ sb->sequences_backup.add(session_uuid, sequence_backup);
+ }
+ return true;
+}
+
void SequencerBackup::init_from_scene(Scene *scene)
{
- Sequence *sequence;
- SEQ_ALL_BEGIN (scene->ed, sequence) {
- SequenceBackup sequence_backup(depsgraph);
- sequence_backup.init_from_sequence(sequence);
- if (!sequence_backup.isEmpty()) {
- const SessionUUID &session_uuid = sequence->runtime.session_uuid;
- BLI_assert(BLI_session_uuid_is_generated(&session_uuid));
- sequences_backup.add(session_uuid, sequence_backup);
- }
+ if (scene->ed != nullptr) {
+ SEQ_for_each_callback(&scene->ed->seqbase, seq_init_cb, this);
}
- SEQ_ALL_END;
+}
+
+static bool seq_restore_cb(Sequence *seq, void *user_data)
+{
+ SequencerBackup *sb = (SequencerBackup *)user_data;
+ const SessionUUID &session_uuid = seq->runtime.session_uuid;
+ BLI_assert(BLI_session_uuid_is_generated(&session_uuid));
+ SequenceBackup *sequence_backup = sb->sequences_backup.lookup_ptr(session_uuid);
+ if (sequence_backup != nullptr) {
+ sequence_backup->restore_to_sequence(seq);
+ }
+ return true;
}
void SequencerBackup::restore_to_scene(Scene *scene)
{
- Sequence *sequence;
- SEQ_ALL_BEGIN (scene->ed, sequence) {
- const SessionUUID &session_uuid = sequence->runtime.session_uuid;
- BLI_assert(BLI_session_uuid_is_generated(&session_uuid));
- SequenceBackup *sequence_backup = sequences_backup.lookup_ptr(session_uuid);
- if (sequence_backup != nullptr) {
- sequence_backup->restore_to_sequence(sequence);
- }
+ if (scene->ed != nullptr) {
+ SEQ_for_each_callback(&scene->ed->seqbase, seq_restore_cb, this);
}
- SEQ_ALL_END;
/* Cleanup audio while the scene is still known. */
for (SequenceBackup &sequence_backup : sequences_backup.values()) {
if (sequence_backup.scene_sound != nullptr) {