Device cleanup to Physical Device.

This commit is contained in:
Anish Bhobe 2024-06-13 12:24:05 +02:00
parent 3032b9a43d
commit 6e8e2c6c80
5 changed files with 126 additions and 106 deletions

View File

@ -9,8 +9,8 @@ find_package( Vulkan REQUIRED )
# find_package( VulkanHeaders CONFIG REQUIRED )
find_package( VulkanMemoryAllocator CONFIG REQUIRED )
set( HEADER_FILES constants.h config.h logger.h global.h context.h window.h device.h )
set( SOURCE_FILES logger.cpp global.cpp context.cpp window.cpp device.cpp )
set( HEADER_FILES constants.h config.h logger.h global.h context.h window.h device.h physical_device.h )
set( SOURCE_FILES logger.cpp global.cpp context.cpp window.cpp device.cpp physical_device.cpp )
add_library( aster_core ${SOURCE_FILES} ${HEADER_FILES} )
set_property( TARGET aster_core PROPERTY CXX_STANDARD 23 )

View File

@ -26,7 +26,7 @@ Device &Device::operator=(Device &&_other) noexcept {
return *this;
}
Device::Device(const std::string_view &_name, Context *_context, const PhysicalDeviceInfo &_physical_device_info, const vk::PhysicalDeviceFeatures &_enabled_features) :
Device::Device(const std::string_view &_name, Context *_context, const PhysicalDevice &_physical_device_info, const vk::PhysicalDeviceFeatures &_enabled_features) :
physical_device{ _physical_device_info },
name{ _name } {
const auto &physical_device = _physical_device_info.device;
@ -221,61 +221,3 @@ void Device::set_name(const std::string_view &_name) {
set_object_name(*physical_device.device, std::fmt("%s GPU", _name.data()));
set_object_name(*device, std::fmt("%s Device", _name.data()));
}
//
// QueueFamilyIndices DeviceSelector::PhysicalDeviceInfo::get_queue_families(const Borrowed<Window> &_window, const vk::PhysicalDevice _device) const {
// QueueFamilyIndices indices;
//
// auto queue_families_ = _device.getQueueFamilyProperties();
//
// u32 i = 0;
// for (const auto &queueFamily : queue_families_) {
// u32 this_family_count = 0;
// VERBOSE(std::fmt("Queue(%i): %s", i, to_string(queueFamily.queueFlags).data()));
//
// if (queueFamily.queueCount <= 0) {
// ++i;
// continue; // Skip families with no queues
// }
//
// if (!indices.has_graphics() && (queueFamily.queueFlags & vk::QueueFlagBits::eGraphics)) {
// if (queueFamily.queueCount > this_family_count) {
// indices.graphics_idx = i;
// ++this_family_count;
// } else {
// continue;
// }
// }
//
// if (!indices.has_compute() && (queueFamily.queueFlags & vk::QueueFlagBits::eCompute)) {
// if (queueFamily.queueCount > this_family_count) {
// indices.compute_idx = i;
// ++this_family_count;
// } else {
// continue;
// }
// }
//
// if (!indices.has_transfer() && (queueFamily.queueFlags & vk::QueueFlagBits::eTransfer)) {
// if (queueFamily.queueCount > this_family_count) {
// indices.transfer_idx = i;
// ++this_family_count;
// } else {
// continue;
// }
// }
//
// auto [result, is_present_supported] = _device.getSurfaceSupportKHR(i, _window->surface);
// if (!indices.has_present() && !failed(result) && is_present_supported) {
// if (queueFamily.queueCount > this_family_count) {
// indices.present_idx = i;
// ++this_family_count;
// } else {
// continue;
// }
// }
//
// ++i;
// }
//
// return indices;
// }

View File

@ -7,38 +7,13 @@
#include "context.h"
#include "global.h"
#include "physical_device.h"
#include "window.h"
#include <iterator>
#include <span>
#include <string_view>
class Device;
struct QueueFamilyIndices {
static constexpr u32 invalid_value = 0xFFFFFFFFu;
u32 graphics_idx{ invalid_value };
u32 present_idx{ invalid_value };
u32 compute_idx{ invalid_value };
u32 transfer_idx{ invalid_value };
[[nodiscard]] b8 has_graphics() const {
return graphics_idx != invalid_value;
}
[[nodiscard]] b8 has_present() const {
return present_idx != invalid_value;
}
[[nodiscard]] b8 has_compute() const {
return compute_idx != invalid_value;
}
[[nodiscard]] b8 has_transfer() const {
return transfer_idx != invalid_value;
}
};
#include <utility>
struct Queues {
vk::raii::Queue graphics{ nullptr };
@ -52,29 +27,13 @@ struct SubmitTask;
class Device {
public:
struct PhysicalDeviceInfo {
vk::raii::PhysicalDevice device;
vk::PhysicalDeviceProperties properties;
vk::PhysicalDeviceFeatures features;
QueueFamilyIndices queue_families;
PhysicalDeviceInfo(Window *const _window, const vk::raii::PhysicalDevice &_device) :
device{ _device } {
properties = device.getProperties();
features = device.getFeatures();
queue_families = get_queue_families(_window, device);
}
private:
[[nodiscard]] QueueFamilyIndices get_queue_families(const Window *_window, vk::raii::PhysicalDevice _device) const;
};
Device(const Device &_other) = delete;
Device(Device &&_other) noexcept;
Device &operator=(const Device &_other) = delete;
Device &operator=(Device &&_other) noexcept;
Device(const std::string_view &_name, Context *_context, const PhysicalDeviceInfo &_physical_device_info, const vk::PhysicalDeviceFeatures &_enabled_features);
Device(const std::string_view &_name, Context *_context, const PhysicalDevice &_physical_device_info, const vk::PhysicalDeviceFeatures &_enabled_features);
~Device();
@ -100,7 +59,7 @@ public:
// Res<> update_data(const Borrowed<Buffer>& _host_buffer, const std::span<u8>& _data) const;
// fields
PhysicalDeviceInfo physical_device;
PhysicalDevice physical_device;
vk::raii::Device device{ nullptr };
Queues queues;
VmaAllocator allocator;

View File

@ -0,0 +1,68 @@
// =============================================
// 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 &queueFamily : queue_families_) {
u32 this_family_count = 0;
VERBOSE(std::fmt("Queue(%i): %s", family_index, to_string(queueFamily.queueFlags).data()));
if (queueFamily.queueCount <= 0) {
++family_index;
continue; // Skip families with no queues
}
if (!indices.has_graphics() && (queueFamily.queueFlags & vk::QueueFlagBits::eGraphics)) {
if (queueFamily.queueCount > this_family_count) {
indices.graphics_idx = family_index;
++this_family_count;
} else {
continue;
}
}
if (!indices.has_compute() && (queueFamily.queueFlags & vk::QueueFlagBits::eCompute)) {
if (queueFamily.queueCount > this_family_count) {
indices.compute_idx = family_index;
++this_family_count;
} else {
continue;
}
}
if (!indices.has_transfer() && (queueFamily.queueFlags & vk::QueueFlagBits::eTransfer)) {
if (queueFamily.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 (queueFamily.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;
}

View File

@ -0,0 +1,51 @@
// =============================================
// Aster: physical_device.h
// Copyright (c) 2020-2024 Anish Bhobe
// =============================================
#pragma once
#include "global.h"
#include "window.h"
struct QueueFamilyIndices {
static constexpr u32 invalid_value = 0xFFFFFFFFu;
u32 graphics_idx{ invalid_value };
u32 present_idx{ invalid_value };
u32 compute_idx{ invalid_value };
u32 transfer_idx{ invalid_value };
[[nodiscard]] b8 has_graphics() const {
return graphics_idx != invalid_value;
}
[[nodiscard]] b8 has_present() const {
return present_idx != invalid_value;
}
[[nodiscard]] b8 has_compute() const {
return compute_idx != invalid_value;
}
[[nodiscard]] b8 has_transfer() const {
return transfer_idx != invalid_value;
}
};
struct PhysicalDevice {
vk::raii::PhysicalDevice device;
vk::PhysicalDeviceProperties properties;
vk::PhysicalDeviceFeatures features;
QueueFamilyIndices queue_families;
PhysicalDevice(const Window *const _window, vk::raii::PhysicalDevice _device) :
device{ std::move(_device) } {
properties = device.getProperties();
features = device.getFeatures();
queue_families = get_queue_families(_window, &device);
}
private:
[[nodiscard]] static QueueFamilyIndices get_queue_families(const Window * _window, const vk::raii::PhysicalDevice* _device) ;
};