diff options
Diffstat (limited to '')
| -rw-r--r-- | src/video_core/renderer_vulkan/renderer_vulkan.cpp | 18 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/renderer_vulkan.h | 5 | ||||
| -rw-r--r-- | src/video_core/vulkan_common/vulkan_debug_callback.cpp | 40 | ||||
| -rw-r--r-- | src/video_core/vulkan_common/vulkan_debug_callback.h | 4 | ||||
| -rw-r--r-- | src/video_core/vulkan_common/vulkan_device.cpp | 2 | ||||
| -rw-r--r-- | src/video_core/vulkan_common/vulkan_instance.cpp | 58 | ||||
| -rw-r--r-- | src/video_core/vulkan_common/vulkan_wrapper.cpp | 14 | ||||
| -rw-r--r-- | src/video_core/vulkan_common/vulkan_wrapper.h | 9 |
8 files changed, 113 insertions, 37 deletions
diff --git a/src/video_core/renderer_vulkan/renderer_vulkan.cpp b/src/video_core/renderer_vulkan/renderer_vulkan.cpp index ddf28ca28..454bb66a4 100644 --- a/src/video_core/renderer_vulkan/renderer_vulkan.cpp +++ b/src/video_core/renderer_vulkan/renderer_vulkan.cpp | |||
| @@ -12,6 +12,7 @@ | |||
| 12 | #include <fmt/format.h> | 12 | #include <fmt/format.h> |
| 13 | 13 | ||
| 14 | #include "common/logging/log.h" | 14 | #include "common/logging/log.h" |
| 15 | #include "common/polyfill_ranges.h" | ||
| 15 | #include "common/scope_exit.h" | 16 | #include "common/scope_exit.h" |
| 16 | #include "common/settings.h" | 17 | #include "common/settings.h" |
| 17 | #include "common/telemetry.h" | 18 | #include "common/telemetry.h" |
| @@ -65,6 +66,21 @@ std::string BuildCommaSeparatedExtensions( | |||
| 65 | return fmt::format("{}", fmt::join(available_extensions, ",")); | 66 | return fmt::format("{}", fmt::join(available_extensions, ",")); |
| 66 | } | 67 | } |
| 67 | 68 | ||
| 69 | DebugCallback MakeDebugCallback(const vk::Instance& instance, const vk::InstanceDispatch& dld) { | ||
| 70 | if (!Settings::values.renderer_debug) { | ||
| 71 | return DebugCallback{}; | ||
| 72 | } | ||
| 73 | const std::optional properties = vk::EnumerateInstanceExtensionProperties(dld); | ||
| 74 | const auto it = std::ranges::find_if(*properties, [](const auto& prop) { | ||
| 75 | return std::strcmp(VK_EXT_DEBUG_UTILS_EXTENSION_NAME, prop.extensionName) == 0; | ||
| 76 | }); | ||
| 77 | if (it != properties->end()) { | ||
| 78 | return CreateDebugUtilsCallback(instance); | ||
| 79 | } else { | ||
| 80 | return CreateDebugReportCallback(instance); | ||
| 81 | } | ||
| 82 | } | ||
| 83 | |||
| 68 | } // Anonymous namespace | 84 | } // Anonymous namespace |
| 69 | 85 | ||
| 70 | Device CreateDevice(const vk::Instance& instance, const vk::InstanceDispatch& dld, | 86 | Device CreateDevice(const vk::Instance& instance, const vk::InstanceDispatch& dld, |
| @@ -87,7 +103,7 @@ RendererVulkan::RendererVulkan(Core::TelemetrySession& telemetry_session_, | |||
| 87 | cpu_memory(cpu_memory_), gpu(gpu_), library(OpenLibrary(context.get())), | 103 | cpu_memory(cpu_memory_), gpu(gpu_), library(OpenLibrary(context.get())), |
| 88 | instance(CreateInstance(*library, dld, VK_API_VERSION_1_1, render_window.GetWindowInfo().type, | 104 | instance(CreateInstance(*library, dld, VK_API_VERSION_1_1, render_window.GetWindowInfo().type, |
| 89 | Settings::values.renderer_debug.GetValue())), | 105 | Settings::values.renderer_debug.GetValue())), |
| 90 | debug_callback(Settings::values.renderer_debug ? CreateDebugCallback(instance) : nullptr), | 106 | debug_callback(MakeDebugCallback(instance, dld)), |
| 91 | surface(CreateSurface(instance, render_window.GetWindowInfo())), | 107 | surface(CreateSurface(instance, render_window.GetWindowInfo())), |
| 92 | device(CreateDevice(instance, dld, *surface)), memory_allocator(device), state_tracker(), | 108 | device(CreateDevice(instance, dld, *surface)), memory_allocator(device), state_tracker(), |
| 93 | scheduler(device, state_tracker), | 109 | scheduler(device, state_tracker), |
diff --git a/src/video_core/renderer_vulkan/renderer_vulkan.h b/src/video_core/renderer_vulkan/renderer_vulkan.h index b2e8cbd1b..ca22c0baa 100644 --- a/src/video_core/renderer_vulkan/renderer_vulkan.h +++ b/src/video_core/renderer_vulkan/renderer_vulkan.h | |||
| @@ -5,6 +5,7 @@ | |||
| 5 | 5 | ||
| 6 | #include <memory> | 6 | #include <memory> |
| 7 | #include <string> | 7 | #include <string> |
| 8 | #include <variant> | ||
| 8 | 9 | ||
| 9 | #include "common/dynamic_library.h" | 10 | #include "common/dynamic_library.h" |
| 10 | #include "video_core/renderer_base.h" | 11 | #include "video_core/renderer_base.h" |
| @@ -33,6 +34,8 @@ class GPU; | |||
| 33 | 34 | ||
| 34 | namespace Vulkan { | 35 | namespace Vulkan { |
| 35 | 36 | ||
| 37 | using DebugCallback = std::variant<vk::DebugUtilsMessenger, vk::DebugReportCallback>; | ||
| 38 | |||
| 36 | Device CreateDevice(const vk::Instance& instance, const vk::InstanceDispatch& dld, | 39 | Device CreateDevice(const vk::Instance& instance, const vk::InstanceDispatch& dld, |
| 37 | VkSurfaceKHR surface); | 40 | VkSurfaceKHR surface); |
| 38 | 41 | ||
| @@ -71,7 +74,7 @@ private: | |||
| 71 | vk::InstanceDispatch dld; | 74 | vk::InstanceDispatch dld; |
| 72 | 75 | ||
| 73 | vk::Instance instance; | 76 | vk::Instance instance; |
| 74 | vk::DebugUtilsMessenger debug_callback; | 77 | DebugCallback debug_callback; |
| 75 | vk::SurfaceKHR surface; | 78 | vk::SurfaceKHR surface; |
| 76 | 79 | ||
| 77 | ScreenInfo screen_info; | 80 | ScreenInfo screen_info; |
diff --git a/src/video_core/vulkan_common/vulkan_debug_callback.cpp b/src/video_core/vulkan_common/vulkan_debug_callback.cpp index 9de484c29..67e8065a4 100644 --- a/src/video_core/vulkan_common/vulkan_debug_callback.cpp +++ b/src/video_core/vulkan_common/vulkan_debug_callback.cpp | |||
| @@ -7,10 +7,10 @@ | |||
| 7 | 7 | ||
| 8 | namespace Vulkan { | 8 | namespace Vulkan { |
| 9 | namespace { | 9 | namespace { |
| 10 | VkBool32 Callback(VkDebugUtilsMessageSeverityFlagBitsEXT severity, | 10 | VkBool32 DebugUtilCallback(VkDebugUtilsMessageSeverityFlagBitsEXT severity, |
| 11 | VkDebugUtilsMessageTypeFlagsEXT type, | 11 | VkDebugUtilsMessageTypeFlagsEXT type, |
| 12 | const VkDebugUtilsMessengerCallbackDataEXT* data, | 12 | const VkDebugUtilsMessengerCallbackDataEXT* data, |
| 13 | [[maybe_unused]] void* user_data) { | 13 | [[maybe_unused]] void* user_data) { |
| 14 | // Skip logging known false-positive validation errors | 14 | // Skip logging known false-positive validation errors |
| 15 | switch (static_cast<u32>(data->messageIdNumber)) { | 15 | switch (static_cast<u32>(data->messageIdNumber)) { |
| 16 | #ifdef ANDROID | 16 | #ifdef ANDROID |
| @@ -62,9 +62,26 @@ VkBool32 Callback(VkDebugUtilsMessageSeverityFlagBitsEXT severity, | |||
| 62 | } | 62 | } |
| 63 | return VK_FALSE; | 63 | return VK_FALSE; |
| 64 | } | 64 | } |
| 65 | |||
| 66 | VkBool32 DebugReportCallback(VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objectType, | ||
| 67 | uint64_t object, size_t location, int32_t messageCode, | ||
| 68 | const char* pLayerPrefix, const char* pMessage, void* pUserData) { | ||
| 69 | const VkDebugReportFlagBitsEXT severity = static_cast<VkDebugReportFlagBitsEXT>(flags); | ||
| 70 | const std::string_view message{pMessage}; | ||
| 71 | if (severity & VK_DEBUG_REPORT_ERROR_BIT_EXT) { | ||
| 72 | LOG_CRITICAL(Render_Vulkan, "{}", message); | ||
| 73 | } else if (severity & VK_DEBUG_REPORT_WARNING_BIT_EXT) { | ||
| 74 | LOG_WARNING(Render_Vulkan, "{}", message); | ||
| 75 | } else if (severity & VK_DEBUG_REPORT_INFORMATION_BIT_EXT) { | ||
| 76 | LOG_INFO(Render_Vulkan, "{}", message); | ||
| 77 | } else if (severity & VK_DEBUG_REPORT_DEBUG_BIT_EXT) { | ||
| 78 | LOG_DEBUG(Render_Vulkan, "{}", message); | ||
| 79 | } | ||
| 80 | return VK_FALSE; | ||
| 81 | } | ||
| 65 | } // Anonymous namespace | 82 | } // Anonymous namespace |
| 66 | 83 | ||
| 67 | vk::DebugUtilsMessenger CreateDebugCallback(const vk::Instance& instance) { | 84 | vk::DebugUtilsMessenger CreateDebugUtilsCallback(const vk::Instance& instance) { |
| 68 | return instance.CreateDebugUtilsMessenger(VkDebugUtilsMessengerCreateInfoEXT{ | 85 | return instance.CreateDebugUtilsMessenger(VkDebugUtilsMessengerCreateInfoEXT{ |
| 69 | .sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT, | 86 | .sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT, |
| 70 | .pNext = nullptr, | 87 | .pNext = nullptr, |
| @@ -76,7 +93,18 @@ vk::DebugUtilsMessenger CreateDebugCallback(const vk::Instance& instance) { | |||
| 76 | .messageType = VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT | | 93 | .messageType = VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT | |
| 77 | VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT | | 94 | VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT | |
| 78 | VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT, | 95 | VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT, |
| 79 | .pfnUserCallback = Callback, | 96 | .pfnUserCallback = DebugUtilCallback, |
| 97 | .pUserData = nullptr, | ||
| 98 | }); | ||
| 99 | } | ||
| 100 | |||
| 101 | vk::DebugReportCallback CreateDebugReportCallback(const vk::Instance& instance) { | ||
| 102 | return instance.CreateDebugReportCallback({ | ||
| 103 | .sType = VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT, | ||
| 104 | .pNext = nullptr, | ||
| 105 | .flags = VK_DEBUG_REPORT_DEBUG_BIT_EXT | VK_DEBUG_REPORT_INFORMATION_BIT_EXT | | ||
| 106 | VK_DEBUG_REPORT_ERROR_BIT_EXT | VK_DEBUG_REPORT_WARNING_BIT_EXT, | ||
| 107 | .pfnCallback = DebugReportCallback, | ||
| 80 | .pUserData = nullptr, | 108 | .pUserData = nullptr, |
| 81 | }); | 109 | }); |
| 82 | } | 110 | } |
diff --git a/src/video_core/vulkan_common/vulkan_debug_callback.h b/src/video_core/vulkan_common/vulkan_debug_callback.h index 71b1f69ec..a8af7b406 100644 --- a/src/video_core/vulkan_common/vulkan_debug_callback.h +++ b/src/video_core/vulkan_common/vulkan_debug_callback.h | |||
| @@ -7,6 +7,8 @@ | |||
| 7 | 7 | ||
| 8 | namespace Vulkan { | 8 | namespace Vulkan { |
| 9 | 9 | ||
| 10 | vk::DebugUtilsMessenger CreateDebugCallback(const vk::Instance& instance); | 10 | vk::DebugUtilsMessenger CreateDebugUtilsCallback(const vk::Instance& instance); |
| 11 | |||
| 12 | vk::DebugReportCallback CreateDebugReportCallback(const vk::Instance& instance); | ||
| 11 | 13 | ||
| 12 | } // namespace Vulkan | 14 | } // namespace Vulkan |
diff --git a/src/video_core/vulkan_common/vulkan_device.cpp b/src/video_core/vulkan_common/vulkan_device.cpp index e4ca65b58..9743a82f5 100644 --- a/src/video_core/vulkan_common/vulkan_device.cpp +++ b/src/video_core/vulkan_common/vulkan_device.cpp | |||
| @@ -349,7 +349,7 @@ Device::Device(VkInstance instance_, vk::PhysicalDevice physical_, VkSurfaceKHR | |||
| 349 | const bool is_s8gen2 = device_id == 0x43050a01; | 349 | const bool is_s8gen2 = device_id == 0x43050a01; |
| 350 | const bool is_arm = driver_id == VK_DRIVER_ID_ARM_PROPRIETARY; | 350 | const bool is_arm = driver_id == VK_DRIVER_ID_ARM_PROPRIETARY; |
| 351 | 351 | ||
| 352 | if ((is_mvk || is_qualcomm || is_turnip) && !is_suitable) { | 352 | if ((is_mvk || is_qualcomm || is_turnip || is_arm) && !is_suitable) { |
| 353 | LOG_WARNING(Render_Vulkan, "Unsuitable driver, continuing anyway"); | 353 | LOG_WARNING(Render_Vulkan, "Unsuitable driver, continuing anyway"); |
| 354 | } else if (!is_suitable) { | 354 | } else if (!is_suitable) { |
| 355 | throw vk::Exception(VK_ERROR_INCOMPATIBLE_DRIVER); | 355 | throw vk::Exception(VK_ERROR_INCOMPATIBLE_DRIVER); |
diff --git a/src/video_core/vulkan_common/vulkan_instance.cpp b/src/video_core/vulkan_common/vulkan_instance.cpp index b6d83e446..7624a9b32 100644 --- a/src/video_core/vulkan_common/vulkan_instance.cpp +++ b/src/video_core/vulkan_common/vulkan_instance.cpp | |||
| @@ -31,10 +31,34 @@ | |||
| 31 | 31 | ||
| 32 | namespace Vulkan { | 32 | namespace Vulkan { |
| 33 | namespace { | 33 | namespace { |
| 34 | |||
| 35 | [[nodiscard]] bool AreExtensionsSupported(const vk::InstanceDispatch& dld, | ||
| 36 | std::span<const char* const> extensions) { | ||
| 37 | const std::optional properties = vk::EnumerateInstanceExtensionProperties(dld); | ||
| 38 | if (!properties) { | ||
| 39 | LOG_ERROR(Render_Vulkan, "Failed to query extension properties"); | ||
| 40 | return false; | ||
| 41 | } | ||
| 42 | for (const char* extension : extensions) { | ||
| 43 | const auto it = std::ranges::find_if(*properties, [extension](const auto& prop) { | ||
| 44 | return std::strcmp(extension, prop.extensionName) == 0; | ||
| 45 | }); | ||
| 46 | if (it == properties->end()) { | ||
| 47 | LOG_ERROR(Render_Vulkan, "Required instance extension {} is not available", extension); | ||
| 48 | return false; | ||
| 49 | } | ||
| 50 | } | ||
| 51 | return true; | ||
| 52 | } | ||
| 53 | |||
| 34 | [[nodiscard]] std::vector<const char*> RequiredExtensions( | 54 | [[nodiscard]] std::vector<const char*> RequiredExtensions( |
| 35 | Core::Frontend::WindowSystemType window_type, bool enable_validation) { | 55 | const vk::InstanceDispatch& dld, Core::Frontend::WindowSystemType window_type, |
| 56 | bool enable_validation) { | ||
| 36 | std::vector<const char*> extensions; | 57 | std::vector<const char*> extensions; |
| 37 | extensions.reserve(6); | 58 | extensions.reserve(6); |
| 59 | #ifdef __APPLE__ | ||
| 60 | extensions.push_back(VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME); | ||
| 61 | #endif | ||
| 38 | switch (window_type) { | 62 | switch (window_type) { |
| 39 | case Core::Frontend::WindowSystemType::Headless: | 63 | case Core::Frontend::WindowSystemType::Headless: |
| 40 | break; | 64 | break; |
| @@ -66,35 +90,14 @@ namespace { | |||
| 66 | extensions.push_back(VK_KHR_SURFACE_EXTENSION_NAME); | 90 | extensions.push_back(VK_KHR_SURFACE_EXTENSION_NAME); |
| 67 | } | 91 | } |
| 68 | if (enable_validation) { | 92 | if (enable_validation) { |
| 69 | extensions.push_back(VK_EXT_DEBUG_UTILS_EXTENSION_NAME); | 93 | const bool debug_utils = |
| 94 | AreExtensionsSupported(dld, std::array{VK_EXT_DEBUG_UTILS_EXTENSION_NAME}); | ||
| 95 | extensions.push_back(debug_utils ? VK_EXT_DEBUG_UTILS_EXTENSION_NAME | ||
| 96 | : VK_EXT_DEBUG_REPORT_EXTENSION_NAME); | ||
| 70 | } | 97 | } |
| 71 | extensions.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME); | ||
| 72 | |||
| 73 | #ifdef __APPLE__ | ||
| 74 | extensions.push_back(VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME); | ||
| 75 | #endif | ||
| 76 | return extensions; | 98 | return extensions; |
| 77 | } | 99 | } |
| 78 | 100 | ||
| 79 | [[nodiscard]] bool AreExtensionsSupported(const vk::InstanceDispatch& dld, | ||
| 80 | std::span<const char* const> extensions) { | ||
| 81 | const std::optional properties = vk::EnumerateInstanceExtensionProperties(dld); | ||
| 82 | if (!properties) { | ||
| 83 | LOG_ERROR(Render_Vulkan, "Failed to query extension properties"); | ||
| 84 | return false; | ||
| 85 | } | ||
| 86 | for (const char* extension : extensions) { | ||
| 87 | const auto it = std::ranges::find_if(*properties, [extension](const auto& prop) { | ||
| 88 | return std::strcmp(extension, prop.extensionName) == 0; | ||
| 89 | }); | ||
| 90 | if (it == properties->end()) { | ||
| 91 | LOG_ERROR(Render_Vulkan, "Required instance extension {} is not available", extension); | ||
| 92 | return false; | ||
| 93 | } | ||
| 94 | } | ||
| 95 | return true; | ||
| 96 | } | ||
| 97 | |||
| 98 | [[nodiscard]] std::vector<const char*> Layers(bool enable_validation) { | 101 | [[nodiscard]] std::vector<const char*> Layers(bool enable_validation) { |
| 99 | std::vector<const char*> layers; | 102 | std::vector<const char*> layers; |
| 100 | if (enable_validation) { | 103 | if (enable_validation) { |
| @@ -138,7 +141,8 @@ vk::Instance CreateInstance(const Common::DynamicLibrary& library, vk::InstanceD | |||
| 138 | LOG_ERROR(Render_Vulkan, "Failed to load Vulkan function pointers"); | 141 | LOG_ERROR(Render_Vulkan, "Failed to load Vulkan function pointers"); |
| 139 | throw vk::Exception(VK_ERROR_INITIALIZATION_FAILED); | 142 | throw vk::Exception(VK_ERROR_INITIALIZATION_FAILED); |
| 140 | } | 143 | } |
| 141 | const std::vector<const char*> extensions = RequiredExtensions(window_type, enable_validation); | 144 | const std::vector<const char*> extensions = |
| 145 | RequiredExtensions(dld, window_type, enable_validation); | ||
| 142 | if (!AreExtensionsSupported(dld, extensions)) { | 146 | if (!AreExtensionsSupported(dld, extensions)) { |
| 143 | throw vk::Exception(VK_ERROR_EXTENSION_NOT_PRESENT); | 147 | throw vk::Exception(VK_ERROR_EXTENSION_NOT_PRESENT); |
| 144 | } | 148 | } |
diff --git a/src/video_core/vulkan_common/vulkan_wrapper.cpp b/src/video_core/vulkan_common/vulkan_wrapper.cpp index 28fcb21a0..2fa29793a 100644 --- a/src/video_core/vulkan_common/vulkan_wrapper.cpp +++ b/src/video_core/vulkan_common/vulkan_wrapper.cpp | |||
| @@ -259,7 +259,9 @@ bool Load(VkInstance instance, InstanceDispatch& dld) noexcept { | |||
| 259 | // These functions may fail to load depending on the enabled extensions. | 259 | // These functions may fail to load depending on the enabled extensions. |
| 260 | // Don't return a failure on these. | 260 | // Don't return a failure on these. |
| 261 | X(vkCreateDebugUtilsMessengerEXT); | 261 | X(vkCreateDebugUtilsMessengerEXT); |
| 262 | X(vkCreateDebugReportCallbackEXT); | ||
| 262 | X(vkDestroyDebugUtilsMessengerEXT); | 263 | X(vkDestroyDebugUtilsMessengerEXT); |
| 264 | X(vkDestroyDebugReportCallbackEXT); | ||
| 263 | X(vkDestroySurfaceKHR); | 265 | X(vkDestroySurfaceKHR); |
| 264 | X(vkGetPhysicalDeviceFeatures2); | 266 | X(vkGetPhysicalDeviceFeatures2); |
| 265 | X(vkGetPhysicalDeviceProperties2); | 267 | X(vkGetPhysicalDeviceProperties2); |
| @@ -481,6 +483,11 @@ void Destroy(VkInstance instance, VkDebugUtilsMessengerEXT handle, | |||
| 481 | dld.vkDestroyDebugUtilsMessengerEXT(instance, handle, nullptr); | 483 | dld.vkDestroyDebugUtilsMessengerEXT(instance, handle, nullptr); |
| 482 | } | 484 | } |
| 483 | 485 | ||
| 486 | void Destroy(VkInstance instance, VkDebugReportCallbackEXT handle, | ||
| 487 | const InstanceDispatch& dld) noexcept { | ||
| 488 | dld.vkDestroyDebugReportCallbackEXT(instance, handle, nullptr); | ||
| 489 | } | ||
| 490 | |||
| 484 | void Destroy(VkInstance instance, VkSurfaceKHR handle, const InstanceDispatch& dld) noexcept { | 491 | void Destroy(VkInstance instance, VkSurfaceKHR handle, const InstanceDispatch& dld) noexcept { |
| 485 | dld.vkDestroySurfaceKHR(instance, handle, nullptr); | 492 | dld.vkDestroySurfaceKHR(instance, handle, nullptr); |
| 486 | } | 493 | } |
| @@ -549,6 +556,13 @@ DebugUtilsMessenger Instance::CreateDebugUtilsMessenger( | |||
| 549 | return DebugUtilsMessenger(object, handle, *dld); | 556 | return DebugUtilsMessenger(object, handle, *dld); |
| 550 | } | 557 | } |
| 551 | 558 | ||
| 559 | DebugReportCallback Instance::CreateDebugReportCallback( | ||
| 560 | const VkDebugReportCallbackCreateInfoEXT& create_info) const { | ||
| 561 | VkDebugReportCallbackEXT object; | ||
| 562 | Check(dld->vkCreateDebugReportCallbackEXT(handle, &create_info, nullptr, &object)); | ||
| 563 | return DebugReportCallback(object, handle, *dld); | ||
| 564 | } | ||
| 565 | |||
| 552 | void Image::SetObjectNameEXT(const char* name) const { | 566 | void Image::SetObjectNameEXT(const char* name) const { |
| 553 | SetObjectName(dld, owner, handle, VK_OBJECT_TYPE_IMAGE, name); | 567 | SetObjectName(dld, owner, handle, VK_OBJECT_TYPE_IMAGE, name); |
| 554 | } | 568 | } |
diff --git a/src/video_core/vulkan_common/vulkan_wrapper.h b/src/video_core/vulkan_common/vulkan_wrapper.h index 44fce47a5..b5e70fcd4 100644 --- a/src/video_core/vulkan_common/vulkan_wrapper.h +++ b/src/video_core/vulkan_common/vulkan_wrapper.h | |||
| @@ -164,8 +164,10 @@ struct InstanceDispatch { | |||
| 164 | PFN_vkEnumerateInstanceLayerProperties vkEnumerateInstanceLayerProperties{}; | 164 | PFN_vkEnumerateInstanceLayerProperties vkEnumerateInstanceLayerProperties{}; |
| 165 | 165 | ||
| 166 | PFN_vkCreateDebugUtilsMessengerEXT vkCreateDebugUtilsMessengerEXT{}; | 166 | PFN_vkCreateDebugUtilsMessengerEXT vkCreateDebugUtilsMessengerEXT{}; |
| 167 | PFN_vkCreateDebugReportCallbackEXT vkCreateDebugReportCallbackEXT{}; | ||
| 167 | PFN_vkCreateDevice vkCreateDevice{}; | 168 | PFN_vkCreateDevice vkCreateDevice{}; |
| 168 | PFN_vkDestroyDebugUtilsMessengerEXT vkDestroyDebugUtilsMessengerEXT{}; | 169 | PFN_vkDestroyDebugUtilsMessengerEXT vkDestroyDebugUtilsMessengerEXT{}; |
| 170 | PFN_vkDestroyDebugReportCallbackEXT vkDestroyDebugReportCallbackEXT{}; | ||
| 169 | PFN_vkDestroyDevice vkDestroyDevice{}; | 171 | PFN_vkDestroyDevice vkDestroyDevice{}; |
| 170 | PFN_vkDestroySurfaceKHR vkDestroySurfaceKHR{}; | 172 | PFN_vkDestroySurfaceKHR vkDestroySurfaceKHR{}; |
| 171 | PFN_vkEnumerateDeviceExtensionProperties vkEnumerateDeviceExtensionProperties{}; | 173 | PFN_vkEnumerateDeviceExtensionProperties vkEnumerateDeviceExtensionProperties{}; |
| @@ -366,6 +368,7 @@ void Destroy(VkDevice, VkSwapchainKHR, const DeviceDispatch&) noexcept; | |||
| 366 | void Destroy(VkDevice, VkSemaphore, const DeviceDispatch&) noexcept; | 368 | void Destroy(VkDevice, VkSemaphore, const DeviceDispatch&) noexcept; |
| 367 | void Destroy(VkDevice, VkShaderModule, const DeviceDispatch&) noexcept; | 369 | void Destroy(VkDevice, VkShaderModule, const DeviceDispatch&) noexcept; |
| 368 | void Destroy(VkInstance, VkDebugUtilsMessengerEXT, const InstanceDispatch&) noexcept; | 370 | void Destroy(VkInstance, VkDebugUtilsMessengerEXT, const InstanceDispatch&) noexcept; |
| 371 | void Destroy(VkInstance, VkDebugReportCallbackEXT, const InstanceDispatch&) noexcept; | ||
| 369 | void Destroy(VkInstance, VkSurfaceKHR, const InstanceDispatch&) noexcept; | 372 | void Destroy(VkInstance, VkSurfaceKHR, const InstanceDispatch&) noexcept; |
| 370 | 373 | ||
| 371 | VkResult Free(VkDevice, VkDescriptorPool, Span<VkDescriptorSet>, const DeviceDispatch&) noexcept; | 374 | VkResult Free(VkDevice, VkDescriptorPool, Span<VkDescriptorSet>, const DeviceDispatch&) noexcept; |
| @@ -581,6 +584,7 @@ private: | |||
| 581 | }; | 584 | }; |
| 582 | 585 | ||
| 583 | using DebugUtilsMessenger = Handle<VkDebugUtilsMessengerEXT, VkInstance, InstanceDispatch>; | 586 | using DebugUtilsMessenger = Handle<VkDebugUtilsMessengerEXT, VkInstance, InstanceDispatch>; |
| 587 | using DebugReportCallback = Handle<VkDebugReportCallbackEXT, VkInstance, InstanceDispatch>; | ||
| 584 | using DescriptorSetLayout = Handle<VkDescriptorSetLayout, VkDevice, DeviceDispatch>; | 588 | using DescriptorSetLayout = Handle<VkDescriptorSetLayout, VkDevice, DeviceDispatch>; |
| 585 | using DescriptorUpdateTemplate = Handle<VkDescriptorUpdateTemplate, VkDevice, DeviceDispatch>; | 589 | using DescriptorUpdateTemplate = Handle<VkDescriptorUpdateTemplate, VkDevice, DeviceDispatch>; |
| 586 | using Pipeline = Handle<VkPipeline, VkDevice, DeviceDispatch>; | 590 | using Pipeline = Handle<VkPipeline, VkDevice, DeviceDispatch>; |
| @@ -613,6 +617,11 @@ public: | |||
| 613 | DebugUtilsMessenger CreateDebugUtilsMessenger( | 617 | DebugUtilsMessenger CreateDebugUtilsMessenger( |
| 614 | const VkDebugUtilsMessengerCreateInfoEXT& create_info) const; | 618 | const VkDebugUtilsMessengerCreateInfoEXT& create_info) const; |
| 615 | 619 | ||
| 620 | /// Creates a debug report callback. | ||
| 621 | /// @throw Exception on creation failure. | ||
| 622 | DebugReportCallback CreateDebugReportCallback( | ||
| 623 | const VkDebugReportCallbackCreateInfoEXT& create_info) const; | ||
| 624 | |||
| 616 | /// Returns dispatch table. | 625 | /// Returns dispatch table. |
| 617 | const InstanceDispatch& Dispatch() const noexcept { | 626 | const InstanceDispatch& Dispatch() const noexcept { |
| 618 | return *dld; | 627 | return *dld; |