From 0c6d0de3ab90024ca6b02dd83bf0e64931ff47e2 Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Sat, 23 Mar 2019 14:58:37 +0100 Subject: [PATCH] - do not use persistent buffers for models as it is a limited resource where each consumes a vkDeviceMemory object --- src/rendering/vulkan/system/vk_buffers.cpp | 20 +++++++++++++++++--- src/rendering/vulkan/system/vk_buffers.h | 2 ++ 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/src/rendering/vulkan/system/vk_buffers.cpp b/src/rendering/vulkan/system/vk_buffers.cpp index 79d5af4f1..c5a3d780d 100644 --- a/src/rendering/vulkan/system/vk_buffers.cpp +++ b/src/rendering/vulkan/system/vk_buffers.cpp @@ -110,15 +110,29 @@ void VKBuffer::Unmap() void *VKBuffer::Lock(unsigned int size) { - SetData(size, nullptr, false); - if (!mPersistent) + if (!mBuffer) + { + // The model mesh loaders lock multiple non-persistent buffers at the same time. This is not allowed in vulkan. + // VkDeviceMemory can only be mapped once and multiple non-persistent buffers may come from the same device memory object. + mStaticUpload.Resize(size); + map = mStaticUpload.Data(); + } + else if (!mPersistent) + { map = mBuffer->Map(0, size); + } return map; } void VKBuffer::Unlock() { - if (!mPersistent) + if (!mBuffer) + { + map = nullptr; + SetData(mStaticUpload.Size(), mStaticUpload.Data(), true); + mStaticUpload.Clear(); + } + else if (!mPersistent) { mBuffer->Unmap(); map = nullptr; diff --git a/src/rendering/vulkan/system/vk_buffers.h b/src/rendering/vulkan/system/vk_buffers.h index 139924bc3..0477f1b68 100644 --- a/src/rendering/vulkan/system/vk_buffers.h +++ b/src/rendering/vulkan/system/vk_buffers.h @@ -2,6 +2,7 @@ #include "hwrenderer/data/buffers.h" #include "vk_objects.h" +#include "utility/tarray.h" #ifdef _MSC_VER // silence bogus warning C4250: 'VKVertexBuffer': inherits 'VKBuffer::VKBuffer::SetData' via dominance @@ -28,6 +29,7 @@ public: std::unique_ptr mBuffer; std::unique_ptr mStaging; bool mPersistent = false; + TArray mStaticUpload; }; class VKVertexBuffer : public IVertexBuffer, public VKBuffer