diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2016-03-03 13:59:20 +0300 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2016-03-03 14:02:31 +0300 |
commit | 8c113a95e3536dfa0be37c9e2e924ea8172bb613 (patch) | |
tree | fc71fffa34bc552168f79efccd5bd02b14700556 /source/blender/compositor/intern | |
parent | ba7eb0c7b9d93987173780d5b819c7f2ec79b96e (diff) |
Make texture node threaded
Quite trivial idea -- just pass tread ID to the texture sampling function.
Implemented as a TLS to avoid passing huge amount of extra contexts around.
Should be working on all platforms, but compilation test is required.
Reviewers: juicyfruit, campbellbarton
Reviewed By: campbellbarton
Differential Revision: https://developer.blender.org/D1831
Diffstat (limited to 'source/blender/compositor/intern')
4 files changed, 30 insertions, 7 deletions
diff --git a/source/blender/compositor/intern/COM_CPUDevice.cpp b/source/blender/compositor/intern/COM_CPUDevice.cpp index c7c3f7769fe..a5824ec5248 100644 --- a/source/blender/compositor/intern/COM_CPUDevice.cpp +++ b/source/blender/compositor/intern/COM_CPUDevice.cpp @@ -22,6 +22,12 @@ #include "COM_CPUDevice.h" +CPUDevice::CPUDevice(int thread_id) + : Device(), + m_thread_id(thread_id) +{ +} + void CPUDevice::execute(WorkPackage *work) { const unsigned int chunkNumber = work->getChunkNumber(); diff --git a/source/blender/compositor/intern/COM_CPUDevice.h b/source/blender/compositor/intern/COM_CPUDevice.h index 3dc8fff66a3..d12666593d4 100644 --- a/source/blender/compositor/intern/COM_CPUDevice.h +++ b/source/blender/compositor/intern/COM_CPUDevice.h @@ -31,11 +31,18 @@ */ class CPUDevice : public Device { public: + CPUDevice(int thread_id); + /** * @brief execute a WorkPackage * @param work the WorkPackage to execute */ void execute(WorkPackage *work); + + int thread_id() { return m_thread_id; } + +protected: + int m_thread_id; }; #endif diff --git a/source/blender/compositor/intern/COM_WorkScheduler.cpp b/source/blender/compositor/intern/COM_WorkScheduler.cpp index fc6ea1299cf..4c85f11f655 100644 --- a/source/blender/compositor/intern/COM_WorkScheduler.cpp +++ b/source/blender/compositor/intern/COM_WorkScheduler.cpp @@ -50,7 +50,8 @@ /// @brief list of all CPUDevices. for every hardware thread an instance of CPUDevice is created -static vector<CPUDevice *> g_cpudevices; +static vector<CPUDevice*> g_cpudevices; +static ThreadLocal(CPUDevice*) g_thread_device; #if COM_CURRENT_THREADING_MODEL == COM_TM_QUEUE /// @brief list of all thread for every CPUDevice in cpudevices a thread exists @@ -153,9 +154,9 @@ int COM_isHighlightedbNode(bNode *bnode) #if COM_CURRENT_THREADING_MODEL == COM_TM_QUEUE void *WorkScheduler::thread_execute_cpu(void *data) { - Device *device = (Device *)data; + CPUDevice *device = (CPUDevice *)data; WorkPackage *work; - + BLI_thread_local_set(g_thread_device, device); while ((work = (WorkPackage *)BLI_thread_queue_pop(g_cpuqueue))) { HIGHLIGHT(work); device->execute(work); @@ -310,18 +311,20 @@ void WorkScheduler::initialize(bool use_opencl, int num_cpu_threads) device->deinitialize(); delete device; } - + if (g_cpuInitialized) { + BLI_thread_local_delete(g_thread_device); + } g_cpuInitialized = false; } /* initialize CPU threads */ if (!g_cpuInitialized) { for (int index = 0; index < num_cpu_threads; index++) { - CPUDevice *device = new CPUDevice(); + CPUDevice *device = new CPUDevice(index); device->initialize(); g_cpudevices.push_back(device); } - + BLI_thread_local_create(g_thread_device); g_cpuInitialized = true; } @@ -407,7 +410,7 @@ void WorkScheduler::deinitialize() device->deinitialize(); delete device; } - + BLI_thread_local_delete(g_thread_device); g_cpuInitialized = false; } @@ -450,3 +453,8 @@ void WorkScheduler::deinitialize() } } +int WorkScheduler::current_thread_id() +{ + CPUDevice *device = (CPUDevice *)BLI_thread_local_get(g_thread_device); + return device->thread_id(); +} diff --git a/source/blender/compositor/intern/COM_WorkScheduler.h b/source/blender/compositor/intern/COM_WorkScheduler.h index 27afdf6efd0..67d3fc87ce1 100644 --- a/source/blender/compositor/intern/COM_WorkScheduler.h +++ b/source/blender/compositor/intern/COM_WorkScheduler.h @@ -113,6 +113,8 @@ public: */ static bool hasGPUDevices(); + static int current_thread_id(); + #ifdef WITH_CXX_GUARDEDALLOC MEM_CXX_CLASS_ALLOC_FUNCS("COM:WorkScheduler") #endif |