diff options
| author | 2020-06-22 04:10:45 -0300 | |
|---|---|---|
| committer | 2020-06-22 04:10:45 -0300 | |
| commit | 2f09c7ddd314f03da0fbafacfcae6b0a47a209ae (patch) | |
| tree | 72518a91005e5143e11f87e59a8345bb90e116fb | |
| parent | Merge pull request #4122 from lioncash/hide (diff) | |
| download | yuzu-2f09c7ddd314f03da0fbafacfcae6b0a47a209ae.tar.gz yuzu-2f09c7ddd314f03da0fbafacfcae6b0a47a209ae.tar.xz yuzu-2f09c7ddd314f03da0fbafacfcae6b0a47a209ae.zip | |
renderer_vulkan: Update validation layer name and test before enabling
Update validation layer string to VK_LAYER_KHRONOS_validation.
While we are at it, properly check for available validation layers
before enabling them.
Diffstat (limited to '')
| -rw-r--r-- | src/video_core/renderer_vulkan/renderer_vulkan.cpp | 28 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/wrapper.cpp | 16 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/wrapper.h | 4 |
3 files changed, 43 insertions, 5 deletions
diff --git a/src/video_core/renderer_vulkan/renderer_vulkan.cpp b/src/video_core/renderer_vulkan/renderer_vulkan.cpp index cd9673d1f..2d9b18ed9 100644 --- a/src/video_core/renderer_vulkan/renderer_vulkan.cpp +++ b/src/video_core/renderer_vulkan/renderer_vulkan.cpp | |||
| @@ -155,11 +155,31 @@ vk::Instance CreateInstance(Common::DynamicLibrary& library, vk::InstanceDispatc | |||
| 155 | } | 155 | } |
| 156 | } | 156 | } |
| 157 | 157 | ||
| 158 | static constexpr std::array layers_data{"VK_LAYER_LUNARG_standard_validation"}; | 158 | std::vector<const char*> layers; |
| 159 | vk::Span<const char*> layers = layers_data; | 159 | layers.reserve(1); |
| 160 | if (!enable_layers) { | 160 | if (enable_layers) { |
| 161 | layers = {}; | 161 | layers.push_back("VK_LAYER_KHRONOS_validation"); |
| 162 | } | ||
| 163 | |||
| 164 | const std::optional layer_properties = vk::EnumerateInstanceLayerProperties(dld); | ||
| 165 | if (!layer_properties) { | ||
| 166 | LOG_ERROR(Render_Vulkan, "Failed to query layer properties, disabling layers"); | ||
| 167 | layers.clear(); | ||
| 168 | } | ||
| 169 | |||
| 170 | for (auto layer_it = layers.begin(); layer_it != layers.end();) { | ||
| 171 | const char* const layer = *layer_it; | ||
| 172 | const auto it = std::find_if( | ||
| 173 | layer_properties->begin(), layer_properties->end(), | ||
| 174 | [layer](const VkLayerProperties& prop) { return !std::strcmp(layer, prop.layerName); }); | ||
| 175 | if (it == layer_properties->end()) { | ||
| 176 | LOG_ERROR(Render_Vulkan, "Layer {} not available, removing it", layer); | ||
| 177 | layer_it = layers.erase(layer_it); | ||
| 178 | } else { | ||
| 179 | ++layer_it; | ||
| 180 | } | ||
| 162 | } | 181 | } |
| 182 | |||
| 163 | vk::Instance instance = vk::Instance::Create(layers, extensions, dld); | 183 | vk::Instance instance = vk::Instance::Create(layers, extensions, dld); |
| 164 | if (!instance) { | 184 | if (!instance) { |
| 165 | LOG_ERROR(Render_Vulkan, "Failed to create Vulkan instance"); | 185 | LOG_ERROR(Render_Vulkan, "Failed to create Vulkan instance"); |
diff --git a/src/video_core/renderer_vulkan/wrapper.cpp b/src/video_core/renderer_vulkan/wrapper.cpp index 42eff85d3..0d485a662 100644 --- a/src/video_core/renderer_vulkan/wrapper.cpp +++ b/src/video_core/renderer_vulkan/wrapper.cpp | |||
| @@ -153,7 +153,8 @@ void Load(VkDevice device, DeviceDispatch& dld) noexcept { | |||
| 153 | 153 | ||
| 154 | bool Load(InstanceDispatch& dld) noexcept { | 154 | bool Load(InstanceDispatch& dld) noexcept { |
| 155 | #define X(name) Proc(dld.name, dld, #name) | 155 | #define X(name) Proc(dld.name, dld, #name) |
| 156 | return X(vkCreateInstance) && X(vkEnumerateInstanceExtensionProperties); | 156 | return X(vkCreateInstance) && X(vkEnumerateInstanceExtensionProperties) && |
| 157 | X(vkEnumerateInstanceLayerProperties); | ||
| 157 | #undef X | 158 | #undef X |
| 158 | } | 159 | } |
| 159 | 160 | ||
| @@ -770,4 +771,17 @@ std::optional<std::vector<VkExtensionProperties>> EnumerateInstanceExtensionProp | |||
| 770 | return properties; | 771 | return properties; |
| 771 | } | 772 | } |
| 772 | 773 | ||
| 774 | std::optional<std::vector<VkLayerProperties>> EnumerateInstanceLayerProperties( | ||
| 775 | const InstanceDispatch& dld) { | ||
| 776 | u32 num; | ||
| 777 | if (dld.vkEnumerateInstanceLayerProperties(&num, nullptr) != VK_SUCCESS) { | ||
| 778 | return std::nullopt; | ||
| 779 | } | ||
| 780 | std::vector<VkLayerProperties> properties(num); | ||
| 781 | if (dld.vkEnumerateInstanceLayerProperties(&num, properties.data()) != VK_SUCCESS) { | ||
| 782 | return std::nullopt; | ||
| 783 | } | ||
| 784 | return properties; | ||
| 785 | } | ||
| 786 | |||
| 773 | } // namespace Vulkan::vk | 787 | } // namespace Vulkan::vk |
diff --git a/src/video_core/renderer_vulkan/wrapper.h b/src/video_core/renderer_vulkan/wrapper.h index da42ca88e..d56fdb3f9 100644 --- a/src/video_core/renderer_vulkan/wrapper.h +++ b/src/video_core/renderer_vulkan/wrapper.h | |||
| @@ -141,6 +141,7 @@ struct InstanceDispatch { | |||
| 141 | PFN_vkCreateInstance vkCreateInstance; | 141 | PFN_vkCreateInstance vkCreateInstance; |
| 142 | PFN_vkDestroyInstance vkDestroyInstance; | 142 | PFN_vkDestroyInstance vkDestroyInstance; |
| 143 | PFN_vkEnumerateInstanceExtensionProperties vkEnumerateInstanceExtensionProperties; | 143 | PFN_vkEnumerateInstanceExtensionProperties vkEnumerateInstanceExtensionProperties; |
| 144 | PFN_vkEnumerateInstanceLayerProperties vkEnumerateInstanceLayerProperties; | ||
| 144 | 145 | ||
| 145 | PFN_vkCreateDebugUtilsMessengerEXT vkCreateDebugUtilsMessengerEXT; | 146 | PFN_vkCreateDebugUtilsMessengerEXT vkCreateDebugUtilsMessengerEXT; |
| 146 | PFN_vkCreateDevice vkCreateDevice; | 147 | PFN_vkCreateDevice vkCreateDevice; |
| @@ -996,4 +997,7 @@ private: | |||
| 996 | std::optional<std::vector<VkExtensionProperties>> EnumerateInstanceExtensionProperties( | 997 | std::optional<std::vector<VkExtensionProperties>> EnumerateInstanceExtensionProperties( |
| 997 | const InstanceDispatch& dld); | 998 | const InstanceDispatch& dld); |
| 998 | 999 | ||
| 1000 | std::optional<std::vector<VkLayerProperties>> EnumerateInstanceLayerProperties( | ||
| 1001 | const InstanceDispatch& dld); | ||
| 1002 | |||
| 999 | } // namespace Vulkan::vk | 1003 | } // namespace Vulkan::vk |