#include "detail/graphics.h" #include 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 queue_create_infos; std::set 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(queue_create_infos.size()); create_info.pQueueCreateInfos = queue_create_infos.data(); create_info.pEnabledFeatures = &device_features; create_info.enabledExtensionCount = static_cast(device_extensions.size()); create_info.ppEnabledExtensionNames = device_extensions.data(); if (ACTIVE_VALIDATION_LAYER) { create_info.enabledLayerCount = static_cast(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