diff options
| author | 2020-06-29 02:34:17 -0300 | |
|---|---|---|
| committer | 2020-08-20 16:55:22 -0300 | |
| commit | 29a0ca23918092d252f440b2f55f68bb3c991366 (patch) | |
| tree | edda29a9afa40fa3167641a79ad324a073de4ad5 /src | |
| parent | Merge pull request #4546 from lioncash/telemetry (diff) | |
| download | yuzu-29a0ca23918092d252f440b2f55f68bb3c991366.tar.gz yuzu-29a0ca23918092d252f440b2f55f68bb3c991366.tar.xz yuzu-29a0ca23918092d252f440b2f55f68bb3c991366.zip | |
renderer_vulkan: Create a Vulkan 1.0 instance when 1.1 is not available
This commit doesn't make yuzu compatible with Vulkan 1.0 yet, it only
creates an 1.0 instance.
Diffstat (limited to '')
| -rw-r--r-- | src/video_core/renderer_vulkan/renderer_vulkan.cpp | 5 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/wrapper.cpp | 23 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/wrapper.h | 4 |
3 files changed, 26 insertions, 6 deletions
diff --git a/src/video_core/renderer_vulkan/renderer_vulkan.cpp b/src/video_core/renderer_vulkan/renderer_vulkan.cpp index 6e49699d0..6f9eadbeb 100644 --- a/src/video_core/renderer_vulkan/renderer_vulkan.cpp +++ b/src/video_core/renderer_vulkan/renderer_vulkan.cpp | |||
| @@ -180,7 +180,10 @@ vk::Instance CreateInstance(Common::DynamicLibrary& library, vk::InstanceDispatc | |||
| 180 | } | 180 | } |
| 181 | } | 181 | } |
| 182 | 182 | ||
| 183 | vk::Instance instance = vk::Instance::Create(layers, extensions, dld); | 183 | // Limit the maximum version of Vulkan to avoid using untested version. |
| 184 | const u32 version = std::min(vk::AvailableVersion(dld), static_cast<u32>(VK_API_VERSION_1_1)); | ||
| 185 | |||
| 186 | vk::Instance instance = vk::Instance::Create(version, layers, extensions, dld); | ||
| 184 | if (!instance) { | 187 | if (!instance) { |
| 185 | LOG_ERROR(Render_Vulkan, "Failed to create Vulkan instance"); | 188 | LOG_ERROR(Render_Vulkan, "Failed to create Vulkan instance"); |
| 186 | return {}; | 189 | return {}; |
diff --git a/src/video_core/renderer_vulkan/wrapper.cpp b/src/video_core/renderer_vulkan/wrapper.cpp index 013865aa4..56055af1b 100644 --- a/src/video_core/renderer_vulkan/wrapper.cpp +++ b/src/video_core/renderer_vulkan/wrapper.cpp | |||
| @@ -10,6 +10,7 @@ | |||
| 10 | #include <vector> | 10 | #include <vector> |
| 11 | 11 | ||
| 12 | #include "common/common_types.h" | 12 | #include "common/common_types.h" |
| 13 | #include "common/logging/log.h" | ||
| 13 | 14 | ||
| 14 | #include "video_core/renderer_vulkan/wrapper.h" | 15 | #include "video_core/renderer_vulkan/wrapper.h" |
| 15 | 16 | ||
| @@ -375,18 +376,17 @@ VkResult Free(VkDevice device, VkCommandPool handle, Span<VkCommandBuffer> buffe | |||
| 375 | return VK_SUCCESS; | 376 | return VK_SUCCESS; |
| 376 | } | 377 | } |
| 377 | 378 | ||
| 378 | Instance Instance::Create(Span<const char*> layers, Span<const char*> extensions, | 379 | Instance Instance::Create(u32 version, Span<const char*> layers, Span<const char*> extensions, |
| 379 | InstanceDispatch& dld) noexcept { | 380 | InstanceDispatch& dld) noexcept { |
| 380 | static constexpr VkApplicationInfo application_info{ | 381 | const VkApplicationInfo application_info{ |
| 381 | .sType = VK_STRUCTURE_TYPE_APPLICATION_INFO, | 382 | .sType = VK_STRUCTURE_TYPE_APPLICATION_INFO, |
| 382 | .pNext = nullptr, | 383 | .pNext = nullptr, |
| 383 | .pApplicationName = "yuzu Emulator", | 384 | .pApplicationName = "yuzu Emulator", |
| 384 | .applicationVersion = VK_MAKE_VERSION(0, 1, 0), | 385 | .applicationVersion = VK_MAKE_VERSION(0, 1, 0), |
| 385 | .pEngineName = "yuzu Emulator", | 386 | .pEngineName = "yuzu Emulator", |
| 386 | .engineVersion = VK_MAKE_VERSION(0, 1, 0), | 387 | .engineVersion = VK_MAKE_VERSION(0, 1, 0), |
| 387 | .apiVersion = VK_API_VERSION_1_1, | 388 | .apiVersion = version, |
| 388 | }; | 389 | }; |
| 389 | |||
| 390 | const VkInstanceCreateInfo ci{ | 390 | const VkInstanceCreateInfo ci{ |
| 391 | .sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO, | 391 | .sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO, |
| 392 | .pNext = nullptr, | 392 | .pNext = nullptr, |
| @@ -775,6 +775,21 @@ VkPhysicalDeviceMemoryProperties PhysicalDevice::GetMemoryProperties() const noe | |||
| 775 | return properties; | 775 | return properties; |
| 776 | } | 776 | } |
| 777 | 777 | ||
| 778 | u32 AvailableVersion(const InstanceDispatch& dld) noexcept { | ||
| 779 | PFN_vkEnumerateInstanceVersion vkEnumerateInstanceVersion; | ||
| 780 | if (!Proc(vkEnumerateInstanceVersion, dld, "vkEnumerateInstanceVersion")) { | ||
| 781 | // If the procedure is not found, Vulkan 1.0 is assumed | ||
| 782 | return VK_API_VERSION_1_0; | ||
| 783 | } | ||
| 784 | u32 version; | ||
| 785 | if (const VkResult result = vkEnumerateInstanceVersion(&version); result != VK_SUCCESS) { | ||
| 786 | LOG_ERROR(Render_Vulkan, "vkEnumerateInstanceVersion returned {}, assuming Vulkan 1.1", | ||
| 787 | ToString(result)); | ||
| 788 | return VK_API_VERSION_1_1; | ||
| 789 | } | ||
| 790 | return version; | ||
| 791 | } | ||
| 792 | |||
| 778 | std::optional<std::vector<VkExtensionProperties>> EnumerateInstanceExtensionProperties( | 793 | std::optional<std::vector<VkExtensionProperties>> EnumerateInstanceExtensionProperties( |
| 779 | const InstanceDispatch& dld) { | 794 | const InstanceDispatch& dld) { |
| 780 | u32 num; | 795 | u32 num; |
diff --git a/src/video_core/renderer_vulkan/wrapper.h b/src/video_core/renderer_vulkan/wrapper.h index b9d3fedc1..748a94d2f 100644 --- a/src/video_core/renderer_vulkan/wrapper.h +++ b/src/video_core/renderer_vulkan/wrapper.h | |||
| @@ -563,7 +563,7 @@ class Instance : public Handle<VkInstance, NoOwner, InstanceDispatch> { | |||
| 563 | 563 | ||
| 564 | public: | 564 | public: |
| 565 | /// Creates a Vulkan instance. Use "operator bool" for error handling. | 565 | /// Creates a Vulkan instance. Use "operator bool" for error handling. |
| 566 | static Instance Create(Span<const char*> layers, Span<const char*> extensions, | 566 | static Instance Create(u32 version, Span<const char*> layers, Span<const char*> extensions, |
| 567 | InstanceDispatch& dld) noexcept; | 567 | InstanceDispatch& dld) noexcept; |
| 568 | 568 | ||
| 569 | /// Enumerates physical devices. | 569 | /// Enumerates physical devices. |
| @@ -1048,6 +1048,8 @@ private: | |||
| 1048 | const DeviceDispatch* dld; | 1048 | const DeviceDispatch* dld; |
| 1049 | }; | 1049 | }; |
| 1050 | 1050 | ||
| 1051 | u32 AvailableVersion(const InstanceDispatch& dld) noexcept; | ||
| 1052 | |||
| 1051 | std::optional<std::vector<VkExtensionProperties>> EnumerateInstanceExtensionProperties( | 1053 | std::optional<std::vector<VkExtensionProperties>> EnumerateInstanceExtensionProperties( |
| 1052 | const InstanceDispatch& dld); | 1054 | const InstanceDispatch& dld); |
| 1053 | 1055 | ||