diff --git a/src/rendering/vulkan/renderer/vk_renderstate.cpp b/src/rendering/vulkan/renderer/vk_renderstate.cpp index 2f55fee24..1f5bc5203 100644 --- a/src/rendering/vulkan/renderer/vk_renderstate.cpp +++ b/src/rendering/vulkan/renderer/vk_renderstate.cpp @@ -373,11 +373,10 @@ void VkRenderState::ApplyPushConstants() void VkRenderState::ApplyMatrices() { - auto fb = GetVulkanFrameBuffer(); - if (!fb->MatrixBuffer->Write(mModelMatrix, mModelMatrixEnabled, mTextureMatrix, mTextureMatrixEnabled)) + if (!mMatrixBufferWriter.Write(mModelMatrix, mModelMatrixEnabled, mTextureMatrix, mTextureMatrixEnabled)) { WaitForStreamBuffers(); - fb->MatrixBuffer->Write(mModelMatrix, mModelMatrixEnabled, mTextureMatrix, mTextureMatrixEnabled); + mMatrixBufferWriter.Write(mModelMatrix, mModelMatrixEnabled, mTextureMatrix, mTextureMatrixEnabled); } } @@ -421,7 +420,7 @@ void VkRenderState::ApplyMaterial() void VkRenderState::ApplyDynamicSet() { auto fb = GetVulkanFrameBuffer(); - uint32_t matrixOffset = fb->MatrixBuffer->Offset(); + uint32_t matrixOffset = mMatrixBufferWriter.Offset(); uint32_t streamDataOffset = mStreamBufferWriter.StreamDataOffset(); if (mViewpointOffset != mLastViewpointOffset || matrixOffset != mLastMatricesOffset || streamDataOffset != mLastStreamDataOffset) { @@ -442,7 +441,7 @@ void VkRenderState::WaitForStreamBuffers() GetVulkanFrameBuffer()->WaitForCommands(false); mApplyCount = 0; mStreamBufferWriter.Reset(); - GetVulkanFrameBuffer()->MatrixBuffer->Reset(); + mMatrixBufferWriter.Reset(); } void VkRenderState::Bind(int bindingpoint, uint32_t offset) @@ -478,7 +477,7 @@ void VkRenderState::EndRenderPass() void VkRenderState::EndFrame() { - GetVulkanFrameBuffer()->MatrixBuffer->Reset(); + mMatrixBufferWriter.Reset(); mStreamBufferWriter.Reset(); } diff --git a/src/rendering/vulkan/renderer/vk_renderstate.h b/src/rendering/vulkan/renderer/vk_renderstate.h index 58582e0b0..73c777eb0 100644 --- a/src/rendering/vulkan/renderer/vk_renderstate.h +++ b/src/rendering/vulkan/renderer/vk_renderstate.h @@ -99,6 +99,7 @@ protected: uint32_t mViewpointOffset = 0; VkStreamBufferWriter mStreamBufferWriter; + VkMatrixBufferWriter mMatrixBufferWriter; int mLastVertexOffsets[2] = { 0, 0 }; IVertexBuffer *mLastVertexBuffer = nullptr; diff --git a/src/rendering/vulkan/renderer/vk_streambuffer.cpp b/src/rendering/vulkan/renderer/vk_streambuffer.cpp index b8377ba40..58eed4911 100644 --- a/src/rendering/vulkan/renderer/vk_streambuffer.cpp +++ b/src/rendering/vulkan/renderer/vk_streambuffer.cpp @@ -4,14 +4,12 @@ #include "vulkan/system/vk_builders.h" #include "vulkan/renderer/vk_streambuffer.h" -template -int UniformBufferAlignedSize(int count) { return ((sizeof(T) + screen->uniformblockalignment - 1) / screen->uniformblockalignment * screen->uniformblockalignment) * count; } - -VkStreamBuffer::VkStreamBuffer() +VkStreamBuffer::VkStreamBuffer(size_t structSize, size_t count) { - auto fb = GetVulkanFrameBuffer(); - UniformBuffer = (VKDataBuffer*)fb->CreateDataBuffer(-1, false, false); - UniformBuffer->SetData(UniformBufferAlignedSize(200), nullptr, false); + mBlockSize = static_cast((structSize + screen->uniformblockalignment - 1) / screen->uniformblockalignment * screen->uniformblockalignment); + + UniformBuffer = (VKDataBuffer*)GetVulkanFrameBuffer()->CreateDataBuffer(-1, false, false); + UniformBuffer->SetData(mBlockSize * count, nullptr, false); } VkStreamBuffer::~VkStreamBuffer() @@ -21,8 +19,8 @@ VkStreamBuffer::~VkStreamBuffer() uint32_t VkStreamBuffer::NextStreamDataBlock() { - mStreamDataOffset += sizeof(StreamUBO); - if (mStreamDataOffset + sizeof(StreamUBO) >= UniformBuffer->Size()) + mStreamDataOffset += mBlockSize; + if (mStreamDataOffset + (size_t)mBlockSize >= UniformBuffer->Size()) { mStreamDataOffset = 0; return 0xffffffff; @@ -61,18 +59,10 @@ void VkStreamBufferWriter::Reset() ///////////////////////////////////////////////////////////////////////////// -VkMatrixBuffer::VkMatrixBuffer() +VkMatrixBufferWriter::VkMatrixBufferWriter() { + mBuffer = GetVulkanFrameBuffer()->MatrixBuffer; mIdentityMatrix.loadIdentity(); - - auto fb = GetVulkanFrameBuffer(); - UniformBuffer = (VKDataBuffer*)fb->CreateDataBuffer(-1, false, false); - UniformBuffer->SetData(UniformBufferAlignedSize(50000), nullptr, false); -} - -VkMatrixBuffer::~VkMatrixBuffer() -{ - delete UniformBuffer; } template @@ -92,7 +82,7 @@ static void BufferedSet(bool& modified, VSMatrix& dst, const VSMatrix& src) modified = true; } -bool VkMatrixBuffer::Write(const VSMatrix& modelMatrix, bool modelMatrixEnabled, const VSMatrix& textureMatrix, bool textureMatrixEnabled) +bool VkMatrixBufferWriter::Write(const VSMatrix& modelMatrix, bool modelMatrixEnabled, const VSMatrix& textureMatrix, bool textureMatrixEnabled) { bool modified = (mOffset == 0); // always modified first call @@ -119,17 +109,19 @@ bool VkMatrixBuffer::Write(const VSMatrix& modelMatrix, bool modelMatrixEnabled, if (modified) { - if (mOffset + (size_t)UniformBufferAlignedSize(2) >= UniformBuffer->Size()) + mOffset = mBuffer->NextStreamDataBlock(); + if (mOffset == 0xffffffff) return false; - mOffset += UniformBufferAlignedSize(1); - memcpy(static_cast(UniformBuffer->Memory()) + mOffset, &mMatrices, sizeof(MatricesUBO)); + uint8_t* ptr = (uint8_t*)mBuffer->UniformBuffer->Memory(); + memcpy(ptr + mOffset, &mMatrices, sizeof(MatricesUBO)); } return true; } -void VkMatrixBuffer::Reset() +void VkMatrixBufferWriter::Reset() { mOffset = 0; + mBuffer->Reset(); } diff --git a/src/rendering/vulkan/renderer/vk_streambuffer.h b/src/rendering/vulkan/renderer/vk_streambuffer.h index da1a5bf83..21c15867a 100644 --- a/src/rendering/vulkan/renderer/vk_streambuffer.h +++ b/src/rendering/vulkan/renderer/vk_streambuffer.h @@ -5,6 +5,7 @@ #include "vulkan/shaders/vk_shader.h" class VkStreamBuffer; +class VkMatrixBuffer; class VkStreamBufferWriter { @@ -23,10 +24,27 @@ private: uint32_t mStreamDataOffset = 0; }; +class VkMatrixBufferWriter +{ +public: + VkMatrixBufferWriter(); + + bool Write(const VSMatrix& modelMatrix, bool modelMatrixEnabled, const VSMatrix& textureMatrix, bool textureMatrixEnabled); + void Reset(); + + uint32_t Offset() const { return mOffset; } + +private: + VkStreamBuffer* mBuffer; + MatricesUBO mMatrices = {}; + VSMatrix mIdentityMatrix; + uint32_t mOffset = 0; +}; + class VkStreamBuffer { public: - VkStreamBuffer(); + VkStreamBuffer(size_t structSize, size_t count); ~VkStreamBuffer(); uint32_t NextStreamDataBlock(); @@ -35,24 +53,6 @@ public: VKDataBuffer* UniformBuffer = nullptr; private: + uint32_t mBlockSize = 0; uint32_t mStreamDataOffset = 0; }; - -class VkMatrixBuffer -{ -public: - VkMatrixBuffer(); - ~VkMatrixBuffer(); - - bool Write(const VSMatrix &modelMatrix, bool modelMatrixEnabled, const VSMatrix& textureMatrix, bool textureMatrixEnabled); - void Reset(); - - uint32_t Offset() const { return mOffset; } - - VKDataBuffer* UniformBuffer = nullptr; - -private: - MatricesUBO mMatrices = {}; - VSMatrix mIdentityMatrix; - uint32_t mOffset = 0; -}; diff --git a/src/rendering/vulkan/system/vk_framebuffer.cpp b/src/rendering/vulkan/system/vk_framebuffer.cpp index 5b36207e1..b8f49edc8 100644 --- a/src/rendering/vulkan/system/vk_framebuffer.cpp +++ b/src/rendering/vulkan/system/vk_framebuffer.cpp @@ -159,8 +159,8 @@ void VulkanFrameBuffer::InitializeState() CreateFanToTrisIndexBuffer(); // To do: move this to HW renderer interface maybe? - MatrixBuffer = new VkMatrixBuffer(); - StreamBuffer = new VkStreamBuffer(); + MatrixBuffer = new VkStreamBuffer(sizeof(MatricesUBO), 50000); + StreamBuffer = new VkStreamBuffer(sizeof(StreamUBO), 200); mShaderManager.reset(new VkShaderManager(device)); mSamplerManager.reset(new VkSamplerManager(device)); diff --git a/src/rendering/vulkan/system/vk_framebuffer.h b/src/rendering/vulkan/system/vk_framebuffer.h index b157bd100..9843851bf 100644 --- a/src/rendering/vulkan/system/vk_framebuffer.h +++ b/src/rendering/vulkan/system/vk_framebuffer.h @@ -10,7 +10,6 @@ class VkShaderManager; class VkRenderPassManager; class VkRenderState; class VkStreamBuffer; -class VkMatrixBuffer; class VKDataBuffer; class VkHardwareTexture; class VkRenderBuffers; @@ -42,7 +41,7 @@ public: VKDataBuffer *ViewpointUBO = nullptr; VKDataBuffer *LightBufferSSO = nullptr; - VkMatrixBuffer *MatrixBuffer = nullptr; + VkStreamBuffer *MatrixBuffer = nullptr; VkStreamBuffer *StreamBuffer = nullptr; VKDataBuffer *LightNodes = nullptr;