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 }