6 #include <ThirdParty/EASTL-master/include/EASTL/set.h> 7 #include <ThirdParty/EASTL-master/include/EASTL/string.h> 8 #include <ThirdParty/EASTL-master/include/EASTL/vector.h> 13 VulkanLogicalDevice::VulkanLogicalDevice(VulkanPhysicalDevice * vulkanPhysicalDevice,
bool debug, eastl::vector<const char*> extensions, VulkanDeviceFeatures_t requestedDeviceFeatures)
15 eastl::vector<VkDeviceQueueCreateInfo> queues;
16 eastl::set<int> uniqueQueueFamilies = { vulkanPhysicalDevice->GetQueueFamilies().graphics,
17 vulkanPhysicalDevice->GetQueueFamilies().compute,
18 vulkanPhysicalDevice->GetQueueFamilies().present };
19 float queuePriority = 1.f;
21 for (
int queueFamily : uniqueQueueFamilies) {
22 VkDeviceQueueCreateInfo QueueCreateInfo = {};
23 QueueCreateInfo.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
24 QueueCreateInfo.queueFamilyIndex = queueFamily;
25 QueueCreateInfo.queueCount = 1;
27 QueueCreateInfo.pQueuePriorities = &queuePriority;
29 queues.push_back(QueueCreateInfo);
33 VkBool32 physicalDeviceFeatures[
sizeof(VkPhysicalDeviceFeatures) /
sizeof(VkBool32)];
34 float* requestedFeatures =
reinterpret_cast<float*
>(&requestedDeviceFeatures);
36 for (
int i = 0; i <
sizeof(VkPhysicalDeviceFeatures) /
sizeof(VkBool32); ++i) {
37 if (requestedFeatures[i] > 0.f)
38 physicalDeviceFeatures[i] = VK_TRUE;
40 physicalDeviceFeatures[i] = VK_FALSE;
43 VkPhysicalDeviceFeatures features = {};
44 memcpy(&features, &physicalDeviceFeatures,
sizeof(VkPhysicalDeviceFeatures));
46 VkDeviceCreateInfo createInfo = {};
47 createInfo.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
48 createInfo.queueCreateInfoCount =
static_cast<uint32_t
>(queues.size());
49 createInfo.pQueueCreateInfos = queues.data();
51 createInfo.pEnabledFeatures = &features;
53 createInfo.enabledExtensionCount =
static_cast<uint32_t
>(extensions.size());
54 createInfo.ppEnabledExtensionNames = extensions.data();
56 eastl::vector<const char*> layers = {
57 "VK_LAYER_LUNARG_standard_validation" 61 createInfo.enabledLayerCount =
static_cast<uint32_t
>(layers.size());
62 createInfo.ppEnabledLayerNames = layers.data();
65 createInfo.enabledLayerCount = 0;
68 VkResult res = vkCreateDevice(vulkanPhysicalDevice->GetPhysicalDevice(), &createInfo,
nullptr, &device);
70 if (res != VK_SUCCESS) {
71 eastl::string s = eastl::string(
"[ERROR] [CODE:") + std::to_string(res).c_str() +
"] Logical device creation failed";
72 std::cout << s.c_str() << std::endl;
75 vkGetDeviceQueue(device, vulkanPhysicalDevice->GetQueueFamilies().graphics, 0, &graphicsQueue);
76 vkGetDeviceQueue(device, vulkanPhysicalDevice->GetQueueFamilies().compute, 0, &computeQueue);
77 vkGetDeviceQueue(device, vulkanPhysicalDevice->GetQueueFamilies().present, 0, &presentQueue);
79 this->vulkanPhysicalDevice = vulkanPhysicalDevice;
83 VulkanLogicalDevice::~VulkanLogicalDevice()
85 vkDestroyDevice(device,
nullptr);
88 VkDevice VulkanLogicalDevice::GetDevice()
const 93 VulkanPhysicalDevice * VulkanLogicalDevice::GetPhysicalDevice()
const 95 return vulkanPhysicalDevice;
98 VkQueue VulkanLogicalDevice::GetGraphicsQueue()
const 100 return graphicsQueue;
103 VkQueue VulkanLogicalDevice::GetComputeQueue()
const 108 VkQueue VulkanLogicalDevice::GetPresentQueue()
const 114 #endif // USING_VULKAN