summaryrefslogtreecommitdiff
path: root/src/video_core/renderer_vulkan
diff options
context:
space:
mode:
authorGravatar ReinUsesLisp2020-12-25 02:14:15 -0300
committerGravatar ReinUsesLisp2020-12-31 02:07:33 -0300
commit11f0f7598df993c717752030c05f7b1eca3c762c (patch)
tree9a3da76be0b55bd9217ad44f85f58ae72f09d396 /src/video_core/renderer_vulkan
parentrenderer_vulkan: Catch and report exceptions (diff)
downloadyuzu-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/renderer_vulkan')
-rw-r--r--src/video_core/renderer_vulkan/renderer_vulkan.cpp74
-rw-r--r--src/video_core/renderer_vulkan/renderer_vulkan.h2
2 files changed, 3 insertions, 73 deletions
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 @@
32#include "video_core/vulkan_common/vulkan_debug_callback.h" 32#include "video_core/vulkan_common/vulkan_debug_callback.h"
33#include "video_core/vulkan_common/vulkan_instance.h" 33#include "video_core/vulkan_common/vulkan_instance.h"
34#include "video_core/vulkan_common/vulkan_library.h" 34#include "video_core/vulkan_common/vulkan_library.h"
35#include "video_core/vulkan_common/vulkan_surface.h"
35#include "video_core/vulkan_common/vulkan_wrapper.h" 36#include "video_core/vulkan_common/vulkan_wrapper.h"
36 37
37// Include these late to avoid polluting previous headers
38#ifdef _WIN32
39#include <windows.h>
40// ensure include order
41#include <vulkan/vulkan_win32.h>
42#endif
43
44#if !defined(_WIN32) && !defined(__APPLE__)
45#include <X11/Xlib.h>
46#include <vulkan/vulkan_wayland.h>
47#include <vulkan/vulkan_xlib.h>
48#endif
49
50namespace Vulkan { 38namespace Vulkan {
51namespace { 39namespace {
52std::string GetReadableVersion(u32 version) { 40std::string GetReadableVersion(u32 version) {
@@ -144,8 +132,8 @@ bool RendererVulkan::Init() try {
144 if (Settings::values.renderer_debug) { 132 if (Settings::values.renderer_debug) {
145 debug_callback = CreateDebugCallback(instance); 133 debug_callback = CreateDebugCallback(instance);
146 } 134 }
147 135 surface = CreateSurface(instance, render_window);
148 if (!CreateSurface() || !PickDevices()) { 136 if (!PickDevices()) {
149 return false; 137 return false;
150 } 138 }
151 139
@@ -191,62 +179,6 @@ void RendererVulkan::ShutDown() {
191 device.reset(); 179 device.reset();
192} 180}
193 181
194bool RendererVulkan::CreateSurface() {
195 [[maybe_unused]] const auto& window_info = render_window.GetWindowInfo();
196 VkSurfaceKHR unsafe_surface = nullptr;
197
198#ifdef _WIN32
199 if (window_info.type == Core::Frontend::WindowSystemType::Windows) {
200 const HWND hWnd = static_cast<HWND>(window_info.render_surface);
201 const VkWin32SurfaceCreateInfoKHR win32_ci{VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR,
202 nullptr, 0, nullptr, hWnd};
203 const auto vkCreateWin32SurfaceKHR = reinterpret_cast<PFN_vkCreateWin32SurfaceKHR>(
204 dld.vkGetInstanceProcAddr(*instance, "vkCreateWin32SurfaceKHR"));
205 if (!vkCreateWin32SurfaceKHR ||
206 vkCreateWin32SurfaceKHR(*instance, &win32_ci, nullptr, &unsafe_surface) != VK_SUCCESS) {
207 LOG_ERROR(Render_Vulkan, "Failed to initialize Win32 surface");
208 return false;
209 }
210 }
211#endif
212#if !defined(_WIN32) && !defined(__APPLE__)
213 if (window_info.type == Core::Frontend::WindowSystemType::X11) {
214 const VkXlibSurfaceCreateInfoKHR xlib_ci{
215 VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR, nullptr, 0,
216 static_cast<Display*>(window_info.display_connection),
217 reinterpret_cast<Window>(window_info.render_surface)};
218 const auto vkCreateXlibSurfaceKHR = reinterpret_cast<PFN_vkCreateXlibSurfaceKHR>(
219 dld.vkGetInstanceProcAddr(*instance, "vkCreateXlibSurfaceKHR"));
220 if (!vkCreateXlibSurfaceKHR ||
221 vkCreateXlibSurfaceKHR(*instance, &xlib_ci, nullptr, &unsafe_surface) != VK_SUCCESS) {
222 LOG_ERROR(Render_Vulkan, "Failed to initialize Xlib surface");
223 return false;
224 }
225 }
226 if (window_info.type == Core::Frontend::WindowSystemType::Wayland) {
227 const VkWaylandSurfaceCreateInfoKHR wayland_ci{
228 VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR, nullptr, 0,
229 static_cast<wl_display*>(window_info.display_connection),
230 static_cast<wl_surface*>(window_info.render_surface)};
231 const auto vkCreateWaylandSurfaceKHR = reinterpret_cast<PFN_vkCreateWaylandSurfaceKHR>(
232 dld.vkGetInstanceProcAddr(*instance, "vkCreateWaylandSurfaceKHR"));
233 if (!vkCreateWaylandSurfaceKHR ||
234 vkCreateWaylandSurfaceKHR(*instance, &wayland_ci, nullptr, &unsafe_surface) !=
235 VK_SUCCESS) {
236 LOG_ERROR(Render_Vulkan, "Failed to initialize Wayland surface");
237 return false;
238 }
239 }
240#endif
241 if (!unsafe_surface) {
242 LOG_ERROR(Render_Vulkan, "Presentation not supported on this platform");
243 return false;
244 }
245
246 surface = vk::SurfaceKHR(unsafe_surface, *instance, dld);
247 return true;
248}
249
250bool RendererVulkan::PickDevices() { 182bool RendererVulkan::PickDevices() {
251 const auto devices = instance.EnumeratePhysicalDevices(); 183 const auto devices = instance.EnumeratePhysicalDevices();
252 if (!devices) { 184 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:
56 static std::vector<std::string> EnumerateDevices(); 56 static std::vector<std::string> EnumerateDevices();
57 57
58private: 58private:
59 bool CreateSurface();
60
61 bool PickDevices(); 59 bool PickDevices();
62 60
63 void Report() const; 61 void Report() const;