Engine
Frameworkcreatedbymeusableforthecreationofsimplegames.CurrentlysupportsOpenGL(Verysimple)andVulkan.
VulkanLogicalDevice.cpp
Go to the documentation of this file.
2 #include <string>
3 #ifdef USING_VULKAN
4 
5 #include <iostream>
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>
9 
10 namespace Engine {
11 
12 
13  VulkanLogicalDevice::VulkanLogicalDevice(VulkanPhysicalDevice * vulkanPhysicalDevice, bool debug, eastl::vector<const char*> extensions, VulkanDeviceFeatures_t requestedDeviceFeatures)
14  {
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;
20 
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;
26 
27  QueueCreateInfo.pQueuePriorities = &queuePriority;
28 
29  queues.push_back(QueueCreateInfo);
30 
31  }
32 
33  VkBool32 physicalDeviceFeatures[sizeof(VkPhysicalDeviceFeatures) / sizeof(VkBool32)];
34  float* requestedFeatures = reinterpret_cast<float*>(&requestedDeviceFeatures);
35 
36  for (int i = 0; i < sizeof(VkPhysicalDeviceFeatures) / sizeof(VkBool32); ++i) {
37  if (requestedFeatures[i] > 0.f)
38  physicalDeviceFeatures[i] = VK_TRUE;
39  else
40  physicalDeviceFeatures[i] = VK_FALSE;
41  }
42 
43  VkPhysicalDeviceFeatures features = {};
44  memcpy(&features, &physicalDeviceFeatures, sizeof(VkPhysicalDeviceFeatures));
45 
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();
50 
51  createInfo.pEnabledFeatures = &features;
52 
53  createInfo.enabledExtensionCount = static_cast<uint32_t>(extensions.size());
54  createInfo.ppEnabledExtensionNames = extensions.data();
55 
56  eastl::vector<const char*> layers = {
57  "VK_LAYER_LUNARG_standard_validation"
58  };
59 
60  if (debug) {
61  createInfo.enabledLayerCount = static_cast<uint32_t>(layers.size());
62  createInfo.ppEnabledLayerNames = layers.data();
63  }
64  else {
65  createInfo.enabledLayerCount = 0;
66  }
67 
68  VkResult res = vkCreateDevice(vulkanPhysicalDevice->GetPhysicalDevice(), &createInfo, nullptr, &device);
69 
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;
73  }
74 
75  vkGetDeviceQueue(device, vulkanPhysicalDevice->GetQueueFamilies().graphics, 0, &graphicsQueue);
76  vkGetDeviceQueue(device, vulkanPhysicalDevice->GetQueueFamilies().compute, 0, &computeQueue);
77  vkGetDeviceQueue(device, vulkanPhysicalDevice->GetQueueFamilies().present, 0, &presentQueue);
78 
79  this->vulkanPhysicalDevice = vulkanPhysicalDevice;
80 
81  }
82 
83  VulkanLogicalDevice::~VulkanLogicalDevice()
84  {
85  vkDestroyDevice(device, nullptr);
86  }
87 
88  VkDevice VulkanLogicalDevice::GetDevice() const
89  {
90  return device;
91  }
92 
93  VulkanPhysicalDevice * VulkanLogicalDevice::GetPhysicalDevice() const
94  {
95  return vulkanPhysicalDevice;
96  }
97 
98  VkQueue VulkanLogicalDevice::GetGraphicsQueue() const
99  {
100  return graphicsQueue;
101  }
102 
103  VkQueue VulkanLogicalDevice::GetComputeQueue() const
104  {
105  return computeQueue;
106  }
107 
108  VkQueue VulkanLogicalDevice::GetPresentQueue() const
109  {
110  return presentQueue;
111  }
112 }
113 
114 #endif // USING_VULKAN