56 lines
1.7 KiB
C++
56 lines
1.7 KiB
C++
// =============================================
|
|
// Aster: device.h
|
|
// Copyright (c) 2020-2024 Anish Bhobe
|
|
// =============================================
|
|
|
|
#pragma once
|
|
|
|
#include "global.h"
|
|
|
|
#include <EASTL/vector.h>
|
|
|
|
struct QueueAllocation;
|
|
struct Context;
|
|
struct PhysicalDevice;
|
|
|
|
struct Features
|
|
{
|
|
vk::PhysicalDeviceFeatures m_Vulkan10Features;
|
|
vk::PhysicalDeviceVulkan11Features m_Vulkan11Features;
|
|
vk::PhysicalDeviceVulkan12Features m_Vulkan12Features;
|
|
vk::PhysicalDeviceVulkan13Features m_Vulkan13Features;
|
|
};
|
|
|
|
struct Device final
|
|
{
|
|
NameString m_Name;
|
|
vk::PhysicalDevice m_PhysicalDevice = nullptr;
|
|
vk::Device m_Device = nullptr;
|
|
VmaAllocator m_Allocator = nullptr;
|
|
|
|
Device(const Context *context, PhysicalDevice *physicalDevice, Features *enabledFeatures,
|
|
const eastl::vector<QueueAllocation> &queueAllocations, NameString &&name);
|
|
~Device();
|
|
|
|
template <typename T>
|
|
requires vk::isVulkanHandleType<T>::value void SetName(const T &object, cstr name) const;
|
|
[[nodiscard]] vk::Queue GetQueue(u32 familyIndex, u32 queueIndex) const;
|
|
};
|
|
|
|
template <typename T>
|
|
requires vk::isVulkanHandleType<T>::value void
|
|
Device::SetName(const T &object, cstr name) const
|
|
{
|
|
if (!name)
|
|
return;
|
|
auto handle = Recast<u64>(Cast<typename T::NativeType>(object));
|
|
const vk::DebugUtilsObjectNameInfoEXT objectNameInfo = {
|
|
.objectType = object.objectType,
|
|
.objectHandle = handle,
|
|
.pObjectName = name,
|
|
};
|
|
vk::Result result = m_Device.setDebugUtilsObjectNameEXT(&objectNameInfo);
|
|
WARN_IF(Failed(result), "Could not name {:x}: {} as {}. Cause: {}", handle, to_string(object.objectType), name,
|
|
result);
|
|
}
|