diff --git a/aster_core/CMakeLists.txt b/aster_core/CMakeLists.txt index 0674097..cfff9ba 100644 --- a/aster_core/CMakeLists.txt +++ b/aster_core/CMakeLists.txt @@ -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 ) diff --git a/aster_core/device.cpp b/aster_core/device.cpp index 51bad77..70cae39 100644 --- a/aster_core/device.cpp +++ b/aster_core/device.cpp @@ -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, 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; -// } diff --git a/aster_core/device.h b/aster_core/device.h index 9d81115..f664193 100644 --- a/aster_core/device.h +++ b/aster_core/device.h @@ -7,38 +7,13 @@ #include "context.h" #include "global.h" +#include "physical_device.h" #include "window.h" #include #include #include - -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 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& _host_buffer, const std::span& _data) const; // fields - PhysicalDeviceInfo physical_device; + PhysicalDevice physical_device; vk::raii::Device device{ nullptr }; Queues queues; VmaAllocator allocator; diff --git a/aster_core/physical_device.cpp b/aster_core/physical_device.cpp new file mode 100644 index 0000000..2d63078 --- /dev/null +++ b/aster_core/physical_device.cpp @@ -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; +} diff --git a/aster_core/physical_device.h b/aster_core/physical_device.h new file mode 100644 index 0000000..0b71f76 --- /dev/null +++ b/aster_core/physical_device.h @@ -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) ; +};