[Bf-blender-cvs] [6587eb6327f] temp-compositor-scheduling: Compositor use atomics for scheduling.

Jeroen Bakker noreply at git.blender.org
Tue Apr 6 16:25:36 CEST 2021


Commit: 6587eb6327ff4757e7dafa7d566cf08fc15642c2
Author: Jeroen Bakker
Date:   Tue Apr 6 16:24:56 2021 +0200
Branches: temp-compositor-scheduling
https://developer.blender.org/rB6587eb6327ff4757e7dafa7d566cf08fc15642c2

Compositor use atomics for scheduling.

===================================================================

M	source/blender/compositor/intern/COM_Enums.h
M	source/blender/compositor/intern/COM_ExecutionGroup.cc
M	source/blender/compositor/intern/COM_WorkScheduler.cc

===================================================================

diff --git a/source/blender/compositor/intern/COM_Enums.h b/source/blender/compositor/intern/COM_Enums.h
index 0ab8a9053c1..6ab2ef51629 100644
--- a/source/blender/compositor/intern/COM_Enums.h
+++ b/source/blender/compositor/intern/COM_Enums.h
@@ -67,7 +67,7 @@ enum class eCompositorPriority {
  * \brief the execution state of a chunk in an ExecutionGroup
  * \ingroup Execution
  */
-enum class eWorkPackageState {
+enum class eWorkPackageState : int32_t {
   /**
    * \brief chunk is not yet scheduled
    */
diff --git a/source/blender/compositor/intern/COM_ExecutionGroup.cc b/source/blender/compositor/intern/COM_ExecutionGroup.cc
index 5e14df87eb7..0a92c77e8b1 100644
--- a/source/blender/compositor/intern/COM_ExecutionGroup.cc
+++ b/source/blender/compositor/intern/COM_ExecutionGroup.cc
@@ -435,6 +435,8 @@ void ExecutionGroup::finalizeChunkExecution(int chunkNumber, MemoryBuffer **memo
     }
   }
 
+  atomic_add_and_fetch_u(&this->m_chunks_finished, 1);
+
   if (memoryBuffers) {
     for (unsigned int index = 0; index < this->m_max_read_buffer_offset; index++) {
       MemoryBuffer *buffer = memoryBuffers[index];
@@ -447,8 +449,8 @@ void ExecutionGroup::finalizeChunkExecution(int chunkNumber, MemoryBuffer **memo
     }
     MEM_freeN(memoryBuffers);
   }
+
   if (this->m_bTree) {
-    atomic_add_and_fetch_u(&this->m_chunks_finished, 1);
     // status report is only performed for top level Execution Groups.
     float progress = this->m_chunks_finished;
     progress /= this->m_chunks_len;
@@ -546,9 +548,14 @@ void ExecutionGroup::link_child_work_packages(WorkPackage *child, rcti *area)
     if (!BLI_rcti_isect(&work_package.rect, area, &isect)) {
       continue;
     }
+    if (!BLI_rcti_isect(&isect, &m_viewerBorder, &isect)) {
+      continue;
+    }
 
-    // TODO(jbakker): `BLI_rcti_isect` assumes inclusive. we use exclusive. added area check to
-    // counteract this.
+    /*
+     * NOTE: `BLI_rcti_isect` includes max values. Compositor excludes max values.
+     * This area check counter act this.
+     */
     if (BLI_rcti_size_x(&isect) * BLI_rcti_size_y(&isect) > 0) {
       work_package.add_child(child);
     }
diff --git a/source/blender/compositor/intern/COM_WorkScheduler.cc b/source/blender/compositor/intern/COM_WorkScheduler.cc
index f23af0f7a52..3421a59bcae 100644
--- a/source/blender/compositor/intern/COM_WorkScheduler.cc
+++ b/source/blender/compositor/intern/COM_WorkScheduler.cc
@@ -446,11 +446,13 @@ void WorkScheduler::schedule(WorkPackage *package)
     return;
   }
 
-  // TODO: race condition..... we should add a mutex in the work package.
-  if (package->state != eWorkPackageState::NotScheduled) {
+  eWorkPackageState old_state = static_cast<eWorkPackageState>(
+      atomic_cas_int32(reinterpret_cast<int32_t *>(&package->state),
+                       static_cast<int32_t>(eWorkPackageState::NotScheduled),
+                       static_cast<int32_t>(eWorkPackageState::Scheduled)));
+  if (old_state != eWorkPackageState::NotScheduled) {
     return;
   }
-  package->state = eWorkPackageState::Scheduled;
 
   if (COM_is_opencl_enabled()) {
     if (opencl_schedule(package)) {



More information about the Bf-blender-cvs mailing list