diff options
| author | ReinUsesLisp <reinuseslisp@airmail.cc> | 2020-04-02 02:32:58 -0300 | 
|---|---|---|
| committer | ReinUsesLisp <reinuseslisp@airmail.cc> | 2020-04-07 16:32:19 -0300 | 
| commit | bf1d66b7c074c02aa8148f2edbdc959082c229e1 (patch) | |
| tree | 744ff7c8db629f73181da21c44ec76ee70cd4e52 /src/video_core | |
| parent | bc1b4b85b01aee30a14c234143e72ef3435f9660 (diff) | |
yuzu: Drop SDL2 and Qt frontend Vulkan requirements
Create Vulkan instances and surfaces from the Vulkan backend.
Diffstat (limited to 'src/video_core')
| -rw-r--r-- | src/video_core/renderer_vulkan/declarations.h | 1 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/renderer_vulkan.cpp | 213 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/renderer_vulkan.h | 16 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_device.cpp | 92 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_device.h | 21 | 
5 files changed, 238 insertions, 105 deletions
diff --git a/src/video_core/renderer_vulkan/declarations.h b/src/video_core/renderer_vulkan/declarations.h index d2a1140c1..89a035ca4 100644 --- a/src/video_core/renderer_vulkan/declarations.h +++ b/src/video_core/renderer_vulkan/declarations.h @@ -51,6 +51,7 @@ using UniqueSampler = UniqueHandle<vk::Sampler>;  using UniqueSamplerYcbcrConversion = UniqueHandle<vk::SamplerYcbcrConversion>;  using UniqueSemaphore = UniqueHandle<vk::Semaphore>;  using UniqueShaderModule = UniqueHandle<vk::ShaderModule>; +using UniqueSurfaceKHR = UniqueHandle<vk::SurfaceKHR>;  using UniqueSwapchainKHR = UniqueHandle<vk::SwapchainKHR>;  using UniqueValidationCacheEXT = UniqueHandle<vk::ValidationCacheEXT>;  using UniqueDebugReportCallbackEXT = UniqueHandle<vk::DebugReportCallbackEXT>; diff --git a/src/video_core/renderer_vulkan/renderer_vulkan.cpp b/src/video_core/renderer_vulkan/renderer_vulkan.cpp index 9c323a1aa..9cdb4b627 100644 --- a/src/video_core/renderer_vulkan/renderer_vulkan.cpp +++ b/src/video_core/renderer_vulkan/renderer_vulkan.cpp @@ -2,8 +2,12 @@  // Licensed under GPLv2 or any later version  // Refer to the license.txt file included. +#include <algorithm> +#include <array> +#include <cstring>  #include <memory>  #include <optional> +#include <string>  #include <vector>  #include <fmt/format.h> @@ -31,15 +35,30 @@  #include "video_core/renderer_vulkan/vk_state_tracker.h"  #include "video_core/renderer_vulkan/vk_swapchain.h" +// Include these late to avoid changing Vulkan-Hpp's dynamic dispatcher size +#ifdef _WIN32 +#include <windows.h> +// ensure include order +#include <vulkan/vulkan_win32.h> +#endif + +#ifdef __linux__ +#include <X11/Xlib.h> +#include <vulkan/vulkan_wayland.h> +#include <vulkan/vulkan_xlib.h> +#endif +  namespace Vulkan {  namespace { +using Core::Frontend::WindowSystemType; +  VkBool32 DebugCallback(VkDebugUtilsMessageSeverityFlagBitsEXT severity_,                         VkDebugUtilsMessageTypeFlagsEXT type,                         const VkDebugUtilsMessengerCallbackDataEXT* data,                         [[maybe_unused]] void* user_data) { -    const vk::DebugUtilsMessageSeverityFlagBitsEXT severity{severity_}; +    const auto severity{static_cast<vk::DebugUtilsMessageSeverityFlagBitsEXT>(severity_)};      const char* message{data->pMessage};      if (severity & vk::DebugUtilsMessageSeverityFlagBitsEXT::eError) { @@ -75,21 +94,86 @@ Common::DynamicLibrary OpenVulkanLibrary() {      return library;  } -UniqueInstance CreateInstance(Common::DynamicLibrary& library, vk::DispatchLoaderDynamic& dld) { +UniqueInstance CreateInstance(Common::DynamicLibrary& library, vk::DispatchLoaderDynamic& dld, +                              WindowSystemType window_type = WindowSystemType::Headless, +                              bool enable_layers = false) { +    if (!library.IsOpen()) { +        LOG_ERROR(Render_Vulkan, "Vulkan library not available"); +        return UniqueInstance{}; +    }      PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr;      if (!library.GetSymbol("vkGetInstanceProcAddr", &vkGetInstanceProcAddr)) { +        LOG_ERROR(Render_Vulkan, "vkGetInstanceProcAddr not present in Vulkan");          return UniqueInstance{};      }      dld.init(vkGetInstanceProcAddr); -    const vk::ApplicationInfo application_info("yuzu", VK_MAKE_VERSION(0, 1, 0), "yuzu", -                                               VK_MAKE_VERSION(0, 1, 0), VK_API_VERSION_1_1); -    const vk::InstanceCreateInfo instance_ci({}, &application_info, 0, nullptr, 0, nullptr); +    std::vector<const char*> extensions; +    extensions.reserve(4); +    switch (window_type) { +    case Core::Frontend::WindowSystemType::Headless: +        break; +#ifdef _WIN32 +    case Core::Frontend::WindowSystemType::Windows: +        extensions.push_back(VK_KHR_WIN32_SURFACE_EXTENSION_NAME); +        break; +#endif +#ifdef __linux__ +    case Core::Frontend::WindowSystemType::X11: +        extensions.push_back(VK_KHR_XLIB_SURFACE_EXTENSION_NAME); +        break; +    case Core::Frontend::WindowSystemType::Wayland: +        extensions.push_back(VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME); +        break; +#endif +    default: +        LOG_ERROR(Render_Vulkan, "Presentation not supported on this platform"); +        break; +    } +    if (window_type != Core::Frontend::WindowSystemType::Headless) { +        extensions.push_back(VK_KHR_SURFACE_EXTENSION_NAME); +    } +    if (enable_layers) { +        extensions.push_back(VK_EXT_DEBUG_UTILS_EXTENSION_NAME); +    } + +    u32 num_properties; +    if (vk::enumerateInstanceExtensionProperties(nullptr, &num_properties, nullptr, dld) != +        vk::Result::eSuccess) { +        LOG_ERROR(Render_Vulkan, "Failed to query number of extension properties"); +        return UniqueInstance{}; +    } +    std::vector<vk::ExtensionProperties> properties(num_properties); +    if (vk::enumerateInstanceExtensionProperties(nullptr, &num_properties, properties.data(), +                                                 dld) != vk::Result::eSuccess) { +        LOG_ERROR(Render_Vulkan, "Failed to query extension properties"); +        return UniqueInstance{}; +    } + +    for (const char* extension : extensions) { +        const auto it = +            std::find_if(properties.begin(), properties.end(), [extension](const auto& prop) { +                return !std::strcmp(extension, prop.extensionName); +            }); +        if (it == properties.end()) { +            LOG_ERROR(Render_Vulkan, "Required instance extension {} is not available", extension); +            return UniqueInstance{}; +        } +    } + +    const vk::ApplicationInfo application_info("yuzu Emulator", VK_MAKE_VERSION(0, 1, 0), +                                               "yuzu Emulator", VK_MAKE_VERSION(0, 1, 0), +                                               VK_API_VERSION_1_1); +    const std::array layers = {"VK_LAYER_LUNARG_standard_validation"}; +    const vk::InstanceCreateInfo instance_ci( +        {}, &application_info, enable_layers ? static_cast<u32>(layers.size()) : 0, layers.data(), +        static_cast<u32>(extensions.size()), extensions.data());      vk::Instance unsafe_instance;      if (vk::createInstance(&instance_ci, nullptr, &unsafe_instance, dld) != vk::Result::eSuccess) { +        LOG_ERROR(Render_Vulkan, "Failed to create Vulkan instance");          return UniqueInstance{};      } -    dld.init(unsafe_instance, vkGetInstanceProcAddr); +    dld.init(unsafe_instance);      return UniqueInstance(unsafe_instance, {nullptr, dld});  } @@ -187,27 +271,12 @@ bool RendererVulkan::TryPresent(int /*timeout_ms*/) {  }  bool RendererVulkan::Init() { -    PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr{}; -    render_window.RetrieveVulkanHandlers(&vkGetInstanceProcAddr, &instance, &surface); -    const vk::DispatchLoaderDynamic dldi(instance, vkGetInstanceProcAddr); - -    std::optional<vk::DebugUtilsMessengerEXT> callback; -    if (Settings::values.renderer_debug && dldi.vkCreateDebugUtilsMessengerEXT) { -        callback = CreateDebugCallback(dldi); -        if (!callback) { -            return false; -        } -    } - -    if (!PickDevices(dldi)) { -        if (callback) { -            instance.destroy(*callback, nullptr, dldi); -        } +    library = OpenVulkanLibrary(); +    instance = CreateInstance(library, dld, render_window.GetWindowInfo().type, +                              Settings::values.renderer_debug); +    if (!instance || !CreateDebugCallback() || !CreateSurface() || !PickDevices()) {          return false;      } -    debug_callback = UniqueDebugUtilsMessengerEXT( -        *callback, vk::ObjectDestroy<vk::Instance, vk::DispatchLoaderDynamic>( -                       instance, nullptr, device->GetDispatchLoader()));      Report(); @@ -216,7 +285,7 @@ bool RendererVulkan::Init() {      resource_manager = std::make_unique<VKResourceManager>(*device);      const auto& framebuffer = render_window.GetFramebufferLayout(); -    swapchain = std::make_unique<VKSwapchain>(surface, *device); +    swapchain = std::make_unique<VKSwapchain>(*surface, *device);      swapchain->Create(framebuffer.width, framebuffer.height, false);      state_tracker = std::make_unique<StateTracker>(system); @@ -253,8 +322,10 @@ void RendererVulkan::ShutDown() {      device.reset();  } -std::optional<vk::DebugUtilsMessengerEXT> RendererVulkan::CreateDebugCallback( -    const vk::DispatchLoaderDynamic& dldi) { +bool RendererVulkan::CreateDebugCallback() { +    if (!Settings::values.renderer_debug) { +        return true; +    }      const vk::DebugUtilsMessengerCreateInfoEXT callback_ci(          {},          vk::DebugUtilsMessageSeverityFlagBitsEXT::eError | @@ -265,32 +336,88 @@ std::optional<vk::DebugUtilsMessengerEXT> RendererVulkan::CreateDebugCallback(              vk::DebugUtilsMessageTypeFlagBitsEXT::eValidation |              vk::DebugUtilsMessageTypeFlagBitsEXT::ePerformance,          &DebugCallback, nullptr); -    vk::DebugUtilsMessengerEXT callback; -    if (instance.createDebugUtilsMessengerEXT(&callback_ci, nullptr, &callback, dldi) != +    vk::DebugUtilsMessengerEXT unsafe_callback; +    if (instance->createDebugUtilsMessengerEXT(&callback_ci, nullptr, &unsafe_callback, dld) !=          vk::Result::eSuccess) {          LOG_ERROR(Render_Vulkan, "Failed to create debug callback"); -        return {}; +        return false; +    } +    debug_callback = UniqueDebugUtilsMessengerEXT(unsafe_callback, {*instance, nullptr, dld}); +    return true; +} + +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.get(), &win32_ci, nullptr, +                                                                &unsafe_surface) != VK_SUCCESS) { +            LOG_ERROR(Render_Vulkan, "Failed to initialize Win32 surface"); +            return false; +        } +    } +#endif +#ifdef __linux__ +    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.get(), &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.get(), &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;      } -    return callback; + +    surface = UniqueSurfaceKHR(unsafe_surface, {*instance, nullptr, dld}); +    return true;  } -bool RendererVulkan::PickDevices(const vk::DispatchLoaderDynamic& dldi) { -    const auto devices = instance.enumeratePhysicalDevices(dldi); +bool RendererVulkan::PickDevices() { +    const auto devices = instance->enumeratePhysicalDevices(dld); -    // TODO(Rodrigo): Choose device from config file      const s32 device_index = Settings::values.vulkan_device;      if (device_index < 0 || device_index >= static_cast<s32>(devices.size())) {          LOG_ERROR(Render_Vulkan, "Invalid device index {}!", device_index);          return false;      } -    const vk::PhysicalDevice physical_device = devices[device_index]; +    const vk::PhysicalDevice physical_device = devices[static_cast<std::size_t>(device_index)]; -    if (!VKDevice::IsSuitable(dldi, physical_device, surface)) { +    if (!VKDevice::IsSuitable(physical_device, *surface, dld)) {          return false;      } -    device = std::make_unique<VKDevice>(dldi, physical_device, surface); -    return device->Create(dldi, instance); +    device = std::make_unique<VKDevice>(dld, physical_device, *surface); +    return device->Create(*instance);  }  void RendererVulkan::Report() const { @@ -317,11 +444,11 @@ void RendererVulkan::Report() const {  }  std::vector<std::string> RendererVulkan::EnumerateDevices() { +    // Avoid putting DispatchLoaderDynamic, it's too large +    auto dld_memory = std::make_unique<vk::DispatchLoaderDynamic>(); +    auto& dld = *dld_memory; +      Common::DynamicLibrary library = OpenVulkanLibrary(); -    if (!library.IsOpen()) { -        return {}; -    } -    vk::DispatchLoaderDynamic dld;      UniqueInstance instance = CreateInstance(library, dld);      if (!instance) {          return {}; diff --git a/src/video_core/renderer_vulkan/renderer_vulkan.h b/src/video_core/renderer_vulkan/renderer_vulkan.h index 7a17c546d..42e253de5 100644 --- a/src/video_core/renderer_vulkan/renderer_vulkan.h +++ b/src/video_core/renderer_vulkan/renderer_vulkan.h @@ -9,6 +9,8 @@  #include <string>  #include <vector> +#include "common/dynamic_library.h" +  #include "video_core/renderer_base.h"  #include "video_core/renderer_vulkan/declarations.h" @@ -48,17 +50,21 @@ public:      static std::vector<std::string> EnumerateDevices();  private: -    std::optional<vk::DebugUtilsMessengerEXT> CreateDebugCallback( -        const vk::DispatchLoaderDynamic& dldi); +    bool CreateDebugCallback(); + +    bool CreateSurface(); -    bool PickDevices(const vk::DispatchLoaderDynamic& dldi); +    bool PickDevices();      void Report() const;      Core::System& system; -    vk::Instance instance; -    vk::SurfaceKHR surface; +    Common::DynamicLibrary library; +    vk::DispatchLoaderDynamic dld; + +    UniqueInstance instance; +    UniqueSurfaceKHR surface;      VKScreenInfo screen_info; diff --git a/src/video_core/renderer_vulkan/vk_device.cpp b/src/video_core/renderer_vulkan/vk_device.cpp index 7aafb5e59..6f4ae9132 100644 --- a/src/video_core/renderer_vulkan/vk_device.cpp +++ b/src/video_core/renderer_vulkan/vk_device.cpp @@ -10,6 +10,7 @@  #include <string_view>  #include <thread>  #include <vector> +  #include "common/assert.h"  #include "core/settings.h"  #include "video_core/renderer_vulkan/declarations.h" @@ -35,20 +36,20 @@ void SetNext(void**& next, T& data) {  }  template <typename T> -T GetFeatures(vk::PhysicalDevice physical, const vk::DispatchLoaderDynamic& dldi) { +T GetFeatures(vk::PhysicalDevice physical, const vk::DispatchLoaderDynamic& dld) {      vk::PhysicalDeviceFeatures2 features;      T extension_features;      features.pNext = &extension_features; -    physical.getFeatures2(&features, dldi); +    physical.getFeatures2(&features, dld);      return extension_features;  }  template <typename T> -T GetProperties(vk::PhysicalDevice physical, const vk::DispatchLoaderDynamic& dldi) { +T GetProperties(vk::PhysicalDevice physical, const vk::DispatchLoaderDynamic& dld) {      vk::PhysicalDeviceProperties2 properties;      T extension_properties;      properties.pNext = &extension_properties; -    physical.getProperties2(&properties, dldi); +    physical.getProperties2(&properties, dld);      return extension_properties;  } @@ -78,19 +79,19 @@ vk::FormatFeatureFlags GetFormatFeatures(vk::FormatProperties properties, Format  } // Anonymous namespace -VKDevice::VKDevice(const vk::DispatchLoaderDynamic& dldi, vk::PhysicalDevice physical, +VKDevice::VKDevice(const vk::DispatchLoaderDynamic& dld, vk::PhysicalDevice physical,                     vk::SurfaceKHR surface) -    : physical{physical}, properties{physical.getProperties(dldi)}, -      format_properties{GetFormatProperties(dldi, physical)} { -    SetupFamilies(dldi, surface); -    SetupFeatures(dldi); +    : dld{dld}, physical{physical}, properties{physical.getProperties(dld)}, +      format_properties{GetFormatProperties(dld, physical)} { +    SetupFamilies(surface); +    SetupFeatures();  }  VKDevice::~VKDevice() = default; -bool VKDevice::Create(const vk::DispatchLoaderDynamic& dldi, vk::Instance instance) { +bool VKDevice::Create(vk::Instance instance) {      const auto queue_cis = GetDeviceQueueCreateInfos(); -    const std::vector extensions = LoadExtensions(dldi); +    const std::vector extensions = LoadExtensions();      vk::PhysicalDeviceFeatures2 features2;      void** next = &features2.pNext; @@ -165,15 +166,13 @@ bool VKDevice::Create(const vk::DispatchLoaderDynamic& dldi, vk::Instance instan                                     nullptr);      device_ci.pNext = &features2; -    vk::Device dummy_logical; -    if (physical.createDevice(&device_ci, nullptr, &dummy_logical, dldi) != vk::Result::eSuccess) { +    vk::Device unsafe_logical; +    if (physical.createDevice(&device_ci, nullptr, &unsafe_logical, dld) != vk::Result::eSuccess) {          LOG_CRITICAL(Render_Vulkan, "Logical device failed to be created!");          return false;      } - -    dld.init(instance, dldi.vkGetInstanceProcAddr, dummy_logical, dldi.vkGetDeviceProcAddr); -    logical = UniqueDevice( -        dummy_logical, vk::ObjectDestroy<vk::NoParent, vk::DispatchLoaderDynamic>(nullptr, dld)); +    dld.init(instance, dld.vkGetInstanceProcAddr, unsafe_logical); +    logical = UniqueDevice(unsafe_logical, {nullptr, dld});      CollectTelemetryParameters(); @@ -235,8 +234,8 @@ void VKDevice::ReportLoss() const {      // *(VKGraphicsPipeline*)data[0]  } -bool VKDevice::IsOptimalAstcSupported(const vk::PhysicalDeviceFeatures& features, -                                      const vk::DispatchLoaderDynamic& dldi) const { +bool VKDevice::IsOptimalAstcSupported(const vk::PhysicalDeviceFeatures& features) const { +    // Disable for now to avoid converting ASTC twice.      static constexpr std::array astc_formats = {          vk::Format::eAstc4x4UnormBlock,   vk::Format::eAstc4x4SrgbBlock,          vk::Format::eAstc5x4UnormBlock,   vk::Format::eAstc5x4SrgbBlock, @@ -260,7 +259,7 @@ bool VKDevice::IsOptimalAstcSupported(const vk::PhysicalDeviceFeatures& features          vk::FormatFeatureFlagBits::eBlitDst | vk::FormatFeatureFlagBits::eTransferSrc |          vk::FormatFeatureFlagBits::eTransferDst};      for (const auto format : astc_formats) { -        const auto format_properties{physical.getFormatProperties(format, dldi)}; +        const auto format_properties{physical.getFormatProperties(format, dld)};          if (!(format_properties.optimalTilingFeatures & format_feature_usage)) {              return false;          } @@ -279,11 +278,9 @@ bool VKDevice::IsFormatSupported(vk::Format wanted_format, vk::FormatFeatureFlag      return (supported_usage & wanted_usage) == wanted_usage;  } -bool VKDevice::IsSuitable(const vk::DispatchLoaderDynamic& dldi, vk::PhysicalDevice physical, -                          vk::SurfaceKHR surface) { -    bool is_suitable = true; - -    constexpr std::array required_extensions = { +bool VKDevice::IsSuitable(vk::PhysicalDevice physical, vk::SurfaceKHR surface, +                          const vk::DispatchLoaderDynamic& dld) { +    static constexpr std::array required_extensions = {          VK_KHR_SWAPCHAIN_EXTENSION_NAME,          VK_KHR_16BIT_STORAGE_EXTENSION_NAME,          VK_KHR_8BIT_STORAGE_EXTENSION_NAME, @@ -293,9 +290,10 @@ bool VKDevice::IsSuitable(const vk::DispatchLoaderDynamic& dldi, vk::PhysicalDev          VK_EXT_SHADER_SUBGROUP_VOTE_EXTENSION_NAME,          VK_EXT_HOST_QUERY_RESET_EXTENSION_NAME,      }; +    bool is_suitable = true;      std::bitset<required_extensions.size()> available_extensions{}; -    for (const auto& prop : physical.enumerateDeviceExtensionProperties(nullptr, dldi)) { +    for (const auto& prop : physical.enumerateDeviceExtensionProperties(nullptr, dld)) {          for (std::size_t i = 0; i < required_extensions.size(); ++i) {              if (available_extensions[i]) {                  continue; @@ -315,7 +313,7 @@ bool VKDevice::IsSuitable(const vk::DispatchLoaderDynamic& dldi, vk::PhysicalDev      }      bool has_graphics{}, has_present{}; -    const auto queue_family_properties = physical.getQueueFamilyProperties(dldi); +    const auto queue_family_properties = physical.getQueueFamilyProperties(dld);      for (u32 i = 0; i < static_cast<u32>(queue_family_properties.size()); ++i) {          const auto& family = queue_family_properties[i];          if (family.queueCount == 0) { @@ -323,7 +321,7 @@ bool VKDevice::IsSuitable(const vk::DispatchLoaderDynamic& dldi, vk::PhysicalDev          }          has_graphics |=              (family.queueFlags & vk::QueueFlagBits::eGraphics) != static_cast<vk::QueueFlagBits>(0); -        has_present |= physical.getSurfaceSupportKHR(i, surface, dldi) != 0; +        has_present |= physical.getSurfaceSupportKHR(i, surface, dld) != 0;      }      if (!has_graphics || !has_present) {          LOG_ERROR(Render_Vulkan, "Device lacks a graphics and present queue"); @@ -331,7 +329,7 @@ bool VKDevice::IsSuitable(const vk::DispatchLoaderDynamic& dldi, vk::PhysicalDev      }      // TODO(Rodrigo): Check if the device matches all requeriments. -    const auto properties{physical.getProperties(dldi)}; +    const auto properties{physical.getProperties(dld)};      const auto& limits{properties.limits};      constexpr u32 required_ubo_size = 65536; @@ -348,7 +346,7 @@ bool VKDevice::IsSuitable(const vk::DispatchLoaderDynamic& dldi, vk::PhysicalDev          is_suitable = false;      } -    const auto features{physical.getFeatures(dldi)}; +    const auto features{physical.getFeatures(dld)};      const std::array feature_report = {          std::make_pair(features.vertexPipelineStoresAndAtomics, "vertexPipelineStoresAndAtomics"),          std::make_pair(features.independentBlend, "independentBlend"), @@ -380,7 +378,7 @@ bool VKDevice::IsSuitable(const vk::DispatchLoaderDynamic& dldi, vk::PhysicalDev      return is_suitable;  } -std::vector<const char*> VKDevice::LoadExtensions(const vk::DispatchLoaderDynamic& dldi) { +std::vector<const char*> VKDevice::LoadExtensions() {      std::vector<const char*> extensions;      const auto Test = [&](const vk::ExtensionProperties& extension,                            std::optional<std::reference_wrapper<bool>> status, const char* name, @@ -411,7 +409,7 @@ std::vector<const char*> VKDevice::LoadExtensions(const vk::DispatchLoaderDynami      bool has_khr_shader_float16_int8{};      bool has_ext_subgroup_size_control{};      bool has_ext_transform_feedback{}; -    for (const auto& extension : physical.enumerateDeviceExtensionProperties(nullptr, dldi)) { +    for (const auto& extension : physical.enumerateDeviceExtensionProperties(nullptr, dld)) {          Test(extension, khr_uniform_buffer_standard_layout,               VK_KHR_UNIFORM_BUFFER_STANDARD_LAYOUT_EXTENSION_NAME, true);          Test(extension, has_khr_shader_float16_int8, VK_KHR_SHADER_FLOAT16_INT8_EXTENSION_NAME, @@ -433,15 +431,15 @@ std::vector<const char*> VKDevice::LoadExtensions(const vk::DispatchLoaderDynami      if (has_khr_shader_float16_int8) {          is_float16_supported = -            GetFeatures<vk::PhysicalDeviceFloat16Int8FeaturesKHR>(physical, dldi).shaderFloat16; +            GetFeatures<vk::PhysicalDeviceFloat16Int8FeaturesKHR>(physical, dld).shaderFloat16;          extensions.push_back(VK_KHR_SHADER_FLOAT16_INT8_EXTENSION_NAME);      }      if (has_ext_subgroup_size_control) {          const auto features = -            GetFeatures<vk::PhysicalDeviceSubgroupSizeControlFeaturesEXT>(physical, dldi); +            GetFeatures<vk::PhysicalDeviceSubgroupSizeControlFeaturesEXT>(physical, dld);          const auto properties = -            GetProperties<vk::PhysicalDeviceSubgroupSizeControlPropertiesEXT>(physical, dldi); +            GetProperties<vk::PhysicalDeviceSubgroupSizeControlPropertiesEXT>(physical, dld);          is_warp_potentially_bigger = properties.maxSubgroupSize > GuestWarpSize; @@ -456,9 +454,9 @@ std::vector<const char*> VKDevice::LoadExtensions(const vk::DispatchLoaderDynami      if (has_ext_transform_feedback) {          const auto features = -            GetFeatures<vk::PhysicalDeviceTransformFeedbackFeaturesEXT>(physical, dldi); +            GetFeatures<vk::PhysicalDeviceTransformFeedbackFeaturesEXT>(physical, dld);          const auto properties = -            GetProperties<vk::PhysicalDeviceTransformFeedbackPropertiesEXT>(physical, dldi); +            GetProperties<vk::PhysicalDeviceTransformFeedbackPropertiesEXT>(physical, dld);          if (features.transformFeedback && features.geometryStreams &&              properties.maxTransformFeedbackStreams >= 4 && properties.maxTransformFeedbackBuffers && @@ -471,10 +469,10 @@ std::vector<const char*> VKDevice::LoadExtensions(const vk::DispatchLoaderDynami      return extensions;  } -void VKDevice::SetupFamilies(const vk::DispatchLoaderDynamic& dldi, vk::SurfaceKHR surface) { +void VKDevice::SetupFamilies(vk::SurfaceKHR surface) {      std::optional<u32> graphics_family_, present_family_; -    const auto queue_family_properties = physical.getQueueFamilyProperties(dldi); +    const auto queue_family_properties = physical.getQueueFamilyProperties(dld);      for (u32 i = 0; i < static_cast<u32>(queue_family_properties.size()); ++i) {          if (graphics_family_ && present_family_)              break; @@ -483,10 +481,12 @@ void VKDevice::SetupFamilies(const vk::DispatchLoaderDynamic& dldi, vk::SurfaceK          if (queue_family.queueCount == 0)              continue; -        if (queue_family.queueFlags & vk::QueueFlagBits::eGraphics) +        if (queue_family.queueFlags & vk::QueueFlagBits::eGraphics) {              graphics_family_ = i; -        if (physical.getSurfaceSupportKHR(i, surface, dldi)) +        } +        if (physical.getSurfaceSupportKHR(i, surface, dld)) {              present_family_ = i; +        }      }      ASSERT(graphics_family_ && present_family_); @@ -494,10 +494,10 @@ void VKDevice::SetupFamilies(const vk::DispatchLoaderDynamic& dldi, vk::SurfaceK      present_family = *present_family_;  } -void VKDevice::SetupFeatures(const vk::DispatchLoaderDynamic& dldi) { -    const auto supported_features{physical.getFeatures(dldi)}; +void VKDevice::SetupFeatures() { +    const auto supported_features{physical.getFeatures(dld)};      is_formatless_image_load_supported = supported_features.shaderStorageImageReadWithoutFormat; -    is_optimal_astc_supported = IsOptimalAstcSupported(supported_features, dldi); +    is_optimal_astc_supported = IsOptimalAstcSupported(supported_features);  }  void VKDevice::CollectTelemetryParameters() { @@ -525,7 +525,7 @@ std::vector<vk::DeviceQueueCreateInfo> VKDevice::GetDeviceQueueCreateInfos() con  }  std::unordered_map<vk::Format, vk::FormatProperties> VKDevice::GetFormatProperties( -    const vk::DispatchLoaderDynamic& dldi, vk::PhysicalDevice physical) { +    const vk::DispatchLoaderDynamic& dld, vk::PhysicalDevice physical) {      static constexpr std::array formats{vk::Format::eA8B8G8R8UnormPack32,                                          vk::Format::eA8B8G8R8UintPack32,                                          vk::Format::eA8B8G8R8SnormPack32, @@ -606,7 +606,7 @@ std::unordered_map<vk::Format, vk::FormatProperties> VKDevice::GetFormatProperti                                          vk::Format::eE5B9G9R9UfloatPack32};      std::unordered_map<vk::Format, vk::FormatProperties> format_properties;      for (const auto format : formats) { -        format_properties.emplace(format, physical.getFormatProperties(format, dldi)); +        format_properties.emplace(format, physical.getFormatProperties(format, dld));      }      return format_properties;  } diff --git a/src/video_core/renderer_vulkan/vk_device.h b/src/video_core/renderer_vulkan/vk_device.h index 6e656517f..d9d809852 100644 --- a/src/video_core/renderer_vulkan/vk_device.h +++ b/src/video_core/renderer_vulkan/vk_device.h @@ -22,12 +22,12 @@ const u32 GuestWarpSize = 32;  /// Handles data specific to a physical device.  class VKDevice final {  public: -    explicit VKDevice(const vk::DispatchLoaderDynamic& dldi, vk::PhysicalDevice physical, +    explicit VKDevice(const vk::DispatchLoaderDynamic& dld, vk::PhysicalDevice physical,                        vk::SurfaceKHR surface);      ~VKDevice();      /// Initializes the device. Returns true on success. -    bool Create(const vk::DispatchLoaderDynamic& dldi, vk::Instance instance); +    bool Create(vk::Instance instance);      /**       * Returns a format supported by the device for the passed requeriments. @@ -188,18 +188,18 @@ public:      }      /// Checks if the physical device is suitable. -    static bool IsSuitable(const vk::DispatchLoaderDynamic& dldi, vk::PhysicalDevice physical, -                           vk::SurfaceKHR surface); +    static bool IsSuitable(vk::PhysicalDevice physical, vk::SurfaceKHR surface, +                           const vk::DispatchLoaderDynamic& dld);  private:      /// Loads extensions into a vector and stores available ones in this object. -    std::vector<const char*> LoadExtensions(const vk::DispatchLoaderDynamic& dldi); +    std::vector<const char*> LoadExtensions();      /// Sets up queue families. -    void SetupFamilies(const vk::DispatchLoaderDynamic& dldi, vk::SurfaceKHR surface); +    void SetupFamilies(vk::SurfaceKHR surface);      /// Sets up device features. -    void SetupFeatures(const vk::DispatchLoaderDynamic& dldi); +    void SetupFeatures();      /// Collects telemetry information from the device.      void CollectTelemetryParameters(); @@ -208,8 +208,7 @@ private:      std::vector<vk::DeviceQueueCreateInfo> GetDeviceQueueCreateInfos() const;      /// Returns true if ASTC textures are natively supported. -    bool IsOptimalAstcSupported(const vk::PhysicalDeviceFeatures& features, -                                const vk::DispatchLoaderDynamic& dldi) const; +    bool IsOptimalAstcSupported(const vk::PhysicalDeviceFeatures& features) const;      /// Returns true if a format is supported.      bool IsFormatSupported(vk::Format wanted_format, vk::FormatFeatureFlags wanted_usage, @@ -217,10 +216,10 @@ private:      /// Returns the device properties for Vulkan formats.      static std::unordered_map<vk::Format, vk::FormatProperties> GetFormatProperties( -        const vk::DispatchLoaderDynamic& dldi, vk::PhysicalDevice physical); +        const vk::DispatchLoaderDynamic& dld, vk::PhysicalDevice physical); -    const vk::PhysicalDevice physical;        ///< Physical device.      vk::DispatchLoaderDynamic dld;            ///< Device function pointers. +    vk::PhysicalDevice physical;              ///< Physical device.      vk::PhysicalDeviceProperties properties;  ///< Device properties.      UniqueDevice logical;                     ///< Logical device.      vk::Queue graphics_queue;                 ///< Main graphics queue.  | 
