Files
FGL-Engine/src/engine/image/ImageHandle.hpp

101 lines
2.4 KiB
C++

//
// Created by kj16609 on 1/4/24.
//
#pragma once
#include <tracy/Tracy.hpp>
#include <memory>
#include "engine/logging/logging.hpp"
#include "engine/rendering/devices/Device.hpp"
#include "vma/vma_impl.hpp"
#include "vulkan/vulkan.hpp"
namespace fgl::engine
{
class ImageView;
class ImageHandle
{
VmaAllocation m_allocation { VK_NULL_HANDLE };
VmaAllocationInfo m_allocation_info {};
vk::Extent2D m_extent;
vk::Format m_format;
vk::ImageUsageFlags m_usage;
vk::ImageLayout m_initial_layout { vk::ImageLayout::eUndefined };
vk::ImageLayout m_final_layout { vk::ImageLayout::eUndefined };
// Because of the way the swapchain works we need to be able to storage a `VkImage` handle.
std::variant< vk::raii::Image, vk::Image > m_image;
bool m_staged { false };
friend class ImageView;
friend class Image;
public:
FGL_DELETE_ALL_Ro5( ImageHandle );
ImageHandle( vk::Extent2D extent, vk::Format format, vk::Image image, vk::ImageUsageFlags usage ) noexcept;
ImageHandle(
vk::Extent2D extent,
vk::Format format,
vk::ImageUsageFlags usage,
vk::ImageLayout inital_layout,
vk::ImageLayout final_layout );
void setName( std::string str );
VkImage operator*()
{
ZoneScoped;
if ( std::holds_alternative< vk::raii::Image >( m_image ) )
{
return *std::get< vk::raii::Image >( m_image );
}
return std::get< vk::Image >( m_image );
}
VkImage getVkImage() { return **this; }
vk::Format format() const { return m_format; }
vk::Extent2D extent() const { return m_extent; }
bool ready() const { return m_staged; }
void setReady( const bool value ) { m_staged = value; }
vk::ImageAspectFlags aspectMask() const
{
vk::ImageAspectFlags flags {};
if ( m_usage & vk::ImageUsageFlagBits::eColorAttachment ) flags |= vk::ImageAspectFlagBits::eColor;
//TODO: This is likely wrong since not all sampled images will be a color.
// Should look into the various image flags and figure out a better pattern here
if ( m_usage & vk::ImageUsageFlagBits::eSampled ) flags |= vk::ImageAspectFlagBits::eColor;
if ( m_usage & vk::ImageUsageFlagBits::eDepthStencilAttachment )
flags |= ( vk::ImageAspectFlagBits::eDepth );
return flags;
}
~ImageHandle()
{
if ( m_allocation != VK_NULL_HANDLE )
{
vmaFreeMemory( Device::getInstance().allocator(), m_allocation );
}
}
};
} // namespace fgl::engine