// Copyright (C) 2022 Jérôme "Lynix" Leclercq (lynix680@gmail.com) // 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 namespace Nz { namespace Vk { template InstanceObject::InstanceObject() : m_handle(VK_NULL_HANDLE) { } template InstanceObject::InstanceObject(InstanceObject&& object) noexcept : m_instance(std::move(object.m_instance)), m_allocator(object.m_allocator), m_handle(object.m_handle), m_lastErrorCode(object.m_lastErrorCode) { object.m_handle = VK_NULL_HANDLE; } template InstanceObject::~InstanceObject() { Destroy(); } template bool InstanceObject::Create(Instance& instance, const CreateInfo& createInfo, const VkAllocationCallbacks* allocator) { m_instance = &instance; m_lastErrorCode = C::CreateHelper(*m_instance, &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 InstanceObject::Destroy() { if (IsValid()) { C::DestroyHelper(*m_instance, m_handle, (m_allocator.pfnAllocation) ? &m_allocator : nullptr); m_handle = VK_NULL_HANDLE; } } template bool InstanceObject::IsValid() const { return m_handle != VK_NULL_HANDLE; } template Instance* InstanceObject::GetInstance() const { return m_instance; } template VkResult InstanceObject::GetLastErrorCode() const { return m_lastErrorCode; } template auto InstanceObject::operator=(InstanceObject&& object) noexcept -> InstanceObject& { std::swap(m_allocator, object.m_allocator); std::swap(m_instance, object.m_instance); std::swap(m_handle, object.m_handle); std::swap(m_lastErrorCode, object.m_lastErrorCode); return *this; } template InstanceObject::operator VkType() const { return m_handle; } } } #include