Device cleanup to Physical Device.
This commit is contained in:
parent
3032b9a43d
commit
6e8e2c6c80
|
|
@ -9,8 +9,8 @@ find_package( Vulkan REQUIRED )
|
||||||
# find_package( VulkanHeaders CONFIG REQUIRED )
|
# find_package( VulkanHeaders CONFIG REQUIRED )
|
||||||
find_package( VulkanMemoryAllocator 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( 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 )
|
set( SOURCE_FILES logger.cpp global.cpp context.cpp window.cpp device.cpp physical_device.cpp )
|
||||||
|
|
||||||
add_library( aster_core ${SOURCE_FILES} ${HEADER_FILES} )
|
add_library( aster_core ${SOURCE_FILES} ${HEADER_FILES} )
|
||||||
set_property( TARGET aster_core PROPERTY CXX_STANDARD 23 )
|
set_property( TARGET aster_core PROPERTY CXX_STANDARD 23 )
|
||||||
|
|
|
||||||
|
|
@ -26,7 +26,7 @@ Device &Device::operator=(Device &&_other) noexcept {
|
||||||
return *this;
|
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 },
|
physical_device{ _physical_device_info },
|
||||||
name{ _name } {
|
name{ _name } {
|
||||||
const auto &physical_device = _physical_device_info.device;
|
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(*physical_device.device, std::fmt("%s GPU", _name.data()));
|
||||||
set_object_name(*device, std::fmt("%s Device", _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;
|
|
||||||
// }
|
|
||||||
|
|
|
||||||
|
|
@ -7,38 +7,13 @@
|
||||||
|
|
||||||
#include "context.h"
|
#include "context.h"
|
||||||
#include "global.h"
|
#include "global.h"
|
||||||
|
#include "physical_device.h"
|
||||||
#include "window.h"
|
#include "window.h"
|
||||||
|
|
||||||
#include <iterator>
|
#include <iterator>
|
||||||
#include <span>
|
#include <span>
|
||||||
#include <string_view>
|
#include <string_view>
|
||||||
|
#include <utility>
|
||||||
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;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
struct Queues {
|
struct Queues {
|
||||||
vk::raii::Queue graphics{ nullptr };
|
vk::raii::Queue graphics{ nullptr };
|
||||||
|
|
@ -52,29 +27,13 @@ struct SubmitTask;
|
||||||
|
|
||||||
class Device {
|
class Device {
|
||||||
public:
|
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(const Device &_other) = delete;
|
||||||
Device(Device &&_other) noexcept;
|
Device(Device &&_other) noexcept;
|
||||||
Device &operator=(const Device &_other) = delete;
|
Device &operator=(const Device &_other) = delete;
|
||||||
Device &operator=(Device &&_other) noexcept;
|
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();
|
~Device();
|
||||||
|
|
||||||
|
|
@ -100,7 +59,7 @@ public:
|
||||||
// Res<> update_data(const Borrowed<Buffer>& _host_buffer, const std::span<u8>& _data) const;
|
// Res<> update_data(const Borrowed<Buffer>& _host_buffer, const std::span<u8>& _data) const;
|
||||||
|
|
||||||
// fields
|
// fields
|
||||||
PhysicalDeviceInfo physical_device;
|
PhysicalDevice physical_device;
|
||||||
vk::raii::Device device{ nullptr };
|
vk::raii::Device device{ nullptr };
|
||||||
Queues queues;
|
Queues queues;
|
||||||
VmaAllocator allocator;
|
VmaAllocator allocator;
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
@ -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) ;
|
||||||
|
};
|
||||||
Loading…
Reference in New Issue