92 lines
2.3 KiB
C++
92 lines
2.3 KiB
C++
// =============================================
|
|
// Aster: physical_device.h
|
|
// Copyright (c) 2020-2025 Anish Bhobe
|
|
// =============================================
|
|
|
|
#pragma once
|
|
|
|
#include "global.h"
|
|
#include "surface.h"
|
|
|
|
#include <sstream>
|
|
|
|
#include <EASTL/fixed_vector.h>
|
|
|
|
struct Window;
|
|
struct Instance;
|
|
|
|
enum class QueueSupportFlagBits
|
|
{
|
|
eGraphics = 0b0001,
|
|
eTransfer = 0b0010,
|
|
eCompute = 0b0100,
|
|
ePresent = 0b1000,
|
|
};
|
|
|
|
using QueueSupportFlags = vk::Flags<QueueSupportFlagBits>;
|
|
|
|
inline std::string
|
|
// ReSharper disable once CppInconsistentNaming
|
|
format_as(QueueSupportFlags const &qfi)
|
|
{
|
|
std::stringstream sb;
|
|
if (qfi & QueueSupportFlagBits::eGraphics)
|
|
{
|
|
sb << "Graphics | ";
|
|
}
|
|
if (qfi & QueueSupportFlagBits::eTransfer)
|
|
{
|
|
sb << "Transfer | ";
|
|
}
|
|
if (qfi & QueueSupportFlagBits::eCompute)
|
|
{
|
|
sb << "Compute | ";
|
|
}
|
|
if (qfi & QueueSupportFlagBits::ePresent)
|
|
{
|
|
sb << "Present | ";
|
|
}
|
|
auto const sbv = sb.view();
|
|
return std::string(sbv.substr(0, sbv.size() - 3));
|
|
}
|
|
|
|
struct QueueFamilyInfo
|
|
{
|
|
u32 m_Index;
|
|
u32 m_Count;
|
|
QueueSupportFlags m_Support;
|
|
};
|
|
|
|
inline std::string
|
|
format_as(QueueFamilyInfo const &qfi)
|
|
{
|
|
return fmt::format("Queue {}: Count={} Support={}", qfi.m_Index, qfi.m_Count, qfi.m_Support);
|
|
}
|
|
|
|
[[nodiscard]] vk::SurfaceCapabilitiesKHR
|
|
GetSurfaceCapabilities(vk::PhysicalDevice physicalDevice, vk::SurfaceKHR surface);
|
|
|
|
[[nodiscard]] eastl::vector<vk::SurfaceFormatKHR>
|
|
GetSurfaceFormats(vk::PhysicalDevice physicalDevice, vk::SurfaceKHR surface);
|
|
|
|
[[nodiscard]] eastl::vector<vk::PresentModeKHR>
|
|
GetSurfacePresentModes(vk::PhysicalDevice physicalDevice, vk::SurfaceKHR surface);
|
|
|
|
struct PhysicalDevice final
|
|
{
|
|
vk::PhysicalDevice m_PhysicalDevice;
|
|
vk::PhysicalDeviceProperties m_DeviceProperties;
|
|
vk::PhysicalDeviceFeatures m_DeviceFeatures;
|
|
eastl::vector<vk::SurfaceFormatKHR> m_SurfaceFormats;
|
|
eastl::vector<vk::PresentModeKHR> m_PresentModes;
|
|
eastl::vector<QueueFamilyInfo> m_QueueFamilies;
|
|
|
|
PhysicalDevice() = default;
|
|
PhysicalDevice(vk::SurfaceKHR surface, vk::PhysicalDevice physicalDevice);
|
|
};
|
|
|
|
class PhysicalDevices : public eastl::fixed_vector<PhysicalDevice, 4>
|
|
{
|
|
public:
|
|
PhysicalDevices(Surface const &surface, Instance const &context);
|
|
}; |