64 lines
1.8 KiB
C++
64 lines
1.8 KiB
C++
// =============================================
|
|
// 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 err;
|
|
}
|
|
|
|
++family_index;
|
|
}
|
|
|
|
return indices;
|
|
}
|