[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