diff options
Diffstat (limited to 'source/blender/compositor/intern/COM_WorkScheduler.h')
-rw-r--r-- | source/blender/compositor/intern/COM_WorkScheduler.h | 127 |
1 files changed, 127 insertions, 0 deletions
diff --git a/source/blender/compositor/intern/COM_WorkScheduler.h b/source/blender/compositor/intern/COM_WorkScheduler.h new file mode 100644 index 00000000000..0befa209e47 --- /dev/null +++ b/source/blender/compositor/intern/COM_WorkScheduler.h @@ -0,0 +1,127 @@ +/* + * Copyright 2011, Blender Foundation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor: + * Jeroen Bakker + * Monique Dewanchand + */ + +#ifndef _COM_WorkScheduler_h_ +#define _COM_WorkScheduler_h_ + +#include "COM_ExecutionGroup.h" +extern "C" { + #include "BLI_threads.h" +} +#include "COM_WorkPackage.h" +#include "COM_defines.h" +#include "COM_Device.h" + +// STATES +/** @brief states of the WorkScheduler + * @ingroup execution + */ +typedef enum WorkSchedulerState { + COM_WSS_UNKNOWN = -1, + COM_WSS_INITIALIZED = 0, + COM_WSS_STARTED = 1, + COM_WSS_STOPPING = 2, + COM_WSS_STOPPED = 3, + COM_WSS_DEINITIALIZED = 4 +} WorkSchedulerState; + +/** @brief the workscheduler + * @ingroup execution + */ +class WorkScheduler { + +#if COM_CURRENT_THREADING_MODEL == COM_TM_QUEUE + /** + * @brief are we being stopped. + */ + static bool isStopping(); + + /** + * @brief main thread loop for cpudevices + * inside this loop new work is queried and being executed + */ + static void* thread_execute_cpu(void* data); + + /** + * @brief main thread loop for gpudevices + * inside this loop new work is queried and being executed + */ + static void* thread_execute_gpu(void* data); +#endif +public: + /** + * @brief schedule a chunk of a group to be calculated. + * An execution group schedules a chunk in the WorkScheduler + * when ExecutionGroup.isOpenCL is set the work will be handled by a OpenCLDevice + * otherwide the work is scheduled for an CPUDevice + * @see ExecutionGroup.execute + * @param group the execution group + * @param chunkNumber the number of the chunk in the group to be executed + */ + static void schedule(ExecutionGroup* group, int chunkNumber); + + /** + * @brief initialize the WorkScheduler + * + * during initialization the mutexes are initialized. + * there are two mutexes (for every device type one) + * After mutex initialization the system is queried in order to count the number of CPUDevices and GPUDevices to be created. + * For every hardware thread a CPUDevice and for every OpenCL GPU device a OpenCLDevice is created. + * these devices are stored in a separate list (cpudevices & gpudevices) + */ + static void initialize(); + + /** + * @brief deinitialize the WorkScheduler + * free all allocated resources + */ + static void deinitialize(); + + /** + * @brief Start the execution + * this methods will start the WorkScheduler. Inside this method all threads are initialized. + * for every device a thread is created. + * @see initialize Initialization and query of the number of devices + */ + static void start(CompositorContext &context); + + /** + * @brief stop the execution + * All created thread by the start method are destroyed. + * @see start + */ + static void stop(); + + /** + * @brief wait for all work to be completed. + */ + static void finish(); + + /** + * @brief Are there OpenCL capable GPU devices initialized? + * the result of this method is stored in the CompositorContext + * A node can generate a different operation tree when OpenCLDevices exists. + * @see CompositorContext.getHasActiveOpenCLDevices + */ + static bool hasGPUDevices(); +}; +#endif |