mirror of
				https://git.zaroz.cloud/nintendo-back-up/yuzu/yuzu-mainline.git
				synced 2025-03-21 01:53:15 +00:00 
			
		
		
		
	renderer_vulkan/wrapper: Add instance handle
This commit is contained in:
		
							parent
							
								
									69728e8ad5
								
							
						
					
					
						commit
						151ddcf419
					
				@ -339,4 +339,74 @@ 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,
 | 
				
			||||||
 | 
					                          InstanceDispatch& dld) noexcept {
 | 
				
			||||||
 | 
					    VkApplicationInfo application_info;
 | 
				
			||||||
 | 
					    application_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
 | 
				
			||||||
 | 
					    application_info.pNext = nullptr;
 | 
				
			||||||
 | 
					    application_info.pApplicationName = "yuzu Emulator";
 | 
				
			||||||
 | 
					    application_info.applicationVersion = VK_MAKE_VERSION(0, 1, 0);
 | 
				
			||||||
 | 
					    application_info.pEngineName = "yuzu Emulator";
 | 
				
			||||||
 | 
					    application_info.engineVersion = VK_MAKE_VERSION(0, 1, 0);
 | 
				
			||||||
 | 
					    application_info.apiVersion = VK_API_VERSION_1_1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    VkInstanceCreateInfo ci;
 | 
				
			||||||
 | 
					    ci.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
 | 
				
			||||||
 | 
					    ci.pNext = nullptr;
 | 
				
			||||||
 | 
					    ci.flags = 0;
 | 
				
			||||||
 | 
					    ci.pApplicationInfo = &application_info;
 | 
				
			||||||
 | 
					    ci.enabledLayerCount = layers.size();
 | 
				
			||||||
 | 
					    ci.ppEnabledLayerNames = layers.data();
 | 
				
			||||||
 | 
					    ci.enabledExtensionCount = extensions.size();
 | 
				
			||||||
 | 
					    ci.ppEnabledExtensionNames = extensions.data();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    VkInstance instance;
 | 
				
			||||||
 | 
					    if (dld.vkCreateInstance(&ci, nullptr, &instance) != VK_SUCCESS) {
 | 
				
			||||||
 | 
					        // Failed to create the instance.
 | 
				
			||||||
 | 
					        return {};
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (!Proc(dld.vkDestroyInstance, dld, "vkDestroyInstance", instance)) {
 | 
				
			||||||
 | 
					        // We successfully created an instance but the destroy function couldn't be loaded.
 | 
				
			||||||
 | 
					        // This is a good moment to panic.
 | 
				
			||||||
 | 
					        return {};
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return Instance(instance, dld);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					std::optional<std::vector<VkPhysicalDevice>> Instance::EnumeratePhysicalDevices() {
 | 
				
			||||||
 | 
					    u32 num;
 | 
				
			||||||
 | 
					    if (dld->vkEnumeratePhysicalDevices(handle, &num, nullptr) != VK_SUCCESS) {
 | 
				
			||||||
 | 
					        return std::nullopt;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    std::vector<VkPhysicalDevice> physical_devices(num);
 | 
				
			||||||
 | 
					    if (dld->vkEnumeratePhysicalDevices(handle, &num, physical_devices.data()) != VK_SUCCESS) {
 | 
				
			||||||
 | 
					        return std::nullopt;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return physical_devices;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DebugCallback Instance::TryCreateDebugCallback(
 | 
				
			||||||
 | 
					    PFN_vkDebugUtilsMessengerCallbackEXT callback) noexcept {
 | 
				
			||||||
 | 
					    VkDebugUtilsMessengerCreateInfoEXT ci;
 | 
				
			||||||
 | 
					    ci.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT;
 | 
				
			||||||
 | 
					    ci.pNext = nullptr;
 | 
				
			||||||
 | 
					    ci.flags = 0;
 | 
				
			||||||
 | 
					    ci.messageSeverity = VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT |
 | 
				
			||||||
 | 
					                         VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT |
 | 
				
			||||||
 | 
					                         VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT |
 | 
				
			||||||
 | 
					                         VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT;
 | 
				
			||||||
 | 
					    ci.messageType = VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT |
 | 
				
			||||||
 | 
					                     VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT |
 | 
				
			||||||
 | 
					                     VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT;
 | 
				
			||||||
 | 
					    ci.pfnUserCallback = callback;
 | 
				
			||||||
 | 
					    ci.pUserData = nullptr;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    VkDebugUtilsMessengerEXT messenger;
 | 
				
			||||||
 | 
					    if (dld->vkCreateDebugUtilsMessengerEXT(handle, &ci, nullptr, &messenger) != VK_SUCCESS) {
 | 
				
			||||||
 | 
					        return {};
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return DebugCallback(messenger, handle, *dld);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
} // namespace Vulkan::vk
 | 
					} // namespace Vulkan::vk
 | 
				
			||||||
 | 
				
			|||||||
@ -542,4 +542,21 @@ using SurfaceKHR = Handle<VkSurfaceKHR, VkInstance, InstanceDispatch>;
 | 
				
			|||||||
using DescriptorSets = PoolAllocations<VkDescriptorSet, VkDescriptorPool>;
 | 
					using DescriptorSets = PoolAllocations<VkDescriptorSet, VkDescriptorPool>;
 | 
				
			||||||
using CommandBuffers = PoolAllocations<VkCommandBuffer, VkCommandPool>;
 | 
					using CommandBuffers = PoolAllocations<VkCommandBuffer, VkCommandPool>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/// Vulkan instance owning handle.
 | 
				
			||||||
 | 
					class Instance : public Handle<VkInstance, NoOwner, InstanceDispatch> {
 | 
				
			||||||
 | 
					    using Handle<VkInstance, NoOwner, InstanceDispatch>::Handle;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public:
 | 
				
			||||||
 | 
					    /// Creates a Vulkan instance. Use "operator bool" for error handling.
 | 
				
			||||||
 | 
					    static Instance Create(Span<const char*> layers, Span<const char*> extensions,
 | 
				
			||||||
 | 
					                           InstanceDispatch& dld) noexcept;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /// Enumerates physical devices.
 | 
				
			||||||
 | 
					    /// @return Physical devices and an empty handle on failure.
 | 
				
			||||||
 | 
					    std::optional<std::vector<VkPhysicalDevice>> EnumeratePhysicalDevices();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /// Tries to create a debug callback messenger. Returns an empty handle on failure.
 | 
				
			||||||
 | 
					    DebugCallback TryCreateDebugCallback(PFN_vkDebugUtilsMessengerCallbackEXT callback) noexcept;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
} // namespace Vulkan::vk
 | 
					} // namespace Vulkan::vk
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user