Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mapsme/omim.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/drape
diff options
context:
space:
mode:
authorr.kuznetsov <r.kuznetsov@corp.mail.ru>2019-02-18 13:47:19 +0300
committerDaria Volvenkova <d.volvenkova@corp.mail.ru>2019-03-01 10:45:24 +0300
commit2ea093139dda41aeebd168464ae51f036270583e (patch)
tree005ccaf6b30ee7bceddab62f0e8fd7e742797bfe /drape
parent85ca336419815dfce4035983bf7c204c3cc89720 (diff)
[vulkan] Fixed index buffers
Diffstat (limited to 'drape')
-rw-r--r--drape/index_buffer.cpp15
-rw-r--r--drape/vulkan/vulkan_gpu_buffer_impl.hpp17
-rw-r--r--drape/vulkan/vulkan_object_manager.cpp9
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);
}