Files
flower/source/engine/rhi/dynamic_uniform_buffer.h
2023-04-23 21:57:20 +08:00

49 lines
1.2 KiB
C++

#pragma once
#include "rhi_misc.h"
namespace engine
{
class VulkanBuffer;
class VulkanContext;
// A ring dynamic uniform buffer.
class DynamicUniformBuffer
{
private:
// Increment state.
bool m_bShouldIncSize = false;
// Fix config.
VulkanContext* m_context = nullptr;
uint32_t m_incrementSize = 0;
uint32_t m_frameLoopNum = 0;
uint32_t m_alginMin = 0;
uint32_t m_totoalSize;
// Dynamic change state.
std::vector<std::unique_ptr<VulkanBuffer>> m_buffers;
std::vector<VkDescriptorSet> m_sets;
std::vector<VkDescriptorSetLayout> m_layouts;
uint32_t m_currentFrameID = 0;
uint32_t m_usedSize = 0;
public:
explicit DynamicUniformBuffer(VulkanContext* context, uint32_t frameNum, uint32_t initSize, uint32_t incrementSize);
~DynamicUniformBuffer();
// Call this when frame start.
void onFrameStart();
uint32_t getAlignSize(uint32_t src) const;
uint32_t alloc(uint32_t size);
const VulkanBuffer* getBuffer() const { return m_buffers[m_currentFrameID].get(); }
VkDescriptorSet getSet() const { return m_sets[m_currentFrameID]; }
VkDescriptorSetLayout getSetlayout() const { return m_layouts[m_currentFrameID]; }
private:
void releaseAndInit();
};
}