Deerith/graphics/src/vulkan_logical_device.cpp
2026-03-23 01:21:29 +01:00

48 lines
1.9 KiB
C++

#include "detail/graphics.h"
#include <set>
namespace deerith {
void graphics::create_vulkan_logical_device() {
deerith_graphics_trace("Initializing Vulkan logical device");
QueueFamilyIndices indices = find_queue_families(physical_device);
VkPhysicalDeviceFeatures device_features{};
std::vector<VkDeviceQueueCreateInfo> queue_create_infos;
std::set<uint32_t> unique_queue_families = {indices.graphics_family.value(), indices.present_family.value()};
float queuePriority = 1.0f;
for (uint32_t queueFamily : unique_queue_families) {
VkDeviceQueueCreateInfo queue_create_info{};
queue_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
queue_create_info.queueFamilyIndex = queueFamily;
queue_create_info.queueCount = 1;
queue_create_info.pQueuePriorities = &queuePriority;
queue_create_infos.push_back(queue_create_info);
}
VkDeviceCreateInfo create_info{};
create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
create_info.queueCreateInfoCount = static_cast<uint32_t>(queue_create_infos.size());
create_info.pQueueCreateInfos = queue_create_infos.data();
create_info.pEnabledFeatures = &device_features;
create_info.enabledExtensionCount = static_cast<uint32_t>(device_extensions.size());
create_info.ppEnabledExtensionNames = device_extensions.data();
if (ACTIVE_VALIDATION_LAYER) {
create_info.enabledLayerCount = static_cast<uint32_t>(validation_layers.size());
create_info.ppEnabledLayerNames = validation_layers.data();
} else {
create_info.enabledLayerCount = 0;
}
if (vkCreateDevice(physical_device, &create_info, nullptr, &device) != VK_SUCCESS) {
deerith_graphics_error("failed to create logical device");
}
vkGetDeviceQueue(device, indices.graphics_family.value(), 0, &graphics_queue);
vkGetDeviceQueue(device, indices.present_family.value(), 0, &pressent_queue);
}
} // namespace deerith