// ============================================= // Aster: physical_device.cpp // Copyright (c) 2020-2024 Anish Bhobe // ============================================= #include "physical_device.h" QueueFamilyIndices PhysicalDevice::get_queue_families(const Window *_window, const vk::raii::PhysicalDevice *_device) { QueueFamilyIndices indices; auto queue_families_ = _device->getQueueFamilyProperties(); u32 family_index = 0; for (const auto &queue_family : queue_families_) { u32 this_family_count = 0; VERBOSE(fmt::format("Queue({}): {}", family_index, to_string(queue_family.queueFlags).data())); if (!indices.has_graphics() && (queue_family.queueFlags & vk::QueueFlagBits::eGraphics)) { if (queue_family.queueCount > this_family_count) { indices.graphics_idx = family_index; ++this_family_count; } else { continue; } } if (!indices.has_compute() && (queue_family.queueFlags & vk::QueueFlagBits::eCompute)) { if (queue_family.queueCount > this_family_count) { indices.compute_idx = family_index; ++this_family_count; } else { continue; } } if (!indices.has_transfer() && (queue_family.queueFlags & vk::QueueFlagBits::eTransfer)) { if (queue_family.queueCount > this_family_count) { indices.transfer_idx = family_index; ++this_family_count; } else { continue; } } try { if (!indices.has_present() && _device->getSurfaceSupportKHR(family_index, *_window->surface)) { if (queue_family.queueCount > this_family_count) { indices.present_idx = family_index; ++this_family_count; } else { continue; } } } catch (const std::exception &err) { ERROR("Failure in finding surface support, all possibilities fatal. Failed with "s + err.what()); throw; } ++family_index; } return indices; }