// ============================================= // Aster: device.h // Copyright (c) 2020-2024 Anish Bhobe // ============================================= #pragma once #include "global.h" #include 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; template requires vk::isVulkanHandleType::value void SetName(const T &object, cstr name) const; [[nodiscard]] vk::Queue GetQueue(u32 familyIndex, u32 queueIndex) const; // Ctor/Dtor Device(const Context *context, PhysicalDevice *physicalDevice, Features *enabledFeatures, const eastl::vector &queueAllocations, NameString &&name); ~Device(); // Move Device(Device &&other) noexcept; Device &operator=(Device &&other) noexcept; DISALLOW_COPY_AND_ASSIGN(Device); }; template requires vk::isVulkanHandleType::value void Device::SetName(const T &object, cstr name) const { if (!name) return; auto handle = Recast(Cast(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); }