diff options
author | r.kuznetsov <r.kuznetsov@corp.mail.ru> | 2019-02-14 14:43:48 +0300 |
---|---|---|
committer | Daria Volvenkova <d.volvenkova@corp.mail.ru> | 2019-03-01 10:45:24 +0300 |
commit | ff589c4b54b190bf8e8dce32b35e7f75715705c8 (patch) | |
tree | 74870dadc99173f1d1e849a934025a9bccfa5ca7 /drape | |
parent | d4dd122572599524f5841c04edb5c9de0d14ba7b (diff) |
[vulkan] Binding info optimization
Diffstat (limited to 'drape')
-rw-r--r-- | drape/binding_info.cpp | 7 | ||||
-rw-r--r-- | drape/binding_info.hpp | 10 | ||||
-rw-r--r-- | drape/vertex_array_buffer.cpp | 9 | ||||
-rw-r--r-- | drape/vertex_array_buffer.hpp | 7 | ||||
-rw-r--r-- | drape/vulkan/vulkan_base_context.cpp | 8 | ||||
-rw-r--r-- | drape/vulkan/vulkan_base_context.hpp | 2 | ||||
-rw-r--r-- | drape/vulkan/vulkan_mesh_object_impl.cpp | 8 | ||||
-rw-r--r-- | drape/vulkan/vulkan_pipeline.cpp | 16 | ||||
-rw-r--r-- | drape/vulkan/vulkan_pipeline.hpp | 3 | ||||
-rw-r--r-- | drape/vulkan/vulkan_vertex_array_buffer_impl.cpp | 14 |
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 |