[Bf-blender-cvs] [c7b9da95f4d] temp-compositor-scheduling: Compositor: Only schedule needed chunks.
Jeroen Bakker
noreply at git.blender.org
Thu Apr 1 16:22:40 CEST 2021
Commit: c7b9da95f4dd2cccbde8cd32e9fa7074e44c1524
Author: Jeroen Bakker
Date: Thu Apr 1 16:22:14 2021 +0200
Branches: temp-compositor-scheduling
https://developer.blender.org/rBc7b9da95f4dd2cccbde8cd32e9fa7074e44c1524
Compositor: Only schedule needed chunks.
===================================================================
M source/blender/compositor/COM_defines.h
M source/blender/compositor/intern/COM_ExecutionGroup.cc
M source/blender/compositor/intern/COM_ExecutionSystem.cc
M source/blender/compositor/intern/COM_WorkPackage.cc
M source/blender/compositor/intern/COM_WorkPackage.h
===================================================================
diff --git a/source/blender/compositor/COM_defines.h b/source/blender/compositor/COM_defines.h
index df92b09e063..590234d0562 100644
--- a/source/blender/compositor/COM_defines.h
+++ b/source/blender/compositor/COM_defines.h
@@ -77,6 +77,8 @@ enum class CompositorPriority {
Medium = 1,
/** \brief Low quality setting */
Low = 0,
+ /** No priority set. Is used to mark WorkPackages that aren't used. */
+ Unset = -1,
};
enum class eSchedulingMode {
diff --git a/source/blender/compositor/intern/COM_ExecutionGroup.cc b/source/blender/compositor/intern/COM_ExecutionGroup.cc
index 89c65cf0a53..89b1e3bbc72 100644
--- a/source/blender/compositor/intern/COM_ExecutionGroup.cc
+++ b/source/blender/compositor/intern/COM_ExecutionGroup.cc
@@ -162,6 +162,7 @@ void ExecutionGroup::init_work_packages()
m_work_packages.resize(this->m_chunks_len);
for (unsigned int index = 0; index < m_chunks_len; index++) {
m_work_packages[index].state = eChunkExecutionState::NotScheduled;
+ m_work_packages[index].priority = CompositorPriority::Unset;
m_work_packages[index].execution_group = this;
m_work_packages[index].chunk_number = index;
determineChunkRect(&m_work_packages[index].rect, index);
@@ -432,8 +433,8 @@ void ExecutionGroup::finalizeChunkExecution(int chunkNumber, MemoryBuffer **memo
WorkPackage &work_package = m_work_packages[chunkNumber];
for (WorkPackage *child : work_package.children) {
if (child->parent_finished()) {
- if (COM_SCHEDULING_MODE == eSchedulingMode::InputToOutput) {
- /* TODO: Do not schedule lower priority children. */
+ if (COM_SCHEDULING_MODE == eSchedulingMode::InputToOutput &&
+ child->priority != CompositorPriority::Unset) {
WorkScheduler::schedule(child);
}
}
diff --git a/source/blender/compositor/intern/COM_ExecutionSystem.cc b/source/blender/compositor/intern/COM_ExecutionSystem.cc
index 185e26b92ba..88bb313f095 100644
--- a/source/blender/compositor/intern/COM_ExecutionSystem.cc
+++ b/source/blender/compositor/intern/COM_ExecutionSystem.cc
@@ -201,19 +201,37 @@ static void schedule_root_work_packages(blender::Vector<ExecutionGroup *> &group
{
for (ExecutionGroup *group : groups) {
for (WorkPackage &work_package : group->get_work_packages()) {
- if (work_package.parents.size() == 0) {
+ if (work_package.state != eChunkExecutionState::NotScheduled) {
+ continue;
+ }
+ if (work_package.priority == CompositorPriority::Unset) {
+ continue;
+ }
+ if (work_package.num_parents == 0) {
WorkScheduler::schedule(&work_package);
}
}
}
}
-static void update_output_groups(blender::Vector<ExecutionGroup *> &groups, const bNodeTree *btree)
+static void mark_priority(WorkPackage &work_package, CompositorPriority priority)
{
- for (ExecutionGroup *group : groups) {
- if (group->get_flags().is_output) {
- group->set_btree(btree);
- }
+ if (work_package.state != eChunkExecutionState::NotScheduled) {
+ return;
+ }
+ if (work_package.priority != CompositorPriority::Unset) {
+ return;
+ }
+ work_package.priority = priority;
+ for (WorkPackage *parent : work_package.parents) {
+ mark_priority(*parent, priority);
+ }
+}
+
+static void mark_priority(blender::Vector<WorkPackage> &work_packages, CompositorPriority priority)
+{
+ for (WorkPackage &work_package : work_packages) {
+ mark_priority(work_package, priority);
}
}
@@ -233,23 +251,10 @@ void ExecutionSystem::execute()
WorkScheduler::start(this->m_context);
editingtree->stats_draw(editingtree->sdh, TIP_("Compositing | Started"));
- switch (COM_SCHEDULING_MODE) {
- case eSchedulingMode::InputToOutput: {
- /* TODO: Mark work_packages with priorities and use this when scheduling. Only schedule when
- * priority match and not waiting on any parents. */
- update_output_groups(m_groups, m_context.getbNodeTree());
- /* TODO: move inside execute groups. */
- schedule_root_work_packages(m_groups);
- break;
- }
- case eSchedulingMode::OutputToInput: {
- execute_groups(CompositorPriority::High);
- if (!this->getContext().isFastCalculation()) {
- execute_groups(CompositorPriority::Medium);
- execute_groups(CompositorPriority::Low);
- }
- break;
- }
+ execute_groups(CompositorPriority::High);
+ if (!this->getContext().isFastCalculation()) {
+ execute_groups(CompositorPriority::Medium);
+ execute_groups(CompositorPriority::Low);
}
WorkScheduler::finish();
WorkScheduler::stop();
@@ -267,10 +272,27 @@ void ExecutionSystem::execute()
void ExecutionSystem::execute_groups(CompositorPriority priority)
{
- for (ExecutionGroup *execution_group : m_groups) {
- if (execution_group->get_flags().is_output &&
- execution_group->getRenderPriority() == priority) {
- execution_group->execute(this);
+ switch (COM_SCHEDULING_MODE) {
+ case eSchedulingMode::InputToOutput: {
+ const bNodeTree *bnodetree = this->m_context.getbNodeTree();
+ for (ExecutionGroup *execution_group : m_groups) {
+ if (execution_group->get_flags().is_output &&
+ execution_group->getRenderPriority() == priority) {
+ execution_group->set_btree(bnodetree);
+ mark_priority(execution_group->get_work_packages(), priority);
+ }
+ }
+ schedule_root_work_packages(m_groups);
+ break;
+ }
+ case eSchedulingMode::OutputToInput: {
+ for (ExecutionGroup *execution_group : m_groups) {
+ if (execution_group->get_flags().is_output &&
+ execution_group->getRenderPriority() == priority) {
+ execution_group->execute(this);
+ }
+ }
+ break;
}
}
}
diff --git a/source/blender/compositor/intern/COM_WorkPackage.cc b/source/blender/compositor/intern/COM_WorkPackage.cc
index b27eacb8cb1..60786efcd2f 100644
--- a/source/blender/compositor/intern/COM_WorkPackage.cc
+++ b/source/blender/compositor/intern/COM_WorkPackage.cc
@@ -59,11 +59,35 @@ static std::ostream &operator<<(std::ostream &os, const eChunkExecutionState &ex
return os;
}
+static std::ostream &operator<<(std::ostream &os, const CompositorPriority &priority)
+{
+ switch (priority) {
+ case CompositorPriority::High: {
+ os << "Priority::High";
+ break;
+ }
+ case CompositorPriority::Medium: {
+ os << "Priority::Medium";
+ break;
+ }
+ case CompositorPriority::Low: {
+ os << "Priority::Low";
+ break;
+ }
+ case CompositorPriority::Unset: {
+ os << "Priority::Unset";
+ break;
+ }
+ }
+ return os;
+}
+
std::ostream &operator<<(std::ostream &os, const WorkPackage &work_package)
{
os << "WorkPackage(execution_group=" << *work_package.execution_group;
os << ",chunk=" << work_package.chunk_number;
os << ",state=" << work_package.state;
+ os << ",priority=" << work_package.priority;
os << ",parents=[" << work_package.num_parents << "/" << work_package.parents.size() << "]";
os << ",children=" << work_package.children.size();
os << ",rect=(" << work_package.rect.xmin << "," << work_package.rect.ymin << ")-("
diff --git a/source/blender/compositor/intern/COM_WorkPackage.h b/source/blender/compositor/intern/COM_WorkPackage.h
index a4251a621f6..8ec1ecae6f4 100644
--- a/source/blender/compositor/intern/COM_WorkPackage.h
+++ b/source/blender/compositor/intern/COM_WorkPackage.h
@@ -35,7 +35,7 @@ class ExecutionGroup;
*/
struct WorkPackage {
eChunkExecutionState state = eChunkExecutionState::NotScheduled;
-
+ CompositorPriority priority = CompositorPriority::Unset;
/**
* \brief executionGroup with the operations-setup to be evaluated
*/
More information about the Bf-blender-cvs
mailing list