#pragma once #include "shaders/program_params.hpp" #include "drape/vulkan/vulkan_base_context.hpp" #include "drape/vulkan/vulkan_gpu_program.hpp" #include "drape/vulkan/vulkan_object_manager.hpp" #include "drape/vulkan/vulkan_utils.hpp" #include "base/thread_checker.hpp" #include #include #include #include namespace gpu { namespace vulkan { class VulkanProgramParamsSetter : public ProgramParamsSetter { public: struct UniformBuffer { dp::vulkan::VulkanObject m_object; uint8_t * m_pointer = nullptr; uint32_t m_freeOffset = 0; }; explicit VulkanProgramParamsSetter(ref_ptr context); ~VulkanProgramParamsSetter() override; void Destroy(ref_ptr context); void Flush(); void Finish(uint32_t inflightFrameIndex); void Apply(ref_ptr context, ref_ptr program, MapProgramParams const & params) override; void Apply(ref_ptr context, ref_ptr program, RouteProgramParams const & params) override; void Apply(ref_ptr context, ref_ptr program, TrafficProgramParams const & params) override; void Apply(ref_ptr context, ref_ptr program, TransitProgramParams const & params) override; void Apply(ref_ptr context, ref_ptr program, GuiProgramParams const & params) override; void Apply(ref_ptr context, ref_ptr program, ShapesProgramParams const & params) override; void Apply(ref_ptr context, ref_ptr program, Arrow3dProgramParams const & params) override; void Apply(ref_ptr context, ref_ptr program, DebugRectProgramParams const & params) override; void Apply(ref_ptr context, ref_ptr program, ScreenQuadProgramParams const & params) override; void Apply(ref_ptr context, ref_ptr program, SMAAProgramParams const & params) override; private: template void ApplyImpl(ref_ptr context, ref_ptr program, T const & params) { ASSERT_EQUAL(T::GetName(), ProgramParams::GetBoundParamsName(program), ("Mismatched program and parameters", program->GetName())); ApplyBytes(context, reinterpret_cast(¶ms), sizeof(params)); } void ApplyBytes(ref_ptr context, void const * data, uint32_t sizeInBytes); ref_ptr m_objectManager; std::array, dp::vulkan::kMaxInflightFrames> m_uniformBuffers; uint32_t m_offsetAlignment = 0; uint32_t m_sizeAlignment = 0; uint32_t m_flushHandlerId = 0; uint32_t m_finishHandlerId = 0; uint32_t m_updateInflightFrameId = 0; ThreadChecker m_threadChecker; uint32_t m_currentInflightFrameIndex = 0; }; } // namespace vulkan } // namespace gpu