project-aster/aster_core/physical_device.cpp

50 lines
1.4 KiB
C++

// =============================================
// Aster: physical_device.cpp
// Copyright (c) 2020-2024 Anish Bhobe
// =============================================
#include "physical_device.h"
std::vector<QueueFamilyInfo> PhysicalDevice::get_queue_families(const Window *_window) const {
auto queue_families_ = device.getQueueFamilyProperties();
std::vector<QueueFamilyInfo> queue_family_infos;
queue_family_infos.reserve(queue_families_.size());
u32 family_index = 0;
for (const auto &queue_family : queue_families_) {
QueueSupportFlags support;
if (queue_family.queueFlags & vk::QueueFlagBits::eGraphics) {
support |= QueueSupportFlagBits::eGraphics;
}
if (queue_family.queueFlags & vk::QueueFlagBits::eCompute) {
support |= QueueSupportFlagBits::eCompute;
}
if (queue_family.queueFlags & vk::QueueFlagBits::eTransfer) {
support |= QueueSupportFlagBits::eTransfer;
}
try {
if (device.getSurfaceSupportKHR(family_index, *_window->surface)) {
support |= QueueSupportFlagBits::ePresent;
}
} catch (const std::exception &err) {
ERROR("Failure in finding surface support, all possibilities fatal. Failed with "s + err.what());
throw;
}
VERBOSE(fmt::format("Queue({}): {}", family_index, to_string(support)));
queue_family_infos.push_back({
.index = family_index,
.count = queue_family.queueCount,
.queue_support = support,
});
++family_index;
}
return queue_family_infos;
}