//---------------------------------------------------------------------
void DefaultWorkQueue::startup(bool forceRestart)
{
    if (mIsRunning)
    {
        if (forceRestart)
            shutdown();
        else
            return;
    }

    mShuttingDown = false;

    mWorkerFunc = OGRE_NEW_T(WorkerFunc(this), MEMCATEGORY_GENERAL);

    LogManager::getSingleton().stream() <<
                                        "DefaultWorkQueue('" << mName << "') initialising on thread " <<
#if OGRE_THREAD_SUPPORT
                                        OGRE_THREAD_CURRENT_ID
#else
                                        "main"
#endif
                                        << ".";

#if OGRE_THREAD_SUPPORT
    if (mWorkerRenderSystemAccess)
        Root::getSingleton().getRenderSystem()->preExtraThreadsStarted();

    mNumThreadsRegisteredWithRS = 0;
    for (uint8 i = 0; i < mWorkerThreadCount; ++i)
    {
        OGRE_THREAD_CREATE(t, *mWorkerFunc);
        mWorkers.push_back(t);
    }

    if (mWorkerRenderSystemAccess)
    {
        OGRE_LOCK_MUTEX_NAMED(mInitMutex, initLock);
        // have to wait until all threads are registered with the render system
        while (mNumThreadsRegisteredWithRS < mWorkerThreadCount)
            OGRE_THREAD_WAIT(mInitSync, mInitMutex, initLock);

        Root::getSingleton().getRenderSystem()->postExtraThreadsStarted();

    }
#endif

    mIsRunning = true;
}
Пример #2
0
    //---------------------------------------------------------------------
    void DefaultWorkQueue::startup(bool forceRestart)
    {
        if (mIsRunning)
        {
            if (forceRestart)
                shutdown();
            else
                return;
        }

        mShuttingDown = false;
        
        mWorkerFunc = OGRE_NEW_T(WorkerFunc(this), MEMCATEGORY_GENERAL);

        LogManager::getSingleton().stream() <<
            "DefaultWorkQueue('" << mName << "') initialising.";

#if OGRE_NO_TBB_SCHEDULER == 0
        mTaskScheduler.initialize(mWorkerThreadCount);
#endif

        if (mWorkerRenderSystemAccess)
        {
            Root::getSingleton().getRenderSystem()->preExtraThreadsStarted();
            RegisterRSWorker worker (this);
            // current thread need not be registered
            mRegisteredThreads.insert(tbb::this_tbb_thread::get_id());
            while (mRegisteredThreads.size() < mWorkerThreadCount)
            {
                // spawn tasks until all worker threads have registered themselves with the RS
                for (size_t i = 0; i < mWorkerThreadCount*3; ++i)
                {
                    mTaskGroup.run(worker);
                }
                mTaskGroup.wait();
            }
            Root::getSingleton().getRenderSystem()->postExtraThreadsStarted();
        }

        mIsRunning = true;
    }