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.
This commit is contained in:
		
							parent
							
								
									3ea3de4ecd
								
							
						
					
					
						commit
						29a0ca2391
					
				@ -180,7 +180,10 @@ vk::Instance CreateInstance(Common::DynamicLibrary& library, vk::InstanceDispatc
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    vk::Instance instance = vk::Instance::Create(layers, extensions, dld);
 | 
					    // Limit the maximum version of Vulkan to avoid using untested version.
 | 
				
			||||||
 | 
					    const u32 version = std::min(vk::AvailableVersion(dld), static_cast<u32>(VK_API_VERSION_1_1));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    vk::Instance instance = vk::Instance::Create(version, layers, extensions, dld);
 | 
				
			||||||
    if (!instance) {
 | 
					    if (!instance) {
 | 
				
			||||||
        LOG_ERROR(Render_Vulkan, "Failed to create Vulkan instance");
 | 
					        LOG_ERROR(Render_Vulkan, "Failed to create Vulkan instance");
 | 
				
			||||||
        return {};
 | 
					        return {};
 | 
				
			||||||
 | 
				
			|||||||
@ -10,6 +10,7 @@
 | 
				
			|||||||
#include <vector>
 | 
					#include <vector>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "common/common_types.h"
 | 
					#include "common/common_types.h"
 | 
				
			||||||
 | 
					#include "common/logging/log.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "video_core/renderer_vulkan/wrapper.h"
 | 
					#include "video_core/renderer_vulkan/wrapper.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -375,18 +376,17 @@ VkResult Free(VkDevice device, VkCommandPool handle, Span<VkCommandBuffer> buffe
 | 
				
			|||||||
    return VK_SUCCESS;
 | 
					    return VK_SUCCESS;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Instance Instance::Create(Span<const char*> layers, Span<const char*> extensions,
 | 
					Instance Instance::Create(u32 version, Span<const char*> layers, Span<const char*> extensions,
 | 
				
			||||||
                          InstanceDispatch& dld) noexcept {
 | 
					                          InstanceDispatch& dld) noexcept {
 | 
				
			||||||
    static constexpr VkApplicationInfo application_info{
 | 
					    const VkApplicationInfo application_info{
 | 
				
			||||||
        .sType = VK_STRUCTURE_TYPE_APPLICATION_INFO,
 | 
					        .sType = VK_STRUCTURE_TYPE_APPLICATION_INFO,
 | 
				
			||||||
        .pNext = nullptr,
 | 
					        .pNext = nullptr,
 | 
				
			||||||
        .pApplicationName = "yuzu Emulator",
 | 
					        .pApplicationName = "yuzu Emulator",
 | 
				
			||||||
        .applicationVersion = VK_MAKE_VERSION(0, 1, 0),
 | 
					        .applicationVersion = VK_MAKE_VERSION(0, 1, 0),
 | 
				
			||||||
        .pEngineName = "yuzu Emulator",
 | 
					        .pEngineName = "yuzu Emulator",
 | 
				
			||||||
        .engineVersion = VK_MAKE_VERSION(0, 1, 0),
 | 
					        .engineVersion = VK_MAKE_VERSION(0, 1, 0),
 | 
				
			||||||
        .apiVersion = VK_API_VERSION_1_1,
 | 
					        .apiVersion = version,
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					 | 
				
			||||||
    const VkInstanceCreateInfo ci{
 | 
					    const VkInstanceCreateInfo ci{
 | 
				
			||||||
        .sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO,
 | 
					        .sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO,
 | 
				
			||||||
        .pNext = nullptr,
 | 
					        .pNext = nullptr,
 | 
				
			||||||
@ -775,6 +775,21 @@ VkPhysicalDeviceMemoryProperties PhysicalDevice::GetMemoryProperties() const noe
 | 
				
			|||||||
    return properties;
 | 
					    return properties;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					u32 AvailableVersion(const InstanceDispatch& dld) noexcept {
 | 
				
			||||||
 | 
					    PFN_vkEnumerateInstanceVersion vkEnumerateInstanceVersion;
 | 
				
			||||||
 | 
					    if (!Proc(vkEnumerateInstanceVersion, dld, "vkEnumerateInstanceVersion")) {
 | 
				
			||||||
 | 
					        // If the procedure is not found, Vulkan 1.0 is assumed
 | 
				
			||||||
 | 
					        return VK_API_VERSION_1_0;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    u32 version;
 | 
				
			||||||
 | 
					    if (const VkResult result = vkEnumerateInstanceVersion(&version); result != VK_SUCCESS) {
 | 
				
			||||||
 | 
					        LOG_ERROR(Render_Vulkan, "vkEnumerateInstanceVersion returned {}, assuming Vulkan 1.1",
 | 
				
			||||||
 | 
					                  ToString(result));
 | 
				
			||||||
 | 
					        return VK_API_VERSION_1_1;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return version;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
std::optional<std::vector<VkExtensionProperties>> EnumerateInstanceExtensionProperties(
 | 
					std::optional<std::vector<VkExtensionProperties>> EnumerateInstanceExtensionProperties(
 | 
				
			||||||
    const InstanceDispatch& dld) {
 | 
					    const InstanceDispatch& dld) {
 | 
				
			||||||
    u32 num;
 | 
					    u32 num;
 | 
				
			||||||
 | 
				
			|||||||
@ -563,7 +563,7 @@ class Instance : public Handle<VkInstance, NoOwner, InstanceDispatch> {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
public:
 | 
					public:
 | 
				
			||||||
    /// Creates a Vulkan instance. Use "operator bool" for error handling.
 | 
					    /// Creates a Vulkan instance. Use "operator bool" for error handling.
 | 
				
			||||||
    static Instance Create(Span<const char*> layers, Span<const char*> extensions,
 | 
					    static Instance Create(u32 version, Span<const char*> layers, Span<const char*> extensions,
 | 
				
			||||||
                           InstanceDispatch& dld) noexcept;
 | 
					                           InstanceDispatch& dld) noexcept;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /// Enumerates physical devices.
 | 
					    /// Enumerates physical devices.
 | 
				
			||||||
@ -1048,6 +1048,8 @@ private:
 | 
				
			|||||||
    const DeviceDispatch* dld;
 | 
					    const DeviceDispatch* dld;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					u32 AvailableVersion(const InstanceDispatch& dld) noexcept;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
std::optional<std::vector<VkExtensionProperties>> EnumerateInstanceExtensionProperties(
 | 
					std::optional<std::vector<VkExtensionProperties>> EnumerateInstanceExtensionProperties(
 | 
				
			||||||
    const InstanceDispatch& dld);
 | 
					    const InstanceDispatch& dld);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user