mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-07-22 13:49:53 -06:00
VideoBackends: Pass window system info from host on creation
This commit is contained in:
@ -16,6 +16,7 @@
|
||||
#include <QProgressDialog>
|
||||
#include <QStackedWidget>
|
||||
#include <QVBoxLayout>
|
||||
#include <QWindow>
|
||||
|
||||
#include <future>
|
||||
#include <optional>
|
||||
@ -31,6 +32,7 @@
|
||||
#endif
|
||||
|
||||
#include "Common/Version.h"
|
||||
#include "Common/WindowSystemInfo.h"
|
||||
|
||||
#include "Core/Boot/Boot.h"
|
||||
#include "Core/BootManager.h"
|
||||
@ -122,6 +124,45 @@ static void InstallSignalHandler()
|
||||
}
|
||||
#endif
|
||||
|
||||
static WindowSystemType GetWindowSystemType()
|
||||
{
|
||||
// Determine WSI type based on Qt platform.
|
||||
QString platform_name = QGuiApplication::platformName();
|
||||
if (platform_name == QStringLiteral("windows"))
|
||||
return WindowSystemType::Windows;
|
||||
else if (platform_name == QStringLiteral("cocoa"))
|
||||
return WindowSystemType::MacOS;
|
||||
else if (platform_name == QStringLiteral("xcb"))
|
||||
return WindowSystemType::X11;
|
||||
else if (platform_name == QStringLiteral("wayland"))
|
||||
return WindowSystemType::Wayland;
|
||||
|
||||
QMessageBox::critical(
|
||||
nullptr, QStringLiteral("Error"),
|
||||
QString::asprintf("Unknown Qt platform: %s", platform_name.toStdString().c_str()));
|
||||
return WindowSystemType::Headless;
|
||||
}
|
||||
|
||||
static WindowSystemInfo GetWindowSystemInfo(QWindow* window)
|
||||
{
|
||||
WindowSystemInfo wsi;
|
||||
wsi.type = GetWindowSystemType();
|
||||
|
||||
// Our Win32 Qt external doesn't have the private API.
|
||||
#if defined(WIN32) || defined(__APPLE__)
|
||||
wsi.render_surface = window ? reinterpret_cast<void*>(window->winId()) : nullptr;
|
||||
#else
|
||||
QPlatformNativeInterface* pni = QGuiApplication::platformNativeInterface();
|
||||
wsi.display_connection = pni->nativeResourceForWindow("display", window);
|
||||
if (wsi.type == WindowSystemType::Wayland)
|
||||
wsi.render_surface = window ? pni->nativeResourceForWindow("surface", window) : nullptr;
|
||||
else
|
||||
wsi.render_surface = window ? reinterpret_cast<void*>(window->winId()) : nullptr;
|
||||
#endif
|
||||
|
||||
return wsi;
|
||||
}
|
||||
|
||||
MainWindow::MainWindow(std::unique_ptr<BootParameters> boot_parameters) : QMainWindow(nullptr)
|
||||
{
|
||||
setWindowTitle(QString::fromStdString(Common::scm_rev_str));
|
||||
@ -804,16 +845,9 @@ void MainWindow::StartGame(std::unique_ptr<BootParameters>&& parameters)
|
||||
// We need the render widget before booting.
|
||||
ShowRenderWidget();
|
||||
|
||||
// Populate the video backend fields of the boot parameters.
|
||||
parameters->render_surface = reinterpret_cast<void*>(m_render_widget->winId());
|
||||
#ifndef WIN32
|
||||
parameters->display_connection =
|
||||
QGuiApplication::platformNativeInterface()->nativeResourceForWindow("display",
|
||||
windowHandle());
|
||||
#endif
|
||||
|
||||
// Boot up, show an error if it fails to load the game.
|
||||
if (!BootManager::BootCore(std::move(parameters)))
|
||||
if (!BootManager::BootCore(std::move(parameters),
|
||||
GetWindowSystemInfo(m_render_widget->windowHandle())))
|
||||
{
|
||||
QMessageBox::critical(this, tr("Error"), tr("Failed to init core"), QMessageBox::Ok);
|
||||
HideRenderWidget();
|
||||
|
Reference in New Issue
Block a user