15 void Push(
void* data, std::size_t size)
17 if (this->m_Size != size)
19 this->m_Size =
static_cast<uint32_t
>(size);
20 m_HandlerStatus = Buffer::Status::Reset;
24 if (!m_UniformBlock || !m_StorageBuffer)
31 m_StorageBuffer->MapMemory(&this->m_Data);
36 if (m_HandlerStatus == Buffer::Status::Changed ||
37 std::memcmp(
static_cast<char*
>(this->m_Data), data, size) != 0)
39 std::memcpy(
static_cast<char*
>(this->m_Data), data, size);
40 m_HandlerStatus = Buffer::Status::Changed;
45 void Push(
const T&
object, std::size_t offset, std::size_t size)
47 if (!m_UniformBlock || !m_StorageBuffer)
54 m_StorageBuffer->MapMemory(&this->m_Data);
59 if (m_HandlerStatus == Buffer::Status::Changed ||
60 std::memcmp(
static_cast<char*
>(this->m_Data) + offset, &
object, size) != 0)
62 std::memcpy(
static_cast<char*
>(this->m_Data) + offset, &
object, size);
63 m_HandlerStatus = Buffer::Status::Changed;
68 void Push(
const std::string& uniformName,
const T&
object, std::size_t size = 0)
75 auto uniform = m_UniformBlock->GetUniform(uniformName);
84 realSize = std::min(
sizeof(
object),
static_cast<std::size_t
>(uniform->GetSize()));
87 Push(
object,
static_cast<std::size_t
>(uniform->GetOffset()), realSize);
90 bool Update(
const std::optional<Shader::UniformBlock>& uniformBlock);
94 return m_StorageBuffer.get();
99 std::optional<Shader::UniformBlock> m_UniformBlock;
101 void* m_Data =
nullptr;
102 bool m_Bound =
false;
103 std::unique_ptr<StorageBuffer> m_StorageBuffer;
104 Buffer::Status m_HandlerStatus;