[Bf-blender-cvs] [fde150fee47] master: Cleanup: Use std::Vector for chunk execution status.

Jeroen Bakker noreply at git.blender.org
Fri Mar 5 16:56:19 CET 2021


Commit: fde150fee476e16ee6130618ed1ea2598913f1b6
Author: Jeroen Bakker
Date:   Fri Mar 5 15:46:31 2021 +0100
Branches: master
https://developer.blender.org/rBfde150fee476e16ee6130618ed1ea2598913f1b6

Cleanup: Use std::Vector for chunk execution status.

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

M	source/blender/compositor/intern/COM_ExecutionGroup.cpp
M	source/blender/compositor/intern/COM_ExecutionGroup.h

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

diff --git a/source/blender/compositor/intern/COM_ExecutionGroup.cpp b/source/blender/compositor/intern/COM_ExecutionGroup.cpp
index b8cacd7138d..63a278c2ecc 100644
--- a/source/blender/compositor/intern/COM_ExecutionGroup.cpp
+++ b/source/blender/compositor/intern/COM_ExecutionGroup.cpp
@@ -45,7 +45,6 @@ ExecutionGroup::ExecutionGroup()
 {
   this->m_isOutput = false;
   this->m_complex = false;
-  this->m_chunkExecutionStates = nullptr;
   this->m_bTree = nullptr;
   this->m_height = 0;
   this->m_width = 0;
@@ -121,18 +120,14 @@ NodeOperation *ExecutionGroup::getOutputOperation() const
 
 void ExecutionGroup::initExecution()
 {
-  if (this->m_chunkExecutionStates != nullptr) {
-    MEM_freeN(this->m_chunkExecutionStates);
-  }
+  m_chunk_execution_states.clear();
   unsigned int index;
   determineNumberOfChunks();
 
-  this->m_chunkExecutionStates = nullptr;
   if (this->m_numberOfChunks != 0) {
-    this->m_chunkExecutionStates = (eChunkExecutionState *)MEM_mallocN(
-        sizeof(eChunkExecutionState) * this->m_numberOfChunks, __func__);
+    m_chunk_execution_states.resize(this->m_numberOfChunks);
     for (index = 0; index < this->m_numberOfChunks; index++) {
-      this->m_chunkExecutionStates[index] = eChunkExecutionState::NOT_SCHEDULED;
+      m_chunk_execution_states[index] = eChunkExecutionState::NOT_SCHEDULED;
     }
   }
 
@@ -152,10 +147,7 @@ void ExecutionGroup::initExecution()
 
 void ExecutionGroup::deinitExecution()
 {
-  if (this->m_chunkExecutionStates != nullptr) {
-    MEM_freeN(this->m_chunkExecutionStates);
-    this->m_chunkExecutionStates = nullptr;
-  }
+  m_chunk_execution_states.clear();
   this->m_numberOfChunks = 0;
   this->m_numberOfXChunks = 0;
   this->m_numberOfYChunks = 0;
@@ -338,25 +330,30 @@ void ExecutionGroup::execute(ExecutionSystem *graph)
       chunkNumber = chunkOrder[index];
       int yChunk = chunkNumber / this->m_numberOfXChunks;
       int xChunk = chunkNumber - (yChunk * this->m_numberOfXChunks);
-      const eChunkExecutionState state = this->m_chunkExecutionStates[chunkNumber];
-      if (state == eChunkExecutionState::NOT_SCHEDULED) {
-        scheduleChunkWhenPossible(graph, xChunk, yChunk);
-        finished = false;
-        startEvaluated = true;
-        numberEvaluated++;
-
-        if (bTree->update_draw) {
-          bTree->update_draw(bTree->udh);
+      switch (m_chunk_execution_states[chunkNumber]) {
+        case eChunkExecutionState::NOT_SCHEDULED: {
+          scheduleChunkWhenPossible(graph, xChunk, yChunk);
+          finished = false;
+          startEvaluated = true;
+          numberEvaluated++;
+
+          if (bTree->update_draw) {
+            bTree->update_draw(bTree->udh);
+          }
+          break;
         }
-      }
-      else if (state == eChunkExecutionState::SCHEDULED) {
-        finished = false;
-        startEvaluated = true;
-        numberEvaluated++;
-      }
-      else if (state == eChunkExecutionState::EXECUTED && !startEvaluated) {
-        startIndex = index + 1;
-      }
+        case eChunkExecutionState::SCHEDULED: {
+          finished = false;
+          startEvaluated = true;
+          numberEvaluated++;
+          break;
+        }
+        case eChunkExecutionState::EXECUTED: {
+          if (!startEvaluated) {
+            startIndex = index + 1;
+          }
+        }
+      };
     }
 
     WorkScheduler::finish();
@@ -405,8 +402,8 @@ MemoryBuffer *ExecutionGroup::constructConsolidatedMemoryBuffer(MemoryProxy *mem
 
 void ExecutionGroup::finalizeChunkExecution(int chunkNumber, MemoryBuffer **memoryBuffers)
 {
-  if (this->m_chunkExecutionStates[chunkNumber] == eChunkExecutionState::SCHEDULED) {
-    this->m_chunkExecutionStates[chunkNumber] = eChunkExecutionState::EXECUTED;
+  if (this->m_chunk_execution_states[chunkNumber] == eChunkExecutionState::SCHEDULED) {
+    this->m_chunk_execution_states[chunkNumber] = eChunkExecutionState::EXECUTED;
   }
 
   atomic_add_and_fetch_u(&this->m_chunksFinished, 1);
@@ -517,8 +514,8 @@ bool ExecutionGroup::scheduleAreaWhenPossible(ExecutionSystem *graph, rcti *area
 
 bool ExecutionGroup::scheduleChunk(unsigned int chunkNumber)
 {
-  if (this->m_chunkExecutionStates[chunkNumber] == eChunkExecutionState::NOT_SCHEDULED) {
-    this->m_chunkExecutionStates[chunkNumber] = eChunkExecutionState::SCHEDULED;
+  if (this->m_chunk_execution_states[chunkNumber] == eChunkExecutionState::NOT_SCHEDULED) {
+    this->m_chunk_execution_states[chunkNumber] = eChunkExecutionState::SCHEDULED;
     WorkScheduler::schedule(this, chunkNumber);
     return true;
   }
@@ -535,12 +532,12 @@ bool ExecutionGroup::scheduleChunkWhenPossible(ExecutionSystem *graph, int xChun
   }
   int chunkNumber = yChunk * this->m_numberOfXChunks + xChunk;
   // chunk is already executed
-  if (this->m_chunkExecutionStates[chunkNumber] == eChunkExecutionState::EXECUTED) {
+  if (this->m_chunk_execution_states[chunkNumber] == eChunkExecutionState::EXECUTED) {
     return true;
   }
 
   // chunk is scheduled, but not executed
-  if (this->m_chunkExecutionStates[chunkNumber] == eChunkExecutionState::SCHEDULED) {
+  if (this->m_chunk_execution_states[chunkNumber] == eChunkExecutionState::SCHEDULED) {
     return false;
   }
 
diff --git a/source/blender/compositor/intern/COM_ExecutionGroup.h b/source/blender/compositor/intern/COM_ExecutionGroup.h
index bfd745d8320..415505616bd 100644
--- a/source/blender/compositor/intern/COM_ExecutionGroup.h
+++ b/source/blender/compositor/intern/COM_ExecutionGroup.h
@@ -23,6 +23,8 @@
 #endif
 
 #include "BLI_rect.h"
+#include "BLI_vector.hh"
+
 #include "COM_CompositorContext.h"
 #include "COM_Device.h"
 #include "COM_MemoryProxy.h"
@@ -149,12 +151,12 @@ class ExecutionGroup {
   unsigned int m_chunksFinished;
 
   /**
-   * \brief the chunkExecutionStates holds per chunk the execution state. this state can be
+   * \brief m_chunk_execution_states holds per chunk the execution state. this state can be
    *   - eChunkExecutionState::NOT_SCHEDULED: not scheduled
    *   - eChunkExecutionState::SCHEDULED: scheduled
    *   - eChunkExecutionState::EXECUTED: executed
    */
-  eChunkExecutionState *m_chunkExecutionStates;
+  blender::Vector<eChunkExecutionState> m_chunk_execution_states;
 
   /**
    * \brief indicator when this ExecutionGroup has valid Operations in its vector for Execution



More information about the Bf-blender-cvs mailing list