/ Core / Clockworks / CwGraphics-Devices.cpp
CwGraphics-Devices.cpp
 1  #include <Clockworks/CwGraphics.hpp>
 2  
 3  void CwGraphics::PhysicalDevice() {
 4          uint32_t DCount = {};
 5          vkEnumeratePhysicalDevices(Instance, &DCount, nullptr);
 6          if (DCount == 0) throw std::runtime_error("CW-Error: Failed to find Gpu :(");
 7          std::vector<VkPhysicalDevice> Devs(DCount);
 8  
 9          vkEnumeratePhysicalDevices(Instance, &DCount, Devs.data());
10          //  Check Suitibility
11  
12          for (const VkPhysicalDevice& Dev : Devs) {
13                  if (IsDeviceSuitable(Dev)) {
14                          PhysicalDev = Dev;
15                          break;
16                  }
17          }
18  
19          if (PhysicalDev == VK_NULL_HANDLE) throw std::runtime_error("CW-Error: Failed to find Gpu :(");
20  }
21  bool CwGraphics::IsDeviceSuitable(VkPhysicalDevice Dev) {
22          VkPhysicalDeviceProperties Prop;
23          VkPhysicalDeviceFeatures Feat;
24          vkGetPhysicalDeviceProperties(Dev, &Prop);
25          vkGetPhysicalDeviceFeatures(Dev, &Feat);
26  
27          FamIndices = FindQueueFam(Dev);
28  
29          bool ExtSupport = EnableDeviceExtensions(Dev);
30  
31          bool ChainGood = false;
32          if (ExtSupport) {
33                  ChainDetails Details = ChainSupport(Dev);
34                  ChainGood = !Details.formats.empty() && !Details.PModes.empty();
35          }
36  
37          return FamIndices.GraphicsFam.has_value() && FamIndices.PresentFam.has_value() && ChainGood;
38          // return true;
39  }
40  bool CwGraphics::EnableDeviceExtensions(VkPhysicalDevice Dev) {
41          uint32_t ExCount;
42          vkEnumerateDeviceExtensionProperties(Dev, nullptr, &ExCount, nullptr);
43          std::vector<VkExtensionProperties> Ex(ExCount);
44          vkEnumerateDeviceExtensionProperties(Dev, nullptr, &ExCount, Ex.data());
45  
46          std::set<std::string> requiredExtensions(RequiredExt.begin(), RequiredExt.end());
47  
48          for (const auto& extension : Ex) {
49                  requiredExtensions.erase(extension.extensionName);
50          }
51  
52          return requiredExtensions.empty();
53  }
54  CwGraphics::QueueFam CwGraphics::FindQueueFam(VkPhysicalDevice Dev) {
55          QueueFam Fam;
56          uint32_t FamCount = 0;
57          vkGetPhysicalDeviceQueueFamilyProperties(Dev, &FamCount, nullptr);
58          std::vector<VkQueueFamilyProperties> QueueFams(FamCount);
59          vkGetPhysicalDeviceQueueFamilyProperties(Dev, &FamCount, QueueFams.data());
60          int i = 0;
61          for (const auto& QFam : QueueFams) {
62                  if (QFam.queueFlags & VK_QUEUE_GRAPHICS_BIT) Fam.GraphicsFam = i;
63  
64                  VkBool32 PresSupport = false;
65                  vkGetPhysicalDeviceSurfaceSupportKHR(Dev, i, Surface, &PresSupport);
66  
67                  if (PresSupport) Fam.PresentFam = i;
68                  i++;
69          }
70  
71          return Fam;
72  }
73  CwGraphics::ChainDetails CwGraphics::ChainSupport(VkPhysicalDevice Dev) {
74          ChainDetails Details;
75  
76          vkGetPhysicalDeviceSurfaceCapabilitiesKHR(Dev, Surface, &Details.Capabilities);
77          uint32_t Count{};
78  
79          vkGetPhysicalDeviceSurfaceFormatsKHR(Dev, Surface, &Count, nullptr);
80  
81          if (Count != 0) {
82                  Details.formats.resize(Count);
83  
84                  vkGetPhysicalDeviceSurfaceFormatsKHR(Dev, Surface, &Count, Details.formats.data());
85          }
86  
87          Count = 0;
88          vkGetPhysicalDeviceSurfacePresentModesKHR(Dev, Surface, &Count, nullptr);
89  
90          if (Count != 0) {
91                  Details.PModes.resize(Count);
92  
93                  vkGetPhysicalDeviceSurfacePresentModesKHR(Dev, Surface, &Count, Details.PModes.data());
94          }
95  
96          return Details;
97  }