mirror of
https://git.suyu.dev/suyu/suyu
synced 2024-12-25 10:52:48 -06:00
renderer_vulkan/wrapper: Add instance handle
This commit is contained in:
parent
69728e8ad5
commit
151ddcf419
2 changed files with 87 additions and 0 deletions
|
@ -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 a new issue