diff options
| -rw-r--r-- | src/video_core/CMakeLists.txt | 2 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/renderer_vulkan.cpp | 74 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/renderer_vulkan.h | 2 | ||||
| -rw-r--r-- | src/video_core/vulkan_common/vulkan_surface.cpp | 81 | ||||
| -rw-r--r-- | src/video_core/vulkan_common/vulkan_surface.h | 18 | ||||
| -rw-r--r-- | src/video_core/vulkan_common/vulkan_wrapper.h | 5 | 
6 files changed, 109 insertions, 73 deletions
diff --git a/src/video_core/CMakeLists.txt b/src/video_core/CMakeLists.txt index 9287faee1..f977cf12b 100644 --- a/src/video_core/CMakeLists.txt +++ b/src/video_core/CMakeLists.txt @@ -264,6 +264,8 @@ add_library(video_core STATIC      vulkan_common/vulkan_instance.h      vulkan_common/vulkan_library.cpp      vulkan_common/vulkan_library.h +    vulkan_common/vulkan_surface.cpp +    vulkan_common/vulkan_surface.h      vulkan_common/vulkan_wrapper.cpp      vulkan_common/vulkan_wrapper.h  ) diff --git a/src/video_core/renderer_vulkan/renderer_vulkan.cpp b/src/video_core/renderer_vulkan/renderer_vulkan.cpp index ccdc86ed7..831c204c2 100644 --- a/src/video_core/renderer_vulkan/renderer_vulkan.cpp +++ b/src/video_core/renderer_vulkan/renderer_vulkan.cpp @@ -32,21 +32,9 @@  #include "video_core/vulkan_common/vulkan_debug_callback.h"  #include "video_core/vulkan_common/vulkan_instance.h"  #include "video_core/vulkan_common/vulkan_library.h" +#include "video_core/vulkan_common/vulkan_surface.h"  #include "video_core/vulkan_common/vulkan_wrapper.h" -// Include these late to avoid polluting previous headers -#ifdef _WIN32 -#include <windows.h> -// ensure include order -#include <vulkan/vulkan_win32.h> -#endif - -#if !defined(_WIN32) && !defined(__APPLE__) -#include <X11/Xlib.h> -#include <vulkan/vulkan_wayland.h> -#include <vulkan/vulkan_xlib.h> -#endif -  namespace Vulkan {  namespace {  std::string GetReadableVersion(u32 version) { @@ -144,8 +132,8 @@ bool RendererVulkan::Init() try {      if (Settings::values.renderer_debug) {          debug_callback = CreateDebugCallback(instance);      } - -    if (!CreateSurface() || !PickDevices()) { +    surface = CreateSurface(instance, render_window); +    if (!PickDevices()) {          return false;      } @@ -191,62 +179,6 @@ void RendererVulkan::ShutDown() {      device.reset();  } -bool RendererVulkan::CreateSurface() { -    [[maybe_unused]] const auto& window_info = render_window.GetWindowInfo(); -    VkSurfaceKHR unsafe_surface = nullptr; - -#ifdef _WIN32 -    if (window_info.type == Core::Frontend::WindowSystemType::Windows) { -        const HWND hWnd = static_cast<HWND>(window_info.render_surface); -        const VkWin32SurfaceCreateInfoKHR win32_ci{VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR, -                                                   nullptr, 0, nullptr, hWnd}; -        const auto vkCreateWin32SurfaceKHR = reinterpret_cast<PFN_vkCreateWin32SurfaceKHR>( -            dld.vkGetInstanceProcAddr(*instance, "vkCreateWin32SurfaceKHR")); -        if (!vkCreateWin32SurfaceKHR || -            vkCreateWin32SurfaceKHR(*instance, &win32_ci, nullptr, &unsafe_surface) != VK_SUCCESS) { -            LOG_ERROR(Render_Vulkan, "Failed to initialize Win32 surface"); -            return false; -        } -    } -#endif -#if !defined(_WIN32) && !defined(__APPLE__) -    if (window_info.type == Core::Frontend::WindowSystemType::X11) { -        const VkXlibSurfaceCreateInfoKHR xlib_ci{ -            VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR, nullptr, 0, -            static_cast<Display*>(window_info.display_connection), -            reinterpret_cast<Window>(window_info.render_surface)}; -        const auto vkCreateXlibSurfaceKHR = reinterpret_cast<PFN_vkCreateXlibSurfaceKHR>( -            dld.vkGetInstanceProcAddr(*instance, "vkCreateXlibSurfaceKHR")); -        if (!vkCreateXlibSurfaceKHR || -            vkCreateXlibSurfaceKHR(*instance, &xlib_ci, nullptr, &unsafe_surface) != VK_SUCCESS) { -            LOG_ERROR(Render_Vulkan, "Failed to initialize Xlib surface"); -            return false; -        } -    } -    if (window_info.type == Core::Frontend::WindowSystemType::Wayland) { -        const VkWaylandSurfaceCreateInfoKHR wayland_ci{ -            VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR, nullptr, 0, -            static_cast<wl_display*>(window_info.display_connection), -            static_cast<wl_surface*>(window_info.render_surface)}; -        const auto vkCreateWaylandSurfaceKHR = reinterpret_cast<PFN_vkCreateWaylandSurfaceKHR>( -            dld.vkGetInstanceProcAddr(*instance, "vkCreateWaylandSurfaceKHR")); -        if (!vkCreateWaylandSurfaceKHR || -            vkCreateWaylandSurfaceKHR(*instance, &wayland_ci, nullptr, &unsafe_surface) != -                VK_SUCCESS) { -            LOG_ERROR(Render_Vulkan, "Failed to initialize Wayland surface"); -            return false; -        } -    } -#endif -    if (!unsafe_surface) { -        LOG_ERROR(Render_Vulkan, "Presentation not supported on this platform"); -        return false; -    } - -    surface = vk::SurfaceKHR(unsafe_surface, *instance, dld); -    return true; -} -  bool RendererVulkan::PickDevices() {      const auto devices = instance.EnumeratePhysicalDevices();      if (!devices) { diff --git a/src/video_core/renderer_vulkan/renderer_vulkan.h b/src/video_core/renderer_vulkan/renderer_vulkan.h index fa7628d0e..7c5ce1da4 100644 --- a/src/video_core/renderer_vulkan/renderer_vulkan.h +++ b/src/video_core/renderer_vulkan/renderer_vulkan.h @@ -56,8 +56,6 @@ public:      static std::vector<std::string> EnumerateDevices();  private: -    bool CreateSurface(); -      bool PickDevices();      void Report() const; diff --git a/src/video_core/vulkan_common/vulkan_surface.cpp b/src/video_core/vulkan_common/vulkan_surface.cpp new file mode 100644 index 000000000..3c3238f96 --- /dev/null +++ b/src/video_core/vulkan_common/vulkan_surface.cpp @@ -0,0 +1,81 @@ +// Copyright 2020 yuzu Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#include "common/logging/log.h" +#include "core/frontend/emu_window.h" +#include "video_core/vulkan_common/vulkan_surface.h" +#include "video_core/vulkan_common/vulkan_wrapper.h" + +// Include these late to avoid polluting previous headers +#ifdef _WIN32 +#include <windows.h> +// ensure include order +#include <vulkan/vulkan_win32.h> +#endif + +#if !defined(_WIN32) && !defined(__APPLE__) +#include <X11/Xlib.h> +#include <vulkan/vulkan_wayland.h> +#include <vulkan/vulkan_xlib.h> +#endif + +namespace Vulkan { + +vk::SurfaceKHR CreateSurface(const vk::Instance& instance, +                             const Core::Frontend::EmuWindow& emu_window) { +    [[maybe_unused]] const vk::InstanceDispatch& dld = instance.Dispatch(); +    [[maybe_unused]] const auto& window_info = emu_window.GetWindowInfo(); +    VkSurfaceKHR unsafe_surface = nullptr; + +#ifdef _WIN32 +    if (window_info.type == Core::Frontend::WindowSystemType::Windows) { +        const HWND hWnd = static_cast<HWND>(window_info.render_surface); +        const VkWin32SurfaceCreateInfoKHR win32_ci{VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR, +                                                   nullptr, 0, nullptr, hWnd}; +        const auto vkCreateWin32SurfaceKHR = reinterpret_cast<PFN_vkCreateWin32SurfaceKHR>( +            dld.vkGetInstanceProcAddr(*instance, "vkCreateWin32SurfaceKHR")); +        if (!vkCreateWin32SurfaceKHR || +            vkCreateWin32SurfaceKHR(*instance, &win32_ci, nullptr, &unsafe_surface) != VK_SUCCESS) { +            LOG_ERROR(Render_Vulkan, "Failed to initialize Win32 surface"); +            throw vk::Exception(VK_ERROR_INITIALIZATION_FAILED); +        } +    } +#endif +#if !defined(_WIN32) && !defined(__APPLE__) +    if (window_info.type == Core::Frontend::WindowSystemType::X11) { +        const VkXlibSurfaceCreateInfoKHR xlib_ci{ +            VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR, nullptr, 0, +            static_cast<Display*>(window_info.display_connection), +            reinterpret_cast<Window>(window_info.render_surface)}; +        const auto vkCreateXlibSurfaceKHR = reinterpret_cast<PFN_vkCreateXlibSurfaceKHR>( +            dld.vkGetInstanceProcAddr(*instance, "vkCreateXlibSurfaceKHR")); +        if (!vkCreateXlibSurfaceKHR || +            vkCreateXlibSurfaceKHR(*instance, &xlib_ci, nullptr, &unsafe_surface) != VK_SUCCESS) { +            LOG_ERROR(Render_Vulkan, "Failed to initialize Xlib surface"); +            throw vk::Exception(VK_ERROR_INITIALIZATION_FAILED); +        } +    } +    if (window_info.type == Core::Frontend::WindowSystemType::Wayland) { +        const VkWaylandSurfaceCreateInfoKHR wayland_ci{ +            VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR, nullptr, 0, +            static_cast<wl_display*>(window_info.display_connection), +            static_cast<wl_surface*>(window_info.render_surface)}; +        const auto vkCreateWaylandSurfaceKHR = reinterpret_cast<PFN_vkCreateWaylandSurfaceKHR>( +            dld.vkGetInstanceProcAddr(*instance, "vkCreateWaylandSurfaceKHR")); +        if (!vkCreateWaylandSurfaceKHR || +            vkCreateWaylandSurfaceKHR(*instance, &wayland_ci, nullptr, &unsafe_surface) != +                VK_SUCCESS) { +            LOG_ERROR(Render_Vulkan, "Failed to initialize Wayland surface"); +            throw vk::Exception(VK_ERROR_INITIALIZATION_FAILED); +        } +    } +#endif +    if (!unsafe_surface) { +        LOG_ERROR(Render_Vulkan, "Presentation not supported on this platform"); +        throw vk::Exception(VK_ERROR_INITIALIZATION_FAILED); +    } +    return vk::SurfaceKHR(unsafe_surface, *instance, dld); +} + +} // namespace Vulkan diff --git a/src/video_core/vulkan_common/vulkan_surface.h b/src/video_core/vulkan_common/vulkan_surface.h new file mode 100644 index 000000000..05a169e32 --- /dev/null +++ b/src/video_core/vulkan_common/vulkan_surface.h @@ -0,0 +1,18 @@ +// Copyright 2020 yuzu Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#pragma once + +#include "video_core/vulkan_common/vulkan_wrapper.h" + +namespace Core::Frontend { +class EmuWindow; +} + +namespace Vulkan { + +[[nodiscard]] vk::SurfaceKHR CreateSurface(const vk::Instance& instance, +                                           const Core::Frontend::EmuWindow& emu_window); + +} // namespace Vulkan diff --git a/src/video_core/vulkan_common/vulkan_wrapper.h b/src/video_core/vulkan_common/vulkan_wrapper.h index 03ca97ac0..012982a3f 100644 --- a/src/video_core/vulkan_common/vulkan_wrapper.h +++ b/src/video_core/vulkan_common/vulkan_wrapper.h @@ -586,6 +586,11 @@ public:      /// @throw Exception on creation failure.      DebugUtilsMessenger CreateDebugUtilsMessenger(          const VkDebugUtilsMessengerCreateInfoEXT& create_info) const; + +    /// Returns dispatch table. +    const InstanceDispatch& Dispatch() const noexcept { +        return *dld; +    }  };  class Queue {  | 
