diff --git a/Common/UI/Screen.cpp b/Common/UI/Screen.cpp index ac1c57fee6..663cdb75fa 100644 --- a/Common/UI/Screen.cpp +++ b/Common/UI/Screen.cpp @@ -174,12 +174,12 @@ void ScreenManager::render() { // when screens are "compatible" (both are UIScreens, for example). first->screen->preRender(); while (iter < last) { - iter->screen->render(); + iter->screen->render(ScreenRenderMode::TOP); iter++; } - stack_.back().screen->render(); + stack_.back().screen->render(ScreenRenderMode::TOP); if (overlayScreen_) { - overlayScreen_->render(); + overlayScreen_->render(ScreenRenderMode::TOP); } if (postRenderCb_) { // Really can't render anything after this! Will crash the screenshot mechanism if we do. @@ -191,9 +191,9 @@ void ScreenManager::render() { default: _assert_(stack_.back().screen); stack_.back().screen->preRender(); - stack_.back().screen->render(); + stack_.back().screen->render(ScreenRenderMode::TOP); if (overlayScreen_) { - overlayScreen_->render(); + overlayScreen_->render(ScreenRenderMode::TOP); } if (postRenderCb_) { // Really can't render anything after this! Will crash the screenshot mechanism if we do. diff --git a/Common/UI/Screen.h b/Common/UI/Screen.h index ae911b1203..55e00ad2a5 100644 --- a/Common/UI/Screen.h +++ b/Common/UI/Screen.h @@ -47,6 +47,14 @@ enum class ScreenFocusChange { FOCUS_BECAME_TOP, // Became the top screen again }; +enum class ScreenRenderMode { + FIRST = 1, + BACKGROUND = 2, + BEHIND = 4, + TOP = 8, +}; +ENUM_CLASS_BITOPS(ScreenRenderMode); + class Screen { public: Screen() : screenManager_(nullptr) { } @@ -57,7 +65,7 @@ public: virtual void onFinish(DialogResult reason) {} virtual void update() {} virtual void preRender() {} - virtual void render() {} + virtual void render(ScreenRenderMode mode) {} virtual void postRender() {} virtual void resized() {} virtual void dialogFinished(const Screen *dialog, DialogResult result) {} diff --git a/Common/UI/UIScreen.cpp b/Common/UI/UIScreen.cpp index c49dee977c..3cfdbfff19 100644 --- a/Common/UI/UIScreen.cpp +++ b/Common/UI/UIScreen.cpp @@ -216,7 +216,7 @@ void UIScreen::postRender() { screenManager()->getUIContext()->Flush(); } -void UIScreen::render() { +void UIScreen::render(ScreenRenderMode mode) { DoRecreateViews(); if (root_) { diff --git a/Common/UI/UIScreen.h b/Common/UI/UIScreen.h index 767cd462cd..ab9b7c488c 100644 --- a/Common/UI/UIScreen.h +++ b/Common/UI/UIScreen.h @@ -37,7 +37,7 @@ public: void update() override; void preRender() override; - void render() override; + void render(ScreenRenderMode mode) override; void postRender() override; void deviceLost() override; void deviceRestored() override; diff --git a/UI/ControlMappingScreen.cpp b/UI/ControlMappingScreen.cpp index 48a11adb68..4df546bb4c 100644 --- a/UI/ControlMappingScreen.cpp +++ b/UI/ControlMappingScreen.cpp @@ -713,8 +713,8 @@ void TouchTestScreen::axis(const AxisInput &axis) { UpdateLogView(); } -void TouchTestScreen::render() { - UIDialogScreenWithGameBackground::render(); +void TouchTestScreen::render(ScreenRenderMode mode) { + UIDialogScreenWithGameBackground::render(mode); UIContext *ui_context = screenManager()->getUIContext(); Bounds bounds = ui_context->GetLayoutBounds(); diff --git a/UI/ControlMappingScreen.h b/UI/ControlMappingScreen.h index cffdac5f6b..69c8a4d449 100644 --- a/UI/ControlMappingScreen.h +++ b/UI/ControlMappingScreen.h @@ -147,7 +147,7 @@ public: } void touch(const TouchInput &touch) override; - void render() override; + void render(ScreenRenderMode mode) override; bool key(const KeyInput &key) override; void axis(const AxisInput &axis) override; diff --git a/UI/EmuScreen.cpp b/UI/EmuScreen.cpp index 28b922107d..ce3dd06235 100644 --- a/UI/EmuScreen.cpp +++ b/UI/EmuScreen.cpp @@ -1447,7 +1447,7 @@ void EmuScreen::postRender() { draw->WipeQueue(); } -void EmuScreen::render() { +void EmuScreen::render(ScreenRenderMode mode) { using namespace Draw; DrawContext *thin3d = screenManager()->getDrawContext(); diff --git a/UI/EmuScreen.h b/UI/EmuScreen.h index 9c9e922afe..5545ff23b3 100644 --- a/UI/EmuScreen.h +++ b/UI/EmuScreen.h @@ -42,7 +42,7 @@ public: const char *tag() const override { return "Emu"; } void update() override; - void render() override; + void render(ScreenRenderMode mode) override; void preRender() override; void postRender() override; void dialogFinished(const Screen *dialog, DialogResult result) override; diff --git a/UI/GPUDriverTestScreen.cpp b/UI/GPUDriverTestScreen.cpp index 6d725dc41c..c10faf17ba 100644 --- a/UI/GPUDriverTestScreen.cpp +++ b/UI/GPUDriverTestScreen.cpp @@ -630,9 +630,9 @@ void GPUDriverTestScreen::ShaderTest() { } -void GPUDriverTestScreen::render() { +void GPUDriverTestScreen::render(ScreenRenderMode mode) { using namespace Draw; - UIScreen::render(); + UIScreen::render(mode); switch (tabHolder_->GetCurrentTab()) { case 0: diff --git a/UI/GPUDriverTestScreen.h b/UI/GPUDriverTestScreen.h index 38ec2c33e1..16c1f8d7c6 100644 --- a/UI/GPUDriverTestScreen.h +++ b/UI/GPUDriverTestScreen.h @@ -15,7 +15,7 @@ public: ~GPUDriverTestScreen(); void CreateViews() override; - void render() override; + void render(ScreenRenderMode mode) override; const char *tag() const override { return "GPUDriverTest"; } diff --git a/UI/GameScreen.cpp b/UI/GameScreen.cpp index 238c8de13a..d38cd53ccb 100644 --- a/UI/GameScreen.cpp +++ b/UI/GameScreen.cpp @@ -274,8 +274,8 @@ UI::EventReturn GameScreen::OnDeleteConfig(UI::EventParams &e) return UI::EVENT_DONE; } -void GameScreen::render() { - UIScreen::render(); +void GameScreen::render(ScreenRenderMode mode) { + UIScreen::render(mode); auto ga = GetI18NCategory(I18NCat::GAME); diff --git a/UI/GameScreen.h b/UI/GameScreen.h index 52c8907ea6..4340fae811 100644 --- a/UI/GameScreen.h +++ b/UI/GameScreen.h @@ -38,7 +38,7 @@ public: void update() override; - void render() override; + void render(ScreenRenderMode mode) override; const char *tag() const override { return "Game"; } diff --git a/UI/MemStickScreen.h b/UI/MemStickScreen.h index 62ad37c082..f409e95815 100644 --- a/UI/MemStickScreen.h +++ b/UI/MemStickScreen.h @@ -52,11 +52,11 @@ protected: void dialogFinished(const Screen *dialog, DialogResult result) override; void update() override; - void render() override { + void render(ScreenRenderMode mode) override { // Simple anti-flicker due to delayed finish. if (!done_) { // render as usual. - UIDialogScreenWithBackground::render(); + UIDialogScreenWithBackground::render(mode); } else { // no render. black frame insertion is better than flicker. } diff --git a/UI/MiscScreens.cpp b/UI/MiscScreens.cpp index 438bc5f9c5..b375e27f78 100644 --- a/UI/MiscScreens.cpp +++ b/UI/MiscScreens.cpp @@ -756,10 +756,10 @@ void LogoScreen::touch(const TouchInput &touch) { } } -void LogoScreen::render() { +void LogoScreen::render(ScreenRenderMode mode) { using namespace Draw; - UIScreen::render(); + UIScreen::render(mode); UIContext &dc = *screenManager()->getUIContext(); const Bounds &bounds = dc.GetBounds(); @@ -895,8 +895,8 @@ void CreditsScreen::update() { UpdateUIState(UISTATE_MENU); } -void CreditsScreen::render() { - UIScreen::render(); +void CreditsScreen::render(ScreenRenderMode mode) { + UIScreen::render(mode); auto cr = GetI18NCategory(I18NCat::PSPCREDITS); diff --git a/UI/MiscScreens.h b/UI/MiscScreens.h index df9d991ab7..24415de636 100644 --- a/UI/MiscScreens.h +++ b/UI/MiscScreens.h @@ -140,7 +140,7 @@ public: bool key(const KeyInput &key) override; void touch(const TouchInput &touch) override; void update() override; - void render() override; + void render(ScreenRenderMode mode) override; void sendMessage(UIMessage message, const char *value) override; void CreateViews() override {} @@ -158,7 +158,7 @@ class CreditsScreen : public UIDialogScreenWithBackground { public: CreditsScreen(); void update() override; - void render() override; + void render(ScreenRenderMode mode) override; void CreateViews() override; diff --git a/UI/OnScreenDisplay.cpp b/UI/OnScreenDisplay.cpp index 5209673883..0edaa36b02 100644 --- a/UI/OnScreenDisplay.cpp +++ b/UI/OnScreenDisplay.cpp @@ -517,8 +517,8 @@ void OSDOverlayScreen::CreateViews() { osmView_ = root_->Add(new OnScreenMessagesView(new UI::AnchorLayoutParams(0.0f, 0.0f, 0.0f, 0.0f))); } -void OSDOverlayScreen::render() { - UIScreen::render(); +void OSDOverlayScreen::render(ScreenRenderMode mode) { + UIScreen::render(mode); DebugOverlay debugOverlay = (DebugOverlay)g_Config.iDebugOverlay; diff --git a/UI/OnScreenDisplay.h b/UI/OnScreenDisplay.h index c22d5478e2..1440fdca63 100644 --- a/UI/OnScreenDisplay.h +++ b/UI/OnScreenDisplay.h @@ -41,7 +41,7 @@ public: bool UnsyncTouch(const TouchInput &touch) override; void CreateViews() override; - void render() override; + void render(ScreenRenderMode mode) override; void update() override; private: