[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