Вынес управление VkDevice в отдельный класс
This commit is contained in:
@@ -0,0 +1,60 @@
|
||||
#include "Device.hpp"
|
||||
|
||||
#include "PhysicalDevice.hpp"
|
||||
|
||||
#include <set>
|
||||
|
||||
#include "DeviceFunctions/DeviceFunctions.hpp"
|
||||
|
||||
VkObjects::Device::Device(const PhysicalDevice& physical_device, const std::vector<const char*>& device_extensions)
|
||||
{
|
||||
PhysicalDevice::QueueFamilyIndices indices = physical_device.get_queue_family_indices();
|
||||
|
||||
VkPhysicalDeviceFeatures device_features{};
|
||||
|
||||
std::vector<VkDeviceQueueCreateInfo> queue_create_infos;
|
||||
std::set<uint32_t> 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<uint32_t>(unique_queue_families.size());
|
||||
device_create_info.pQueueCreateInfos = queue_create_infos.data();
|
||||
device_create_info.pEnabledFeatures = &device_features;
|
||||
device_create_info.enabledExtensionCount = static_cast<uint32_t>(device_extensions.size());
|
||||
device_create_info.ppEnabledExtensionNames = device_extensions.data();
|
||||
|
||||
#ifdef _DEBUG
|
||||
const std::vector<const char*> layers_validation = {
|
||||
"VK_LAYER_KHRONOS_validation"
|
||||
};
|
||||
device_create_info.enabledLayerCount = static_cast<uint32_t>(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);
|
||||
}
|
||||
Reference in New Issue
Block a user