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. @@
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to