summaryrefslogtreecommitdiffstats
path: root/src/yuzu
diff options
context:
space:
mode:
authorbunnei <bunneidev@gmail.com>2020-04-11 02:06:55 +0200
committerGitHub <noreply@github.com>2020-04-11 02:06:55 +0200
commit51c6688e214a9bdcf335fb0598dc7e5bc194f8f6 (patch)
tree37ef2214634c2423ca617e9e22a2c9d57693ed86 /src/yuzu
parentMerge pull request #3607 from FearlessTobi/input-kms (diff)
parentyuzu: Drop SDL2 and Qt frontend Vulkan requirements (diff)
downloadyuzu-51c6688e214a9bdcf335fb0598dc7e5bc194f8f6.tar
yuzu-51c6688e214a9bdcf335fb0598dc7e5bc194f8f6.tar.gz
yuzu-51c6688e214a9bdcf335fb0598dc7e5bc194f8f6.tar.bz2
yuzu-51c6688e214a9bdcf335fb0598dc7e5bc194f8f6.tar.lz
yuzu-51c6688e214a9bdcf335fb0598dc7e5bc194f8f6.tar.xz
yuzu-51c6688e214a9bdcf335fb0598dc7e5bc194f8f6.tar.zst
yuzu-51c6688e214a9bdcf335fb0598dc7e5bc194f8f6.zip
Diffstat (limited to 'src/yuzu')
-rw-r--r--src/yuzu/CMakeLists.txt4
-rw-r--r--src/yuzu/bootmanager.cpp92
-rw-r--r--src/yuzu/bootmanager.h9
-rw-r--r--src/yuzu/configuration/configure_graphics.cpp42
4 files changed, 57 insertions, 90 deletions
diff --git a/src/yuzu/CMakeLists.txt b/src/yuzu/CMakeLists.txt
index d34b47b3f..8b9404718 100644
--- a/src/yuzu/CMakeLists.txt
+++ b/src/yuzu/CMakeLists.txt
@@ -150,6 +150,10 @@ target_link_libraries(yuzu PRIVATE common core input_common video_core)
target_link_libraries(yuzu PRIVATE Boost::boost glad Qt5::OpenGL Qt5::Widgets)
target_link_libraries(yuzu PRIVATE ${PLATFORM_LIBRARIES} Threads::Threads)
+if (ENABLE_VULKAN AND NOT WIN32)
+ target_include_directories(yuzu PRIVATE ${Qt5Gui_PRIVATE_INCLUDE_DIRS})
+endif()
+
target_compile_definitions(yuzu PRIVATE
# Use QStringBuilder for string concatenation to reduce
# the overall number of temporary strings created.
diff --git a/src/yuzu/bootmanager.cpp b/src/yuzu/bootmanager.cpp
index 7b211bd32..1cac2f942 100644
--- a/src/yuzu/bootmanager.cpp
+++ b/src/yuzu/bootmanager.cpp
@@ -14,8 +14,9 @@
#include <QScreen>
#include <QStringList>
#include <QWindow>
-#ifdef HAS_VULKAN
-#include <QVulkanWindow>
+
+#if !defined(WIN32) && HAS_VULKAN
+#include <qpa/qplatformnativeinterface.h>
#endif
#include <fmt/format.h>
@@ -237,16 +238,50 @@ private:
#ifdef HAS_VULKAN
class VulkanRenderWidget : public RenderWidget {
public:
- explicit VulkanRenderWidget(GRenderWindow* parent, QVulkanInstance* instance)
- : RenderWidget(parent) {
+ explicit VulkanRenderWidget(GRenderWindow* parent) : RenderWidget(parent) {
windowHandle()->setSurfaceType(QWindow::VulkanSurface);
- windowHandle()->setVulkanInstance(instance);
}
};
#endif
-GRenderWindow::GRenderWindow(GMainWindow* parent_, EmuThread* emu_thread)
- : QWidget(parent_), emu_thread(emu_thread) {
+static Core::Frontend::WindowSystemType GetWindowSystemType() {
+ // Determine WSI type based on Qt platform.
+ QString platform_name = QGuiApplication::platformName();
+ if (platform_name == QStringLiteral("windows"))
+ return Core::Frontend::WindowSystemType::Windows;
+ else if (platform_name == QStringLiteral("xcb"))
+ return Core::Frontend::WindowSystemType::X11;
+ else if (platform_name == QStringLiteral("wayland"))
+ return Core::Frontend::WindowSystemType::Wayland;
+
+ LOG_CRITICAL(Frontend, "Unknown Qt platform!");
+ return Core::Frontend::WindowSystemType::Windows;
+}
+
+static Core::Frontend::EmuWindow::WindowSystemInfo GetWindowSystemInfo(QWindow* window) {
+ Core::Frontend::EmuWindow::WindowSystemInfo wsi;
+ wsi.type = GetWindowSystemType();
+
+#ifdef HAS_VULKAN
+ // 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 == Core::Frontend::WindowSystemType::Wayland)
+ wsi.render_surface = window ? pni->nativeResourceForWindow("surface", window) : nullptr;
+ else
+ wsi.render_surface = window ? reinterpret_cast<void*>(window->winId()) : nullptr;
+#endif
+ wsi.render_surface_scale = window ? static_cast<float>(window->devicePixelRatio()) : 1.0f;
+#endif
+
+ return wsi;
+}
+
+GRenderWindow::GRenderWindow(GMainWindow* parent_, EmuThread* emu_thread_)
+ : QWidget(parent_), emu_thread(emu_thread_) {
setWindowTitle(QStringLiteral("yuzu %1 | %2-%3")
.arg(QString::fromUtf8(Common::g_build_name),
QString::fromUtf8(Common::g_scm_branch),
@@ -459,6 +494,9 @@ bool GRenderWindow::InitRenderTarget() {
break;
}
+ // Update the Window System information with the new render target
+ window_info = GetWindowSystemInfo(child_widget->windowHandle());
+
child_widget->resize(Layout::ScreenUndocked::Width, Layout::ScreenUndocked::Height);
layout()->addWidget(child_widget);
// Reset minimum required size to avoid resizing issues on the main window after restarting.
@@ -530,30 +568,7 @@ bool GRenderWindow::InitializeOpenGL() {
bool GRenderWindow::InitializeVulkan() {
#ifdef HAS_VULKAN
- vk_instance = std::make_unique<QVulkanInstance>();
- vk_instance->setApiVersion(QVersionNumber(1, 1, 0));
- vk_instance->setFlags(QVulkanInstance::Flag::NoDebugOutputRedirect);
- if (Settings::values.renderer_debug) {
- const auto supported_layers{vk_instance->supportedLayers()};
- const bool found =
- std::find_if(supported_layers.begin(), supported_layers.end(), [](const auto& layer) {
- constexpr const char searched_layer[] = "VK_LAYER_LUNARG_standard_validation";
- return layer.name == searched_layer;
- });
- if (found) {
- vk_instance->setLayers(QByteArrayList() << "VK_LAYER_LUNARG_standard_validation");
- vk_instance->setExtensions(QByteArrayList() << VK_EXT_DEBUG_UTILS_EXTENSION_NAME);
- }
- }
- if (!vk_instance->create()) {
- QMessageBox::critical(
- this, tr("Error while initializing Vulkan 1.1!"),
- tr("Your OS doesn't seem to support Vulkan 1.1 instances, or you do not have the "
- "latest graphics drivers."));
- return false;
- }
-
- auto child = new VulkanRenderWidget(this, vk_instance.get());
+ auto child = new VulkanRenderWidget(this);
child_widget = child;
child_widget->windowHandle()->create();
main_context = std::make_unique<DummyContext>();
@@ -566,21 +581,6 @@ bool GRenderWindow::InitializeVulkan() {
#endif
}
-void GRenderWindow::RetrieveVulkanHandlers(void* get_instance_proc_addr, void* instance,
- void* surface) const {
-#ifdef HAS_VULKAN
- const auto instance_proc_addr = vk_instance->getInstanceProcAddr("vkGetInstanceProcAddr");
- const VkInstance instance_copy = vk_instance->vkInstance();
- const VkSurfaceKHR surface_copy = vk_instance->surfaceForWindow(child_widget->windowHandle());
-
- std::memcpy(get_instance_proc_addr, &instance_proc_addr, sizeof(instance_proc_addr));
- std::memcpy(instance, &instance_copy, sizeof(instance_copy));
- std::memcpy(surface, &surface_copy, sizeof(surface_copy));
-#else
- UNREACHABLE_MSG("Executing Vulkan code without compiling Vulkan");
-#endif
-}
-
bool GRenderWindow::LoadOpenGL() {
auto context = CreateSharedContext();
auto scope = context->Acquire();
diff --git a/src/yuzu/bootmanager.h b/src/yuzu/bootmanager.h
index d69078df1..3626604ca 100644
--- a/src/yuzu/bootmanager.h
+++ b/src/yuzu/bootmanager.h
@@ -22,9 +22,6 @@ class GMainWindow;
class QKeyEvent;
class QTouchEvent;
class QStringList;
-#ifdef HAS_VULKAN
-class QVulkanInstance;
-#endif
namespace VideoCore {
enum class LoadCallbackStage;
@@ -122,8 +119,6 @@ public:
// EmuWindow implementation.
void PollEvents() override;
bool IsShown() const override;
- void RetrieveVulkanHandlers(void* get_instance_proc_addr, void* instance,
- void* surface) const override;
std::unique_ptr<Core::Frontend::GraphicsContext> CreateSharedContext() const override;
void BackupGeometry();
@@ -186,10 +181,6 @@ private:
// should instead be shared from
std::shared_ptr<Core::Frontend::GraphicsContext> main_context;
-#ifdef HAS_VULKAN
- std::unique_ptr<QVulkanInstance> vk_instance;
-#endif
-
/// Temporary storage of the screenshot taken
QImage screenshot_image;
diff --git a/src/yuzu/configuration/configure_graphics.cpp b/src/yuzu/configuration/configure_graphics.cpp
index a821c7b3c..ea667caef 100644
--- a/src/yuzu/configuration/configure_graphics.cpp
+++ b/src/yuzu/configuration/configure_graphics.cpp
@@ -15,6 +15,10 @@
#include "ui_configure_graphics.h"
#include "yuzu/configuration/configure_graphics.h"
+#ifdef HAS_VULKAN
+#include "video_core/renderer_vulkan/renderer_vulkan.h"
+#endif
+
namespace {
enum class Resolution : int {
Auto,
@@ -165,41 +169,9 @@ void ConfigureGraphics::UpdateDeviceComboBox() {
void ConfigureGraphics::RetrieveVulkanDevices() {
#ifdef HAS_VULKAN
- QVulkanInstance instance;
- instance.setApiVersion(QVersionNumber(1, 1, 0));
- if (!instance.create()) {
- LOG_INFO(Frontend, "Vulkan 1.1 not available");
- return;
- }
- const auto vkEnumeratePhysicalDevices{reinterpret_cast<PFN_vkEnumeratePhysicalDevices>(
- instance.getInstanceProcAddr("vkEnumeratePhysicalDevices"))};
- if (vkEnumeratePhysicalDevices == nullptr) {
- LOG_INFO(Frontend, "Failed to get pointer to vkEnumeratePhysicalDevices");
- return;
- }
- u32 physical_device_count;
- if (vkEnumeratePhysicalDevices(instance.vkInstance(), &physical_device_count, nullptr) !=
- VK_SUCCESS) {
- LOG_INFO(Frontend, "Failed to get physical devices count");
- return;
- }
- std::vector<VkPhysicalDevice> physical_devices(physical_device_count);
- if (vkEnumeratePhysicalDevices(instance.vkInstance(), &physical_device_count,
- physical_devices.data()) != VK_SUCCESS) {
- LOG_INFO(Frontend, "Failed to get physical devices");
- return;
- }
-
- const auto vkGetPhysicalDeviceProperties{reinterpret_cast<PFN_vkGetPhysicalDeviceProperties>(
- instance.getInstanceProcAddr("vkGetPhysicalDeviceProperties"))};
- if (vkGetPhysicalDeviceProperties == nullptr) {
- LOG_INFO(Frontend, "Failed to get pointer to vkGetPhysicalDeviceProperties");
- return;
- }
- for (const auto physical_device : physical_devices) {
- VkPhysicalDeviceProperties properties;
- vkGetPhysicalDeviceProperties(physical_device, &properties);
- vulkan_devices.push_back(QString::fromUtf8(properties.deviceName));
+ vulkan_devices.clear();
+ for (auto& name : Vulkan::RendererVulkan::EnumerateDevices()) {
+ vulkan_devices.push_back(QString::fromStdString(name));
}
#endif
}