diff options
| author | 2020-12-25 02:14:15 -0300 | |
|---|---|---|
| committer | 2020-12-31 02:07:33 -0300 | |
| commit | 11f0f7598df993c717752030c05f7b1eca3c762c (patch) | |
| tree | 9a3da76be0b55bd9217ad44f85f58ae72f09d396 /src/video_core/vulkan_common | |
| parent | renderer_vulkan: Catch and report exceptions (diff) | |
| download | yuzu-11f0f7598df993c717752030c05f7b1eca3c762c.tar.gz yuzu-11f0f7598df993c717752030c05f7b1eca3c762c.tar.xz yuzu-11f0f7598df993c717752030c05f7b1eca3c762c.zip | |
renderer_vulkan: Initialize surface in separate file
Move surface initialization code to a separate file. It's unlikely to
use this code outside of Vulkan, but keeping platform-specific code
(Win32, Xlib, Wayland) in its own translation unit keeps things cleaner.
Diffstat (limited to 'src/video_core/vulkan_common')
| -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 |
3 files changed, 104 insertions, 0 deletions
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 @@ | |||
| 1 | // Copyright 2020 yuzu Emulator Project | ||
| 2 | // Licensed under GPLv2 or any later version | ||
| 3 | // Refer to the license.txt file included. | ||
| 4 | |||
| 5 | #include "common/logging/log.h" | ||
| 6 | #include "core/frontend/emu_window.h" | ||
| 7 | #include "video_core/vulkan_common/vulkan_surface.h" | ||
| 8 | #include "video_core/vulkan_common/vulkan_wrapper.h" | ||
| 9 | |||
| 10 | // Include these late to avoid polluting previous headers | ||
| 11 | #ifdef _WIN32 | ||
| 12 | #include <windows.h> | ||
| 13 | // ensure include order | ||
| 14 | #include <vulkan/vulkan_win32.h> | ||
| 15 | #endif | ||
| 16 | |||
| 17 | #if !defined(_WIN32) && !defined(__APPLE__) | ||
| 18 | #include <X11/Xlib.h> | ||
| 19 | #include <vulkan/vulkan_wayland.h> | ||
| 20 | #include <vulkan/vulkan_xlib.h> | ||
| 21 | #endif | ||
| 22 | |||
| 23 | namespace Vulkan { | ||
| 24 | |||
| 25 | vk::SurfaceKHR CreateSurface(const vk::Instance& instance, | ||
| 26 | const Core::Frontend::EmuWindow& emu_window) { | ||
| 27 | [[maybe_unused]] const vk::InstanceDispatch& dld = instance.Dispatch(); | ||
| 28 | [[maybe_unused]] const auto& window_info = emu_window.GetWindowInfo(); | ||
| 29 | VkSurfaceKHR unsafe_surface = nullptr; | ||
| 30 | |||
| 31 | #ifdef _WIN32 | ||
| 32 | if (window_info.type == Core::Frontend::WindowSystemType::Windows) { | ||
| 33 | const HWND hWnd = static_cast<HWND>(window_info.render_surface); | ||
| 34 | const VkWin32SurfaceCreateInfoKHR win32_ci{VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR, | ||
| 35 | nullptr, 0, nullptr, hWnd}; | ||
| 36 | const auto vkCreateWin32SurfaceKHR = reinterpret_cast<PFN_vkCreateWin32SurfaceKHR>( | ||
| 37 | dld.vkGetInstanceProcAddr(*instance, "vkCreateWin32SurfaceKHR")); | ||
| 38 | if (!vkCreateWin32SurfaceKHR || | ||
| 39 | vkCreateWin32SurfaceKHR(*instance, &win32_ci, nullptr, &unsafe_surface) != VK_SUCCESS) { | ||
| 40 | LOG_ERROR(Render_Vulkan, "Failed to initialize Win32 surface"); | ||
| 41 | throw vk::Exception(VK_ERROR_INITIALIZATION_FAILED); | ||
| 42 | } | ||
| 43 | } | ||
| 44 | #endif | ||
| 45 | #if !defined(_WIN32) && !defined(__APPLE__) | ||
| 46 | if (window_info.type == Core::Frontend::WindowSystemType::X11) { | ||
| 47 | const VkXlibSurfaceCreateInfoKHR xlib_ci{ | ||
| 48 | VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR, nullptr, 0, | ||
| 49 | static_cast<Display*>(window_info.display_connection), | ||
| 50 | reinterpret_cast<Window>(window_info.render_surface)}; | ||
| 51 | const auto vkCreateXlibSurfaceKHR = reinterpret_cast<PFN_vkCreateXlibSurfaceKHR>( | ||
| 52 | dld.vkGetInstanceProcAddr(*instance, "vkCreateXlibSurfaceKHR")); | ||
| 53 | if (!vkCreateXlibSurfaceKHR || | ||
| 54 | vkCreateXlibSurfaceKHR(*instance, &xlib_ci, nullptr, &unsafe_surface) != VK_SUCCESS) { | ||
| 55 | LOG_ERROR(Render_Vulkan, "Failed to initialize Xlib surface"); | ||
| 56 | throw vk::Exception(VK_ERROR_INITIALIZATION_FAILED); | ||
| 57 | } | ||
| 58 | } | ||
| 59 | if (window_info.type == Core::Frontend::WindowSystemType::Wayland) { | ||
| 60 | const VkWaylandSurfaceCreateInfoKHR wayland_ci{ | ||
| 61 | VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR, nullptr, 0, | ||
| 62 | static_cast<wl_display*>(window_info.display_connection), | ||
| 63 | static_cast<wl_surface*>(window_info.render_surface)}; | ||
| 64 | const auto vkCreateWaylandSurfaceKHR = reinterpret_cast<PFN_vkCreateWaylandSurfaceKHR>( | ||
| 65 | dld.vkGetInstanceProcAddr(*instance, "vkCreateWaylandSurfaceKHR")); | ||
| 66 | if (!vkCreateWaylandSurfaceKHR || | ||
| 67 | vkCreateWaylandSurfaceKHR(*instance, &wayland_ci, nullptr, &unsafe_surface) != | ||
| 68 | VK_SUCCESS) { | ||
| 69 | LOG_ERROR(Render_Vulkan, "Failed to initialize Wayland surface"); | ||
| 70 | throw vk::Exception(VK_ERROR_INITIALIZATION_FAILED); | ||
| 71 | } | ||
| 72 | } | ||
| 73 | #endif | ||
| 74 | if (!unsafe_surface) { | ||
| 75 | LOG_ERROR(Render_Vulkan, "Presentation not supported on this platform"); | ||
| 76 | throw vk::Exception(VK_ERROR_INITIALIZATION_FAILED); | ||
| 77 | } | ||
| 78 | return vk::SurfaceKHR(unsafe_surface, *instance, dld); | ||
| 79 | } | ||
| 80 | |||
| 81 | } // 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 @@ | |||
| 1 | // Copyright 2020 yuzu Emulator Project | ||
| 2 | // Licensed under GPLv2 or any later version | ||
| 3 | // Refer to the license.txt file included. | ||
| 4 | |||
| 5 | #pragma once | ||
| 6 | |||
| 7 | #include "video_core/vulkan_common/vulkan_wrapper.h" | ||
| 8 | |||
| 9 | namespace Core::Frontend { | ||
| 10 | class EmuWindow; | ||
| 11 | } | ||
| 12 | |||
| 13 | namespace Vulkan { | ||
| 14 | |||
| 15 | [[nodiscard]] vk::SurfaceKHR CreateSurface(const vk::Instance& instance, | ||
| 16 | const Core::Frontend::EmuWindow& emu_window); | ||
| 17 | |||
| 18 | } // 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: | |||
| 586 | /// @throw Exception on creation failure. | 586 | /// @throw Exception on creation failure. |
| 587 | DebugUtilsMessenger CreateDebugUtilsMessenger( | 587 | DebugUtilsMessenger CreateDebugUtilsMessenger( |
| 588 | const VkDebugUtilsMessengerCreateInfoEXT& create_info) const; | 588 | const VkDebugUtilsMessengerCreateInfoEXT& create_info) const; |
| 589 | |||
| 590 | /// Returns dispatch table. | ||
| 591 | const InstanceDispatch& Dispatch() const noexcept { | ||
| 592 | return *dld; | ||
| 593 | } | ||
| 589 | }; | 594 | }; |
| 590 | 595 | ||
| 591 | class Queue { | 596 | class Queue { |