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-14 14:43:48 +0300
committerDaria Volvenkova <d.volvenkova@corp.mail.ru>2019-03-01 10:45:24 +0300
commitff589c4b54b190bf8e8dce32b35e7f75715705c8 (patch)
tree74870dadc99173f1d1e849a934025a9bccfa5ca7 /drape
parentd4dd122572599524f5841c04edb5c9de0d14ba7b (diff)
[vulkan] Binding info optimization
Diffstat (limited to 'drape')
-rw-r--r--drape/binding_info.cpp7
-rw-r--r--drape/binding_info.hpp10
-rw-r--r--drape/vertex_array_buffer.cpp9
-rw-r--r--drape/vertex_array_buffer.hpp7
-rw-r--r--drape/vulkan/vulkan_base_context.cpp8
-rw-r--r--drape/vulkan/vulkan_base_context.hpp2
-rw-r--r--drape/vulkan/vulkan_mesh_object_impl.cpp8
-rw-r--r--drape/vulkan/vulkan_pipeline.cpp16
-rw-r--r--drape/vulkan/vulkan_pipeline.hpp3
-rw-r--r--drape/vulkan/vulkan_vertex_array_buffer_impl.cpp14
10 files changed, 55 insertions, 29 deletions
diff --git a/drape/binding_info.cpp b/drape/binding_info.cpp
index f56b527f9c..fc0028879a 100644
--- a/drape/binding_info.cpp
+++ b/drape/binding_info.cpp
@@ -55,9 +55,10 @@ BindingInfo::BindingInfo()
{}
BindingInfo::BindingInfo(uint8_t count, uint8_t id)
- : m_bindings(count)
- , m_info((static_cast<uint16_t>(count) << 8) | id)
-{}
+ : m_info((static_cast<uint16_t>(count) << 8) | id)
+{
+ CHECK_LESS_OR_EQUAL(count, kMaxBindingDecl, ());
+}
uint8_t BindingInfo::GetCount() const
{
diff --git a/drape/binding_info.hpp b/drape/binding_info.hpp
index ce796a29da..62603faed3 100644
--- a/drape/binding_info.hpp
+++ b/drape/binding_info.hpp
@@ -4,11 +4,15 @@
#include "drape/glsl_func.hpp"
#include "drape/glsl_types.hpp"
+#include <array>
+#include <cstdint>
#include <string>
-#include <vector>
namespace dp
{
+size_t constexpr kMaxBindingDecl = 8;
+size_t constexpr kMaxBindingInfo = 2;
+
struct BindingDecl
{
std::string m_attributeName;
@@ -41,7 +45,7 @@ public:
bool operator<(BindingInfo const & other) const;
protected:
- std::vector<BindingDecl> m_bindings;
+ std::array<BindingDecl, kMaxBindingDecl> m_bindings;
uint16_t m_info;
};
@@ -58,6 +62,8 @@ uint8_t FillDecl(size_t index, std::string const & attrName, dp::BindingInfo & i
return sizeof(TFieldType);
}
+using BindingInfoArray = std::array<dp::BindingInfo, kMaxBindingInfo>;
+
template <typename TVertex>
class BindingFiller
{
diff --git a/drape/vertex_array_buffer.cpp b/drape/vertex_array_buffer.cpp
index 4375b404c1..b77dce0389 100644
--- a/drape/vertex_array_buffer.cpp
+++ b/drape/vertex_array_buffer.cpp
@@ -217,8 +217,8 @@ void VertexArrayBuffer::Build(ref_ptr<GraphicsContext> context, ref_ptr<GpuProgr
}
else if (apiVersion == dp::ApiVersion::Vulkan)
{
- CHECK(!m_bindingInfo.empty(), ());
- m_impl = CreateImplForVulkan(context, make_ref(this), std::move(m_bindingInfo));
+ CHECK_NOT_EQUAL(m_bindingInfoCount, 0, ());
+ m_impl = CreateImplForVulkan(context, make_ref(this), std::move(m_bindingInfo), m_bindingInfoCount);
}
else
{
@@ -448,8 +448,9 @@ void VertexArrayBuffer::CollectBindingInfo(dp::BindingInfo const & bindingInfo)
return;
}
- m_bindingInfo.push_back(bindingInfo);
- std::sort(m_bindingInfo.begin(), m_bindingInfo.end(),
+ CHECK_LESS(m_bindingInfoCount, kMaxBindingInfo, ());
+ m_bindingInfo[m_bindingInfoCount++] = bindingInfo;
+ std::sort(m_bindingInfo.begin(), m_bindingInfo.begin() + m_bindingInfoCount,
[](dp::BindingInfo const & info1, dp::BindingInfo const & info2)
{
return info1.GetID() < info2.GetID();
diff --git a/drape/vertex_array_buffer.hpp b/drape/vertex_array_buffer.hpp
index 0dff3c7ec1..de2b111ad7 100644
--- a/drape/vertex_array_buffer.hpp
+++ b/drape/vertex_array_buffer.hpp
@@ -8,6 +8,7 @@
#include "drape/index_buffer_mutator.hpp"
#include "drape/pointers.hpp"
+#include <cstdint>
#include <map>
#include <vector>
@@ -109,7 +110,8 @@ private:
// Definition of this method is in a separate .cpp-file.
drape_ptr<VertexArrayBufferImpl> CreateImplForVulkan(ref_ptr<GraphicsContext> context,
ref_ptr<VertexArrayBuffer> buffer,
- std::vector<dp::BindingInfo> && bindingInfo);
+ BindingInfoArray && bindingInfo,
+ uint8_t bindingInfoCount);
uint32_t const m_dataBufferSize;
uint64_t const m_batcherHash;
@@ -123,6 +125,7 @@ private:
bool m_isPreflushed = false;
bool m_moveToGpuOnBuild = false;
bool m_isChanged = false;
- std::vector<dp::BindingInfo> m_bindingInfo;
+ BindingInfoArray m_bindingInfo;
+ uint8_t m_bindingInfoCount = 0;
};
} // namespace dp
diff --git a/drape/vulkan/vulkan_base_context.cpp b/drape/vulkan/vulkan_base_context.cpp
index 8e929c014e..31597e15a9 100644
--- a/drape/vulkan/vulkan_base_context.cpp
+++ b/drape/vulkan/vulkan_base_context.cpp
@@ -824,10 +824,12 @@ void VulkanBaseContext::SetPrimitiveTopology(VkPrimitiveTopology topology)
{
m_pipelineKey.m_primitiveTopology = topology;
}
-
-void VulkanBaseContext::SetBindingInfo(std::vector<dp::BindingInfo> const & bindingInfo)
+
+void VulkanBaseContext::SetBindingInfo(BindingInfoArray const & bindingInfo, uint8_t bindingInfoCount)
{
- m_pipelineKey.m_bindingInfo = bindingInfo;
+ std::copy(bindingInfo.begin(), bindingInfo.begin() + bindingInfoCount,
+ m_pipelineKey.m_bindingInfo.begin());
+ m_pipelineKey.m_bindingInfoCount = bindingInfoCount;
}
void VulkanBaseContext::SetProgram(ref_ptr<VulkanGpuProgram> program)
diff --git a/drape/vulkan/vulkan_base_context.hpp b/drape/vulkan/vulkan_base_context.hpp
index cd912b091f..4d99c5c8c7 100644
--- a/drape/vulkan/vulkan_base_context.hpp
+++ b/drape/vulkan/vulkan_base_context.hpp
@@ -66,7 +66,7 @@ public:
void SetStencilReferenceValue(uint32_t stencilReferenceValue) override;
void SetPrimitiveTopology(VkPrimitiveTopology topology);
- void SetBindingInfo(std::vector<dp::BindingInfo> const & bindingInfo);
+ void SetBindingInfo(BindingInfoArray const & bindingInfo, uint8_t bindingInfoCount);
void SetProgram(ref_ptr<VulkanGpuProgram> program);
void SetBlendingEnabled(bool blendingEnabled);
diff --git a/drape/vulkan/vulkan_mesh_object_impl.cpp b/drape/vulkan/vulkan_mesh_object_impl.cpp
index c9ce5d6864..2128fb4681 100644
--- a/drape/vulkan/vulkan_mesh_object_impl.cpp
+++ b/drape/vulkan/vulkan_mesh_object_impl.cpp
@@ -45,7 +45,8 @@ public:
ResetDescriptorSetGroup();
m_geometryBuffers.resize(m_mesh->m_buffers.size());
- m_bindingInfo.resize(m_mesh->m_buffers.size());
+ m_bindingInfoCount = static_cast<uint8_t>(m_mesh->m_buffers.size());
+ CHECK_LESS_OR_EQUAL(m_bindingInfoCount, kMaxBindingInfo, ());
for (size_t i = 0; i < m_mesh->m_buffers.size(); i++)
{
if (m_mesh->m_buffers[i].m_data.empty())
@@ -150,7 +151,7 @@ public:
CHECK(commandBuffer != nullptr, ());
vulkanContext->SetPrimitiveTopology(GetPrimitiveType(m_mesh->m_drawPrimitive));
- vulkanContext->SetBindingInfo(m_bindingInfo);
+ vulkanContext->SetBindingInfo(m_bindingInfo, m_bindingInfoCount);
if (!m_descriptorSetGroup)
m_descriptorSetGroup = vulkanContext->GetCurrentDescriptorSetGroup();
@@ -186,7 +187,8 @@ private:
ref_ptr<dp::MeshObject> m_mesh;
ref_ptr<VulkanObjectManager> m_objectManager;
std::vector<VulkanObject> m_geometryBuffers;
- std::vector<dp::BindingInfo> m_bindingInfo;
+ BindingInfoArray m_bindingInfo;
+ uint8_t m_bindingInfoCount = 0;
DescriptorSetGroup m_descriptorSetGroup;
};
} // namespace vulkan
diff --git a/drape/vulkan/vulkan_pipeline.cpp b/drape/vulkan/vulkan_pipeline.cpp
index 77b0179a17..a5a3aa6f80 100644
--- a/drape/vulkan/vulkan_pipeline.cpp
+++ b/drape/vulkan/vulkan_pipeline.cpp
@@ -299,9 +299,9 @@ VkPipeline VulkanPipeline::GetPipeline(VkDevice device, PipelineKey const & key)
dynamicStateCreateInfo.dynamicStateCount = static_cast<uint32_t>(dynamicState.size());
// Input state.
- std::vector<VkVertexInputBindingDescription> bindingDescriptions(key.m_bindingInfo.size());
+ std::vector<VkVertexInputBindingDescription> bindingDescriptions(key.m_bindingInfoCount);
size_t attribsCount = 0;
- for (size_t i = 0; i < key.m_bindingInfo.size(); ++i)
+ for (size_t i = 0; i < key.m_bindingInfoCount; ++i)
{
bindingDescriptions[i].binding = static_cast<uint32_t>(i);
bindingDescriptions[i].stride = key.m_bindingInfo[i].GetElementSize();
@@ -311,7 +311,7 @@ VkPipeline VulkanPipeline::GetPipeline(VkDevice device, PipelineKey const & key)
std::vector<VkVertexInputAttributeDescription> attributeDescriptions(attribsCount);
uint32_t bindingCounter = 0;
- for (size_t i = 0; i < key.m_bindingInfo.size(); ++i)
+ for (size_t i = 0; i < key.m_bindingInfoCount; ++i)
{
for (uint8_t j = 0; j < key.m_bindingInfo[i].GetCount(); ++j)
{
@@ -500,8 +500,14 @@ bool VulkanPipeline::PipelineKey::operator<(PipelineKey const & rhs) const
if (m_depthStencil != rhs.m_depthStencil)
return m_depthStencil < rhs.m_depthStencil;
- if (m_bindingInfo != rhs.m_bindingInfo)
- return m_bindingInfo < rhs.m_bindingInfo;
+ if (m_bindingInfoCount != rhs.m_bindingInfoCount)
+ return m_bindingInfoCount < rhs.m_bindingInfoCount;
+
+ for (uint8_t i = 0; i < m_bindingInfoCount; ++i)
+ {
+ if (m_bindingInfo[i] != rhs.m_bindingInfo[i])
+ return m_bindingInfo[i] < rhs.m_bindingInfo[i];
+ }
if (m_primitiveTopology != rhs.m_primitiveTopology)
return m_primitiveTopology < rhs.m_primitiveTopology;
diff --git a/drape/vulkan/vulkan_pipeline.hpp b/drape/vulkan/vulkan_pipeline.hpp
index 7db9f3266e..486705a5e2 100644
--- a/drape/vulkan/vulkan_pipeline.hpp
+++ b/drape/vulkan/vulkan_pipeline.hpp
@@ -43,7 +43,8 @@ public:
VkRenderPass m_renderPass = {};
ref_ptr<VulkanGpuProgram> m_program;
DepthStencilKey m_depthStencil;
- std::vector<BindingInfo> m_bindingInfo;
+ BindingInfoArray m_bindingInfo;
+ uint8_t m_bindingInfoCount = 0;
VkPrimitiveTopology m_primitiveTopology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST;
bool m_blendingEnabled = false;
};
diff --git a/drape/vulkan/vulkan_vertex_array_buffer_impl.cpp b/drape/vulkan/vulkan_vertex_array_buffer_impl.cpp
index 139e9d96af..229b3486dd 100644
--- a/drape/vulkan/vulkan_vertex_array_buffer_impl.cpp
+++ b/drape/vulkan/vulkan_vertex_array_buffer_impl.cpp
@@ -24,10 +24,12 @@ class VulkanVertexArrayBufferImpl : public VertexArrayBufferImpl
public:
VulkanVertexArrayBufferImpl(ref_ptr<VertexArrayBuffer> buffer,
ref_ptr<VulkanObjectManager> objectManager,
- std::vector<dp::BindingInfo> && bindingInfo)
+ BindingInfoArray && bindingInfo,
+ uint8_t bindingInfoCount)
: m_vertexArrayBuffer(std::move(buffer))
, m_objectManager(std::move(objectManager))
, m_bindingInfo(std::move(bindingInfo))
+ , m_bindingInfoCount(bindingInfoCount)
{}
~VulkanVertexArrayBufferImpl() override
@@ -58,7 +60,7 @@ public:
vulkanContext->SetPrimitiveTopology(drawAsLine ? VK_PRIMITIVE_TOPOLOGY_LINE_LIST :
VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST);
- vulkanContext->SetBindingInfo(m_bindingInfo);
+ vulkanContext->SetBindingInfo(m_bindingInfo, m_bindingInfoCount);
if (!m_descriptorSetGroup)
m_descriptorSetGroup = vulkanContext->GetCurrentDescriptorSetGroup();
@@ -99,17 +101,19 @@ public:
private:
ref_ptr<VertexArrayBuffer> m_vertexArrayBuffer;
ref_ptr<VulkanObjectManager> m_objectManager;
- std::vector<dp::BindingInfo> m_bindingInfo;
+ BindingInfoArray m_bindingInfo;
+ uint8_t m_bindingInfoCount = 0;
DescriptorSetGroup m_descriptorSetGroup;
};
} // namespace vulkan
drape_ptr<VertexArrayBufferImpl> VertexArrayBuffer::CreateImplForVulkan(ref_ptr<GraphicsContext> context,
ref_ptr<VertexArrayBuffer> buffer,
- std::vector<dp::BindingInfo> && bindingInfo)
+ BindingInfoArray && bindingInfo,
+ uint8_t bindingInfoCount)
{
ref_ptr<dp::vulkan::VulkanBaseContext> vulkanContext = context;
return make_unique_dp<vulkan::VulkanVertexArrayBufferImpl>(buffer, vulkanContext->GetObjectManager(),
- std::move(bindingInfo));
+ std::move(bindingInfo), bindingInfoCount);
}
} // namespace dp