mirror of
				https://github.com/OpenMW/openmw.git
				synced 2025-10-29 03:26:38 +00:00 
			
		
		
		
	Fix a race condition in loading screen.
This commit is contained in:
		
							parent
							
								
									f917037ead
								
							
						
					
					
						commit
						663e0a1055
					
				
					 2 changed files with 2 additions and 49 deletions
				
			
		|  | @ -45,8 +45,6 @@ namespace MWGui | ||||||
|         , mNestedLoadingCount(0) |         , mNestedLoadingCount(0) | ||||||
|         , mProgress(0) |         , mProgress(0) | ||||||
|         , mShowWallpaper(true) |         , mShowWallpaper(true) | ||||||
|         , mOldCallback(nullptr) |  | ||||||
|         , mHasCallback(false) |  | ||||||
|     { |     { | ||||||
|         mMainWidget->setSize(MyGUI::RenderManager::getInstance().getViewSize()); |         mMainWidget->setSize(MyGUI::RenderManager::getInstance().getViewSize()); | ||||||
| 
 | 
 | ||||||
|  | @ -147,35 +145,11 @@ namespace MWGui | ||||||
| 
 | 
 | ||||||
|         void operator () (osg::RenderInfo& renderInfo) const override |         void operator () (osg::RenderInfo& renderInfo) const override | ||||||
|         { |         { | ||||||
|             { |  | ||||||
|                 std::unique_lock<std::mutex> lock(mMutex); |  | ||||||
|                 mOneshot = false; |  | ||||||
|             } |  | ||||||
|             mSignal.notify_all(); |  | ||||||
| 
 |  | ||||||
|             int w = renderInfo.getCurrentCamera()->getViewport()->width(); |             int w = renderInfo.getCurrentCamera()->getViewport()->width(); | ||||||
|             int h = renderInfo.getCurrentCamera()->getViewport()->height(); |             int h = renderInfo.getCurrentCamera()->getViewport()->height(); | ||||||
|             mTexture->copyTexImage2D(*renderInfo.getState(), 0, 0, w, h); |             mTexture->copyTexImage2D(*renderInfo.getState(), 0, 0, w, h); | ||||||
| 
 | 
 | ||||||
|             { |             mOneshot = false; | ||||||
|                 std::unique_lock<std::mutex> lock(mMutex); |  | ||||||
|                 mOneshot = false; |  | ||||||
|             } |  | ||||||
|             mSignal.notify_all(); |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         void wait() |  | ||||||
|         { |  | ||||||
|             std::unique_lock<std::mutex> lock(mMutex); |  | ||||||
|             while (mOneshot) |  | ||||||
|                 mSignal.wait(lock); |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         void waitUntilInvoked() |  | ||||||
|         { |  | ||||||
|             std::unique_lock<std::mutex> lock(mMutex); |  | ||||||
|             while (mOneshot) |  | ||||||
|                 mSignal.wait(lock); |  | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         void reset() |         void reset() | ||||||
|  | @ -185,8 +159,6 @@ namespace MWGui | ||||||
| 
 | 
 | ||||||
|     private: |     private: | ||||||
|         mutable bool mOneshot; |         mutable bool mOneshot; | ||||||
|         mutable std::mutex mMutex; |  | ||||||
|         mutable std::condition_variable mSignal; |  | ||||||
|         osg::ref_ptr<osg::Texture2D> mTexture; |         osg::ref_ptr<osg::Texture2D> mTexture; | ||||||
|     }; |     }; | ||||||
| 
 | 
 | ||||||
|  | @ -362,14 +334,12 @@ namespace MWGui | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
| #if OSG_VERSION_GREATER_OR_EQUAL(3, 5, 10) | #if OSG_VERSION_GREATER_OR_EQUAL(3, 5, 10) | ||||||
|  |         mViewer->getCamera()->removeInitialDrawCallback(mCopyFramebufferToTextureCallback); | ||||||
|         mViewer->getCamera()->addInitialDrawCallback(mCopyFramebufferToTextureCallback); |         mViewer->getCamera()->addInitialDrawCallback(mCopyFramebufferToTextureCallback); | ||||||
| #else | #else | ||||||
|         // TODO: Remove once we officially end support for OSG versions pre 3.5.10
 |  | ||||||
|         mOldCallback = mViewer->getCamera()->getInitialDrawCallback(); |  | ||||||
|         mViewer->getCamera()->setInitialDrawCallback(mCopyFramebufferToTextureCallback); |         mViewer->getCamera()->setInitialDrawCallback(mCopyFramebufferToTextureCallback); | ||||||
| #endif | #endif | ||||||
|         mCopyFramebufferToTextureCallback->reset(); |         mCopyFramebufferToTextureCallback->reset(); | ||||||
|         mHasCallback = true; |  | ||||||
| 
 | 
 | ||||||
|         mBackgroundImage->setBackgroundImage(""); |         mBackgroundImage->setBackgroundImage(""); | ||||||
|         mBackgroundImage->setVisible(false); |         mBackgroundImage->setVisible(false); | ||||||
|  | @ -412,21 +382,6 @@ namespace MWGui | ||||||
|         mViewer->renderingTraversals(); |         mViewer->renderingTraversals(); | ||||||
|         mViewer->advance(mViewer->getFrameStamp()->getSimulationTime()); |         mViewer->advance(mViewer->getFrameStamp()->getSimulationTime()); | ||||||
| 
 | 
 | ||||||
|         if (mHasCallback) |  | ||||||
|         { |  | ||||||
|             mCopyFramebufferToTextureCallback->waitUntilInvoked(); |  | ||||||
| 
 |  | ||||||
|             // Note that we are removing the callback before the draw thread has returned from it.
 |  | ||||||
|             // This is OK as we are retaining the ref_ptr.
 |  | ||||||
| #if OSG_VERSION_GREATER_OR_EQUAL(3, 5, 10) |  | ||||||
|             mViewer->getCamera()->removeInitialDrawCallback(mCopyFramebufferToTextureCallback); |  | ||||||
| #else |  | ||||||
|             // TODO: Remove once we officially end support for OSG versions pre 3.5.10
 |  | ||||||
|             mViewer->getCamera()->setInitialDrawCallback(mOldCallback); |  | ||||||
| #endif |  | ||||||
|             mHasCallback = false; |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         mLastRenderTime = mTimer.time_m(); |         mLastRenderTime = mTimer.time_m(); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -87,8 +87,6 @@ namespace MWGui | ||||||
| 
 | 
 | ||||||
|         osg::ref_ptr<osg::Texture2D> mTexture; |         osg::ref_ptr<osg::Texture2D> mTexture; | ||||||
|         osg::ref_ptr<CopyFramebufferToTextureCallback> mCopyFramebufferToTextureCallback; |         osg::ref_ptr<CopyFramebufferToTextureCallback> mCopyFramebufferToTextureCallback; | ||||||
|         osg::ref_ptr<osg::Camera::DrawCallback> mOldCallback; |  | ||||||
|         bool mHasCallback; |  | ||||||
|         std::unique_ptr<MyGUI::ITexture> mGuiTexture; |         std::unique_ptr<MyGUI::ITexture> mGuiTexture; | ||||||
| 
 | 
 | ||||||
|         void changeWallpaper(); |         void changeWallpaper(); | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue