// Copyright (C) 2020 Jérôme Leclercq // This file is part of the "Nazara Engine - Vulkan Renderer" // For conditions of distribution and use, see copyright notice in Config.hpp #include #include #include #include #include #include namespace Nz { namespace Vk { template DeviceObject::DeviceObject() : m_handle(VK_NULL_HANDLE) { } template DeviceObject::DeviceObject(DeviceObject&& object) noexcept : m_device(std::move(object.m_device)), m_allocator(object.m_allocator), m_handle(object.m_handle), m_lastErrorCode(object.m_lastErrorCode) { object.m_handle = VK_NULL_HANDLE; } template DeviceObject::~DeviceObject() { Destroy(); } template bool DeviceObject::Create(Device& device, const CreateInfo& createInfo, const VkAllocationCallbacks* allocator) { m_device = &device; m_lastErrorCode = C::CreateHelper(*m_device, &createInfo, allocator, &m_handle); if (m_lastErrorCode != VkResult::VK_SUCCESS) { NazaraError("Failed to create Vulkan object: " + TranslateVulkanError(m_lastErrorCode)); return false; } // Store the allocator to access them when needed if (allocator) m_allocator = *allocator; else m_allocator.pfnAllocation = nullptr; return true; } template void DeviceObject::Destroy() { if (IsValid()) { C::DestroyHelper(*m_device, m_handle, (m_allocator.pfnAllocation) ? &m_allocator : nullptr); m_handle = VK_NULL_HANDLE; } } template bool DeviceObject::IsValid() const { return m_handle != VK_NULL_HANDLE; } template Device* DeviceObject::GetDevice() const { return m_device; } template VkResult DeviceObject::GetLastErrorCode() const { return m_lastErrorCode; } template void DeviceObject::SetDebugName(const char* name) { if (m_device->vkSetDebugUtilsObjectNameEXT) { VkDebugUtilsObjectNameInfoEXT debugName = { VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT }; debugName.objectType = ObjectType; debugName.objectHandle = static_cast(reinterpret_cast(m_handle)); debugName.pObjectName = name; m_device->vkSetDebugUtilsObjectNameEXT(*m_device, &debugName); } } template void DeviceObject::SetDebugName(const std::string& name) { return SetDebugName(name.data()); } template DeviceObject::operator VkType() const { return m_handle; } } } #include