Added per-frame update of gpu transforms buffer
This commit is contained in:
parent
cb31628e66
commit
495d2b4b66
|
@ -86,6 +86,23 @@ namespace SHADE
|
||||||
matPropsBuffer.Free();
|
matPropsBuffer.Free();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SHBatch::UpdateTransformBuffer()
|
||||||
|
{
|
||||||
|
// Reset Transform Data
|
||||||
|
transformData.clear();
|
||||||
|
|
||||||
|
// Populate on the CPU
|
||||||
|
for (auto& subBatch : subBatches)
|
||||||
|
for (const SHRenderable* renderable : subBatch.Renderables)
|
||||||
|
{
|
||||||
|
// Transform
|
||||||
|
transformData.emplace_back(renderable->TransformMatrix);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Transfer to GPU
|
||||||
|
transformDataBuffer->WriteToMemory(transformData.data(), transformData.size() * sizeof(SHMatrix), 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
void SHBatch::Build(Handle<SHVkLogicalDevice> device)
|
void SHBatch::Build(Handle<SHVkLogicalDevice> device)
|
||||||
{
|
{
|
||||||
// No need to build as there are no changes
|
// No need to build as there are no changes
|
||||||
|
@ -159,36 +176,27 @@ namespace SHADE
|
||||||
// Send all buffered data to the GPU buffers
|
// Send all buffered data to the GPU buffers
|
||||||
using BuffUsage = vk::BufferUsageFlagBits;
|
using BuffUsage = vk::BufferUsageFlagBits;
|
||||||
// - Draw Data
|
// - Draw Data
|
||||||
if (drawDataBuffer)
|
|
||||||
drawDataBuffer->Unmap();
|
|
||||||
const uint32_t DRAW_DATA_BYTES = static_cast<uint32_t>(drawData.size() * sizeof(vk::DrawIndexedIndirectCommand));
|
const uint32_t DRAW_DATA_BYTES = static_cast<uint32_t>(drawData.size() * sizeof(vk::DrawIndexedIndirectCommand));
|
||||||
SHVkUtil::EnsureBufferAndCopyHostVisibleData
|
SHVkUtil::EnsureBufferAndCopyHostVisibleData
|
||||||
(
|
(
|
||||||
device, drawDataBuffer, drawData.data(), DRAW_DATA_BYTES,
|
device, drawDataBuffer, drawData.data(), DRAW_DATA_BYTES,
|
||||||
BuffUsage::eIndirectBuffer
|
BuffUsage::eIndirectBuffer
|
||||||
);
|
);
|
||||||
drawDataBuffer->Map();
|
|
||||||
// - Transform Buffer
|
// - Transform Buffer
|
||||||
if (transformDataBuffer)
|
|
||||||
transformDataBuffer->Unmap();
|
|
||||||
const uint32_t TF_DATA_BYTES = static_cast<uint32_t>(transformData.size() * sizeof(SHMatrix));
|
const uint32_t TF_DATA_BYTES = static_cast<uint32_t>(transformData.size() * sizeof(SHMatrix));
|
||||||
SHVkUtil::EnsureBufferAndCopyHostVisibleData
|
SHVkUtil::EnsureBufferAndCopyHostVisibleData
|
||||||
(
|
(
|
||||||
device, transformDataBuffer, transformData.data(), TF_DATA_BYTES,
|
device, transformDataBuffer, transformData.data(), TF_DATA_BYTES,
|
||||||
BuffUsage::eVertexBuffer
|
BuffUsage::eVertexBuffer
|
||||||
);
|
);
|
||||||
transformDataBuffer->Map();
|
|
||||||
// - Material Properties Buffer
|
// - Material Properties Buffer
|
||||||
if (!EMPTY_MAT_PROPS)
|
if (!EMPTY_MAT_PROPS)
|
||||||
{
|
{
|
||||||
if (matPropsBuffer)
|
|
||||||
matPropsBuffer->Unmap();
|
|
||||||
SHVkUtil::EnsureBufferAndCopyHostVisibleData
|
SHVkUtil::EnsureBufferAndCopyHostVisibleData
|
||||||
(
|
(
|
||||||
device, matPropsBuffer, matPropsData.get(), static_cast<uint32_t>(matPropTotalBytes),
|
device, matPropsBuffer, matPropsData.get(), static_cast<uint32_t>(matPropTotalBytes),
|
||||||
BuffUsage::eStorageBuffer
|
BuffUsage::eStorageBuffer
|
||||||
);
|
);
|
||||||
matPropsBuffer->Map();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
isDirty = false;
|
isDirty = false;
|
||||||
|
|
|
@ -71,6 +71,7 @@ namespace SHADE
|
||||||
void Add(const SHRenderable* renderable);
|
void Add(const SHRenderable* renderable);
|
||||||
void Remove(const SHRenderable* renderable);
|
void Remove(const SHRenderable* renderable);
|
||||||
void Clear();
|
void Clear();
|
||||||
|
void UpdateTransformBuffer();
|
||||||
void Build(Handle<SHVkLogicalDevice> device);
|
void Build(Handle<SHVkLogicalDevice> device);
|
||||||
void Draw(Handle<SHVkCommandBuffer> cmdBuffer);
|
void Draw(Handle<SHVkCommandBuffer> cmdBuffer);
|
||||||
|
|
||||||
|
|
|
@ -109,6 +109,14 @@ namespace SHADE
|
||||||
superBatches.clear();
|
superBatches.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SHBatcher::UpdateTransformBuffer()
|
||||||
|
{
|
||||||
|
for (auto& batch : superBatches)
|
||||||
|
{
|
||||||
|
batch->UpdateTransformBuffer();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void SHBatcher::RegisterSuperBatch(Handle<SHSuperBatch> superBatch)
|
void SHBatcher::RegisterSuperBatch(Handle<SHSuperBatch> superBatch)
|
||||||
{
|
{
|
||||||
superBatches.emplace_back(superBatch);
|
superBatches.emplace_back(superBatch);
|
||||||
|
|
|
@ -53,6 +53,7 @@ namespace SHADE
|
||||||
void RemoveFromBatch(SHRenderable const* renderable);
|
void RemoveFromBatch(SHRenderable const* renderable);
|
||||||
void FinaliseBatches(Handle<SHVkLogicalDevice> device);
|
void FinaliseBatches(Handle<SHVkLogicalDevice> device);
|
||||||
void ClearBatches();
|
void ClearBatches();
|
||||||
|
void UpdateTransformBuffer();
|
||||||
void RegisterSuperBatch(Handle<SHSuperBatch> superBatch);
|
void RegisterSuperBatch(Handle<SHSuperBatch> superBatch);
|
||||||
void DeregisterSuperBatch(Handle<SHSuperBatch> superBatch);
|
void DeregisterSuperBatch(Handle<SHSuperBatch> superBatch);
|
||||||
|
|
||||||
|
|
|
@ -78,6 +78,14 @@ namespace SHADE
|
||||||
batches.clear();
|
batches.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SHSuperBatch::UpdateTransformBuffer()
|
||||||
|
{
|
||||||
|
for (auto& batch : batches)
|
||||||
|
{
|
||||||
|
batch.UpdateTransformBuffer();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void SHSuperBatch::Build(Handle<SHVkLogicalDevice> device) noexcept
|
void SHSuperBatch::Build(Handle<SHVkLogicalDevice> device) noexcept
|
||||||
{
|
{
|
||||||
// Build all batches
|
// Build all batches
|
||||||
|
|
|
@ -55,6 +55,7 @@ namespace SHADE
|
||||||
void Add(const SHRenderable* renderable) noexcept;
|
void Add(const SHRenderable* renderable) noexcept;
|
||||||
void Remove(const SHRenderable* renderable) noexcept;
|
void Remove(const SHRenderable* renderable) noexcept;
|
||||||
void Clear() noexcept;
|
void Clear() noexcept;
|
||||||
|
void UpdateTransformBuffer();
|
||||||
void Build(Handle<SHVkLogicalDevice> device) noexcept;
|
void Build(Handle<SHVkLogicalDevice> device) noexcept;
|
||||||
void Draw(Handle<SHVkCommandBuffer> cmdBuffer) noexcept;
|
void Draw(Handle<SHVkCommandBuffer> cmdBuffer) noexcept;
|
||||||
|
|
||||||
|
|
|
@ -348,6 +348,9 @@ namespace SHADE
|
||||||
|
|
||||||
void SHSubpass::Execute(Handle<SHVkCommandBuffer>& commandBuffer) noexcept
|
void SHSubpass::Execute(Handle<SHVkCommandBuffer>& commandBuffer) noexcept
|
||||||
{
|
{
|
||||||
|
// Ensure correct transforms are provided
|
||||||
|
superBatch->UpdateTransformBuffer();
|
||||||
|
|
||||||
// Draw all the batches
|
// Draw all the batches
|
||||||
superBatch->Draw(commandBuffer);
|
superBatch->Draw(commandBuffer);
|
||||||
|
|
||||||
|
@ -626,6 +629,11 @@ namespace SHADE
|
||||||
batcher.FinaliseBatches(logicalDeviceHdl);
|
batcher.FinaliseBatches(logicalDeviceHdl);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SHRenderGraphNode::UpdateBatchTransforms()
|
||||||
|
{
|
||||||
|
batcher.UpdateTransformBuffer();
|
||||||
|
}
|
||||||
|
|
||||||
/***************************************************************************/
|
/***************************************************************************/
|
||||||
/*!
|
/*!
|
||||||
|
|
||||||
|
|
|
@ -231,6 +231,7 @@ namespace SHADE
|
||||||
void Execute (Handle<SHVkCommandBuffer>& commandBuffer, uint32_t frameIndex) noexcept;
|
void Execute (Handle<SHVkCommandBuffer>& commandBuffer, uint32_t frameIndex) noexcept;
|
||||||
Handle<SHVkPipeline> GetOrCreatePipeline (std::pair<Handle<SHVkShaderModule>, Handle<SHVkShaderModule>> const& vsFsPair, Handle<SHSubpass> subpass) noexcept;
|
Handle<SHVkPipeline> GetOrCreatePipeline (std::pair<Handle<SHVkShaderModule>, Handle<SHVkShaderModule>> const& vsFsPair, Handle<SHSubpass> subpass) noexcept;
|
||||||
void FinaliseBatch();
|
void FinaliseBatch();
|
||||||
|
void UpdateBatchTransforms();
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------*/
|
||||||
/* SETTERS AND GETTERS */
|
/* SETTERS AND GETTERS */
|
||||||
|
|
Loading…
Reference in New Issue