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( 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 )
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
// }
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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