[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [42642] branches/tile/source/blender/ compositor: Tile branch:

Jeroen Bakker j.bakker at atmind.nl
Thu Dec 15 13:42:51 CET 2011


Revision: 42642
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=42642
Author:   jbakker
Date:     2011-12-15 12:42:43 +0000 (Thu, 15 Dec 2011)
Log Message:
-----------
Tile branch:
added the worker pattern in the workscheduler for stability reasons.
the execution time is slower (+-70% of normal speed) but it does not crash that much.

Goal is still to use the pthreaded model. but this needs some more complex debugging.

Jeroen

Modified Paths:
--------------
    branches/tile/source/blender/compositor/COM_defines.h
    branches/tile/source/blender/compositor/intern/COM_ExecutionGroup.cpp
    branches/tile/source/blender/compositor/intern/COM_MemoryManagerState.cpp
    branches/tile/source/blender/compositor/intern/COM_WorkPackage.cpp
    branches/tile/source/blender/compositor/intern/COM_WorkScheduler.cpp
    branches/tile/source/blender/compositor/intern/COM_compositor.cpp
    branches/tile/source/blender/compositor/operations/COM_CompositorOperation.cpp
    branches/tile/source/blender/compositor/operations/COM_RenderLayersBaseProg.h

Modified: branches/tile/source/blender/compositor/COM_defines.h
===================================================================
--- branches/tile/source/blender/compositor/COM_defines.h	2011-12-15 12:18:09 UTC (rev 42641)
+++ branches/tile/source/blender/compositor/COM_defines.h	2011-12-15 12:42:43 UTC (rev 42642)
@@ -70,9 +70,15 @@
 #define COM_TM_NOTHREAD 2
 
 /**
+  * COM_TM_WORKER is a multithreaded model, which uses the BLI_Worker pattern. it is slower as it searched for free threads.
+  * But for stability reasons you can select this one.
+  */
+#define COM_TM_WORKER 3
+
+/**
   * COM_CURRENT_THREADING_MODEL can be one of the above, COM_PTHREAD is currently default.
   */
-#define COM_CURRENT_THREADING_MODEL COM_TM_PTHREAD
+#define COM_CURRENT_THREADING_MODEL COM_TM_WORKER
 
 
 // chunk order

Modified: branches/tile/source/blender/compositor/intern/COM_ExecutionGroup.cpp
===================================================================
--- branches/tile/source/blender/compositor/intern/COM_ExecutionGroup.cpp	2011-12-15 12:18:09 UTC (rev 42641)
+++ branches/tile/source/blender/compositor/intern/COM_ExecutionGroup.cpp	2011-12-15 12:42:43 UTC (rev 42642)
@@ -95,6 +95,7 @@
 			this->openCL = operation->isOpenCL();
 			this->initialized = true;
 		}
+		printf("Adding operation to group %d, %d\n", this, operation);
 		this->operations.push_back(operation);
 		if (operation->isReadBufferOperation()) {
 			ReadBufferOperation* readOperation = (ReadBufferOperation*)operation;
@@ -414,7 +415,11 @@
 }
 
 void ExecutionGroup::finalizeChunkExecution(int chunkNumber, MemoryBuffer** memoryBuffers) {
-	this->chunkExecutionStates[chunkNumber] = COM_ES_EXECUTED;
+	if (this->chunkExecutionStates[chunkNumber] == COM_ES_SCHEDULED)
+		this->chunkExecutionStates[chunkNumber] = COM_ES_EXECUTED;
+	else 
+		throw "Threading inconsistency";
+	
 	this->chunksFinished++;
 	if (memoryBuffers) {
 		for (unsigned int index = 0 ; index < this->cachedMaxReadBufferOffset; index ++) {
@@ -487,9 +492,12 @@
 }
 
 bool ExecutionGroup::scheduleChunk(unsigned int chunkNumber) {
-	this->chunkExecutionStates[chunkNumber] = COM_ES_SCHEDULED;
-	WorkScheduler::schedule(this, chunkNumber);
-	return true;
+	if (this->chunkExecutionStates[chunkNumber] == COM_ES_NOT_SCHEDULED) {
+		this->chunkExecutionStates[chunkNumber] = COM_ES_SCHEDULED;
+		WorkScheduler::schedule(this, chunkNumber);
+		return true;
+	}
+	return false;
 }
 
 bool ExecutionGroup::scheduleChunkWhenPossible(ExecutionSystem * graph, int xChunk, int yChunk) {

Modified: branches/tile/source/blender/compositor/intern/COM_MemoryManagerState.cpp
===================================================================
--- branches/tile/source/blender/compositor/intern/COM_MemoryManagerState.cpp	2011-12-15 12:18:09 UTC (rev 42641)
+++ branches/tile/source/blender/compositor/intern/COM_MemoryManagerState.cpp	2011-12-15 12:42:43 UTC (rev 42642)
@@ -67,7 +67,11 @@
         if (oldbuffer) delete oldbuffer;
     }
 
-	this->chunkBuffers[chunkNumber] = buffer;
+	if (this->chunkBuffers[chunkNumber] == NULL) {
+		this->chunkBuffers[chunkNumber] = buffer;
+	} else {
+		throw "ALREADY ALLOCATED!";
+	}
     BLI_mutex_unlock(&this->mutex);
 }
 

Modified: branches/tile/source/blender/compositor/intern/COM_WorkPackage.cpp
===================================================================
--- branches/tile/source/blender/compositor/intern/COM_WorkPackage.cpp	2011-12-15 12:18:09 UTC (rev 42641)
+++ branches/tile/source/blender/compositor/intern/COM_WorkPackage.cpp	2011-12-15 12:42:43 UTC (rev 42642)
@@ -21,10 +21,8 @@
  */
 
 #include "COM_WorkPackage.h"
-#include <stdio.h>
 
 WorkPackage::WorkPackage(ExecutionGroup *group, unsigned int chunkNumber) {
-	printf("%d: %d\n", group, chunkNumber);
-    this->executionGroup = group;
+	this->executionGroup = group;
 	this->chunkNumber = chunkNumber;
 }

Modified: branches/tile/source/blender/compositor/intern/COM_WorkScheduler.cpp
===================================================================
--- branches/tile/source/blender/compositor/intern/COM_WorkScheduler.cpp	2011-12-15 12:18:09 UTC (rev 42641)
+++ branches/tile/source/blender/compositor/intern/COM_WorkScheduler.cpp	2011-12-15 12:42:43 UTC (rev 42642)
@@ -28,11 +28,11 @@
 #include "COM_OpenCLDevice.h"
 #include "OCL_opencl.h"
 #include "stdio.h"
-#include "MEM_guardedalloc.h"
 #include "COM_OpenCLKernels.cl.cpp"
 
 #if COM_CURRENT_THREADING_MODEL == COM_TM_PTHREAD
 #elif COM_CURRENT_THREADING_MODEL == COM_TM_NOTHREAD
+#elif COM_CURRENT_THREADING_MODEL == COM_TM_WORKER
 #else
 #error WorkScheduler: No threading model configured
 #endif
@@ -60,11 +60,23 @@
 static ListBase gputhreads;
 #endif
 
+#if COM_CURRENT_THREADING_MODEL == COM_TM_WORKER
+ThreadedWorker *cpuworker;
+#endif
+
 #if COM_OPENCL_ENABLED
 static cl_context context;
 static cl_program program;
 #endif
 
+#if COM_CURRENT_THREADING_MODEL == COM_TM_WORKER
+void* worker_execute_cpu(void* data) {
+	CPUDevice device;
+	WorkPackage * package = (WorkPackage*)data;
+	device.execute(package);
+	delete package;
+}
+#endif
 #if COM_CURRENT_THREADING_MODEL == COM_TM_PTHREAD
 void* WorkScheduler::thread_execute_cpu(void* data) {
 	bool continueLoop = true;
@@ -145,6 +157,8 @@
 	CPUDevice device;
 	device.execute(package);
 	delete package;
+#elif COM_CURRENT_THREADING_MODEL == COM_TM_WORKER
+	BLI_insert_work(cpuworker, package);
 #endif
 }
 
@@ -167,6 +181,9 @@
 		openclActive = false;
 	}
 #endif
+#if COM_CURRENT_THREADING_MODEL == COM_TM_WORKER
+	cpuworker = BLI_create_worker(worker_execute_cpu, cpudevices.size(), 0);
+#endif
 	state = COM_WSS_STARTED;
 }
 
@@ -176,11 +193,14 @@
 	BLI_end_threads(&cputhreads);
 	BLI_end_threads(&gputhreads);
 #endif
+#if COM_CURRENT_THREADING_MODEL == COM_TM_WORKER
+	BLI_destroy_worker(cpuworker);
+#endif
 	state = COM_WSS_STOPPED;
 }
 
 void WorkScheduler::finish() {
-	while ((cpuwork.size() + gpuwork.size()) >0) {
+	while (!cpuwork.empty() && !gpuwork.empty()) {
 		PIL_sleep_ms(10);
 	}
 }
@@ -206,6 +226,14 @@
 		device->initialize();
 		cpudevices.push_back(device);
 	}
+#elif COM_CURRENT_THREADING_MODEL == COM_TM_WORKER
+	int numberOfCPUThreads = BLI_system_thread_count();
+
+	for (int index = 0 ; index < numberOfCPUThreads ; index ++) {
+		CPUDevice *device = new CPUDevice();
+		device->initialize();
+		cpudevices.push_back(device);
+	}
 #endif
 
 #if COM_OPENCL_ENABLED

Modified: branches/tile/source/blender/compositor/intern/COM_compositor.cpp
===================================================================
--- branches/tile/source/blender/compositor/intern/COM_compositor.cpp	2011-12-15 12:18:09 UTC (rev 42641)
+++ branches/tile/source/blender/compositor/intern/COM_compositor.cpp	2011-12-15 12:42:43 UTC (rev 42642)
@@ -30,18 +30,18 @@
 #include "COM_ExecutionSystem.h"
 #include "COM_WorkScheduler.h"
 
-static ThreadMutex *mutex=NULL;
+static ThreadMutex *compositorMutex;
 void COM_execute(bNodeTree *editingtree, int rendering) {
-	if (mutex == NULL) { /// TODO: move to blender startup phase
-		mutex = new ThreadMutex();
-		BLI_mutex_init(mutex);
+	if (compositorMutex == NULL) { /// TODO: move to blender startup phase
+		compositorMutex = new ThreadMutex();
+		BLI_mutex_init(compositorMutex);
 		WorkScheduler::initialize(); ///TODO: call workscheduler.deinitialize somewhere
 	}
-	BLI_mutex_lock(mutex);
+	BLI_mutex_lock(compositorMutex);
 	if (editingtree->test_break && editingtree->test_break(editingtree->tbh)) {
 		// during editing multiple calls to this method can be triggered.
 		// make sure one the last one will be doing the work.
-		BLI_mutex_unlock(mutex);
+		BLI_mutex_unlock(compositorMutex);
 		return;
 
 	}
@@ -55,5 +55,5 @@
 	system->execute();
 	delete system;
 
-	BLI_mutex_unlock(mutex);
+	BLI_mutex_unlock(compositorMutex);
 }

Modified: branches/tile/source/blender/compositor/operations/COM_CompositorOperation.cpp
===================================================================
--- branches/tile/source/blender/compositor/operations/COM_CompositorOperation.cpp	2011-12-15 12:18:09 UTC (rev 42641)
+++ branches/tile/source/blender/compositor/operations/COM_CompositorOperation.cpp	2011-12-15 12:42:43 UTC (rev 42642)
@@ -51,7 +51,7 @@
 	this->imageInput = getInputSocketReader(0);
 	this->alphaInput = getInputSocketReader(1);
 	if (this->getWidth() * this->getHeight() != 0) {
-		this->outputBuffer=(float*) MEM_mapallocN(this->getWidth()*this->getHeight()*4*sizeof(float), "CompositorOperation");
+		this->outputBuffer=(float*) MEM_callocN(this->getWidth()*this->getHeight()*4*sizeof(float), "CompositorOperation");
 	}
 	const Scene * scene = this->scene;
 	Render* re= RE_GetRender(scene->id.name);
@@ -77,6 +77,7 @@
 
 
 void CompositorOperation::executeRegion(rcti *rect, unsigned int tileNumber, MemoryBuffer** memoryBuffers) {
+	float color[8]; // 7 is enough
 	float* buffer = this->outputBuffer;
 
 	if (!buffer) return;
@@ -91,17 +92,19 @@
 
 	for (y = y1 ; y < y2 && (!breaked); y++) {
 		for (x = x1 ; x < x2 && (!breaked) ; x++) {
-			imageInput->read(&(buffer[offset]), x, y, memoryBuffers);
+			imageInput->read(color, x, y, memoryBuffers);
 			if (alphaInput != NULL) {
-				alphaInput->read(&(buffer[offset+3]), x, y, memoryBuffers);
+				alphaInput->read(&(color[3]), x, y, memoryBuffers);
 			}
+			buffer[offset] = color[0];
+			buffer[offset+1] = color[1];
+			buffer[offset+2] = color[2];
+			buffer[offset+3] = color[3];
 			offset +=4;
 			if (tree->test_break && tree->test_break(tree->tbh)) {
 				breaked = true;
 			}
-
 		}
 		offset += (this->getWidth()-(x2-x1))*4;
 	}
 }
-

Modified: branches/tile/source/blender/compositor/operations/COM_RenderLayersBaseProg.h
===================================================================
--- branches/tile/source/blender/compositor/operations/COM_RenderLayersBaseProg.h	2011-12-15 12:18:09 UTC (rev 42641)
+++ branches/tile/source/blender/compositor/operations/COM_RenderLayersBaseProg.h	2011-12-15 12:42:43 UTC (rev 42642)
@@ -63,7 +63,7 @@
     int renderpass;
 
 	int elementsize;
-
+	
 protected:
     /**
       * Constructor




More information about the Bf-blender-cvs mailing list