#include "Device.hpp" #include "PhysicalDevice.hpp" #include #include #include #include "DeviceFunctions/DeviceFunctions.hpp" VkObjects::Device::Device(const PhysicalDevice& physical_device, const std::vector& device_extensions) { PhysicalDevice::QueueFamilyIndices indices = physical_device.get_queue_family_indices(); VkPhysicalDeviceFeatures device_features{}; std::vector queue_create_infos; std::set unique_queue_families = {indices.graphics_family, indices.present_family, indices.transfer_family}; float queue_priority = 1.0f; VkDeviceQueueCreateInfo device_queue_create_info{}; device_queue_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO; device_queue_create_info.pQueuePriorities = &queue_priority; for (auto queue_family : unique_queue_families) { device_queue_create_info.queueFamilyIndex = queue_family; device_queue_create_info.queueCount = 1; queue_create_infos.push_back(device_queue_create_info); } VkDeviceCreateInfo device_create_info{}; device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO; device_create_info.queueCreateInfoCount = static_cast(unique_queue_families.size()); device_create_info.pQueueCreateInfos = queue_create_infos.data(); device_create_info.pEnabledFeatures = &device_features; device_create_info.enabledExtensionCount = static_cast(device_extensions.size()); device_create_info.ppEnabledExtensionNames = device_extensions.data(); #ifdef _DEBUG const std::vector layers_validation = { "VK_LAYER_KHRONOS_validation" }; device_create_info.enabledLayerCount = static_cast(layers_validation.size()); device_create_info.ppEnabledLayerNames = layers_validation.data(); #else device_create_info.enabledLayerCount = 0; device_create_info.ppEnabledLayerNames = nullptr; #endif VK_CHECK(vkCreateDevice(physical_device.get_native(), &device_create_info, nullptr, &device_)) vkGetDeviceQueue(device_, indices.graphics_family, 0, &graphics_queue_); vkGetDeviceQueue(device_, indices.present_family, 0, &present_queue_); vkGetDeviceQueue(device_, indices.transfer_family, 0, &transfer_queue_); } VkObjects::Device::~Device() { if (device_ != nullptr) vkDestroyDevice(device_, nullptr); }