111 lines
2.3 KiB
C++
111 lines
2.3 KiB
C++
// =============================================
|
|
// Aster: pipeline_utils.h
|
|
// Copyright (c) 2020-2024 Anish Bhobe
|
|
// =============================================
|
|
|
|
#pragma once
|
|
|
|
#include "global.h"
|
|
|
|
#include <EASTL/deque.h>
|
|
#include <EASTL/stack.h>
|
|
|
|
struct Device;
|
|
struct Texture;
|
|
struct UniformStorageBuffer;
|
|
|
|
struct RenderResourceManager;
|
|
|
|
struct Handle
|
|
{
|
|
u32 m_Index;
|
|
};
|
|
|
|
struct BufferHandle : Handle
|
|
{
|
|
};
|
|
|
|
struct TextureHandle : Handle
|
|
{
|
|
};
|
|
|
|
struct FreeList
|
|
{
|
|
eastl::stack<u32, eastl::deque<u32>> m_List;
|
|
u32 m_MaxVisited = 0;
|
|
u32 m_MaxCapacity = 16;
|
|
|
|
void
|
|
Init(u32 maxCapacity)
|
|
{
|
|
m_MaxCapacity = maxCapacity;
|
|
}
|
|
|
|
[[nodiscard]] u32
|
|
Alloc()
|
|
{
|
|
if (!m_List.empty())
|
|
{
|
|
const u32 value = m_List.top();
|
|
m_List.pop();
|
|
return value;
|
|
}
|
|
if (m_MaxVisited < m_MaxCapacity)
|
|
{
|
|
return m_MaxVisited++;
|
|
}
|
|
ERROR("Out of Handles.") THEN_ABORT(-1);
|
|
}
|
|
|
|
void
|
|
Free(u32 index)
|
|
{
|
|
WARN_IF(index >= m_MaxCapacity, "Trying to free an out-of-bounds index.");
|
|
|
|
if (index < m_MaxCapacity)
|
|
m_List.push(index);
|
|
}
|
|
};
|
|
|
|
struct RenderResourceManager
|
|
{
|
|
private:
|
|
union WriteInfo {
|
|
vk::DescriptorBufferInfo uBufferInfo;
|
|
vk::DescriptorImageInfo uImageInfo;
|
|
vk::BufferView uBufferView;
|
|
|
|
explicit WriteInfo(vk::DescriptorBufferInfo info);
|
|
explicit WriteInfo(vk::DescriptorImageInfo info);
|
|
explicit WriteInfo(vk::BufferView info);
|
|
};
|
|
|
|
eastl::deque<WriteInfo> m_WriteInfos;
|
|
eastl::vector<vk::WriteDescriptorSet> m_Writes;
|
|
|
|
vk::Sampler m_Sampler;
|
|
|
|
FreeList m_BufferFreeList;
|
|
FreeList m_TextureFreeList;
|
|
|
|
public:
|
|
const Device *m_Device;
|
|
|
|
constexpr static u32 BUFFER_BINDING_INDEX = 0;
|
|
constexpr static u32 TEXTURE_BINDING_INDEX = 1;
|
|
|
|
vk::DescriptorPool m_DescriptorPool;
|
|
vk::DescriptorSetLayout m_SetLayout;
|
|
vk::DescriptorSet m_DescriptorSet;
|
|
|
|
BufferHandle Commit(const UniformStorageBuffer *storageBuffer);
|
|
void Release(BufferHandle handle);
|
|
TextureHandle Commit(const Texture *texture);
|
|
void Release(TextureHandle handle);
|
|
|
|
void Update();
|
|
|
|
// Ctor/Dtor
|
|
explicit RenderResourceManager(const Device *device, u16 maxSize);
|
|
~RenderResourceManager();
|
|
}; |