151 lines
4.1 KiB
C++
151 lines
4.1 KiB
C++
// =============================================
|
|
// Aster: resource_manager.h
|
|
// Copyright (c) 2020-2025 Anish Bhobe
|
|
// =============================================
|
|
|
|
#pragma once
|
|
|
|
#include "aster/aster.h"
|
|
|
|
#include "buffer_manager.h"
|
|
#include "image_manager.h"
|
|
#include "sampler_manager.h"
|
|
#include "view_manager.h"
|
|
|
|
namespace systems
|
|
{
|
|
class ResourceManager
|
|
{
|
|
|
|
struct CombinedImageViewManager
|
|
{
|
|
ImageManager *m_ImageManager;
|
|
ImageViewManager *m_ViewManager;
|
|
|
|
CombinedImageViewManager(ImageManager *imageManager, ImageViewManager *viewManager)
|
|
: m_ImageManager{imageManager}
|
|
, m_ViewManager{viewManager}
|
|
{
|
|
}
|
|
|
|
template <concepts::ImageView T>
|
|
[[nodiscard]] Ref<T>
|
|
CreateTexture2D(const Texture2DCreateInfo &createInfo)
|
|
{
|
|
auto handle = CreateTexture2D(createInfo);
|
|
return CastView<T>(handle);
|
|
}
|
|
|
|
template <concepts::ImageCubeView T>
|
|
[[nodiscard]] Ref<T>
|
|
CreateTextureCube(const TextureCubeCreateInfo &createInfo)
|
|
{
|
|
auto handle = CreateTextureCube(createInfo);
|
|
return CastView<T>(handle);
|
|
}
|
|
|
|
[[nodiscard]] Ref<TextureView>
|
|
CreateTexture2D(const Texture2DCreateInfo &createInfo) const
|
|
{
|
|
return m_ViewManager->CreateView<TextureView>({
|
|
.m_Image = CastImage<Texture>(m_ImageManager->CreateTexture2D(createInfo)),
|
|
.m_Name = createInfo.m_Name,
|
|
.m_ViewType = vk::ImageViewType::e2D,
|
|
.m_AspectMask = vk::ImageAspectFlagBits::eColor,
|
|
});
|
|
}
|
|
|
|
[[nodiscard]] Ref<ImageCubeView>
|
|
CreateTextureCube(const TextureCubeCreateInfo &createInfo) const
|
|
{
|
|
return m_ViewManager->CreateView<ImageCubeView>({
|
|
.m_Image = m_ImageManager->CreateTextureCube(createInfo),
|
|
.m_Name = createInfo.m_Name,
|
|
.m_ViewType = vk::ImageViewType::eCube,
|
|
.m_AspectMask = vk::ImageAspectFlagBits::eColor,
|
|
});
|
|
}
|
|
|
|
[[nodiscard]] Ref<ImageView>
|
|
CreateAttachment(const AttachmentCreateInfo &createInfo) const
|
|
{
|
|
return m_ViewManager->CreateView({
|
|
.m_Image = m_ImageManager->CreateAttachment(createInfo),
|
|
.m_Name = createInfo.m_Name,
|
|
.m_ViewType = vk::ImageViewType::e2D,
|
|
.m_AspectMask = vk::ImageAspectFlagBits::eColor,
|
|
});
|
|
}
|
|
|
|
[[nodiscard]] Ref<ImageView>
|
|
CreateDepthStencilImage(const DepthStencilImageCreateInfo &createInfo) const
|
|
{
|
|
return m_ViewManager->CreateView({
|
|
.m_Image = m_ImageManager->CreateDepthStencilImage(createInfo),
|
|
.m_Name = createInfo.m_Name,
|
|
.m_ViewType = vk::ImageViewType::e2D,
|
|
.m_AspectMask = vk::ImageAspectFlagBits::eDepth | vk::ImageAspectFlagBits::eStencil,
|
|
});
|
|
}
|
|
};
|
|
|
|
BufferManager m_Buffers;
|
|
ImageManager m_Images;
|
|
SamplerManager m_Samplers;
|
|
ImageViewManager m_Views;
|
|
CombinedImageViewManager m_CombinedImageViews;
|
|
|
|
public:
|
|
ResourceManager(const Device *device, u32 maxBufferCount, u32 maxImageCount, u32 maxSamplerCount, u32 maxViewCount)
|
|
: m_Buffers{device, maxBufferCount}
|
|
, m_Images{device, maxImageCount}
|
|
, m_Samplers{device, maxSamplerCount}
|
|
, m_Views{device, maxViewCount}
|
|
, m_CombinedImageViews{&m_Images, &m_Views}
|
|
{
|
|
}
|
|
|
|
BufferManager &
|
|
Buffers()
|
|
{
|
|
return m_Buffers;
|
|
}
|
|
|
|
ImageManager &
|
|
Images()
|
|
{
|
|
return m_Images;
|
|
}
|
|
|
|
ImageViewManager &
|
|
Views()
|
|
{
|
|
return m_Views;
|
|
}
|
|
|
|
SamplerManager &
|
|
Samplers()
|
|
{
|
|
return m_Samplers;
|
|
}
|
|
|
|
CombinedImageViewManager &
|
|
CombinedImageViews()
|
|
{
|
|
return m_CombinedImageViews;
|
|
}
|
|
|
|
void
|
|
Update()
|
|
{
|
|
m_Views.Sweep();
|
|
m_Images.Sweep();
|
|
m_Buffers.Sweep();
|
|
m_Samplers.Sweep();
|
|
}
|
|
|
|
~ResourceManager() = default;
|
|
|
|
PIN_MEMORY(ResourceManager);
|
|
};
|
|
} // namespace systems
|