From 08722ffdf51b65ae5ac5c24f10589c48c3fa6e89 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Fri, 29 Jul 2022 14:46:54 +0600 Subject: [PATCH] qt: Fix black screen when switching between renderers --- src/qt/qt_rendererstack.cpp | 53 +++++++++++++++++++++++-------------- src/qt/qt_rendererstack.hpp | 5 +++- 2 files changed, 37 insertions(+), 21 deletions(-) diff --git a/src/qt/qt_rendererstack.cpp b/src/qt/qt_rendererstack.cpp index fab20b5b7..ef415a82c 100644 --- a/src/qt/qt_rendererstack.cpp +++ b/src/qt/qt_rendererstack.cpp @@ -237,28 +237,40 @@ RendererStack::switchRenderer(Renderer renderer) { startblit(); if (current) { - rendererWindow->finalize(); - if (rendererWindow->hasBlitFunc()) { - while (directBlitting) {} - connect(this, &RendererStack::blit, this, &RendererStack::blitDummy, Qt::DirectConnection); - disconnect(this, &RendererStack::blit, this, &RendererStack::blitRenderer); + if ((current_vid_api == Renderer::Direct3D9 && renderer != Renderer::Direct3D9) + || (current_vid_api != Renderer::Direct3D9 && renderer == Renderer::Direct3D9)) { + rendererWindow->finalize(); + if (rendererWindow->hasBlitFunc()) { + while (directBlitting) {} + connect(this, &RendererStack::blit, this, &RendererStack::blitDummy, Qt::DirectConnection); + disconnect(this, &RendererStack::blit, this, &RendererStack::blitRenderer); + } else { + connect(this, &RendererStack::blit, this, &RendererStack::blitDummy, Qt::DirectConnection); + disconnect(this, &RendererStack::blit, this, &RendererStack::blitCommon); + } + + removeWidget(current.get()); + disconnect(this, &RendererStack::blitToRenderer, nullptr, nullptr); + + /* Create new renderer only after previous is destroyed! */ + connect(current.get(), &QObject::destroyed, [this, renderer](QObject *) { + createRenderer(renderer); + disconnect(this, &RendererStack::blit, this, &RendererStack::blitDummy); + blitDummied = false; + QTimer::singleShot(1000, this, [this]() { this->blitDummied = false; } ); + }); + + rendererWindow->hasBlitFunc() ? current.reset() : current.release()->deleteLater(); } else { - connect(this, &RendererStack::blit, this, &RendererStack::blitDummy, Qt::DirectConnection); - disconnect(this, &RendererStack::blit, this, &RendererStack::blitCommon); + rendererWindow->finalize(); + removeWidget(current.get()); + disconnect(this, &RendererStack::blitToRenderer, nullptr, nullptr); + + /* Create new renderer only after previous is destroyed! */ + connect(current.get(), &QObject::destroyed, [this, renderer](QObject *) { createRenderer(renderer); }); + + current.release()->deleteLater(); } - - removeWidget(current.get()); - disconnect(this, &RendererStack::blitToRenderer, nullptr, nullptr); - - /* Create new renderer only after previous is destroyed! */ - connect(current.get(), &QObject::destroyed, [this, renderer](QObject *) { - createRenderer(renderer); - disconnect(this, &RendererStack::blit, this, &RendererStack::blitDummy); - blitDummied = false; - QTimer::singleShot(1000, this, [this]() { this->blitDummied = false; } ); - }); - - rendererWindow->hasBlitFunc() ? current.reset() : current.release()->deleteLater(); } else { createRenderer(renderer); } @@ -267,6 +279,7 @@ RendererStack::switchRenderer(Renderer renderer) void RendererStack::createRenderer(Renderer renderer) { + current_vid_api = renderer; switch (renderer) { default: case Renderer::Software: diff --git a/src/qt/qt_rendererstack.hpp b/src/qt/qt_rendererstack.hpp index 72495ec33..6ee1a0433 100644 --- a/src/qt/qt_rendererstack.hpp +++ b/src/qt/qt_rendererstack.hpp @@ -47,7 +47,8 @@ public: OpenGLES, OpenGL3, Vulkan, - Direct3D9 + Direct3D9, + None = -1 }; void switchRenderer(Renderer renderer); @@ -96,6 +97,8 @@ private: int isMouseDown = 0; int m_monitor_index = 0; + Renderer current_vid_api = Renderer::None; + std::vector> imagebufs; RendererCommon *rendererWindow { nullptr };