[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