qt: Fix black screen when switching between renderers
This commit is contained in:
@@ -237,6 +237,8 @@ RendererStack::switchRenderer(Renderer renderer)
|
|||||||
{
|
{
|
||||||
startblit();
|
startblit();
|
||||||
if (current) {
|
if (current) {
|
||||||
|
if ((current_vid_api == Renderer::Direct3D9 && renderer != Renderer::Direct3D9)
|
||||||
|
|| (current_vid_api != Renderer::Direct3D9 && renderer == Renderer::Direct3D9)) {
|
||||||
rendererWindow->finalize();
|
rendererWindow->finalize();
|
||||||
if (rendererWindow->hasBlitFunc()) {
|
if (rendererWindow->hasBlitFunc()) {
|
||||||
while (directBlitting) {}
|
while (directBlitting) {}
|
||||||
@@ -259,6 +261,16 @@ RendererStack::switchRenderer(Renderer renderer)
|
|||||||
});
|
});
|
||||||
|
|
||||||
rendererWindow->hasBlitFunc() ? current.reset() : current.release()->deleteLater();
|
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 {
|
} else {
|
||||||
createRenderer(renderer);
|
createRenderer(renderer);
|
||||||
}
|
}
|
||||||
@@ -267,6 +279,7 @@ RendererStack::switchRenderer(Renderer renderer)
|
|||||||
void
|
void
|
||||||
RendererStack::createRenderer(Renderer renderer)
|
RendererStack::createRenderer(Renderer renderer)
|
||||||
{
|
{
|
||||||
|
current_vid_api = renderer;
|
||||||
switch (renderer) {
|
switch (renderer) {
|
||||||
default:
|
default:
|
||||||
case Renderer::Software:
|
case Renderer::Software:
|
||||||
|
@@ -47,7 +47,8 @@ public:
|
|||||||
OpenGLES,
|
OpenGLES,
|
||||||
OpenGL3,
|
OpenGL3,
|
||||||
Vulkan,
|
Vulkan,
|
||||||
Direct3D9
|
Direct3D9,
|
||||||
|
None = -1
|
||||||
};
|
};
|
||||||
void switchRenderer(Renderer renderer);
|
void switchRenderer(Renderer renderer);
|
||||||
|
|
||||||
@@ -96,6 +97,8 @@ private:
|
|||||||
int isMouseDown = 0;
|
int isMouseDown = 0;
|
||||||
int m_monitor_index = 0;
|
int m_monitor_index = 0;
|
||||||
|
|
||||||
|
Renderer current_vid_api = Renderer::None;
|
||||||
|
|
||||||
std::vector<std::tuple<uint8_t *, std::atomic_flag *>> imagebufs;
|
std::vector<std::tuple<uint8_t *, std::atomic_flag *>> imagebufs;
|
||||||
|
|
||||||
RendererCommon *rendererWindow { nullptr };
|
RendererCommon *rendererWindow { nullptr };
|
||||||
|
Reference in New Issue
Block a user