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

Jeroen Bakker j.bakker at atmind.nl
Tue Jan 3 13:06:40 CET 2012


Revision: 43096
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=43096
Author:   jbakker
Date:     2012-01-03 12:06:30 +0000 (Tue, 03 Jan 2012)
Log Message:
-----------
Tile branch
 * Enabled OpenCL for the compositor
 * Remove not working Threadind models of the compositor
 * OpenCL will only work when the COM_TM_QUEUE is enabled and COM_OPENCL_ENABLED
 * Updated the scons build system

Modified Paths:
--------------
    branches/tile/build_files/scons/tools/Blender.py
    branches/tile/source/blender/compositor/COM_defines.h
    branches/tile/source/blender/compositor/intern/COM_WorkScheduler.cpp
    branches/tile/source/blender/compositor/intern/COM_WorkScheduler.h
    branches/tile/source/blender/compositor/operations/COM_OpenCLKernels.cl
    branches/tile/source/blender/compositor/operations/COM_OpenCLKernels.cl.cpp
    branches/tile/source/blender/opencl/CMakeLists.txt
    branches/tile/source/blender/opencl/OCL_opencl.h
    branches/tile/source/blender/opencl/SConscript
    branches/tile/source/creator/creator.c

Added Paths:
-----------
    branches/tile/source/blender/opencl/intern/OCL_opencl.c

Modified: branches/tile/build_files/scons/tools/Blender.py
===================================================================
--- branches/tile/build_files/scons/tools/Blender.py	2012-01-03 10:55:46 UTC (rev 43095)
+++ branches/tile/build_files/scons/tools/Blender.py	2012-01-03 12:06:30 UTC (rev 43096)
@@ -317,7 +317,7 @@
 def creator(env):
     sources = ['creator.c']# + Blender.buildinfo(env, "dynamic") + Blender.resources
 
-    incs = ['#/intern/guardedalloc', '#/source/blender/blenlib', '#/source/blender/blenkernel', '#/source/blender/editors/include', '#/source/blender/blenloader', '#/source/blender/imbuf', '#/source/blender/renderconverter', '#/source/blender/render/extern/include', '#/source/blender/windowmanager', '#/source/blender/makesdna', '#/source/blender/makesrna', '#/source/gameengine/BlenderRoutines', '#/extern/glew/include', '#/source/blender/gpu', env['BF_OPENGL_INC']]
+    incs = ['#/intern/guardedalloc', '#/source/blender/blenlib', '#/source/blender/blenkernel', '#/source/blender/editors/include', '#/source/blender/blenloader', '#/source/blender/imbuf', '#/source/blender/renderconverter', '#/source/blender/render/extern/include', '#/source/blender/windowmanager', '#/source/blender/makesdna', '#/source/blender/makesrna', '#/source/gameengine/BlenderRoutines', '#/extern/glew/include', '#/source/blender/gpu', '#/source/blender/opencl', env['BF_OPENGL_INC']]
 
     defs = []
 

Modified: branches/tile/source/blender/compositor/COM_defines.h
===================================================================
--- branches/tile/source/blender/compositor/COM_defines.h	2012-01-03 10:55:46 UTC (rev 43095)
+++ branches/tile/source/blender/compositor/COM_defines.h	2012-01-03 12:06:30 UTC (rev 43096)
@@ -56,34 +56,22 @@
 
 // chunk size determination
 #define COM_PREVIEW_SIZE 140.0f
-#define COM_OPENCL_ENABLED true
-#define COM_PREVIEW_ENABLED true
+#define COM_OPENCL_ENABLED
+#define COM_PREVIEW_ENABLED
 // workscheduler threading models
 /**
-  * COM_TM_PTHREAD is a threading model based on pthread library. where the control (picking new work) is done by each thread
+  * COM_TM_QUEUE is a multithreaded model, which uses the BLI_thread_queue pattern. This is the default option.
   */
-#define COM_TM_PTHREAD 1
+#define COM_TM_QUEUE 1
 
 /**
   * COM_TM_NOTHREAD is a single threading model, everything is executed in the caller thread. easy for debugging
   */
-#define COM_TM_NOTHREAD 2
+#define COM_TM_NOTHREAD 0
 
 /**
-  * 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.
+  * COM_CURRENT_THREADING_MODEL can be one of the above, COM_TM_QUEUE is currently default.
   */
-#define COM_TM_WORKER 3
-
-/**
-  * COM_TM_QUEUE is a multithreaded model, which uses the BLI_thread_queue pattern. it has the same speed as PTHREAD. Currently this needs to 
-  * be expended with OpenCL. After that it might become the default threading model.
-  */
-#define COM_TM_QUEUE 4
-
-/**
-  * COM_CURRENT_THREADING_MODEL can be one of the above, COM_PTHREAD is currently default.
-  */
 #define COM_CURRENT_THREADING_MODEL COM_TM_QUEUE
 
 // chunk order

Modified: branches/tile/source/blender/compositor/intern/COM_WorkScheduler.cpp
===================================================================
--- branches/tile/source/blender/compositor/intern/COM_WorkScheduler.cpp	2012-01-03 10:55:46 UTC (rev 43095)
+++ branches/tile/source/blender/compositor/intern/COM_WorkScheduler.cpp	2012-01-03 12:06:30 UTC (rev 43096)
@@ -30,61 +30,40 @@
 #include "stdio.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
+#if COM_CURRENT_THREADING_MODEL == COM_TM_NOTHREAD
+#warning COM_CURRENT_THREADING_MODEL COM_TM_NOTHREAD is activated. Use only for debugging.
 #elif COM_CURRENT_THREADING_MODEL == COM_TM_QUEUE
 #else
-#error WorkScheduler: No threading model configured
+#error COM_CURRENT_THREADING_MODEL No threading model selected
 #endif
 
 
-/// @brief mutex for cpuwork
-static ThreadMutex cpumutex;
-/// @brief mutem for gpuwork
-static ThreadMutex gpumutex;
 /// @brief global state of the WorkScheduler.
 static WorkSchedulerState state;
-/// @brief work that are scheduled for a CPUDevice. the work has not been picked up by a CPUDevice
-static list<WorkPackage*> cpuwork;
-/// @brief work that are scheduled for a OpenCLDevice. the work has not been picked up by a OpenCLDevice
-static list<WorkPackage*> gpuwork;
 /// @brief list of all CPUDevices. for every hardware thread an instance of CPUDevice is created
 static vector<CPUDevice*> cpudevices;
-/// @brief list of all OpenCLDevices. for every OpenCL GPU device an instance of OpenCLDevice is created
-static vector<OpenCLDevice*> gpudevices;
-static bool openclActive;
-#if COM_CURRENT_THREADING_MODEL == COM_TM_PTHREAD
-/// @brief list of all thread for every CPUDevice in cpudevices a thread exists
-static ListBase cputhreads;
-/// @brief list of all thread for every OpenCLDevice in gpudevices a thread exists
-static ListBase gputhreads;
-#endif
 
-#if COM_CURRENT_THREADING_MODEL == COM_TM_WORKER
-ThreadedWorker *cpuworker;
-#endif
-
 #if COM_CURRENT_THREADING_MODEL == COM_TM_QUEUE
 /// @brief list of all thread for every CPUDevice in cpudevices a thread exists
 static ListBase cputhreads;
+/// @brief all scheduled work for the cpu
 static ThreadQueue * cpuqueue;
-#endif
-
+static ThreadQueue * gpuqueue;
 #ifdef COM_OPENCL_ENABLED
 static cl_context context;
 static cl_program program;
+/// @brief list of all OpenCLDevices. for every OpenCL GPU device an instance of OpenCLDevice is created
+static vector<OpenCLDevice*> gpudevices;
+/// @brief list of all thread for every GPUDevice in cpudevices a thread exists
+static ListBase gputhreads;
+/// @brief all scheduled work for the gpu
+#ifdef COM_OPENCL_ENABLED
+static bool openclActive = false;
 #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;
-	return NULL;
-}
 #endif
+#endif
+
+
 #if COM_CURRENT_THREADING_MODEL == COM_TM_QUEUE
 void* WorkScheduler::thread_execute_cpu(void* data) {
 	bool continueLoop = true;
@@ -104,38 +83,16 @@
 	return NULL;
 }
 
-bool WorkScheduler::isStopping() {return state == COM_WSS_STOPPING;}
-
-#endif
-#if COM_CURRENT_THREADING_MODEL == COM_TM_PTHREAD
-void* WorkScheduler::thread_execute_cpu(void* data) {
-	bool continueLoop = true;
-	Device* device = (Device*)data;
-	while (continueLoop) {
-		WorkPackage* work = WorkScheduler::getCPUWork();
-		if (work) {
-		   device->execute(work);
-		   delete work;
-		}
-		PIL_sleep_ms(100);
-
-		if (WorkScheduler::isStopping()) {
-			continueLoop = false;
-		}
-	}
-	return NULL;
-}
-
 void* WorkScheduler::thread_execute_gpu(void* data) {
 	bool continueLoop = true;
 	Device* device = (Device*)data;
 	while (continueLoop) {
-		WorkPackage* work = WorkScheduler::getGPUWork();
+		WorkPackage* work = (WorkPackage*)BLI_thread_queue_pop(gpuqueue);
 		if (work) {
-		   device->execute(work);
-		   delete work;
+			device->execute(work);
+			delete work;
 		}
-		PIL_sleep_ms(100);
+		PIL_sleep_ms(10);
 
 		if (WorkScheduler::isStopping()) {
 			continueLoop = false;
@@ -145,68 +102,43 @@
 }
 
 bool WorkScheduler::isStopping() {return state == COM_WSS_STOPPING;}
-
-WorkPackage* WorkScheduler::getCPUWork() {
-	WorkPackage* result = NULL;
-	BLI_mutex_lock(&cpumutex);
-
-	if (cpuwork.size()>0) {
-	   result = cpuwork.front();
-	   cpuwork.pop_front();
-	}
-	BLI_mutex_unlock(&cpumutex);
-	return result;
-}
-
-WorkPackage* WorkScheduler::getGPUWork() {
-	WorkPackage* result = NULL;
-	BLI_mutex_lock(&gpumutex);
-
-	if (gpuwork.size()>0) {
-	   result = gpuwork.front();
-	   gpuwork.pop_front();
-	}
-	BLI_mutex_unlock(&gpumutex);
-	return result;
-}
-
 #endif
 
 
+
 void WorkScheduler::schedule(ExecutionGroup *group, int chunkNumber) {
 	WorkPackage* package = new WorkPackage(group, chunkNumber);
-#if COM_CURRENT_THREADING_MODEL == COM_TM_PTHREAD
-	if (group->isOpenCL() && openclActive){
-		BLI_mutex_lock(&gpumutex);
-		gpuwork.push_back(package);
-		BLI_mutex_unlock(&gpumutex);
-	} else{
-		BLI_mutex_lock(&cpumutex);
-		cpuwork.push_back(package);
-		BLI_mutex_unlock(&cpumutex);
-	}
-#elif COM_CURRENT_THREADING_MODEL == COM_TM_NOTHREAD
+#if COM_CURRENT_THREADING_MODEL == COM_TM_NOTHREAD
 	CPUDevice device;
 	device.execute(package);
 	delete package;
-#elif COM_CURRENT_THREADING_MODEL == COM_TM_WORKER
-	BLI_insert_work(cpuworker, package);
 #elif COM_CURRENT_THREADING_MODEL == COM_TM_QUEUE
+#ifdef COM_OPENCL_ENABLED
+	if (group->isOpenCL() && openclActive){
+		BLI_thread_queue_push(gpuqueue, package);
+	} else{
+		BLI_thread_queue_push(cpuqueue, package);
+	}
+#else
 	BLI_thread_queue_push(cpuqueue, package);
 #endif
+#endif
 }
 
 void WorkScheduler::start(CompositorContext &context) {
-#if COM_CURRENT_THREADING_MODEL == COM_TM_PTHREAD
+#if COM_CURRENT_THREADING_MODEL == COM_TM_QUEUE
 	unsigned int index;
-	cpuwork.clear();
+	cpuqueue = BLI_thread_queue_init();
+	BLI_thread_queue_nowait(cpuqueue);
 	BLI_init_threads(&cputhreads, thread_execute_cpu, cpudevices.size());
 	for (index = 0 ; index < cpudevices.size() ; index ++) {
 		Device* device = cpudevices[index];
 		BLI_insert_thread(&cputhreads, device);
 	}
+#ifdef COM_OPENCL_ENABLED
 	if (context.getHasActiveOpenCLDevices()) {
-		gpuwork.clear();
+		gpuqueue = BLI_thread_queue_init();
+		BLI_thread_queue_nowait(gpuqueue);
 		BLI_init_threads(&gputhreads, thread_execute_gpu, gpudevices.size());
 		for (index = 0 ; index < gpudevices.size() ; index ++) {
 			Device* device = gpudevices[index];
@@ -217,70 +149,55 @@
 		openclActive = false;
 	}
 #endif
-#if COM_CURRENT_THREADING_MODEL == COM_TM_WORKER
-	cpuworker = BLI_create_worker(worker_execute_cpu, cpudevices.size(), 0);
 #endif
-#if COM_CURRENT_THREADING_MODEL == COM_TM_QUEUE
-	unsigned int index;
-	cpuqueue = BLI_thread_queue_init();
-	BLI_thread_queue_nowait(cpuqueue);
-	BLI_init_threads(&cputhreads, thread_execute_cpu, cpudevices.size());
-	for (index = 0 ; index < cpudevices.size() ; index ++) {
-		Device* device = cpudevices[index];
-		BLI_insert_thread(&cputhreads, device);
-	}
-#endif
-	
 	state = COM_WSS_STARTED;
 }
-
-void WorkScheduler::stop() {
-	state = COM_WSS_STOPPING;

@@ Diff output truncated at 10240 characters. @@


More information about the Bf-blender-cvs mailing list