| | 54 | typedef std::vector< osg::ref_ptr<osg::GraphicsThread> > GraphicsThreads; |
|---|
| | 55 | |
|---|
| | 56 | class CountedBlock : public osg::Referenced |
|---|
| | 57 | { |
|---|
| | 58 | public: |
|---|
| | 59 | |
|---|
| | 60 | CountedBlock(unsigned int blockCount); |
|---|
| | 61 | |
|---|
| | 62 | void completed(); |
|---|
| | 63 | |
|---|
| | 64 | void block(); |
|---|
| | 65 | |
|---|
| | 66 | void reset(); |
|---|
| | 67 | |
|---|
| | 68 | void release(); |
|---|
| | 69 | |
|---|
| | 70 | void setBlockCount(unsigned int blockCount); |
|---|
| | 71 | |
|---|
| | 72 | protected: |
|---|
| | 73 | |
|---|
| | 74 | ~CountedBlock(); |
|---|
| | 75 | |
|---|
| | 76 | OpenThreads::Mutex _mut; |
|---|
| | 77 | OpenThreads::Condition _cond; |
|---|
| | 78 | unsigned int _numberOfBlocks; |
|---|
| | 79 | unsigned int _blockCount; |
|---|
| | 80 | }; |
|---|
| | 81 | |
|---|
| | 82 | CountedBlock::CountedBlock(unsigned int numberOfBlocks): |
|---|
| | 83 | _numberOfBlocks(numberOfBlocks), |
|---|
| | 84 | _blockCount(0) |
|---|
| | 85 | { |
|---|
| | 86 | } |
|---|
| | 87 | |
|---|
| | 88 | void CountedBlock::completed() |
|---|
| | 89 | { |
|---|
| | 90 | OpenThreads::ScopedLock<OpenThreads::Mutex> mutlock(_mut); |
|---|
| | 91 | if (_blockCount>0) |
|---|
| | 92 | { |
|---|
| | 93 | --_blockCount; |
|---|
| | 94 | |
|---|
| | 95 | if (_blockCount==0) |
|---|
| | 96 | { |
|---|
| | 97 | // osg::notify(osg::NOTICE)<<"Released"<<std::endl; |
|---|
| | 98 | _cond.broadcast(); |
|---|
| | 99 | } |
|---|
| | 100 | } |
|---|
| | 101 | } |
|---|
| | 102 | |
|---|
| | 103 | void CountedBlock::block() |
|---|
| | 104 | { |
|---|
| | 105 | OpenThreads::ScopedLock<OpenThreads::Mutex> mutlock(_mut); |
|---|
| | 106 | if (_blockCount) |
|---|
| | 107 | _cond.wait(&_mut); |
|---|
| | 108 | } |
|---|
| | 109 | |
|---|
| | 110 | void CountedBlock::release() |
|---|
| | 111 | { |
|---|
| | 112 | OpenThreads::ScopedLock<OpenThreads::Mutex> mutlock(_mut); |
|---|
| | 113 | if (_blockCount) |
|---|
| | 114 | { |
|---|
| | 115 | _blockCount = 0; |
|---|
| | 116 | _cond.broadcast(); |
|---|
| | 117 | } |
|---|
| | 118 | } |
|---|
| | 119 | |
|---|
| | 120 | void CountedBlock::reset() |
|---|
| | 121 | { |
|---|
| | 122 | OpenThreads::ScopedLock<OpenThreads::Mutex> mutlock(_mut); |
|---|
| | 123 | if (_numberOfBlocks!=_blockCount) |
|---|
| | 124 | { |
|---|
| | 125 | if (_numberOfBlocks==0) _cond.broadcast(); |
|---|
| | 126 | _blockCount = _numberOfBlocks; |
|---|
| | 127 | } |
|---|
| | 128 | } |
|---|
| | 129 | |
|---|
| | 130 | void CountedBlock::setBlockCount(unsigned int blockCount) |
|---|
| | 131 | { |
|---|
| | 132 | _numberOfBlocks = blockCount; |
|---|
| | 133 | } |
|---|
| | 134 | |
|---|
| | 135 | CountedBlock::~CountedBlock() |
|---|
| | 136 | { |
|---|
| | 137 | _blockCount = 0; |
|---|
| | 138 | release(); |
|---|
| | 139 | } |
|---|
| | 140 | |
|---|
| | 141 | class LoadAndCompileOperation : public osg::Operation |
|---|
| | 142 | { |
|---|
| | 143 | public: |
|---|
| | 144 | |
|---|
| | 145 | LoadAndCompileOperation(const std::string& filename, GraphicsThreads& graphicsThreads, CountedBlock* block): |
|---|
| | 146 | Operation("Load and compile Operation", false), |
|---|
| | 147 | _filename(filename), |
|---|
| | 148 | _graphicsThreads(graphicsThreads), |
|---|
| | 149 | _block(block) {} |
|---|
| | 150 | |
|---|
| | 151 | virtual void operator () (osg::Object* object) |
|---|
| | 152 | { |
|---|
| | 153 | // osg::notify(osg::NOTICE)<<"LoadAndCompileOperation "<<_filename<<std::endl; |
|---|
| | 154 | |
|---|
| | 155 | _loadedModel = osgDB::readNodeFile(_filename); |
|---|
| | 156 | if (_loadedModel.valid() && !_graphicsThreads.empty()) |
|---|
| | 157 | { |
|---|
| | 158 | osg::ref_ptr<osgUtil::GLObjectsOperation> compileOperation = new osgUtil::GLObjectsOperation(_loadedModel.get()); |
|---|
| | 159 | |
|---|
| | 160 | for(GraphicsThreads::iterator gitr = _graphicsThreads.begin(); |
|---|
| | 161 | gitr != _graphicsThreads.end(); |
|---|
| | 162 | ++gitr) |
|---|
| | 163 | { |
|---|
| | 164 | (*gitr)->add( compileOperation.get() ); |
|---|
| | 165 | // requiresBarrier = true; |
|---|
| | 166 | } |
|---|
| | 167 | } |
|---|
| | 168 | |
|---|
| | 169 | if (_block.valid()) _block->completed(); |
|---|
| | 170 | |
|---|
| | 171 | // osg::notify(osg::NOTICE)<<"done LoadAndCompileOperation "<<_filename<<std::endl; |
|---|
| | 172 | } |
|---|
| | 173 | |
|---|
| | 174 | std::string _filename; |
|---|
| | 175 | GraphicsThreads _graphicsThreads; |
|---|
| | 176 | osg::ref_ptr<osg::Node> _loadedModel; |
|---|
| | 177 | osg::ref_ptr<CountedBlock> _block; |
|---|
| | 178 | |
|---|
| | 179 | }; |
|---|
| | 180 | |
|---|
| 173 | | |
|---|
| 174 | | for(Files::iterator nitr = newFiles.begin(); |
|---|
| 175 | | nitr != newFiles.end(); |
|---|
| 176 | | ++nitr) |
|---|
| 177 | | { |
|---|
| 178 | | osg::ref_ptr<osg::Node> loadedModel = osgDB::readNodeFile(*nitr); |
|---|
| 179 | | |
|---|
| 180 | | if (loadedModel.get()) |
|---|
| 181 | | { |
|---|
| 182 | | nodesToAdd[*nitr] = loadedModel; |
|---|
| 183 | | |
|---|
| 184 | | osg::ref_ptr<osgUtil::GLObjectsOperation> compileOperation = new osgUtil::GLObjectsOperation(loadedModel.get()); |
|---|
| 185 | | |
|---|
| 186 | | for(GraphicsThreads::iterator gitr = threads.begin(); |
|---|
| 187 | | gitr != threads.end(); |
|---|
| 188 | | ++gitr) |
|---|
| | 305 | |
|---|
| | 306 | |
|---|
| | 307 | if (_operationQueue.valid()) |
|---|
| | 308 | { |
|---|
| | 309 | // osg::notify(osg::NOTICE)<<"Using OperationQueue"<<std::endl; |
|---|
| | 310 | |
|---|
| | 311 | _endOfLoadBlock = new CountedBlock(newFiles.size()); |
|---|
| | 312 | |
|---|
| | 313 | typedef std::list< osg::ref_ptr<LoadAndCompileOperation> > LoadAndCompileList; |
|---|
| | 314 | LoadAndCompileList loadAndCompileList; |
|---|
| | 315 | |
|---|
| | 316 | for(Files::iterator nitr = newFiles.begin(); |
|---|
| | 317 | nitr != newFiles.end(); |
|---|
| | 318 | ++nitr) |
|---|
| | 319 | { |
|---|
| | 320 | osg::ref_ptr<LoadAndCompileOperation> loadAndCompile = new LoadAndCompileOperation( *nitr, threads, _endOfLoadBlock.get() ); |
|---|
| | 321 | loadAndCompileList.push_back(loadAndCompile); |
|---|
| | 322 | _operationQueue->add( loadAndCompile.get() ); |
|---|
| | 323 | } |
|---|
| | 324 | |
|---|
| | 325 | osg::ref_ptr<osg::Operation> operation; |
|---|
| | 326 | while ((operation=_operationQueue->getNextOperation()).valid()) |
|---|
| | 327 | { |
|---|
| | 328 | // osg::notify(osg::NOTICE)<<"Local running of operation"<<std::endl; |
|---|
| | 329 | (*operation)(0); |
|---|
| | 330 | } |
|---|
| | 331 | |
|---|
| | 332 | // osg::notify(osg::NOTICE)<<"Waiting for completion of LoadAndCompile operations"<<std::endl; |
|---|
| | 333 | _endOfLoadBlock->block(); |
|---|
| | 334 | // osg::notify(osg::NOTICE)<<"done ... Waiting for completion of LoadAndCompile operations"<<std::endl; |
|---|
| | 335 | |
|---|
| | 336 | for(LoadAndCompileList::iterator litr = loadAndCompileList.begin(); |
|---|
| | 337 | litr != loadAndCompileList.end(); |
|---|
| | 338 | ++litr) |
|---|
| | 339 | { |
|---|
| | 340 | if ((*litr)->_loadedModel.valid()) |
|---|
| 778 | | operationThread = new osg::OperationThread; |
|---|
| 779 | | operationThread->startThread(); |
|---|
| 780 | | operationThread->add(masterOperation.get()); |
|---|
| | 967 | masterOperationThread = new osg::OperationThread; |
|---|
| | 968 | masterOperationThread->startThread(); |
|---|
| | 969 | |
|---|
| | 970 | masterOperationThread->add(masterOperation.get()); |
|---|
| | 971 | |
|---|
| | 972 | // if (numLoadThreads>0) |
|---|
| | 973 | { |
|---|
| | 974 | osg::ref_ptr<osg::OperationQueue> operationQueue = new osg::OperationQueue; |
|---|
| | 975 | masterOperation->setOperationQueue(operationQueue.get()); |
|---|
| | 976 | |
|---|
| | 977 | for(unsigned int i=0; i<numLoadThreads; ++i) |
|---|
| | 978 | { |
|---|
| | 979 | osg::ref_ptr<osg::OperationThread> thread = new osg::OperationThread; |
|---|
| | 980 | thread->setOperationQueue(operationQueue.get()); |
|---|
| | 981 | thread->startThread(); |
|---|
| | 982 | generalThreadList.push_back(thread); |
|---|
| | 983 | } |
|---|
| | 984 | } |
|---|