qt: Fix black screen when switching between renderers

This commit is contained in:
Cacodemon345
2022-07-29 14:46:54 +06:00
parent 826d9cdf1c
commit 08722ffdf5
2 changed files with 37 additions and 21 deletions

View File

@@ -237,6 +237,8 @@ RendererStack::switchRenderer(Renderer renderer)
{
startblit();
if (current) {
if ((current_vid_api == Renderer::Direct3D9 && renderer != Renderer::Direct3D9)
|| (current_vid_api != Renderer::Direct3D9 && renderer == Renderer::Direct3D9)) {
rendererWindow->finalize();
if (rendererWindow->hasBlitFunc()) {
while (directBlitting) {}
@@ -259,6 +261,16 @@ RendererStack::switchRenderer(Renderer renderer)
});
rendererWindow->hasBlitFunc() ? current.reset() : current.release()->deleteLater();
} else {
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();
}
} 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:

View File

@@ -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<std::tuple<uint8_t *, std::atomic_flag *>> imagebufs;
RendererCommon *rendererWindow { nullptr };