summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar ReinUsesLisp2020-06-29 02:34:17 -0300
committerGravatar ReinUsesLisp2020-08-20 16:55:22 -0300
commit29a0ca23918092d252f440b2f55f68bb3c991366 (patch)
treeedda29a9afa40fa3167641a79ad324a073de4ad5 /src
parentMerge pull request #4546 from lioncash/telemetry (diff)
downloadyuzu-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.cpp5
-rw-r--r--src/video_core/renderer_vulkan/wrapper.cpp23
-rw-r--r--src/video_core/renderer_vulkan/wrapper.h4
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
378Instance Instance::Create(Span<const char*> layers, Span<const char*> extensions, 379Instance 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
778u32 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
778std::optional<std::vector<VkExtensionProperties>> EnumerateInstanceExtensionProperties( 793std::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
564public: 564public:
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
1051u32 AvailableVersion(const InstanceDispatch& dld) noexcept;
1052
1051std::optional<std::vector<VkExtensionProperties>> EnumerateInstanceExtensionProperties( 1053std::optional<std::vector<VkExtensionProperties>> EnumerateInstanceExtensionProperties(
1052 const InstanceDispatch& dld); 1054 const InstanceDispatch& dld);
1053 1055