qt: Remove the Direct3D 9 renderer
This commit is contained in:
@@ -25,9 +25,6 @@
|
||||
#include "qt_openglrenderer.hpp"
|
||||
#include "qt_softwarerenderer.hpp"
|
||||
#include "qt_vulkanwindowrenderer.hpp"
|
||||
#ifdef Q_OS_WIN
|
||||
# include "qt_d3d9renderer.hpp"
|
||||
#endif
|
||||
|
||||
#include "qt_mainwindow.hpp"
|
||||
#include "qt_util.hpp"
|
||||
@@ -279,40 +276,14 @@ 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) { }
|
||||
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);
|
||||
}
|
||||
rendererWindow->finalize();
|
||||
removeWidget(current.get());
|
||||
disconnect(this, &RendererStack::blitToRenderer, nullptr, nullptr);
|
||||
|
||||
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); });
|
||||
|
||||
/* 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, []() { blitDummied = false; });
|
||||
});
|
||||
|
||||
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();
|
||||
}
|
||||
current.release()->deleteLater();
|
||||
} else {
|
||||
createRenderer(renderer);
|
||||
}
|
||||
@@ -321,7 +292,6 @@ RendererStack::switchRenderer(Renderer renderer)
|
||||
void
|
||||
RendererStack::createRenderer(Renderer renderer)
|
||||
{
|
||||
current_vid_api = renderer;
|
||||
switch (renderer) {
|
||||
default:
|
||||
case Renderer::Software:
|
||||
@@ -374,27 +344,6 @@ RendererStack::createRenderer(Renderer renderer)
|
||||
current.reset(this->createWindowContainer(hw, this));
|
||||
break;
|
||||
}
|
||||
#ifdef Q_OS_WIN
|
||||
case Renderer::Direct3D9:
|
||||
{
|
||||
this->createWinId();
|
||||
auto hw = new D3D9Renderer(this, m_monitor_index);
|
||||
rendererWindow = hw;
|
||||
connect(hw, &D3D9Renderer::error, this, [this](QString str) {
|
||||
auto msgBox = new QMessageBox(QMessageBox::Critical, "86Box", QString("Failed to initialize D3D9 renderer. Falling back to software rendering.\n\n") + str, QMessageBox::Ok);
|
||||
msgBox->setAttribute(Qt::WA_DeleteOnClose);
|
||||
msgBox->show();
|
||||
imagebufs = {};
|
||||
QTimer::singleShot(0, this, [this]() { switchRenderer(Renderer::Software); });
|
||||
});
|
||||
connect(hw, &D3D9Renderer::initialized, this, [this]() {
|
||||
endblit();
|
||||
emit rendererChanged();
|
||||
});
|
||||
current.reset(hw);
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
#if QT_CONFIG(vulkan)
|
||||
case Renderer::Vulkan:
|
||||
{
|
||||
@@ -444,44 +393,18 @@ RendererStack::createRenderer(Renderer renderer)
|
||||
|
||||
currentBuf = 0;
|
||||
|
||||
if (rendererWindow->hasBlitFunc()) {
|
||||
connect(this, &RendererStack::blit, this, &RendererStack::blitRenderer, Qt::DirectConnection);
|
||||
} else {
|
||||
connect(this, &RendererStack::blit, this, &RendererStack::blitCommon, Qt::DirectConnection);
|
||||
}
|
||||
|
||||
if (renderer != Renderer::OpenGL3 && renderer != Renderer::Vulkan && renderer != Renderer::Direct3D9) {
|
||||
if (renderer != Renderer::OpenGL3 && renderer != Renderer::Vulkan) {
|
||||
imagebufs = rendererWindow->getBuffers();
|
||||
endblit();
|
||||
emit rendererChanged();
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
RendererStack::blitDummy(int x, int y, int w, int h)
|
||||
{
|
||||
video_blit_complete_monitor(m_monitor_index);
|
||||
blitDummied = true;
|
||||
}
|
||||
|
||||
void
|
||||
RendererStack::blitRenderer(int x, int y, int w, int h)
|
||||
{
|
||||
if (blitDummied) {
|
||||
blitDummied = false;
|
||||
video_blit_complete_monitor(m_monitor_index);
|
||||
return;
|
||||
}
|
||||
directBlitting = true;
|
||||
rendererWindow->blit(x, y, w, h);
|
||||
directBlitting = false;
|
||||
}
|
||||
|
||||
// called from blitter thread
|
||||
void
|
||||
RendererStack::blitCommon(int x, int y, int w, int h)
|
||||
RendererStack::blit(int x, int y, int w, int h)
|
||||
{
|
||||
if (blitDummied || (x < 0) || (y < 0) || (w <= 0) || (h <= 0) || (w > 2048) || (h > 2048) || (monitors[m_monitor_index].target_buffer == NULL) || imagebufs.empty() || std::get<std::atomic_flag *>(imagebufs[currentBuf])->test_and_set()) {
|
||||
if ((x < 0) || (y < 0) || (w <= 0) || (h <= 0) || (w > 2048) || (h > 2048) || (monitors[m_monitor_index].target_buffer == NULL) || imagebufs.empty() || std::get<std::atomic_flag *>(imagebufs[currentBuf])->test_and_set()) {
|
||||
video_blit_complete_monitor(m_monitor_index);
|
||||
return;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user