diff --git a/src/rendering/vulkan/renderer/vk_renderstate.cpp b/src/rendering/vulkan/renderer/vk_renderstate.cpp index c2fc30875..20d29fa47 100644 --- a/src/rendering/vulkan/renderer/vk_renderstate.cpp +++ b/src/rendering/vulkan/renderer/vk_renderstate.cpp @@ -327,6 +327,9 @@ void VkRenderState::ApplyStreamData() { mDataIndex = 0; mStreamDataOffset += sizeof(StreamUBO); + + if (mStreamDataOffset + sizeof(StreamUBO) >= fb->StreamUBO->Size()) + WaitForStreamBuffers(); } uint8_t *ptr = (uint8_t*)fb->StreamUBO->Memory(); memcpy(ptr + mStreamDataOffset + sizeof(StreamData) * mDataIndex, &mStreamData, sizeof(StreamData)); @@ -420,11 +423,11 @@ void VkRenderState::ApplyMatrices() { auto fb = GetVulkanFrameBuffer(); - if (mMatricesOffset + (fb->UniformBufferAlignedSize() << 1) < fb->MatricesUBO->Size()) - { - mMatricesOffset += fb->UniformBufferAlignedSize(); - memcpy(static_cast(fb->MatricesUBO->Memory()) + mMatricesOffset, &mMatrices, sizeof(MatricesUBO)); - } + if (mMatricesOffset + (fb->UniformBufferAlignedSize() << 1) >= fb->MatricesUBO->Size()) + WaitForStreamBuffers(); + + mMatricesOffset += fb->UniformBufferAlignedSize(); + memcpy(static_cast(fb->MatricesUBO->Memory()) + mMatricesOffset, &mMatrices, sizeof(MatricesUBO)); } } @@ -481,6 +484,16 @@ void VkRenderState::ApplyDynamicSet() } } +void VkRenderState::WaitForStreamBuffers() +{ + EndRenderPass(); + GetVulkanFrameBuffer()->WaitForCommands(false); + mApplyCount = 0; + mStreamDataOffset = 0; + mDataIndex = 0; + mMatricesOffset = 0; +} + void VkRenderState::Bind(int bindingpoint, uint32_t offset) { if (bindingpoint == VIEWPOINT_BINDINGPOINT) diff --git a/src/rendering/vulkan/renderer/vk_renderstate.h b/src/rendering/vulkan/renderer/vk_renderstate.h index ef58804b7..6848d15a5 100644 --- a/src/rendering/vulkan/renderer/vk_renderstate.h +++ b/src/rendering/vulkan/renderer/vk_renderstate.h @@ -63,6 +63,7 @@ protected: void ApplyVertexBuffers(); void ApplyMaterial(); + void WaitForStreamBuffers(); void BeginRenderPass(VulkanCommandBuffer *cmdbuffer); bool mDepthClamp = true;