50 lines
1.4 KiB
C++
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;
|
|
}
|