From e756f4e97567d3d5731a95fa23694b5351ab3fcd Mon Sep 17 00:00:00 2001 From: "r.kuznetsov" Date: Thu, 21 Feb 2019 10:40:39 +0300 Subject: [PATCH] [vulkan] Refactored param descriptors --- drape/CMakeLists.txt | 2 + drape/mesh_object.cpp | 2 +- drape/mesh_object.hpp | 2 +- drape/vulkan/vulkan_base_context.hpp | 3 +- drape/vulkan/vulkan_mesh_object_impl.cpp | 62 +++--------- drape/vulkan/vulkan_object_manager.hpp | 1 + drape/vulkan/vulkan_param_descriptor.cpp | 96 +++++++++++++++++++ drape/vulkan/vulkan_param_descriptor.hpp | 68 +++++++++++++ drape/vulkan/vulkan_utils.cpp | 31 ------ drape/vulkan/vulkan_utils.hpp | 31 ------ .../vulkan_vertex_array_buffer_impl.cpp | 50 ++-------- xcode/drape/drape.xcodeproj/project.pbxproj | 8 ++ 12 files changed, 200 insertions(+), 156 deletions(-) create mode 100644 drape/vulkan/vulkan_param_descriptor.cpp create mode 100644 drape/vulkan/vulkan_param_descriptor.hpp diff --git a/drape/CMakeLists.txt b/drape/CMakeLists.txt index 9f30072da7..53a3e292a9 100644 --- a/drape/CMakeLists.txt +++ b/drape/CMakeLists.txt @@ -164,6 +164,8 @@ append( ${DRAPE_ROOT}/vulkan/vulkan_texture.hpp ${DRAPE_ROOT}/vulkan/vulkan_object_manager.cpp ${DRAPE_ROOT}/vulkan/vulkan_object_manager.hpp + ${DRAPE_ROOT}/vulkan/vulkan_param_descriptor.cpp + ${DRAPE_ROOT}/vulkan/vulkan_param_descriptor.hpp ${DRAPE_ROOT}/vulkan/vulkan_pipeline.cpp ${DRAPE_ROOT}/vulkan/vulkan_pipeline.hpp ${DRAPE_ROOT}/vulkan/vulkan_staging_buffer.cpp diff --git a/drape/mesh_object.cpp b/drape/mesh_object.cpp index 1cd82f2f98..bb256d4bbd 100644 --- a/drape/mesh_object.cpp +++ b/drape/mesh_object.cpp @@ -160,7 +160,7 @@ MeshObject::MeshObject(ref_ptr context, DrawPrimitive drawP } else if (apiVersion == dp::ApiVersion::Vulkan) { - InitForVulkan(); + InitForVulkan(context); } CHECK(m_impl != nullptr, ()); } diff --git a/drape/mesh_object.hpp b/drape/mesh_object.hpp index 4e52f49a32..0c5fa07010 100644 --- a/drape/mesh_object.hpp +++ b/drape/mesh_object.hpp @@ -106,7 +106,7 @@ private: }; void InitForOpenGL(); - void InitForVulkan(); + void InitForVulkan(ref_ptr context); #if defined(OMIM_METAL_AVAILABLE) // Definition of this method is in a .mm-file. diff --git a/drape/vulkan/vulkan_base_context.hpp b/drape/vulkan/vulkan_base_context.hpp index e1e745f4bb..6e7e48218b 100644 --- a/drape/vulkan/vulkan_base_context.hpp +++ b/drape/vulkan/vulkan_base_context.hpp @@ -4,6 +4,7 @@ #include "drape/pointers.hpp" #include "drape/vulkan/vulkan_gpu_program.hpp" #include "drape/vulkan/vulkan_object_manager.hpp" +#include "drape/vulkan/vulkan_param_descriptor.hpp" #include "drape/vulkan/vulkan_pipeline.hpp" #include "drape/vulkan/vulkan_texture.hpp" #include "drape/vulkan/vulkan_utils.hpp" @@ -102,8 +103,6 @@ public: VkSampler GetSampler(SamplerKey const & key); - void UpdateDescriptorSetGroup(DescriptorSetGroup & descriptorSetGroup); - enum class HandlerType : uint8_t { PrePresent = 0, diff --git a/drape/vulkan/vulkan_mesh_object_impl.cpp b/drape/vulkan/vulkan_mesh_object_impl.cpp index a767c3a21a..1e2630d4cc 100644 --- a/drape/vulkan/vulkan_mesh_object_impl.cpp +++ b/drape/vulkan/vulkan_mesh_object_impl.cpp @@ -2,6 +2,7 @@ #include "drape/pointers.hpp" #include "drape/vulkan/vulkan_base_context.hpp" #include "drape/vulkan/vulkan_staging_buffer.hpp" +#include "drape/vulkan/vulkan_param_descriptor.hpp" #include "drape/vulkan/vulkan_utils.hpp" #include "base/assert.hpp" @@ -33,16 +34,15 @@ VkPrimitiveTopology GetPrimitiveType(MeshObject::DrawPrimitive primitive) class VulkanMeshObjectImpl : public MeshObjectImpl { public: - explicit VulkanMeshObjectImpl(ref_ptr mesh) + VulkanMeshObjectImpl(ref_ptr objectManager, ref_ptr mesh) : m_mesh(std::move(mesh)) + , m_objectManager(objectManager) + , m_descriptorUpdater(objectManager) {} void Build(ref_ptr context, ref_ptr program) override { - ref_ptr vulkanContext = context; - m_objectManager = vulkanContext->GetObjectManager(); - - ResetDescriptorSetGroup(); + m_descriptorUpdater.Reset(); m_geometryBuffers.resize(m_mesh->m_buffers.size()); m_bindingInfoCount = static_cast(m_mesh->m_buffers.size()); CHECK_LESS_OR_EQUAL(m_bindingInfoCount, kMaxBindingInfo, ()); @@ -74,7 +74,7 @@ public: void Reset() override { - ResetDescriptorSetGroup(); + m_descriptorUpdater.Reset(); for (auto const & b : m_geometryBuffers) m_objectManager->DestroyObject(b); m_geometryBuffers.clear(); @@ -151,13 +151,13 @@ public: vulkanContext->SetPrimitiveTopology(GetPrimitiveType(m_mesh->m_drawPrimitive)); vulkanContext->SetBindingInfo(m_bindingInfo, m_bindingInfoCount); - UpdateDescriptorSetGroup(vulkanContext); + m_descriptorUpdater.Update(context); + auto descriptorSet = m_descriptorUpdater.GetDescriptorSet(); uint32_t dynamicOffset = vulkanContext->GetCurrentDynamicBufferOffset(); vkCmdBindDescriptorSets(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, vulkanContext->GetCurrentPipelineLayout(), 0, 1, - &m_descriptorSetGroups[m_descriptorSetIndex].m_descriptorSet, - 1, &dynamicOffset); + &descriptorSet, 1, &dynamicOffset); vkCmdBindPipeline(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, vulkanContext->GetCurrentPipeline()); @@ -173,53 +173,19 @@ public: void Unbind() override {} private: - void ResetDescriptorSetGroup() - { - for (auto const & g : m_descriptorSetGroups) - m_objectManager->DestroyDescriptorSetGroup(g); - m_descriptorSetGroups.clear(); - } - - void UpdateDescriptorSetGroup(ref_ptr vulkanContext) - { - if (m_program != vulkanContext->GetCurrentProgram()) - { - ResetDescriptorSetGroup(); - m_program = vulkanContext->GetCurrentProgram(); - } - - if (m_updateDescriptorFrame != vulkanContext->GetCurrentFrameIndex()) - { - m_updateDescriptorFrame = vulkanContext->GetCurrentFrameIndex(); - m_descriptorSetIndex = 0; - } - else - { - m_descriptorSetIndex++; - } - - CHECK_LESS_OR_EQUAL(m_descriptorSetIndex, m_descriptorSetGroups.size(), ()); - if (m_descriptorSetIndex == m_descriptorSetGroups.size()) - m_descriptorSetGroups.emplace_back(m_objectManager->CreateDescriptorSetGroup(m_program)); - - m_descriptorSetGroups[m_descriptorSetIndex].Update(vulkanContext->GetDevice(), - vulkanContext->GetCurrentParamDescriptors()); - } - ref_ptr m_mesh; ref_ptr m_objectManager; std::vector m_geometryBuffers; BindingInfoArray m_bindingInfo; uint8_t m_bindingInfoCount = 0; - std::vector m_descriptorSetGroups; - ref_ptr m_program; - uint32_t m_updateDescriptorFrame = 0; - uint32_t m_descriptorSetIndex = 0; + ParamDescriptorUpdater m_descriptorUpdater; }; } // namespace vulkan -void MeshObject::InitForVulkan() +void MeshObject::InitForVulkan(ref_ptr context) { - m_impl = make_unique_dp(make_ref(this)); + ref_ptr vulkanContext = context; + m_impl = make_unique_dp(vulkanContext->GetObjectManager(), + make_ref(this)); } } // namespace dp diff --git a/drape/vulkan/vulkan_object_manager.hpp b/drape/vulkan/vulkan_object_manager.hpp index d456cf26ff..79f4ccb70a 100644 --- a/drape/vulkan/vulkan_object_manager.hpp +++ b/drape/vulkan/vulkan_object_manager.hpp @@ -3,6 +3,7 @@ #include "drape/pointers.hpp" #include "drape/vulkan/vulkan_gpu_program.hpp" #include "drape/vulkan/vulkan_memory_manager.hpp" +#include "drape/vulkan/vulkan_param_descriptor.hpp" #include "drape/vulkan/vulkan_utils.hpp" #include "base/assert.hpp" diff --git a/drape/vulkan/vulkan_param_descriptor.cpp b/drape/vulkan/vulkan_param_descriptor.cpp new file mode 100644 index 0000000000..b65af32d0f --- /dev/null +++ b/drape/vulkan/vulkan_param_descriptor.cpp @@ -0,0 +1,96 @@ +#include "drape/vulkan/vulkan_param_descriptor.hpp" +#include "drape/vulkan/vulkan_base_context.hpp" +#include "drape/vulkan/vulkan_object_manager.hpp" + +#include "base/assert.hpp" +#include "base/logging.hpp" + +#include + +namespace dp +{ +namespace vulkan +{ +void DescriptorSetGroup::Update(VkDevice device, std::vector const & descriptors) +{ + size_t constexpr kMaxDescriptorSets = 8; + size_t const writeDescriptorsCount = descriptors.size(); + CHECK_LESS_OR_EQUAL(writeDescriptorsCount, kMaxDescriptorSets, ()); + + std::array writeDescriptorSets = {}; + for (size_t i = 0; i < writeDescriptorsCount; ++i) + { + writeDescriptorSets[i] = {}; + writeDescriptorSets[i].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; + writeDescriptorSets[i].dstSet = m_descriptorSet; + writeDescriptorSets[i].descriptorCount = 1; + if (descriptors[i].m_type == ParamDescriptor::Type::DynamicUniformBuffer) + { + writeDescriptorSets[i].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC; + writeDescriptorSets[i].dstBinding = 0; + writeDescriptorSets[i].pBufferInfo = &descriptors[i].m_bufferDescriptor; + } + else if (descriptors[i].m_type == ParamDescriptor::Type::Texture) + { + writeDescriptorSets[i].descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; + writeDescriptorSets[i].dstBinding = static_cast(descriptors[i].m_textureSlot); + writeDescriptorSets[i].pImageInfo = &descriptors[i].m_imageDescriptor; + } + else + { + CHECK(false, ("Unsupported param descriptor type.")); + } + } + + vkUpdateDescriptorSets(device, static_cast(writeDescriptorsCount), + writeDescriptorSets.data(), 0, nullptr); +} + +ParamDescriptorUpdater::ParamDescriptorUpdater(ref_ptr objectManager) + : m_objectManager(std::move(objectManager)) +{} + +void ParamDescriptorUpdater::Reset() +{ + for (auto const & g : m_descriptorSetGroups) + m_objectManager->DestroyDescriptorSetGroup(g); + m_descriptorSetGroups.clear(); + m_descriptorSetIndex = 0; + m_updateDescriptorFrame = 0; +} + +void ParamDescriptorUpdater::Update(ref_ptr context) +{ + ref_ptr vulkanContext = context; + if (m_program != vulkanContext->GetCurrentProgram()) + { + Reset(); + m_program = vulkanContext->GetCurrentProgram(); + } + + // We can update descriptors only once per frame. So if we need to render + // object several times per frame, we must allocate new descriptors. + if (m_updateDescriptorFrame != vulkanContext->GetCurrentFrameIndex()) + { + m_updateDescriptorFrame = vulkanContext->GetCurrentFrameIndex(); + m_descriptorSetIndex = 0; + } + else + { + m_descriptorSetIndex++; + } + + CHECK_LESS_OR_EQUAL(m_descriptorSetIndex, m_descriptorSetGroups.size(), ()); + if (m_descriptorSetIndex == m_descriptorSetGroups.size()) + m_descriptorSetGroups.emplace_back(m_objectManager->CreateDescriptorSetGroup(m_program)); + + m_descriptorSetGroups[m_descriptorSetIndex].Update(vulkanContext->GetDevice(), + vulkanContext->GetCurrentParamDescriptors()); +} + +VkDescriptorSet ParamDescriptorUpdater::GetDescriptorSet() const +{ + return m_descriptorSetGroups[m_descriptorSetIndex].m_descriptorSet; +} +} // namespace vulkan +} // namespace dp diff --git a/drape/vulkan/vulkan_param_descriptor.hpp b/drape/vulkan/vulkan_param_descriptor.hpp new file mode 100644 index 0000000000..419c1ea7e3 --- /dev/null +++ b/drape/vulkan/vulkan_param_descriptor.hpp @@ -0,0 +1,68 @@ +#pragma once + +#include "drape/graphics_context.hpp" +#include "drape/vulkan/vulkan_gpu_program.hpp" + +#include +#include + +#include +#include +#include + +namespace dp +{ +namespace vulkan +{ +struct ParamDescriptor +{ + enum class Type : uint8_t + { + DynamicUniformBuffer, + Texture + }; + + Type m_type = Type::DynamicUniformBuffer; + + VkDescriptorBufferInfo m_bufferDescriptor = {}; + uint32_t m_bufferDynamicOffset = 0; + + VkDescriptorImageInfo m_imageDescriptor = {}; + int8_t m_textureSlot = 0; +}; + +struct DescriptorSetGroup +{ + VkDescriptorSet m_descriptorSet = {}; + VkDescriptorPool m_descriptorPool = {}; + + explicit operator bool() + { + return m_descriptorSet != VK_NULL_HANDLE && + m_descriptorPool != VK_NULL_HANDLE; + } + + void Update(VkDevice device, std::vector const & descriptors); +}; + +class VulkanObjectManager; + +class ParamDescriptorUpdater +{ +public: + explicit ParamDescriptorUpdater(ref_ptr objectManager); + + void Update(ref_ptr context); + void Reset(); + VkDescriptorSet GetDescriptorSet() const; + +private: + ref_ptr m_objectManager; + std::vector m_descriptorSetGroups; + ref_ptr m_program; + uint32_t m_updateDescriptorFrame = 0; + uint32_t m_descriptorSetIndex = 0; +}; + +} // namespace vulkan +} // namespace dp diff --git a/drape/vulkan/vulkan_utils.cpp b/drape/vulkan/vulkan_utils.cpp index d6ae47b63a..997580d731 100644 --- a/drape/vulkan/vulkan_utils.cpp +++ b/drape/vulkan/vulkan_utils.cpp @@ -105,36 +105,5 @@ bool SamplerKey::operator<(SamplerKey const & rhs) const { return m_sampler < rhs.m_sampler; } - -void DescriptorSetGroup::Update(VkDevice device, std::vector const & descriptors) -{ - std::vector writeDescriptorSets(descriptors.size()); - for (size_t i = 0; i < writeDescriptorSets.size(); ++i) - { - writeDescriptorSets[i] = {}; - writeDescriptorSets[i].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; - writeDescriptorSets[i].dstSet = m_descriptorSet; - writeDescriptorSets[i].descriptorCount = 1; - if (descriptors[i].m_type == ParamDescriptor::Type::DynamicUniformBuffer) - { - writeDescriptorSets[i].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC; - writeDescriptorSets[i].dstBinding = 0; - writeDescriptorSets[i].pBufferInfo = &descriptors[i].m_bufferDescriptor; - } - else if (descriptors[i].m_type == ParamDescriptor::Type::Texture) - { - writeDescriptorSets[i].descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; - writeDescriptorSets[i].dstBinding = static_cast(descriptors[i].m_textureSlot); - writeDescriptorSets[i].pImageInfo = &descriptors[i].m_imageDescriptor; - } - else - { - CHECK(false, ("Unsupported param descriptor type.")); - } - } - - vkUpdateDescriptorSets(device, static_cast(writeDescriptorSets.size()), - writeDescriptorSets.data(), 0, nullptr); -} } // namespace vulkan } // namespace dp diff --git a/drape/vulkan/vulkan_utils.hpp b/drape/vulkan/vulkan_utils.hpp index 5c63e93e5f..ee0df4cbda 100644 --- a/drape/vulkan/vulkan_utils.hpp +++ b/drape/vulkan/vulkan_utils.hpp @@ -18,37 +18,6 @@ namespace vulkan extern std::string GetVulkanResultString(VkResult result); extern VkFormat UnpackFormat(TextureFormat format); -struct ParamDescriptor -{ - enum class Type : uint8_t - { - DynamicUniformBuffer, - Texture - }; - - Type m_type = Type::DynamicUniformBuffer; - - VkDescriptorBufferInfo m_bufferDescriptor = {}; - uint32_t m_bufferDynamicOffset = 0; - - VkDescriptorImageInfo m_imageDescriptor = {}; - int8_t m_textureSlot = 0; -}; - -struct DescriptorSetGroup -{ - VkDescriptorSet m_descriptorSet = {}; - VkDescriptorPool m_descriptorPool = {}; - - explicit operator bool() - { - return m_descriptorSet != VK_NULL_HANDLE && - m_descriptorPool != VK_NULL_HANDLE; - } - - void Update(VkDevice device, std::vector const & descriptors); -}; - template void SetStateByte(T & state, uint8_t value, uint8_t byteNumber) { diff --git a/drape/vulkan/vulkan_vertex_array_buffer_impl.cpp b/drape/vulkan/vulkan_vertex_array_buffer_impl.cpp index 3c05cbd720..5eb1d4c904 100644 --- a/drape/vulkan/vulkan_vertex_array_buffer_impl.cpp +++ b/drape/vulkan/vulkan_vertex_array_buffer_impl.cpp @@ -2,6 +2,7 @@ #include "drape/vertex_array_buffer.hpp" #include "drape/vulkan/vulkan_base_context.hpp" #include "drape/vulkan/vulkan_gpu_buffer_impl.hpp" +#include "drape/vulkan/vulkan_param_descriptor.hpp" #include "drape/vulkan/vulkan_utils.hpp" #include "base/assert.hpp" @@ -27,14 +28,15 @@ public: BindingInfoArray && bindingInfo, uint8_t bindingInfoCount) : m_vertexArrayBuffer(std::move(buffer)) - , m_objectManager(std::move(objectManager)) + , m_objectManager(objectManager) , m_bindingInfo(std::move(bindingInfo)) , m_bindingInfoCount(bindingInfoCount) + , m_descriptorUpdater(objectManager) {} ~VulkanVertexArrayBufferImpl() override { - ResetDescriptorSetGroup(); + m_descriptorUpdater.Reset(); } bool Build(ref_ptr program) override @@ -58,13 +60,13 @@ public: VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST); vulkanContext->SetBindingInfo(m_bindingInfo, m_bindingInfoCount); - UpdateDescriptorSetGroup(vulkanContext); + m_descriptorUpdater.Update(context); + auto descriptorSet = m_descriptorUpdater.GetDescriptorSet(); uint32_t dynamicOffset = vulkanContext->GetCurrentDynamicBufferOffset(); vkCmdBindDescriptorSets(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, vulkanContext->GetCurrentPipelineLayout(), 0, 1, - &m_descriptorSetGroups[m_descriptorSetIndex].m_descriptorSet, - 1, &dynamicOffset); + &descriptorSet, 1, &dynamicOffset); vkCmdBindPipeline(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, vulkanContext->GetCurrentPipeline()); @@ -95,47 +97,11 @@ public: } private: - void ResetDescriptorSetGroup() - { - for (auto const & g : m_descriptorSetGroups) - m_objectManager->DestroyDescriptorSetGroup(g); - m_descriptorSetGroups.clear(); - } - - void UpdateDescriptorSetGroup(ref_ptr vulkanContext) - { - if (m_program != vulkanContext->GetCurrentProgram()) - { - ResetDescriptorSetGroup(); - m_program = vulkanContext->GetCurrentProgram(); - } - - if (m_updateDescriptorFrame != vulkanContext->GetCurrentFrameIndex()) - { - m_updateDescriptorFrame = vulkanContext->GetCurrentFrameIndex(); - m_descriptorSetIndex = 0; - } - else - { - m_descriptorSetIndex++; - } - - CHECK_LESS_OR_EQUAL(m_descriptorSetIndex, m_descriptorSetGroups.size(), ()); - if (m_descriptorSetIndex == m_descriptorSetGroups.size()) - m_descriptorSetGroups.emplace_back(m_objectManager->CreateDescriptorSetGroup(m_program)); - - m_descriptorSetGroups[m_descriptorSetIndex].Update(vulkanContext->GetDevice(), - vulkanContext->GetCurrentParamDescriptors()); - } - ref_ptr m_vertexArrayBuffer; ref_ptr m_objectManager; BindingInfoArray m_bindingInfo; uint8_t m_bindingInfoCount = 0; - std::vector m_descriptorSetGroups; - ref_ptr m_program; - uint32_t m_updateDescriptorFrame = 0; - uint32_t m_descriptorSetIndex = 0; + ParamDescriptorUpdater m_descriptorUpdater; }; } // namespace vulkan diff --git a/xcode/drape/drape.xcodeproj/project.pbxproj b/xcode/drape/drape.xcodeproj/project.pbxproj index 335c1c1a53..9915a6daf6 100644 --- a/xcode/drape/drape.xcodeproj/project.pbxproj +++ b/xcode/drape/drape.xcodeproj/project.pbxproj @@ -54,6 +54,8 @@ 45789EF8213557F7009955CC /* gl_constants.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 45789EEF213557F6009955CC /* gl_constants.cpp */; }; 45789EF9213557F7009955CC /* gl_functions.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 45789EF0213557F6009955CC /* gl_functions.hpp */; }; 45789EFA213557F7009955CC /* gl_extensions_list.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 45789EF1213557F7009955CC /* gl_extensions_list.hpp */; }; + 45799345221E858000627B5E /* vulkan_param_descriptor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 45799343221E857F00627B5E /* vulkan_param_descriptor.cpp */; }; + 45799346221E858000627B5E /* vulkan_param_descriptor.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 45799344221E858000627B5E /* vulkan_param_descriptor.hpp */; }; 457B536620358F7E00E4E752 /* drape_routine.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 457B536320358F7D00E4E752 /* drape_routine.hpp */; }; 457B536720358F7E00E4E752 /* glyph_generator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 457B536420358F7D00E4E752 /* glyph_generator.cpp */; }; 457B536820358F7E00E4E752 /* glyph_generator.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 457B536520358F7E00E4E752 /* glyph_generator.hpp */; }; @@ -199,6 +201,8 @@ 45789EEF213557F6009955CC /* gl_constants.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = gl_constants.cpp; sourceTree = ""; }; 45789EF0213557F6009955CC /* gl_functions.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = gl_functions.hpp; sourceTree = ""; }; 45789EF1213557F7009955CC /* gl_extensions_list.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = gl_extensions_list.hpp; sourceTree = ""; }; + 45799343221E857F00627B5E /* vulkan_param_descriptor.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = vulkan_param_descriptor.cpp; sourceTree = ""; }; + 45799344221E858000627B5E /* vulkan_param_descriptor.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = vulkan_param_descriptor.hpp; sourceTree = ""; }; 457B536320358F7D00E4E752 /* drape_routine.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = drape_routine.hpp; sourceTree = ""; }; 457B536420358F7D00E4E752 /* glyph_generator.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = glyph_generator.cpp; sourceTree = ""; }; 457B536520358F7E00E4E752 /* glyph_generator.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = glyph_generator.hpp; sourceTree = ""; }; @@ -309,6 +313,8 @@ 4577B24321F2034200864FAC /* vulkan */ = { isa = PBXGroup; children = ( + 45799343221E857F00627B5E /* vulkan_param_descriptor.cpp */, + 45799344221E858000627B5E /* vulkan_param_descriptor.hpp */, 4577B25121F2035D00864FAC /* vulkan_base_context.cpp */, 4577B24E21F2035C00864FAC /* vulkan_base_context.hpp */, 4577B24421F2035C00864FAC /* vulkan_gpu_buffer_impl.cpp */, @@ -508,6 +514,7 @@ 6729A5A31A69213A007D5872 /* stipple_pen_resource.hpp in Headers */, 452D373521F7415F00CD3A94 /* vulkan_object_manager.hpp in Headers */, 6729A5661A69213A007D5872 /* attribute_provider.hpp in Headers */, + 45799346221E858000627B5E /* vulkan_param_descriptor.hpp in Headers */, 6729A58D1A69213A007D5872 /* index_buffer_mutator.hpp in Headers */, 6729A5781A69213A007D5872 /* font_texture.hpp in Headers */, 670947231BDF9A4F005014C0 /* data_buffer_impl.hpp in Headers */, @@ -657,6 +664,7 @@ 4560F59F213F986E00CC736C /* metal_states.mm in Sources */, 4560F5A52142890600CC736C /* metal_gpu_buffer_impl.mm in Sources */, 6709472A1BDF9A4F005014C0 /* hw_texture_ios.mm in Sources */, + 45799345221E858000627B5E /* vulkan_param_descriptor.cpp in Sources */, 459843792136AC2600F8CAB2 /* metal_mesh_object_impl.mm in Sources */, 4513BF0D1EC2F0760066565C /* viewport.cpp in Sources */, 34C624C91DABDB2000510300 /* static_texture.cpp in Sources */,