| 2046 | } |
| 2047 | |
| 2048 | void |
| 2049 | RenderThreadTask::run() |
| 2050 | { |
| 2051 | #ifdef DEBUG |
| 2052 | boost_adaptbx::floating_point::exception_trapping trap(boost_adaptbx::floating_point::exception_trapping::division_by_zero | |
| 2053 | boost_adaptbx::floating_point::exception_trapping::invalid | |
| 2054 | boost_adaptbx::floating_point::exception_trapping::overflow); |
| 2055 | #endif |
| 2056 | #ifndef NATRON_PLAYBACK_USES_THREAD_POOL |
| 2057 | notifyIsRunning(true); |
| 2058 | |
| 2059 | for (;; ) { |
| 2060 | bool enableRenderStats; |
| 2061 | std::vector<ViewIdx> viewsToRender; |
| 2062 | int time = _imp->scheduler->pickFrameToRender(this, &enableRenderStats, &viewsToRender); |
| 2063 | |
| 2064 | if ( mustQuit() ) { |
| 2065 | break; |
| 2066 | } |
| 2067 | |
| 2068 | #ifdef TRACE_SCHEDULER |
| 2069 | qDebug() << "Parallel Render Thread: Picking frame to render: " << time; |
| 2070 | #endif |
| 2071 | renderFrame(time, viewsToRender, enableRenderStats); |
| 2072 | |
| 2073 | appPTR->getAppTLS()->cleanupTLSForThread(); |
| 2074 | |
| 2075 | if ( mustQuit() ) { |
| 2076 | break; |
| 2077 | } |
| 2078 | } |
| 2079 | |
| 2080 | { |
| 2081 | QMutexLocker l(&_imp->mustQuitMutex); |
| 2082 | _imp->hasQuit = true; |
| 2083 | } |
| 2084 | notifyIsRunning(false); |
| 2085 | _imp->scheduler->notifyThreadAboutToQuit(this); |
| 2086 | #else // NATRON_PLAYBACK_USES_THREAD_POOL |
| 2087 | renderFrame(_imp->time, _imp->viewsToRender, _imp->useRenderStats); |
| 2088 | _imp->scheduler->notifyThreadAboutToQuit(this); |
| 2089 | #endif |
| 2090 | } |
| 2091 | |
| 2092 | #ifndef NATRON_PLAYBACK_USES_THREAD_POOL |
| 2093 | bool |
no test coverage detected