From 35fb88e5e5b81cb3030fbae95158389cc7782523 Mon Sep 17 00:00:00 2001 From: Glenn Maynard Date: Mon, 13 Nov 2006 21:04:17 +0000 Subject: [PATCH] Drop generic concurrent rendering. It makes too many things very complicated, and I don't trust it at a high level: it makes too many unchecked things concurrent, so I think it will make things brittle. --- stepmania/src/ScreenManager.cpp | 86 +++--------------------- stepmania/src/ScreenManager.h | 3 - stepmania/src/ScreenSelect.cpp | 2 - stepmania/src/ScreenStage.cpp | 14 +--- stepmania/src/ScreenWithMenuElements.cpp | 4 -- stepmania/src/StepMania.cpp | 6 -- 6 files changed, 11 insertions(+), 104 deletions(-) diff --git a/stepmania/src/ScreenManager.cpp b/stepmania/src/ScreenManager.cpp index f957ea0c10..5900334888 100644 --- a/stepmania/src/ScreenManager.cpp +++ b/stepmania/src/ScreenManager.cpp @@ -34,9 +34,6 @@ * (added to by GroupScreen), the screen group is reset: all prepared screens are * unloaded and the persistance list is cleared. * - * (For persistance, concurrently preparing a screen is logically equivalent - * to SetNewScreen, since it's going to be set after it finishes loading.) - * * Note that not all screens yet support reuse in this way; proper use of BeginScreen * is required. This will misbehave if a screen pushes another screen that's already * in use lower on the stack, but that's not useful; it would allow infinite screen @@ -74,11 +71,9 @@ #include "ScreenDimensions.h" #include "Foreach.h" #include "ActorUtil.h" -#include "GameLoop.h" ScreenManager* SCREENMAN = NULL; // global and accessable from anywhere in our program -static Preference g_bConcurrentLoading( "ConcurrentLoading", false ); static Preference g_bDelayedScreenLoad( "DelayedScreenLoad", false ); // Screen registration @@ -331,8 +326,6 @@ bool ScreenManager::IsStackedScreen( const Screen *pScreen ) const return false; } -static bool g_bIsConcurrentlyLoading = false; - /* Pop the top screen off the stack, sending SM_LoseFocus messages and * returning the message the popped screen wants sent to the new top * screen. Does not send SM_GainFocus. */ @@ -447,20 +440,10 @@ void ScreenManager::Update( float fDeltaTime ) /* If we're currently inside a background screen load, and m_sDelayedScreen * is set, then the screen called SetNewScreen before we finished preparing. * Postpone it until we're finished loading. */ - if( !IsConcurrentlyLoading() && m_sDelayedScreen.size() != 0 ) + if( m_sDelayedScreen.size() != 0 ) { LoadDelayedScreen(); } - - if( !m_sDelayedConcurrentPrepare.empty() ) - { - RunConcurrentlyPrepareScreen(); - } -} - -bool ScreenManager::IsConcurrentlyLoading() const -{ - return g_bIsConcurrentlyLoading; } void ScreenManager::Draw() @@ -596,54 +579,6 @@ void ScreenManager::PersistantScreen( const RString &sScreenName ) g_setPersistantScreens.insert( sScreenName ); } -bool ScreenManager::ConcurrentlyPrepareScreen( const RString &sScreenName, ScreenMessage SM ) -{ - ASSERT_M( m_sDelayedConcurrentPrepare == "", m_sDelayedConcurrentPrepare ); - - if( !g_bConcurrentLoading || !DISPLAY->SupportsThreadedRendering() ) - return false; - - LOG->Trace( "ConcurrentlyPrepareScreen(%s)", sScreenName.c_str() ); - ASSERT( !IsConcurrentlyLoading() ); - - m_sDelayedConcurrentPrepare = sScreenName; - m_OnDonePreparingScreen = SM; - return true; -} - -void ScreenManager::RunConcurrentlyPrepareScreen() -{ - /* Don't call BackgroundPrepareScreen() from within another background load. */ - ASSERT( !IsConcurrentlyLoading() ); - - RString sScreenName = m_sDelayedConcurrentPrepare; - m_sDelayedConcurrentPrepare = ""; - - ScreenMessage SM = m_OnDonePreparingScreen; - m_OnDonePreparingScreen = SM_None; - - /* If the screen is already prepared, we're all set. */ - if( !ScreenIsPrepped(sScreenName) ) - { - g_bIsConcurrentlyLoading = true; - GameLoop::StartConcurrentRendering(); - - if( g_setGroupedScreens.find(sScreenName) == g_setGroupedScreens.end() ) - DeletePreparedScreens(); - - PrepareScreen( sScreenName ); - - GameLoop::FinishConcurrentRendering(); - g_bIsConcurrentlyLoading = false; - - LOG->Trace( "Concurrent prepare of %s finished", sScreenName.c_str() ); - } - - /* We're done. Send the message. The screen is allowed to start - * another concurrent prepare from this message. */ - SendMessageToTopScreen( SM ); -} - void ScreenManager::SetNewScreen( const RString &sScreenName ) { ASSERT( sScreenName != "" ); @@ -866,17 +801,14 @@ void ScreenManager::RefreshCreditsMessages() void ScreenManager::ZeroNextUpdate() { - if( !IsConcurrentlyLoading() ) - { - LOG->Trace("ScreenManager::ZeroNextUpdate"); - m_bZeroNextUpdate = true; + LOG->Trace("ScreenManager::ZeroNextUpdate"); + m_bZeroNextUpdate = true; - /* Loading probably took a little while. Let's reset stats. This prevents us - * from displaying an unnaturally low FPS value, and the next FPS value we - * display will be accurate, which makes skips in the initial tween-ins more - * apparent. */ - DISPLAY->ResetStats(); - } + /* Loading probably took a little while. Let's reset stats. This prevents us + * from displaying an unnaturally low FPS value, and the next FPS value we + * display will be accurate, which makes skips in the initial tween-ins more + * apparent. */ + DISPLAY->ResetStats(); } void ScreenManager::PlayInvalidSound() @@ -940,7 +872,6 @@ public: return 1; } static int SystemMessage( T* p, lua_State *L ) { p->SystemMessage( SArg(1) ); return 0; } - static int ConcurrentlyPrepareScreen( T* p, lua_State *L ) { p->ConcurrentlyPrepareScreen( SArg(1) ); return 0; } static int ScreenIsPrepped( T* p, lua_State *L ) { lua_pushboolean( L, ScreenManagerUtil::ScreenIsPrepped( SArg(1) ) ); return 1; } LunaScreenManager() @@ -948,7 +879,6 @@ public: ADD_METHOD( SetNewScreen ); ADD_METHOD( GetTopScreen ); ADD_METHOD( SystemMessage ); - ADD_METHOD( ConcurrentlyPrepareScreen ); ADD_METHOD( ScreenIsPrepped ); } }; diff --git a/stepmania/src/ScreenManager.h b/stepmania/src/ScreenManager.h index bd3967b79a..cfa8c8970e 100644 --- a/stepmania/src/ScreenManager.h +++ b/stepmania/src/ScreenManager.h @@ -30,8 +30,6 @@ public: void PrepareScreen( const RString &sScreenName ); // creates and caches screen so that the next call to SetNewScreen for the prep'd screen will be very quick. void GroupScreen( const RString &sScreenName ); void PersistantScreen( const RString &sScreenName ); - bool ConcurrentlyPrepareScreen( const RString &sScreenName, ScreenMessage send_when_done = SM_None ); - bool IsConcurrentlyLoading() const; void PopTopScreen( ScreenMessage SM ); void PopAllScreens(); Screen *GetTopScreen(); @@ -81,7 +79,6 @@ private: void LoadDelayedScreen(); bool ActivatePreparedScreenAndBackground( const RString &sScreenName ); ScreenMessage PopTopScreenInternal( bool bSendLoseFocus = true ); - void RunConcurrentlyPrepareScreen(); // Keep these sounds always loaded, because they could be // played at any time. We want to eliminate SOUND->PlayOnce diff --git a/stepmania/src/ScreenSelect.cpp b/stepmania/src/ScreenSelect.cpp index ed21522201..b75c176433 100644 --- a/stepmania/src/ScreenSelect.cpp +++ b/stepmania/src/ScreenSelect.cpp @@ -237,8 +237,6 @@ void ScreenSelect::HandleScreenMessage( const ScreenMessage SM ) if( !IsTransitioning() ) StartTransitioningScreen( SM_GoToNextScreen ); - - SCREENMAN->ConcurrentlyPrepareScreen( GetNextScreen() ); } else if( SM == SM_GoToNextScreen ) { diff --git a/stepmania/src/ScreenStage.cpp b/stepmania/src/ScreenStage.cpp index 83510bdd6e..47c0d7f6ee 100644 --- a/stepmania/src/ScreenStage.cpp +++ b/stepmania/src/ScreenStage.cpp @@ -65,7 +65,7 @@ void ScreenStage::HandleScreenMessage( const ScreenMessage SM ) } else if( SM == SM_BeginFadingOut ) { - if( SCREENMAN->IsConcurrentlyLoading() || m_sprOverlay->GetTweenTimeLeft() ) + if( m_sprOverlay->GetTweenTimeLeft() ) return; /* Clear any other SM_BeginFadingOut messages. */ @@ -84,16 +84,8 @@ void ScreenStage::Update( float fDeltaTime ) { if( this->IsFirstUpdate() ) { - if( SCREENMAN->ConcurrentlyPrepareScreen(GetNextScreen(), SM_BeginFadingOut) ) - { - /* Continue when both the screen finishes loading and the tween finishes. */ - this->PostScreenMessage( SM_BeginFadingOut, m_sprOverlay->GetTweenTimeLeft() ); - } - else - { - /* Prep the new screen once m_In is complete. */ - this->PostScreenMessage( SM_PrepScreen, m_sprOverlay->GetTweenTimeLeft() ); - } + /* Prep the new screen once m_In is complete. */ + this->PostScreenMessage( SM_PrepScreen, m_sprOverlay->GetTweenTimeLeft() ); } Screen::Update( fDeltaTime ); diff --git a/stepmania/src/ScreenWithMenuElements.cpp b/stepmania/src/ScreenWithMenuElements.cpp index 4b2bc1b5e4..fc6658f595 100644 --- a/stepmania/src/ScreenWithMenuElements.cpp +++ b/stepmania/src/ScreenWithMenuElements.cpp @@ -329,8 +329,6 @@ void ScreenWithMenuElementsSimple::MenuStart( const InputEventPlus &input ) return; StartTransitioningScreen( SM_GoToNextScreen ); - - SCREENMAN->ConcurrentlyPrepareScreen( GetNextScreen() ); } void ScreenWithMenuElementsSimple::MenuBack( const InputEventPlus &input ) @@ -341,8 +339,6 @@ void ScreenWithMenuElementsSimple::MenuBack( const InputEventPlus &input ) return; Cancel( SM_GoToPrevScreen ); - - SCREENMAN->ConcurrentlyPrepareScreen( GetNextScreen() ); } // lua start diff --git a/stepmania/src/StepMania.cpp b/stepmania/src/StepMania.cpp index c79947e42e..4a86530729 100644 --- a/stepmania/src/StepMania.cpp +++ b/stepmania/src/StepMania.cpp @@ -284,12 +284,6 @@ void ShutdownGame() static void HandleException( const RString &sError ) { - if( SCREENMAN && SCREENMAN->IsConcurrentlyLoading() ) - { - LOG->Trace( "HandleException: FinishConcurrentRendering" ); - GameLoop::FinishConcurrentRendering(); - } - if( g_bAutoRestart ) HOOKS->RestartProgram();