diff options
author | r.kuznetsov <r.kuznetsov@corp.mail.ru> | 2019-02-18 13:47:19 +0300 |
---|---|---|
committer | Daria Volvenkova <d.volvenkova@corp.mail.ru> | 2019-03-01 10:45:24 +0300 |
commit | 2ea093139dda41aeebd168464ae51f036270583e (patch) | |
tree | 005ccaf6b30ee7bceddab62f0e8fd7e742797bfe /drape | |
parent | 85ca336419815dfce4035983bf7c204c3cc89720 (diff) |
[vulkan] Fixed index buffers
Diffstat (limited to 'drape')
-rw-r--r-- | drape/index_buffer.cpp | 15 | ||||
-rw-r--r-- | drape/vulkan/vulkan_gpu_buffer_impl.hpp | 17 | ||||
-rw-r--r-- | drape/vulkan/vulkan_object_manager.cpp | 9 |
3 files changed, 20 insertions, 21 deletions
diff --git a/drape/index_buffer.cpp b/drape/index_buffer.cpp index 772236e850..f10dbed188 100644 --- a/drape/index_buffer.cpp +++ b/drape/index_buffer.cpp @@ -20,19 +20,6 @@ void IndexBuffer::UpdateData(ref_ptr<GraphicsContext> context, void const * data if (size == 0) return; - GetBuffer()->Seek(0); - if (context->GetApiVersion() == dp::ApiVersion::Vulkan) - { - // For Vulkan we can't update by means of UploadData, because UploadData can be called from - // BR, where command buffers are not available. - auto ptr = GetBuffer()->Map(context, 0, size); - CHECK(ptr != nullptr, ()); - GetBuffer()->UpdateData(ptr, data, 0, size); - GetBuffer()->Unmap(context); - } - else - { - UploadData(context, data, size); - } + UploadData(context, data, size); } } // namespace dp diff --git a/drape/vulkan/vulkan_gpu_buffer_impl.hpp b/drape/vulkan/vulkan_gpu_buffer_impl.hpp index 5069a6a79f..4d99786fde 100644 --- a/drape/vulkan/vulkan_gpu_buffer_impl.hpp +++ b/drape/vulkan/vulkan_gpu_buffer_impl.hpp @@ -32,6 +32,8 @@ public: uint32_t elementOffset, uint32_t elementCount); void Unmap(ref_ptr<VulkanBaseContext> context); + void Advance(uint32_t elementCount) { BufferBase::UploadData(elementCount); } + VkBuffer GetVulkanBuffer() const { return m_geometryBuffer.m_buffer; } protected: @@ -66,9 +68,18 @@ public: void UploadData(ref_ptr<GraphicsContext> context, void const * data, uint32_t elementCount) override { - // For Vulkan we can't update buffers by means of UploadData, because UploadData - // can be called from BR, where command buffers are not available. - CHECK(false, ("UploadData is unsupported for Vulkan buffers (use Map-Copy-Unmap).")); + // In Vulkan we must call upload only from FR. + ref_ptr<VulkanBaseContext> vulkanContext = context; + CHECK(vulkanContext->GetCurrentMemoryCommandBuffer() != nullptr, ()); + + uint32_t const currentSize = m_buffer->GetCurrentSize(); + ASSERT(m_buffer->GetCapacity() >= elementCount + currentSize, + ("Not enough memory to upload ", elementCount, " elements")); + auto ptr = m_buffer->Map(context, currentSize, elementCount); + CHECK(ptr != nullptr, ()); + m_buffer->UpdateData(ptr, data, 0, elementCount); + m_buffer->Unmap(context); + m_buffer->Advance(elementCount); } void UpdateData(void * destPtr, void const * srcPtr, uint32_t elementOffset, diff --git a/drape/vulkan/vulkan_object_manager.cpp b/drape/vulkan/vulkan_object_manager.cpp index 1df19bb9fd..f20705e6ad 100644 --- a/drape/vulkan/vulkan_object_manager.cpp +++ b/drape/vulkan/vulkan_object_manager.cpp @@ -3,6 +3,7 @@ #include "base/macros.hpp" #include <algorithm> +#include <cstring> namespace dp { @@ -303,12 +304,12 @@ void VulkanObjectManager::UnmapUnsafe(VulkanObject object) void VulkanObjectManager::Fill(VulkanObject object, void const * data, uint32_t sizeInBytes) { - if (data == nullptr) - return; - std::lock_guard<std::mutex> lock(m_mutex); void * gpuPtr = MapUnsafe(object); - memcpy(gpuPtr, data, sizeInBytes); + if (data != nullptr) + memcpy(gpuPtr, data, sizeInBytes); + else + memset(gpuPtr, 0, sizeInBytes); FlushUnsafe(object); UnmapUnsafe(object); } |