diff --git a/3party/vulkan_wrapper/CMakeLists.txt b/3party/vulkan_wrapper/CMakeLists.txt index 6638f31373..fe73f1bb2e 100644 --- a/3party/vulkan_wrapper/CMakeLists.txt +++ b/3party/vulkan_wrapper/CMakeLists.txt @@ -17,9 +17,6 @@ endif() target_include_directories(${PROJECT_NAME} PUBLIC .) -if (PLATFORM_LINUX) - target_compile_definitions(${PROJECT_NAME} PRIVATE VK_USE_PLATFORM_XLIB_KHR) -endif() # dlopen target_link_libraries(${PROJECT_NAME} $<$:${CMAKE_DL_LIBS}>) diff --git a/3party/vulkan_wrapper/vulkan_wrapper.cpp b/3party/vulkan_wrapper/vulkan_wrapper.cpp index 4322a49d94..e025139038 100755 --- a/3party/vulkan_wrapper/vulkan_wrapper.cpp +++ b/3party/vulkan_wrapper/vulkan_wrapper.cpp @@ -22,20 +22,7 @@ extern "C" { #include int InitVulkan(void) { -#if defined(__APPLE__) - void* libvulkan = dlopen("libvulkan.dylib", RTLD_NOW | RTLD_LOCAL); - if (!libvulkan) { - libvulkan = dlopen("libvulkan.1.dylib", RTLD_NOW | RTLD_LOCAL); - } - if (!libvulkan) { - libvulkan = dlopen("libMoltenVK.dylib", RTLD_NOW | RTLD_LOCAL); - } -#else - void* libvulkan = dlopen("libvulkan.so.1", RTLD_NOW | RTLD_LOCAL); - if (!libvulkan) { - libvulkan = dlopen("libvulkan.so", RTLD_NOW | RTLD_LOCAL); - } -#endif + void* libvulkan = dlopen("libvulkan.so", RTLD_NOW | RTLD_LOCAL); if (!libvulkan) return 0; // Vulkan supported, set function addresses @@ -558,10 +545,6 @@ int InitVulkan(void) { vkDestroyDebugReportCallbackEXT = reinterpret_cast(dlsym(libvulkan, "vkDestroyDebugReportCallbackEXT")); vkDebugReportMessageEXT = reinterpret_cast(dlsym(libvulkan, "vkDebugReportMessageEXT")); -#if defined(__APPLE__) - vkCreateMacOSSurfaceMVK = reinterpret_cast(dlsym(libvulkan, "vkCreateMacOSSurfaceMVK")); -#endif - return 1; } @@ -1154,10 +1137,6 @@ PFN_vkCmdDecodeVideoKHR vkCmdDecodeVideoKHR; PFN_vkCmdEncodeVideoKHR vkCmdEncodeVideoKHR; #endif -#if defined(__APPLE__) -PFN_vkCreateMacOSSurfaceMVK vkCreateMacOSSurfaceMVK; -#endif - #ifdef __cplusplus } #endif diff --git a/3party/vulkan_wrapper/vulkan_wrapper.h b/3party/vulkan_wrapper/vulkan_wrapper.h index e29b084071..79f1105b44 100755 --- a/3party/vulkan_wrapper/vulkan_wrapper.h +++ b/3party/vulkan_wrapper/vulkan_wrapper.h @@ -25,10 +25,6 @@ extern "C" { #define VK_USE_PLATFORM_ANDROID_KHR 1 #include -#if defined(__APPLE__) -#include -#endif - /* Initialize the Vulkan function pointer variables declared in this header. * Returns 0 if vulkan is not available, non-zero if it is available. */ @@ -504,10 +500,6 @@ extern PFN_vkCreateDebugReportCallbackEXT vkCreateDebugReportCallbackEXT; extern PFN_vkDestroyDebugReportCallbackEXT vkDestroyDebugReportCallbackEXT; extern PFN_vkDebugReportMessageEXT vkDebugReportMessageEXT; -#if defined(__APPLE__) -extern PFN_vkCreateMacOSSurfaceMVK vkCreateMacOSSurfaceMVK; -#endif - #ifdef __cplusplus } #endif diff --git a/android/app/src/main/cpp/app/organicmaps/vulkan/android_vulkan_context_factory.cpp b/android/app/src/main/cpp/app/organicmaps/vulkan/android_vulkan_context_factory.cpp index 84b9220632..9559d4db6a 100644 --- a/android/app/src/main/cpp/app/organicmaps/vulkan/android_vulkan_context_factory.cpp +++ b/android/app/src/main/cpp/app/organicmaps/vulkan/android_vulkan_context_factory.cpp @@ -2,16 +2,274 @@ #include "app/organicmaps/platform/AndroidPlatform.hpp" +#include "drape/drape_diagnostics.hpp" +#include "drape/support_manager.hpp" +#include "drape/vulkan/vulkan_pipeline.hpp" +#include "drape/vulkan/vulkan_utils.hpp" + #include "base/assert.hpp" #include "base/logging.hpp" #include "base/macros.hpp" #include "base/src_point.hpp" +#include +#include + namespace android { +namespace +{ +class DrawVulkanContext : public dp::vulkan::VulkanBaseContext +{ +public: + DrawVulkanContext(VkInstance vulkanInstance, VkPhysicalDevice gpu, + VkPhysicalDeviceProperties const & gpuProperties, VkDevice device, + uint32_t renderingQueueFamilyIndex, + ref_ptr objectManager, uint32_t appVersionCode, + bool hasPartialTextureUpdates) + : dp::vulkan::VulkanBaseContext( + vulkanInstance, gpu, gpuProperties, device, renderingQueueFamilyIndex, objectManager, + make_unique_dp(device, appVersionCode), + hasPartialTextureUpdates) + { + VkQueue queue; + vkGetDeviceQueue(device, renderingQueueFamilyIndex, 0, &queue); + SetRenderingQueue(queue); + CreateCommandPool(); + } + + void MakeCurrent() override + { + m_objectManager->RegisterThread(dp::vulkan::VulkanObjectManager::Frontend); + } +}; + +class UploadVulkanContext : public dp::vulkan::VulkanBaseContext +{ +public: + UploadVulkanContext(VkInstance vulkanInstance, VkPhysicalDevice gpu, + VkPhysicalDeviceProperties const & gpuProperties, VkDevice device, + uint32_t renderingQueueFamilyIndex, + ref_ptr objectManager, + bool hasPartialTextureUpdates) + : dp::vulkan::VulkanBaseContext(vulkanInstance, gpu, gpuProperties, device, + renderingQueueFamilyIndex, objectManager, + nullptr /* pipeline */, hasPartialTextureUpdates) + {} + + void MakeCurrent() override + { + m_objectManager->RegisterThread(dp::vulkan::VulkanObjectManager::Backend); + } + + void Present() override {} + + void Resize(int w, int h) override {} + void SetFramebuffer(ref_ptr framebuffer) override {} + void Init(dp::ApiVersion apiVersion) override + { + CHECK_EQUAL(apiVersion, dp::ApiVersion::Vulkan, ()); + } + + void SetClearColor(dp::Color const & color) override {} + void Clear(uint32_t clearBits, uint32_t storeBits) override {} + void Flush() override {} + void SetDepthTestEnabled(bool enabled) override {} + void SetDepthTestFunction(dp::TestFunction depthFunction) override {} + void SetStencilTestEnabled(bool enabled) override {} + void SetStencilFunction(dp::StencilFace face, + dp::TestFunction stencilFunction) override {} + void SetStencilActions(dp::StencilFace face, + dp::StencilAction stencilFailAction, + dp::StencilAction depthFailAction, + dp::StencilAction passAction) override {} +}; +} // namespace + AndroidVulkanContextFactory::AndroidVulkanContextFactory(uint32_t appVersionCode, int sdkVersion, bool isCustomROM) - : dp::vulkan::VulkanContextFactory(appVersionCode, sdkVersion, isCustomROM) -{} +{ + if (InitVulkan() == 0) + { + LOG_ERROR_VK("Could not initialize Vulkan library."); + return; + } + + VkApplicationInfo appInfo = {}; + appInfo.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO; + appInfo.pNext = nullptr; + appInfo.apiVersion = VK_MAKE_VERSION(1, 0, 0); + appInfo.applicationVersion = appVersionCode; + appInfo.engineVersion = appVersionCode; + appInfo.pApplicationName = "OMaps"; + appInfo.pEngineName = "Drape Engine"; + + bool enableDiagnostics = false; +#ifdef ENABLE_VULKAN_DIAGNOSTICS + enableDiagnostics = true; +#endif + m_layers = make_unique_dp(enableDiagnostics); + + VkInstanceCreateInfo instanceCreateInfo = {}; + instanceCreateInfo.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO; + instanceCreateInfo.pNext = nullptr; + instanceCreateInfo.pApplicationInfo = &appInfo; + instanceCreateInfo.enabledExtensionCount = m_layers->GetInstanceExtensionsCount(); + instanceCreateInfo.ppEnabledExtensionNames = m_layers->GetInstanceExtensions(); + instanceCreateInfo.enabledLayerCount = m_layers->GetInstanceLayersCount(); + instanceCreateInfo.ppEnabledLayerNames = m_layers->GetInstanceLayers(); + + // Enable extra validation features. + VkValidationFeaturesEXT validationFeatures = {}; + const VkValidationFeatureEnableEXT validationFeaturesEnabled[] = { + VK_VALIDATION_FEATURE_ENABLE_SYNCHRONIZATION_VALIDATION_EXT}; + if (m_layers->IsValidationFeaturesEnabled()) + { + validationFeatures.sType = VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT; + validationFeatures.pNext = nullptr; + validationFeatures.enabledValidationFeatureCount = ARRAY_SIZE(validationFeaturesEnabled), + validationFeatures.pEnabledValidationFeatures = validationFeaturesEnabled; + + instanceCreateInfo.pNext = &validationFeatures; + } + + VkResult statusCode; + statusCode = vkCreateInstance(&instanceCreateInfo, nullptr, &m_vulkanInstance); + if (statusCode != VK_SUCCESS) + { + LOG_ERROR_VK_CALL(vkCreateInstance, statusCode); + return; + } + + uint32_t gpuCount = 0; + statusCode = vkEnumeratePhysicalDevices(m_vulkanInstance, &gpuCount, nullptr); + if (statusCode != VK_SUCCESS || gpuCount == 0) + { + LOG_ERROR_VK_CALL(vkEnumeratePhysicalDevices, statusCode); + return; + } + + std::vector tmpGpus(gpuCount); + statusCode = vkEnumeratePhysicalDevices(m_vulkanInstance, &gpuCount, tmpGpus.data()); + if (statusCode != VK_SUCCESS) + { + LOG_ERROR_VK_CALL(vkEnumeratePhysicalDevices, statusCode); + return; + } + m_gpu = tmpGpus[0]; + + VkPhysicalDeviceProperties gpuProperties; + vkGetPhysicalDeviceProperties(m_gpu, &gpuProperties); + dp::SupportManager::Version apiVersion{VK_VERSION_MAJOR(gpuProperties.apiVersion), + VK_VERSION_MINOR(gpuProperties.apiVersion), + VK_VERSION_PATCH(gpuProperties.apiVersion)}; + dp::SupportManager::Version driverVersion{VK_VERSION_MAJOR(gpuProperties.driverVersion), + VK_VERSION_MINOR(gpuProperties.driverVersion), + VK_VERSION_PATCH(gpuProperties.driverVersion)}; + if (dp::SupportManager::Instance().IsVulkanForbidden(gpuProperties.deviceName, apiVersion, driverVersion, isCustomROM)) + { + LOG_ERROR_VK("GPU/Driver configuration is not supported."); + return; + } + + uint32_t queueFamilyCount; + vkGetPhysicalDeviceQueueFamilyProperties(m_gpu, &queueFamilyCount, nullptr); + if (queueFamilyCount == 0) + { + LOG_ERROR_VK("Any queue family wasn't found."); + return; + } + + std::vector queueFamilyProperties(queueFamilyCount); + vkGetPhysicalDeviceQueueFamilyProperties(m_gpu, &queueFamilyCount, + queueFamilyProperties.data()); + + uint32_t renderingQueueFamilyIndex = 0; + for (; renderingQueueFamilyIndex < queueFamilyCount; ++renderingQueueFamilyIndex) + { + if (queueFamilyProperties[renderingQueueFamilyIndex].queueFlags & VK_QUEUE_GRAPHICS_BIT) + break; + } + if (renderingQueueFamilyIndex == queueFamilyCount) + { + LOG_ERROR_VK("Any queue family with VK_QUEUE_GRAPHICS_BIT wasn't found."); + return; + } + + if (!dp::vulkan::VulkanFormatUnpacker::Init(m_gpu)) + return; + + if (!m_layers->Initialize(m_vulkanInstance, m_gpu)) + return; + + float priorities[] = {1.0f}; + VkDeviceQueueCreateInfo queueCreateInfo = {}; + queueCreateInfo.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO; + queueCreateInfo.pNext = nullptr; + queueCreateInfo.flags = 0; + queueCreateInfo.queueCount = 1; + queueCreateInfo.queueFamilyIndex = renderingQueueFamilyIndex; + queueCreateInfo.pQueuePriorities = priorities; + + VkDeviceCreateInfo deviceCreateInfo = {}; + VkPhysicalDeviceFeatures enabledFeatures = {}; + deviceCreateInfo.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO; + deviceCreateInfo.pNext = nullptr; + deviceCreateInfo.queueCreateInfoCount = 1; + deviceCreateInfo.pQueueCreateInfos = &queueCreateInfo; + deviceCreateInfo.enabledLayerCount = m_layers->GetDeviceLayersCount(); + deviceCreateInfo.ppEnabledLayerNames = m_layers->GetDeviceLayers(); + deviceCreateInfo.enabledExtensionCount = m_layers->GetDeviceExtensionsCount(); + deviceCreateInfo.ppEnabledExtensionNames = m_layers->GetDeviceExtensions(); + deviceCreateInfo.pEnabledFeatures = nullptr; + if (enableDiagnostics) + { + enabledFeatures.robustBufferAccess = VK_TRUE; + deviceCreateInfo.pEnabledFeatures = &enabledFeatures; + } + + statusCode = vkCreateDevice(m_gpu, &deviceCreateInfo, nullptr, &m_device); + if (statusCode != VK_SUCCESS) + { + LOG_ERROR_VK_CALL(vkCreateDevice, statusCode); + return; + } + + VkPhysicalDeviceMemoryProperties memoryProperties; + vkGetPhysicalDeviceMemoryProperties(m_gpu, &memoryProperties); + m_objectManager = make_unique_dp(m_device, gpuProperties.limits, + memoryProperties, + renderingQueueFamilyIndex); + + bool const hasPartialTextureUpdates = + !dp::SupportManager::Instance().IsVulkanTexturePartialUpdateBuggy( + sdkVersion, gpuProperties.deviceName, apiVersion, driverVersion); + + m_drawContext = make_unique_dp( + m_vulkanInstance, m_gpu, gpuProperties, m_device, renderingQueueFamilyIndex, + make_ref(m_objectManager), appVersionCode, hasPartialTextureUpdates); + m_uploadContext = make_unique_dp( + m_vulkanInstance, m_gpu, gpuProperties, m_device, renderingQueueFamilyIndex, + make_ref(m_objectManager), hasPartialTextureUpdates); +} + +AndroidVulkanContextFactory::~AndroidVulkanContextFactory() +{ + m_drawContext.reset(); + m_uploadContext.reset(); + m_objectManager.reset(); + + if (m_device != nullptr) + { + vkDeviceWaitIdle(m_device); + vkDestroyDevice(m_device, nullptr); + } + + if (m_vulkanInstance != nullptr) + { + m_layers->Uninitialize(m_vulkanInstance); + vkDestroyInstance(m_vulkanInstance, nullptr); + } +} void AndroidVulkanContextFactory::SetSurface(JNIEnv * env, jobject jsurface) { @@ -69,6 +327,56 @@ void AndroidVulkanContextFactory::SetVulkanSurface() m_windowSurfaceValid = true; } +bool AndroidVulkanContextFactory::QuerySurfaceSize() +{ + auto statusCode = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(m_gpu, m_surface, + &m_surfaceCapabilities); + if (statusCode != VK_SUCCESS) + { + LOG_ERROR_VK_CALL(vkGetPhysicalDeviceSurfaceCapabilitiesKHR, statusCode); + return false; + } + + uint32_t formatCount = 0; + statusCode = vkGetPhysicalDeviceSurfaceFormatsKHR(m_gpu, m_surface, &formatCount, nullptr); + if (statusCode != VK_SUCCESS) + { + LOG_ERROR_VK_CALL(vkGetPhysicalDeviceSurfaceFormatsKHR, statusCode); + return false; + } + + std::vector formats(formatCount); + statusCode = vkGetPhysicalDeviceSurfaceFormatsKHR(m_gpu, m_surface, &formatCount, formats.data()); + if (statusCode != VK_SUCCESS) + { + LOG_ERROR_VK_CALL(vkGetPhysicalDeviceSurfaceFormatsKHR, statusCode); + return false; + } + + uint32_t chosenFormat; + for (chosenFormat = 0; chosenFormat < formatCount; chosenFormat++) + { + if (formats[chosenFormat].format == VK_FORMAT_R8G8B8A8_UNORM) + break; + } + if (chosenFormat == formatCount) + { + LOG_ERROR_VK("Any supported surface format wasn't found."); + return false; + } + + if (!(m_surfaceCapabilities.supportedCompositeAlpha & VK_COMPOSITE_ALPHA_INHERIT_BIT_KHR)) + { + LOG_ERROR_VK("Alpha channel is not supported."); + return false; + } + + m_surfaceFormat = formats[chosenFormat]; + m_surfaceWidth = static_cast(m_surfaceCapabilities.currentExtent.width); + m_surfaceHeight = static_cast(m_surfaceCapabilities.currentExtent.height); + return true; +} + void AndroidVulkanContextFactory::ResetSurface(bool allowPipelineDump) { ResetVulkanSurface(allowPipelineDump); @@ -118,8 +426,51 @@ void AndroidVulkanContextFactory::ChangeSurface(JNIEnv * env, jobject jsurface, LOG(LINFO, ("Surface changed", m_surfaceWidth, m_surfaceHeight)); } +bool AndroidVulkanContextFactory::IsVulkanSupported() const +{ + return m_vulkanInstance != nullptr && m_gpu != nullptr && m_device != nullptr; +} + bool AndroidVulkanContextFactory::IsValid() const { return IsVulkanSupported() && m_windowSurfaceValid; } + +int AndroidVulkanContextFactory::GetWidth() const +{ + ASSERT(IsValid(), ()); + return m_surfaceWidth; +} + +int AndroidVulkanContextFactory::GetHeight() const +{ + ASSERT(IsValid(), ()); + return m_surfaceHeight; +} + +dp::GraphicsContext * AndroidVulkanContextFactory::GetDrawContext() +{ + return m_drawContext.get(); +} + +dp::GraphicsContext * AndroidVulkanContextFactory::GetResourcesUploadContext() +{ + return m_uploadContext.get(); +} + +bool AndroidVulkanContextFactory::IsDrawContextCreated() const +{ + return m_drawContext != nullptr; +} + +bool AndroidVulkanContextFactory::IsUploadContextCreated() const +{ + return m_uploadContext != nullptr; +} + +void AndroidVulkanContextFactory::SetPresentAvailable(bool available) +{ + if (m_drawContext) + m_drawContext->SetPresentAvailable(available); +} } // namespace android diff --git a/android/app/src/main/cpp/app/organicmaps/vulkan/android_vulkan_context_factory.hpp b/android/app/src/main/cpp/app/organicmaps/vulkan/android_vulkan_context_factory.hpp index b98dc4c04e..35d16f8fb6 100644 --- a/android/app/src/main/cpp/app/organicmaps/vulkan/android_vulkan_context_factory.hpp +++ b/android/app/src/main/cpp/app/organicmaps/vulkan/android_vulkan_context_factory.hpp @@ -2,7 +2,11 @@ #include "app/organicmaps/core/jni_helper.hpp" -#include "drape/vulkan/vulkan_context_factory.hpp" +#include "drape/graphics_context_factory.hpp" +#include "drape/vulkan/vulkan_base_context.hpp" +#include "drape/vulkan/vulkan_object_manager.hpp" +#include "drape/vulkan/vulkan_layers.hpp" +#include "drape/pointers.hpp" #include @@ -11,22 +15,48 @@ namespace android { -class AndroidVulkanContextFactory : public dp::vulkan::VulkanContextFactory +class AndroidVulkanContextFactory : public dp::GraphicsContextFactory { public: AndroidVulkanContextFactory(uint32_t appVersionCode, int sdkVersion, bool isCustomROM); + ~AndroidVulkanContextFactory(); + bool IsVulkanSupported() const; bool IsValid() const; + dp::GraphicsContext * GetDrawContext() override; + dp::GraphicsContext * GetResourcesUploadContext() override; + bool IsDrawContextCreated() const override; + bool IsUploadContextCreated() const override; + void SetPresentAvailable(bool available) override; + void SetSurface(JNIEnv * env, jobject jsurface); void ResetSurface(bool allowPipelineDump); void ChangeSurface(JNIEnv * env, jobject jsurface, int w, int h); + int GetWidth() const; + int GetHeight() const; + private: void SetVulkanSurface(); void ResetVulkanSurface(bool allowPipelineDump); + bool QuerySurfaceSize(); + + VkInstance m_vulkanInstance = nullptr; + drape_ptr m_layers; + VkPhysicalDevice m_gpu = nullptr; + VkDevice m_device = nullptr; + drape_ptr m_objectManager; + drape_ptr m_drawContext; + drape_ptr m_uploadContext; ANativeWindow * m_nativeWindow = nullptr; bool m_windowSurfaceValid = false; + VkSurfaceKHR m_surface = 0; + VkSurfaceFormatKHR m_surfaceFormat; + VkSurfaceCapabilitiesKHR m_surfaceCapabilities; + + int m_surfaceWidth = 0; + int m_surfaceHeight = 0; }; } // namespace android diff --git a/android/app/src/main/java/app/organicmaps/PanelAnimator.java b/android/app/src/main/java/app/organicmaps/PanelAnimator.java index 48fb8a37d9..f668f4e983 100644 --- a/android/app/src/main/java/app/organicmaps/PanelAnimator.java +++ b/android/app/src/main/java/app/organicmaps/PanelAnimator.java @@ -11,15 +11,13 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; -import org.chromium.base.ObserverList; - +import app.organicmaps.util.Listeners; import app.organicmaps.util.UiUtils; class PanelAnimator { private final MwmActivity mActivity; - private final ObserverList mAnimationTrackListeners = new ObserverList<>(); - private final ObserverList.RewindableIterator mAnimationTrackIterator = mAnimationTrackListeners.rewindableIterator(); + private final Listeners mAnimationTrackListeners = new Listeners<>(); private final View mPanel; private final int mWidth; @IntegerRes @@ -35,7 +33,7 @@ class PanelAnimator void registerListener(@NonNull MwmActivity.LeftAnimationTrackListener animationTrackListener) { - mAnimationTrackListeners.addObserver(animationTrackListener); + mAnimationTrackListeners.register(animationTrackListener); } private void track(ValueAnimator animation) @@ -44,9 +42,9 @@ class PanelAnimator mPanel.setTranslationX(offset); mPanel.setAlpha(offset / mWidth + 1.0f); - mAnimationTrackIterator.rewind(); - while (mAnimationTrackIterator.hasNext()) - mAnimationTrackIterator.next().onTrackLeftAnimation(offset + mWidth); + for (MwmActivity.LeftAnimationTrackListener listener: mAnimationTrackListeners) + listener.onTrackLeftAnimation(offset + mWidth); + mAnimationTrackListeners.finishIterate(); } /** @param completionListener will be called before the fragment becomes actually visible */ @@ -72,9 +70,9 @@ class PanelAnimator UiUtils.show(mPanel); - mAnimationTrackIterator.rewind(); - while (mAnimationTrackIterator.hasNext()) - mAnimationTrackIterator.next().onTrackStarted(false); + for (MwmActivity.LeftAnimationTrackListener listener: mAnimationTrackListeners) + listener.onTrackStarted(false); + mAnimationTrackListeners.finishIterate(); ValueAnimator animator = ValueAnimator.ofFloat(-mWidth, 0.0f); animator.addUpdateListener(this::track); @@ -83,9 +81,9 @@ class PanelAnimator @Override public void onAnimationEnd(Animator animation) { - mAnimationTrackIterator.rewind(); - while (mAnimationTrackIterator.hasNext()) - mAnimationTrackIterator.next().onTrackStarted(true); + for (MwmActivity.LeftAnimationTrackListener listener: mAnimationTrackListeners) + listener.onTrackStarted(true); + mAnimationTrackListeners.finishIterate(); } }); @@ -103,9 +101,9 @@ class PanelAnimator return; } - mAnimationTrackIterator.rewind(); - while (mAnimationTrackIterator.hasNext()) - mAnimationTrackIterator.next().onTrackStarted(true); + for (MwmActivity.LeftAnimationTrackListener listener: mAnimationTrackListeners) + listener.onTrackStarted(true); + mAnimationTrackListeners.finishIterate(); ValueAnimator animator = ValueAnimator.ofFloat(0.0f, -mWidth); animator.addUpdateListener(this::track); @@ -116,9 +114,9 @@ class PanelAnimator { UiUtils.hide(mPanel); - mAnimationTrackIterator.rewind(); - while (mAnimationTrackIterator.hasNext()) - mAnimationTrackIterator.next().onTrackStarted(false); + for (MwmActivity.LeftAnimationTrackListener listener: mAnimationTrackListeners) + listener.onTrackStarted(false); + mAnimationTrackListeners.finishIterate(); if (completionListener != null) completionListener.run(); diff --git a/android/app/src/main/java/app/organicmaps/search/SearchEngine.java b/android/app/src/main/java/app/organicmaps/search/SearchEngine.java index dd899e627b..ddae8e7a88 100644 --- a/android/app/src/main/java/app/organicmaps/search/SearchEngine.java +++ b/android/app/src/main/java/app/organicmaps/search/SearchEngine.java @@ -5,11 +5,9 @@ import android.content.Context; import androidx.annotation.MainThread; import androidx.annotation.NonNull; import androidx.annotation.Nullable; - -import org.chromium.base.ObserverList; - import app.organicmaps.Framework; import app.organicmaps.util.Language; +import app.organicmaps.util.Listeners; import app.organicmaps.util.concurrency.UiThread; import java.nio.charset.StandardCharsets; @@ -32,6 +30,7 @@ public enum SearchEngine implements NativeSearchListener, { for (NativeSearchListener listener : mListeners) listener.onResultsUpdate(results, timestamp); + mListeners.finishIterate(); }); } @@ -43,6 +42,7 @@ public enum SearchEngine implements NativeSearchListener, { for (NativeSearchListener listener : mListeners) listener.onResultsEnd(timestamp); + mListeners.finishIterate(); }); } @@ -54,6 +54,7 @@ public enum SearchEngine implements NativeSearchListener, { for (NativeMapSearchListener listener : mMapListeners) listener.onMapSearchResults(results, timestamp, isLast); + mMapListeners.finishIterate(); }); } @@ -62,6 +63,7 @@ public enum SearchEngine implements NativeSearchListener, { for (NativeBookmarkSearchListener listener : mBookmarkListeners) listener.onBookmarkSearchResultsUpdate(bookmarkIds, timestamp); + mBookmarkListeners.finishIterate(); } @Override @@ -69,42 +71,44 @@ public enum SearchEngine implements NativeSearchListener, { for (NativeBookmarkSearchListener listener : mBookmarkListeners) listener.onBookmarkSearchResultsEnd(bookmarkIds, timestamp); + mBookmarkListeners.finishIterate(); } - private final ObserverList mListeners = new ObserverList<>(); - - private final ObserverList mMapListeners = new ObserverList<>(); - - private final ObserverList mBookmarkListeners = new ObserverList<>(); + @NonNull + private final Listeners mListeners = new Listeners<>(); + @NonNull + private final Listeners mMapListeners = new Listeners<>(); + @NonNull + private final Listeners mBookmarkListeners = new Listeners<>(); public void addListener(NativeSearchListener listener) { - mListeners.addObserver(listener); + mListeners.register(listener); } public void removeListener(NativeSearchListener listener) { - mListeners.removeObserver(listener); + mListeners.unregister(listener); } public void addMapListener(NativeMapSearchListener listener) { - mMapListeners.addObserver(listener); + mMapListeners.register(listener); } public void removeMapListener(NativeMapSearchListener listener) { - mMapListeners.removeObserver(listener); + mMapListeners.unregister(listener); } public void addBookmarkListener(NativeBookmarkSearchListener listener) { - mBookmarkListeners.addObserver(listener); + mBookmarkListeners.register(listener); } public void removeBookmarkListener(NativeBookmarkSearchListener listener) { - mBookmarkListeners.removeObserver(listener); + mBookmarkListeners.unregister(listener); } private native void nativeInit(); diff --git a/android/app/src/main/java/app/organicmaps/util/Listeners.java b/android/app/src/main/java/app/organicmaps/util/Listeners.java new file mode 100644 index 0000000000..aefdc1a266 --- /dev/null +++ b/android/app/src/main/java/app/organicmaps/util/Listeners.java @@ -0,0 +1,94 @@ +package app.organicmaps.util; + +import androidx.annotation.NonNull; + +import java.util.Iterator; +import java.util.LinkedHashSet; +import java.util.Set; + +/** + * `Registrator` pattern implementation which allows to maintain the list of listeners, + * offers safe adding/removing of listeners during iteration. + *
{@link #finishIterate()} must be called after iteration is complete. + */ +public final class Listeners implements Iterable +{ + private final Set mListeners = new LinkedHashSet<>(); + private final Set mListenersToAdd = new LinkedHashSet<>(); + private final Set mListenersToRemove = new LinkedHashSet<>(); + + private boolean mIterating; + + @Override + public @NonNull Iterator iterator() + { + if (mIterating) + throw new RuntimeException("finishIterate() must be called before new iteration"); + + mIterating = true; + return mListeners.iterator(); + } + + /** + * Completes listeners iteration. Must be called after iteration is done. + */ + public void finishIterate() + { + if (!mListenersToRemove.isEmpty()) + mListeners.removeAll(mListenersToRemove); + + if (!mListenersToAdd.isEmpty()) + mListeners.addAll(mListenersToAdd); + + mListenersToAdd.clear(); + mListenersToRemove.clear(); + mIterating = false; + } + + /** + * Safely registers new listener. If registered during iteration, new listener will NOT be called before current iteration is complete. + */ + public void register(T listener) + { + if (mIterating) + { + mListenersToRemove.remove(listener); + if (!mListeners.contains(listener)) + mListenersToAdd.add(listener); + } + else + mListeners.add(listener); + } + + /** + * Safely unregisters listener. If unregistered during iteration, old listener WILL be called in the current iteration. + */ + public void unregister(T listener) + { + if (mIterating) + { + mListenersToAdd.remove(listener); + if (mListeners.contains(listener)) + mListenersToRemove.add(listener); + } + else + mListeners.remove(listener); + } + + public int getSize() + { + int res = mListeners.size(); + if (mIterating) + { + res += mListenersToAdd.size(); + res -= mListenersToRemove.size(); + } + + return res; + } + + public boolean isEmpty() + { + return (getSize() <= 0); + } +} diff --git a/android/app/src/main/java/app/organicmaps/widget/placepage/PlacePageController.java b/android/app/src/main/java/app/organicmaps/widget/placepage/PlacePageController.java index c20ed5e2d9..05378c9760 100644 --- a/android/app/src/main/java/app/organicmaps/widget/placepage/PlacePageController.java +++ b/android/app/src/main/java/app/organicmaps/widget/placepage/PlacePageController.java @@ -283,9 +283,6 @@ public class PlacePageController extends Fragment implements */ private void animatePeekHeight(int peekHeight) { - if (mCurrentWindowInsets == null) { - return; - } final int bottomInsets = mCurrentWindowInsets.getInsets(WindowInsetsCompat.Type.systemBars()).bottom; // Make sure to start from the current height of the place page final int parentHeight = ((View) mPlacePage.getParent()).getHeight(); diff --git a/android/app/src/main/res/layout/fragment_categories.xml b/android/app/src/main/res/layout/fragment_categories.xml index 5b76383f00..e2c9d95571 100644 --- a/android/app/src/main/res/layout/fragment_categories.xml +++ b/android/app/src/main/res/layout/fragment_categories.xml @@ -9,7 +9,5 @@ + android:layout_height="match_parent" /> diff --git a/android/app/src/main/res/values-sr/strings.xml b/android/app/src/main/res/values-sr/strings.xml index d603777d37..31e0ce77dd 100644 --- a/android/app/src/main/res/values-sr/strings.xml +++ b/android/app/src/main/res/values-sr/strings.xml @@ -84,7 +84,7 @@ Подешавања - Место за чување мапа + Сачувај мапе у Изаберите фолдер у ком се чувају мапе. @@ -256,7 +256,7 @@ Није доступно Аутоматско увећавање Раздаљина - Прикажи на мапи + Погледај на мапи Мени @@ -276,7 +276,7 @@ Подржи пројекат - Пријавите проблем + Пријави проблем Побољшајте смер стрелице тако што ћете померати телефон у путањи осмице као бисте калибрисали компас. @@ -312,10 +312,6 @@ Google Play прецизност локације Брзо одређивање ваше локације коришћењем Bluetooth-а, WiFi-а, или мобилне мреже - - Претрага хотела на Kayak.com - - Линкови \"Фотографије, рецензије, резервације\" приказују се за хотеле повезане са Kayak.com. Бонус добијен за сваку резервацију преко ових линкова иде за развој Organic Maps-а. Преузми све мапе које се налазе на рути @@ -455,7 +451,7 @@ Промени радно време Немате OpenStreetMap налог? Региструјте се на OpenStreetMap-у - Пријавите се + Пријави се Нисте пријављени Пријава на OpenStreetMap @@ -596,11 +592,11 @@ Никад не користи Увек ме питај Да би се приказали подаци о саобраћају, мапа мора да се ажурира. - Увећана слова на мапи + Повећај слова на мапи Молим Вас да ажурирате Organic Maps Подаци о саобраћају нису доступни - Снимање лог фајлова + Омогући снимање лог фајлова Ваше мишљење Користимо системски сервис текст-у-говор за гласовне инструкције. Многи Андроид уређаји користе Google Препознавање и синтезу говора, који можете да преузмете или ажурирате путем Google Play продавнице (https://play.google.com/store/apps/details?id=com.google.android.tts) @@ -676,7 +672,7 @@ Ограничен приступ Унесите опис (текст или html) Приватно - Прекршајне камере + Саобраћајне камере Опис места Преузимање мапа @@ -691,7 +687,7 @@ Никад Када је батерија при крају Увек - Привремено укључите ову опцију да бисте сачували детаљне дијагностичке логове уколико имате неки проблем. Логове можете да нам пошаљете коришћењем опције \"Пријавите проблем\" у прозору Помоћ. Напомена: Логови могу да садрже информације о вашој локацији. + Привремено укључите ову опцију да бисте сачували детаљне дијагностичке логове уколико имате неки проблем. Логове можете да нам пошаљете коришћењем опције \"Пријави проблем\" у прозору Помоћ. Напомена: Логови могу да садрже информације о вашој локацији. Online измене Опције рутирања @@ -783,11 +779,11 @@ Повезивање није успело Откачите USB кабл - Екран увек укључен + Држи укључен екран Када је одабрано, екран ће увек бити укључен док се приказује мапа. - Приказ мапе на закључаном екрану + Прикажи на закључаном екрану Када је одабрано, апликација ће радити и на закључаном екрану, тј. када је уређај закључан. diff --git a/cmake/OmimHelpers.cmake b/cmake/OmimHelpers.cmake index d4afa851de..4dad95eed6 100644 --- a/cmake/OmimHelpers.cmake +++ b/cmake/OmimHelpers.cmake @@ -4,10 +4,6 @@ include(OmimConfig) function(omim_add_executable executable) add_executable(${executable} ${ARGN}) - if (PLATFORM_WIN) - target_sources(${executable} PRIVATE "${CMAKE_CURRENT_FUNCTION_LIST_DIR}/windows/OrganicMaps.manifest") - endif() - # Enable warnings for all our binaries. target_compile_options(${executable} PRIVATE ${OMIM_WARNING_FLAGS}) target_include_directories(${executable} SYSTEM PRIVATE ${3PARTY_INCLUDE_DIRS}) diff --git a/cmake/windows/OrganicMaps.manifest b/cmake/windows/OrganicMaps.manifest deleted file mode 100644 index c589bed88e..0000000000 --- a/cmake/windows/OrganicMaps.manifest +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - UTF-8 - - true - - - diff --git a/data/resources-6plus_dark/symbols.png b/data/resources-6plus_dark/symbols.png index 4f04331563..fdcae8fb56 100644 Binary files a/data/resources-6plus_dark/symbols.png and b/data/resources-6plus_dark/symbols.png differ diff --git a/data/resources-6plus_dark/symbols.sdf b/data/resources-6plus_dark/symbols.sdf index 8a8a7aa4db..10ebd690a1 100644 --- a/data/resources-6plus_dark/symbols.sdf +++ b/data/resources-6plus_dark/symbols.sdf @@ -8,807 +8,801 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/resources-6plus_light/symbols.png b/data/resources-6plus_light/symbols.png index 14fe2a93a6..67bd91783b 100644 Binary files a/data/resources-6plus_light/symbols.png and b/data/resources-6plus_light/symbols.png differ diff --git a/data/resources-6plus_light/symbols.sdf b/data/resources-6plus_light/symbols.sdf index ff468ac84d..dc4ae97d44 100644 --- a/data/resources-6plus_light/symbols.sdf +++ b/data/resources-6plus_light/symbols.sdf @@ -8,807 +8,801 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/resources-hdpi_dark/symbols.png b/data/resources-hdpi_dark/symbols.png index abe938a98d..8587fe1fb0 100644 Binary files a/data/resources-hdpi_dark/symbols.png and b/data/resources-hdpi_dark/symbols.png differ diff --git a/data/resources-hdpi_dark/symbols.sdf b/data/resources-hdpi_dark/symbols.sdf index f4b3b7ed01..20425293d0 100644 --- a/data/resources-hdpi_dark/symbols.sdf +++ b/data/resources-hdpi_dark/symbols.sdf @@ -8,807 +8,801 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/resources-hdpi_light/symbols.png b/data/resources-hdpi_light/symbols.png index 0c135a06f5..da977b8eaf 100644 Binary files a/data/resources-hdpi_light/symbols.png and b/data/resources-hdpi_light/symbols.png differ diff --git a/data/resources-hdpi_light/symbols.sdf b/data/resources-hdpi_light/symbols.sdf index f4b3b7ed01..20425293d0 100644 --- a/data/resources-hdpi_light/symbols.sdf +++ b/data/resources-hdpi_light/symbols.sdf @@ -8,807 +8,801 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/resources-mdpi_dark/symbols.png b/data/resources-mdpi_dark/symbols.png index 38fc20546c..58013eafc6 100644 Binary files a/data/resources-mdpi_dark/symbols.png and b/data/resources-mdpi_dark/symbols.png differ diff --git a/data/resources-mdpi_dark/symbols.sdf b/data/resources-mdpi_dark/symbols.sdf index 82549c24e8..1fb895734f 100644 --- a/data/resources-mdpi_dark/symbols.sdf +++ b/data/resources-mdpi_dark/symbols.sdf @@ -8,807 +8,801 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/resources-mdpi_light/symbols.png b/data/resources-mdpi_light/symbols.png index 1e7f536e6b..91475067dc 100644 Binary files a/data/resources-mdpi_light/symbols.png and b/data/resources-mdpi_light/symbols.png differ diff --git a/data/resources-mdpi_light/symbols.sdf b/data/resources-mdpi_light/symbols.sdf index 82549c24e8..1fb895734f 100644 --- a/data/resources-mdpi_light/symbols.sdf +++ b/data/resources-mdpi_light/symbols.sdf @@ -8,807 +8,801 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/resources-xhdpi_dark/symbols.png b/data/resources-xhdpi_dark/symbols.png index 0273c2c2ef..b53fcbc301 100644 Binary files a/data/resources-xhdpi_dark/symbols.png and b/data/resources-xhdpi_dark/symbols.png differ diff --git a/data/resources-xhdpi_dark/symbols.sdf b/data/resources-xhdpi_dark/symbols.sdf index 329c5d4748..f7dadcf94b 100644 --- a/data/resources-xhdpi_dark/symbols.sdf +++ b/data/resources-xhdpi_dark/symbols.sdf @@ -8,807 +8,801 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/resources-xhdpi_light/symbols.png b/data/resources-xhdpi_light/symbols.png index 1d78b655d3..db03a481a5 100644 Binary files a/data/resources-xhdpi_light/symbols.png and b/data/resources-xhdpi_light/symbols.png differ diff --git a/data/resources-xhdpi_light/symbols.sdf b/data/resources-xhdpi_light/symbols.sdf index 329c5d4748..f7dadcf94b 100644 --- a/data/resources-xhdpi_light/symbols.sdf +++ b/data/resources-xhdpi_light/symbols.sdf @@ -8,807 +8,801 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/resources-xxhdpi_dark/symbols.png b/data/resources-xxhdpi_dark/symbols.png index 41c53851dc..6433330454 100644 Binary files a/data/resources-xxhdpi_dark/symbols.png and b/data/resources-xxhdpi_dark/symbols.png differ diff --git a/data/resources-xxhdpi_dark/symbols.sdf b/data/resources-xxhdpi_dark/symbols.sdf index 7edaf1034c..d19b89f77f 100644 --- a/data/resources-xxhdpi_dark/symbols.sdf +++ b/data/resources-xxhdpi_dark/symbols.sdf @@ -8,807 +8,801 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/resources-xxhdpi_light/symbols.png b/data/resources-xxhdpi_light/symbols.png index 21baf8a144..f13c84940c 100644 Binary files a/data/resources-xxhdpi_light/symbols.png and b/data/resources-xxhdpi_light/symbols.png differ diff --git a/data/resources-xxhdpi_light/symbols.sdf b/data/resources-xxhdpi_light/symbols.sdf index 7edaf1034c..d19b89f77f 100644 --- a/data/resources-xxhdpi_light/symbols.sdf +++ b/data/resources-xxhdpi_light/symbols.sdf @@ -8,807 +8,801 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/resources-xxxhdpi_dark/symbols.png b/data/resources-xxxhdpi_dark/symbols.png index ec3ccea92f..d440326e51 100644 Binary files a/data/resources-xxxhdpi_dark/symbols.png and b/data/resources-xxxhdpi_dark/symbols.png differ diff --git a/data/resources-xxxhdpi_dark/symbols.sdf b/data/resources-xxxhdpi_dark/symbols.sdf index fd0697777b..9f19cd0513 100644 --- a/data/resources-xxxhdpi_dark/symbols.sdf +++ b/data/resources-xxxhdpi_dark/symbols.sdf @@ -8,807 +8,801 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/resources-xxxhdpi_light/symbols.png b/data/resources-xxxhdpi_light/symbols.png index 052348d9c0..48de77b608 100644 Binary files a/data/resources-xxxhdpi_light/symbols.png and b/data/resources-xxxhdpi_light/symbols.png differ diff --git a/data/resources-xxxhdpi_light/symbols.sdf b/data/resources-xxxhdpi_light/symbols.sdf index fd0697777b..9f19cd0513 100644 --- a/data/resources-xxxhdpi_light/symbols.sdf +++ b/data/resources-xxxhdpi_light/symbols.sdf @@ -8,807 +8,801 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/strings/strings.txt b/data/strings/strings.txt index e58ad6fcfd..8c7aba4287 100644 --- a/data/strings/strings.txt +++ b/data/strings/strings.txt @@ -2463,7 +2463,7 @@ ro = Salvează hărțile în ru = Сохранять карты в sk = Uložiť mapy do - sr = Место за чување мапа + sr = Сачувај мапе у sv = Spara kartor i sw = Hifadhi ramani kwenye th = บันทึกแผนที่ไปยัง @@ -6540,7 +6540,7 @@ ro = Vezi pe hartă ru = Посмотреть на карте sk = Zobraziť na mape - sr = Прикажи на мапи + sr = Погледај на мапи sv = Visa på kartan th = ดูบนแผนที่ tr = Haritada görüntüle @@ -7281,7 +7281,7 @@ ro = Raportează o eroare ru = Сообщить о проблеме sk = Nahlásiť chybu - sr = Пријавите проблем + sr = Пријави проблем sv = Rapportera en bugg th = แจ้งข้อผิดพลาด tr = Hata bildirin @@ -8677,7 +8677,6 @@ ro = Kayak.com Linkuri către hoteluri ru = Ссылки в гостиницах на Kayak.com sk = Kayak.com Hotel Odkazy - sr = Претрага хотела на Kayak.com sv = Kayak.com Hotellänkar sw = Viungo vya Hoteli ya Kayak.com th = ลงคโรงแรม Kayak.com @@ -8725,7 +8724,6 @@ ro = Fotografiile, recenziile, linkurile de rezervare sunt afișate pentru hotelurile care au o listă pe Kayak.com. Bonusul de recomandare primit pentru fiecare rezervare prin intermediul acestor linkuri este destinat dezvoltării Organic Maps. ru = Ссылки "Фотографии, отзывы, бронирование" отображаются для отелей, подключенных к Kayak.com. Реферальный бонус, полученный за каждое бронирование по этим ссылкам, идет на развитие Organic Maps. sk = Fotografie, recenzie a rezervačné odkazy sa zobrazujú pre hotely, ktoré majú svoju ponuku na Kayak.com. Bonus získaný za každú rezerváciu prostredníctvom týchto odkazov ide na rozvoj Organic Maps. - sr = Линкови "Фотографије, рецензије, резервације" приказују се за хотеле повезане са Kayak.com. Бонус добијен за сваку резервацију преко ових линкова иде за развој Organic Maps-а. sv = Foton, recensioner, bokningslänkar visas för hotell som har en lista på Kayak.com. Den värvningsbonus som erhålls för varje bokning via dessa länkar går till utveckling av Organic Maps. sw = Picha, maoni, viungo vya kuweka nafasi vinaonyeshwa kwa hoteli ambazo zimeorodheshwa kwenye Kayak.com. Bonasi ya rufaa inayopokelewa kwa kila nafasi iliyowekwa kupitia viungo hivi huenda kwenye uundaji wa Organic Maps. th = รปภาพ รวว ลงกการจองจะแสดงสำหรบโรงแรมทมรายการขอมลบน Kayak.com โบนสผแนะนำทไดรบสำหรบการจองแตละครงผานลงกเหลานจะนำไปใชในการพฒนา Organic Maps @@ -14180,7 +14178,7 @@ ro = Autentificare ru = Войти sk = Prihlásiť sa - sr = Пријавите се + sr = Пријави се sv = Logga in th = ล็อกอิน tr = Oturum aç @@ -21027,7 +21025,7 @@ ro = Mărește dimensiunea literelor pe hartă ru = Увеличить шрифт на карте sk = Zväčšiť veľkosť písma na mape - sr = Увећана слова на мапи + sr = Повећај слова на мапи sv = Öka teckenstorlek på kartan th = เพิ่มขนาดฟอนต์บนแผนที่ tr = Haritadaki yazı tipi boyutunu artır @@ -21210,7 +21208,7 @@ ro = Activează jurnalizarea ru = Включить запись логов sk = Zapnúť zaznamenávanie - sr = Снимање лог фајлова + sr = Омогући снимање лог фајлова sv = Aktivera loggning th = เปิดใช้งานการเก็บล็อก tr = Günlüğü etkinleştir @@ -24873,7 +24871,7 @@ ro = Radare ru = Камеры скорости sk = Rýchlostné kamery - sr = Прекршајне камере + sr = Саобраћајне камере sv = Hastighetskameror sw = Kamera za mwendo-kasi th = กล้องตรวจจับความเร็ว @@ -25400,7 +25398,7 @@ ro = Opțiunea activează jurnalizarea în scopuri de diagnosticare. Aceasta poate fi utilă echipei noastre pentru a rezolva problemele cu aplicația. Activează temporar această opțiune pentru a înregistra și a ne trimite jurnale detaliate despre problema ta. ru = Данная настройка включается для записи действий в целях диагностики, чтобы помочь нашей команде выявить проблемы с приложением. Временно включайте эту настройку только для отправки детальной информации о найденной вами проблеме в приложении через кнопку "Сообщить о проблеме". sk = Týmto zapnete záznamenávanie diagnostických informácií, ktoré môžete poslať našej technickej podpore v prípade problémov s aplikáciou. Záznam môže obsahovať údaje o vašej polohe. - sr = Привремено укључите ову опцију да бисте сачували детаљне дијагностичке логове уколико имате неки проблем. Логове можете да нам пошаљете коришћењем опције "Пријавите проблем" у прозору Помоћ. Напомена: Логови могу да садрже информације о вашој локацији. + sr = Привремено укључите ову опцију да бисте сачували детаљне дијагностичке логове уколико имате неки проблем. Логове можете да нам пошаљете коришћењем опције "Пријави проблем" у прозору Помоћ. Напомена: Логови могу да садрже информације о вашој локацији. sv = Aktivera denna funktion för att logga detaljer för diagnostiska ändamål. Detta hjälper utvecklarna att identifiera problem med appen. Slå på funktionen endast på begäran av Organic Maps supporttjänst. sw = Chaguo huwasha data kwa madhumuni ya uchunguzi. Itakuwa muhimu kwa wafanyakazi wetu ambao wanatatua matatizo ya programu. Washa chaguo hili kwa maombi ya mhudumu wa Organic Maps tu. th = ออปชันเพื่อเปิดการบันทึกประวัติการทำงานเพื่อการวินิจฉัย ประวัติดังกล่าวอาจเป็นประโยชน์กับทีมงานช่วยเหลือของเราที่คอยจัดการกับปัญหาที่เจอระหว่างแอปทำงาน โปรดเปิดออปชันดังกล่าวจากการร้องข้อการสนับสนุนจาก Organic Maps เท่านั้น @@ -27159,7 +27157,7 @@ ro = Radare ru = Камеры sk = Radary - sr = Прекршајне камере + sr = Саобраћајне камере sv = Fartkameror sw = Kam za kasi th = จับความเร็ว @@ -30085,7 +30083,7 @@ ro = Păstrați ecranul pornit ru = Держи экран включённым sk = Nechať obrazovku zapnutú - sr = Екран увек укључен + sr = Држи укључен екран sv = Behåll skärmen på sw = Washa skrini th = เปิดหน้าจอไว้ @@ -30174,7 +30172,7 @@ ro = Arată pe ecranul de blocare ru = Показывать на экране блокировки sk = Zobraziť na uzamknutej obrazovke - sr = Приказ мапе на закључаном екрану + sr = Прикажи на закључаном екрану tr = Kilit ekranında göster uk = Показувати на заблокованому екрані zh-Hans = 在锁屏上显示 @@ -30529,7 +30527,6 @@ ro = Sunteți sigur că doriți să ștergeți această pistă? ru = Вы уверены, что хотите удалить этот трек? sk = Ste si istí, že chcete túto skladbu odstrániť? - sr = Да ли сте сигурни да желите да обришете ову путању? sv = Är du säker på att du vill radera det här spåret? sw = Je, una uhakika unataka kufuta wimbo huu? th = คุณแน่ใจหรือไม่ว่าต้องการลบแทร็กนี้ diff --git a/data/styles/default/dark/symbols/search-result-archaeological-site.svg b/data/styles/default/dark/symbols/search-result-archaeological-site.svg deleted file mode 100644 index 8006805983..0000000000 --- a/data/styles/default/dark/symbols/search-result-archaeological-site.svg +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/data/styles/default/dark/symbols/search-result-attraction.svg b/data/styles/default/dark/symbols/search-result-attraction.svg deleted file mode 100644 index 0da8d5b4a7..0000000000 --- a/data/styles/default/dark/symbols/search-result-attraction.svg +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/data/styles/default/dark/symbols/search-result-drinking-water-no.svg b/data/styles/default/dark/symbols/search-result-drinking-water-no.svg deleted file mode 100644 index d32f00fe44..0000000000 --- a/data/styles/default/dark/symbols/search-result-drinking-water-no.svg +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/data/styles/default/dark/symbols/search-result-drinking-water.svg b/data/styles/default/dark/symbols/search-result-drinking-water.svg deleted file mode 100644 index 89f4976570..0000000000 --- a/data/styles/default/dark/symbols/search-result-drinking-water.svg +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/data/styles/default/dark/symbols/search-result-remains.svg b/data/styles/default/dark/symbols/search-result-remains.svg deleted file mode 100644 index 3b76c65c4c..0000000000 --- a/data/styles/default/dark/symbols/search-result-remains.svg +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/data/styles/default/dark/symbols/search-result-viewpoint.svg b/data/styles/default/dark/symbols/search-result-viewpoint.svg deleted file mode 100644 index ee9e6e67c9..0000000000 --- a/data/styles/default/dark/symbols/search-result-viewpoint.svg +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/data/styles/default/light/symbols/search-result-archaeological-site.svg b/data/styles/default/light/symbols/search-result-archaeological-site.svg deleted file mode 100644 index 8006805983..0000000000 --- a/data/styles/default/light/symbols/search-result-archaeological-site.svg +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/data/styles/default/light/symbols/search-result-attraction.svg b/data/styles/default/light/symbols/search-result-attraction.svg deleted file mode 100644 index 0da8d5b4a7..0000000000 --- a/data/styles/default/light/symbols/search-result-attraction.svg +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/data/styles/default/light/symbols/search-result-drinking-water-no.svg b/data/styles/default/light/symbols/search-result-drinking-water-no.svg deleted file mode 100644 index d32f00fe44..0000000000 --- a/data/styles/default/light/symbols/search-result-drinking-water-no.svg +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/data/styles/default/light/symbols/search-result-drinking-water.svg b/data/styles/default/light/symbols/search-result-drinking-water.svg deleted file mode 100644 index 89f4976570..0000000000 --- a/data/styles/default/light/symbols/search-result-drinking-water.svg +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/data/styles/default/light/symbols/search-result-remains.svg b/data/styles/default/light/symbols/search-result-remains.svg deleted file mode 100644 index 3b76c65c4c..0000000000 --- a/data/styles/default/light/symbols/search-result-remains.svg +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/data/styles/default/light/symbols/search-result-viewpoint.svg b/data/styles/default/light/symbols/search-result-viewpoint.svg deleted file mode 100644 index ee9e6e67c9..0000000000 --- a/data/styles/default/light/symbols/search-result-viewpoint.svg +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/drape/CMakeLists.txt b/drape/CMakeLists.txt index 1501dbf5c0..1d74a250b0 100644 --- a/drape/CMakeLists.txt +++ b/drape/CMakeLists.txt @@ -107,10 +107,9 @@ set(DRAPE_TESTABLE_SRC viewport.cpp viewport.hpp visual_scale.hpp + # TODO: Why Vulkan is added on all platforms, even on iOS and Mac? vulkan/vulkan_base_context.cpp vulkan/vulkan_base_context.hpp - vulkan/vulkan_context_factory.cpp - vulkan/vulkan_context_factory.hpp vulkan/vulkan_gpu_buffer_impl.cpp vulkan/vulkan_gpu_buffer_impl.hpp vulkan/vulkan_gpu_program.hpp @@ -134,8 +133,12 @@ set(DRAPE_TESTABLE_SRC vulkan/vulkan_vertex_array_buffer_impl.cpp ) -if (PLATFORM_IPHONE OR PLATFORM_MAC) - append(DRAPE_TESTABLE_SRC +set(SRC ${DRAPE_TESTABLE_SRC} gl_functions.cpp) + +if (PLATFORM_IPHONE) + append(SRC + hw_texture_ios.hpp + hw_texture_ios.mm metal/metal_base_context.hpp metal/metal_base_context.mm metal/metal_cleaner.hpp @@ -152,15 +155,6 @@ if (PLATFORM_IPHONE OR PLATFORM_MAC) ) endif() -set(SRC ${DRAPE_TESTABLE_SRC} gl_functions.cpp) - -if (PLATFORM_IPHONE) - append(SRC - hw_texture_ios.hpp - hw_texture_ios.mm - ) -endif() - omim_add_library(${PROJECT_NAME} ${SRC}) # Do not include glm's CMakeLists.txt, because it's outdated and not necessary. @@ -170,10 +164,6 @@ if (PLATFORM_LINUX) find_package(OpenGL) endif() -if (PLATFORM_MAC) - set_target_properties(${PROJECT_NAME} PROPERTIES XCODE_ATTRIBUTE_CLANG_ENABLE_OBJC_ARC YES) -endif() - set(DRAPE_LINK_LIBRARIES indexer platform @@ -187,7 +177,6 @@ set(DRAPE_LINK_LIBRARIES ICU::i18n expat::expat $<$:-framework\ OpenGL> - $<$:-framework\ Metal> $<$:OpenGL::GL> ) diff --git a/drape/drape_global.hpp b/drape/drape_global.hpp index d0f449483b..68cb3d3b4d 100644 --- a/drape/drape_global.hpp +++ b/drape/drape_global.hpp @@ -1,7 +1,6 @@ #pragma once #include "drape/color.hpp" -#include "drape/pointers.hpp" #include "geometry/point2d.hpp" @@ -10,17 +9,11 @@ #include "std/target_os.hpp" #include -#include -#if defined(__APPLE__) +#if defined(__APPLE__) && !defined(OMIM_OS_MAC) #define OMIM_METAL_AVAILABLE #endif -namespace gpu -{ -class ProgramManager; -} // namespace gpu - namespace dp { enum class ApiVersion @@ -137,11 +130,4 @@ inline dp::ApiVersion ApiVersionFromString(std::string const & str) return dp::ApiVersion::OpenGLES3; #endif } - -class GraphicsContext; -class TextureManager; -using RenderInjectionHandler = std::function, - ref_ptr, - ref_ptr, - bool shutdown)>; } // namespace dp diff --git a/drape/drape_routine.hpp b/drape/drape_routine.hpp index c4a49d5d20..927d561b43 100644 --- a/drape/drape_routine.hpp +++ b/drape/drape_routine.hpp @@ -48,7 +48,7 @@ public: static void Init() { - Instance(true /* reinitialize*/); + Instance(); } static void Shutdown() @@ -106,15 +106,10 @@ public: } private: - static DrapeRoutine & Instance(bool reinitialize = false) + static DrapeRoutine & Instance() { - static std::unique_ptr instance; - if (!instance || reinitialize) { - if (instance) - instance->FinishAll(); - instance = std::unique_ptr(new DrapeRoutine()); - } - return *instance; + static DrapeRoutine instance; + return instance; } DrapeRoutine() : m_workerThread(4 /* threads count */) {} diff --git a/drape/drape_tests/testing_graphics_context.hpp b/drape/drape_tests/testing_graphics_context.hpp index 95b9580c3c..7270f02086 100644 --- a/drape/drape_tests/testing_graphics_context.hpp +++ b/drape/drape_tests/testing_graphics_context.hpp @@ -27,7 +27,6 @@ public: void Clear(uint32_t clearBits, uint32_t storeBits) override {} void Flush() override {} void SetViewport(uint32_t x, uint32_t y, uint32_t w, uint32_t h) override {} - void SetScissor(uint32_t x, uint32_t y, uint32_t w, uint32_t h) override {} void SetDepthTestEnabled(bool enabled) override {} void SetDepthTestFunction(dp::TestFunction depthFunction) override {} void SetStencilTestEnabled(bool enabled) override {} @@ -35,7 +34,6 @@ public: void SetStencilActions(dp::StencilFace face, dp::StencilAction stencilFailAction, dp::StencilAction depthFailAction, dp::StencilAction passAction) override {} void SetStencilReferenceValue(uint32_t stencilReferenceValue) override {} - void SetCullingEnabled(bool enabled) override {} private: dp::ApiVersion m_apiVersion = dp::ApiVersion::OpenGLES2; diff --git a/drape/glsl_types.hpp b/drape/glsl_types.hpp index 2a8a58a865..d2ba26e82a 100644 --- a/drape/glsl_types.hpp +++ b/drape/glsl_types.hpp @@ -29,10 +29,6 @@ using glm::ivec2; using glm::ivec3; using glm::ivec4; -using glm::uvec2; -using glm::uvec3; -using glm::uvec4; - using glm::mat3; using glm::mat4; using glm::mat4x2; diff --git a/drape/graphics_context.hpp b/drape/graphics_context.hpp index 0215a49cce..56e30bec99 100644 --- a/drape/graphics_context.hpp +++ b/drape/graphics_context.hpp @@ -81,7 +81,6 @@ public: virtual void Clear(uint32_t clearBits, uint32_t storeBits) = 0; virtual void Flush() = 0; virtual void SetViewport(uint32_t x, uint32_t y, uint32_t w, uint32_t h) = 0; - virtual void SetScissor(uint32_t x, uint32_t y, uint32_t w, uint32_t h) = 0; virtual void SetDepthTestEnabled(bool enabled) = 0; virtual void SetDepthTestFunction(TestFunction depthFunction) = 0; virtual void SetStencilTestEnabled(bool enabled) = 0; @@ -89,6 +88,5 @@ public: virtual void SetStencilActions(StencilFace face, StencilAction stencilFailAction, StencilAction depthFailAction, StencilAction passAction) = 0; virtual void SetStencilReferenceValue(uint32_t stencilReferenceValue) = 0; - virtual void SetCullingEnabled(bool enabled) = 0; }; } // namespace dp diff --git a/drape/mesh_object.cpp b/drape/mesh_object.cpp index 525c31b0cb..268d793535 100644 --- a/drape/mesh_object.cpp +++ b/drape/mesh_object.cpp @@ -46,35 +46,27 @@ public: for (auto & buffer : m_mesh->m_buffers) { - buffer->m_bufferId = GLFunctions::glGenBuffer(); - GLFunctions::glBindBuffer(buffer->m_bufferId, gl_const::GLArrayBuffer); + buffer.m_bufferId = GLFunctions::glGenBuffer(); + GLFunctions::glBindBuffer(buffer.m_bufferId, gl_const::GLArrayBuffer); - if (buffer->GetSizeInBytes() != 0) + if (!buffer.m_data.empty()) { - GLFunctions::glBufferData(gl_const::GLArrayBuffer, buffer->GetSizeInBytes(), - buffer->GetData(), gl_const::GLStaticDraw); - } - - if (!m_mesh->m_indices.empty()) - { - m_indexBuffer = GLFunctions::glGenBuffer(); - GLFunctions::glBindBuffer(m_indexBuffer, gl_const::GLElementArrayBuffer); - GLFunctions::glBufferData(gl_const::GLElementArrayBuffer, - m_mesh->m_indices.size() * sizeof(uint16_t), - m_mesh->m_indices.data(), gl_const::GLStaticDraw); + GLFunctions::glBufferData(gl_const::GLArrayBuffer, + static_cast(buffer.m_data.size()) * sizeof(buffer.m_data[0]), + buffer.m_data.data(), gl_const::GLStaticDraw); } if (isVAOSupported) { ref_ptr p = program; - for (auto const & attribute : buffer->m_attributes) + for (auto const & attribute : buffer.m_attributes) { int8_t const attributePosition = p->GetAttributeLocation(attribute.m_attributeName); ASSERT_NOT_EQUAL(attributePosition, -1, ()); GLFunctions::glEnableVertexAttribute(attributePosition); GLFunctions::glVertexAttributePointer(attributePosition, attribute.m_componentsCount, - attribute.m_type, false, buffer->GetStrideInBytes(), - attribute.m_offset); + gl_const::GLFloatType, false, + buffer.m_stride, attribute.m_offset); } } } @@ -82,56 +74,36 @@ public: if (isVAOSupported) GLFunctions::glBindVertexArray(0); GLFunctions::glBindBuffer(0, gl_const::GLArrayBuffer); - if (!m_mesh->m_indices.empty()) - GLFunctions::glBindBuffer(0, gl_const::GLElementArrayBuffer); } void Reset() override { for (auto & buffer : m_mesh->m_buffers) { - if (buffer->m_bufferId != 0) + if (buffer.m_bufferId != 0) { - GLFunctions::glDeleteBuffer(buffer->m_bufferId); - buffer->m_bufferId = 0; + GLFunctions::glDeleteBuffer(buffer.m_bufferId); + buffer.m_bufferId = 0; } } - if (m_indexBuffer != 0) - { - GLFunctions::glDeleteBuffer(m_indexBuffer); - m_indexBuffer = 0; - } - if (m_VAO != 0) - { GLFunctions::glDeleteVertexArray(m_VAO); - m_VAO = 0; - } + + m_VAO = 0; } void UpdateBuffer(ref_ptr context, uint32_t bufferInd) override { UNUSED_VALUE(context); auto & buffer = m_mesh->m_buffers[bufferInd]; - GLFunctions::glBindBuffer(buffer->m_bufferId, gl_const::GLArrayBuffer); - GLFunctions::glBufferData(gl_const::GLArrayBuffer, buffer->GetSizeInBytes(), - buffer->GetData(), gl_const::GLStaticDraw); + GLFunctions::glBindBuffer(buffer.m_bufferId, gl_const::GLArrayBuffer); + GLFunctions::glBufferData(gl_const::GLArrayBuffer, + static_cast(buffer.m_data.size()) * sizeof(buffer.m_data[0]), + buffer.m_data.data(), gl_const::GLStaticDraw); GLFunctions::glBindBuffer(0, gl_const::GLArrayBuffer); } - void UpdateIndexBuffer(ref_ptr context) override - { - UNUSED_VALUE(context); - CHECK(!m_mesh->m_indices.empty(), ()); - CHECK(m_indexBuffer, ("Index buffer was not created")); - GLFunctions::glBindBuffer(m_indexBuffer, gl_const::GLElementArrayBuffer); - GLFunctions::glBufferData(gl_const::GLElementArrayBuffer, - m_mesh->m_indices.size() * sizeof(uint16_t), - m_mesh->m_indices.data(), gl_const::GLStaticDraw); - GLFunctions::glBindBuffer(0, gl_const::GLElementArrayBuffer); - } - void Bind(ref_ptr program) override { if (GLFunctions::ExtensionsList.IsSupported(dp::GLExtensionsList::VertexArrayObject)) @@ -143,17 +115,15 @@ public: ref_ptr p = program; for (auto const & buffer : m_mesh->m_buffers) { - GLFunctions::glBindBuffer(buffer->m_bufferId, gl_const::GLArrayBuffer); - if (m_indexBuffer != 0) - GLFunctions::glBindBuffer(m_indexBuffer, gl_const::GLElementArrayBuffer); - for (auto const & attribute : buffer->m_attributes) + GLFunctions::glBindBuffer(buffer.m_bufferId, gl_const::GLArrayBuffer); + for (auto const & attribute : buffer.m_attributes) { int8_t const attributePosition = p->GetAttributeLocation(attribute.m_attributeName); ASSERT_NOT_EQUAL(attributePosition, -1, ()); GLFunctions::glEnableVertexAttribute(attributePosition); GLFunctions::glVertexAttributePointer(attributePosition, attribute.m_componentsCount, - attribute.m_type, false, buffer->GetStrideInBytes(), - attribute.m_offset); + gl_const::GLFloatType, false, + buffer.m_stride, attribute.m_offset); } } } @@ -163,38 +133,22 @@ public: if (GLFunctions::ExtensionsList.IsSupported(dp::GLExtensionsList::VertexArrayObject)) GLFunctions::glBindVertexArray(0); GLFunctions::glBindBuffer(0, gl_const::GLArrayBuffer); - if (m_indexBuffer != 0) - GLFunctions::glBindBuffer(0, gl_const::GLElementArrayBuffer); } - void DrawPrimitives(ref_ptr context, uint32_t verticesCount, - uint32_t startVertex) override + void DrawPrimitives(ref_ptr context, uint32_t verticesCount) override { UNUSED_VALUE(context); - GLFunctions::glDrawArrays(GetGLDrawPrimitive(m_mesh->m_drawPrimitive), - static_cast(startVertex), - verticesCount); - } - void DrawPrimitivesIndexed(ref_ptr context, uint32_t indexCount, - uint32_t startIndex) override - { - UNUSED_VALUE(context); - CHECK(m_indexBuffer != 0, ()); - GLFunctions::glDrawElements(GetGLDrawPrimitive(m_mesh->m_drawPrimitive), sizeof(uint16_t), - indexCount, startIndex); + GLFunctions::glDrawArrays(GetGLDrawPrimitive(m_mesh->m_drawPrimitive), 0, verticesCount); } private: ref_ptr m_mesh; uint32_t m_VAO = 0; - uint32_t m_indexBuffer = 0; }; -MeshObject::MeshObject(ref_ptr context, DrawPrimitive drawPrimitive, - std::string const & debugName) +MeshObject::MeshObject(ref_ptr context, DrawPrimitive drawPrimitive) : m_drawPrimitive(drawPrimitive) - , m_debugName(debugName) { auto const apiVersion = context->GetApiVersion(); if (apiVersion == dp::ApiVersion::OpenGLES2 || apiVersion == dp::ApiVersion::OpenGLES3) @@ -224,12 +178,23 @@ void MeshObject::InitForOpenGL() m_impl = make_unique_dp(make_ref(this)); } +void MeshObject::SetBuffer(uint32_t bufferInd, std::vector && vertices, uint32_t stride) +{ + CHECK_LESS_OR_EQUAL(bufferInd, GetNextBufferIndex(), ()); + + if (bufferInd == GetNextBufferIndex()) + m_buffers.emplace_back(std::move(vertices), stride); + else + m_buffers[bufferInd] = VertexBuffer(std::move(vertices), stride); + + Reset(); +} + void MeshObject::SetAttribute(std::string const & attributeName, uint32_t bufferInd, uint32_t offset, - uint32_t componentsCount, glConst type) + uint32_t componentsCount) { CHECK_LESS(bufferInd, m_buffers.size(), ()); - CHECK(m_buffers[bufferInd], ()); - m_buffers[bufferInd]->m_attributes.emplace_back(attributeName, offset, componentsCount, type); + m_buffers[bufferInd].m_attributes.emplace_back(attributeName, offset, componentsCount); Reset(); } @@ -242,6 +207,20 @@ void MeshObject::Reset() m_initialized = false; } +void MeshObject::UpdateBuffer(ref_ptr context, uint32_t bufferInd, + std::vector && vertices) +{ + CHECK(m_initialized, ()); + CHECK_LESS(bufferInd, static_cast(m_buffers.size()), ()); + CHECK(!vertices.empty(), ()); + + auto & buffer = m_buffers[bufferInd]; + buffer.m_data = std::move(vertices); + + CHECK(m_impl != nullptr, ()); + m_impl->UpdateBuffer(context, bufferInd); +} + void MeshObject::Build(ref_ptr context, ref_ptr program) { Reset(); @@ -263,66 +242,24 @@ void MeshObject::Bind(ref_ptr context, ref_ptrBind(program); } -void MeshObject::SetIndexBuffer(std::vector && indices) -{ - m_indices = std::move(indices); - Reset(); -} - -void MeshObject::UpdateIndexBuffer(ref_ptr context, std::vector const & indices) -{ - CHECK(!indices.empty(), ("Use SetIndexBuffer() to reset index buffer")); - CHECK_LESS_OR_EQUAL(indices.size(), m_indices.size(), ()); - memcpy(m_indices.data(), indices.data(), indices.size() * sizeof(uint16_t)); - - CHECK(m_impl != nullptr, ()); - m_impl->UpdateIndexBuffer(context); -} - -void MeshObject::DrawPrimitivesSubset(ref_ptr context, uint32_t vertexCount, - uint32_t startVertex) -{ - CHECK(m_impl != nullptr, ()); - CHECK(!m_buffers.empty(), ()); - auto const & buffer = m_buffers[0]; - auto const vertexNum = buffer->GetSizeInBytes() / buffer->GetStrideInBytes(); - CHECK_LESS(startVertex, vertexNum, ()); - CHECK_LESS_OR_EQUAL(startVertex + vertexCount, vertexNum, ()); - - m_impl->DrawPrimitives(context, vertexCount, startVertex); -} - -void MeshObject::DrawPrimitivesSubsetIndexed(ref_ptr context, uint32_t indexCount, - uint32_t startIndex) -{ - CHECK(m_impl != nullptr, ()); - CHECK(!m_indices.empty(), ()); - CHECK_LESS(startIndex, m_indices.size(), ()); - CHECK_LESS_OR_EQUAL(startIndex + indexCount, m_indices.size(), ()); - - m_impl->DrawPrimitivesIndexed(context, indexCount, startIndex); -} - void MeshObject::DrawPrimitives(ref_ptr context) { if (m_buffers.empty()) return; auto const & buffer = m_buffers[0]; - auto const vertexNum = buffer->GetSizeInBytes() / buffer->GetStrideInBytes(); #ifdef DEBUG for (size_t i = 1; i < m_buffers.size(); i++) { - ASSERT_EQUAL(m_buffers[i]->GetSizeInBytes() / m_buffers[i]->GetStrideInBytes(), vertexNum, - ("All buffers in a mesh must contain the same vertex number")); + ASSERT_EQUAL(m_buffers[i].m_data.size() / m_buffers[i].m_stride, + buffer.m_data.size() / buffer.m_stride, ()); } #endif - + auto const verticesCount = + static_cast(buffer.m_data.size() * sizeof(buffer.m_data[0]) / buffer.m_stride); + CHECK(m_impl != nullptr, ()); - if (m_indices.empty()) - m_impl->DrawPrimitives(context, vertexNum, 0); - else - m_impl->DrawPrimitivesIndexed(context, static_cast(m_indices.size()), 0); + m_impl->DrawPrimitives(context, verticesCount); } void MeshObject::Unbind(ref_ptr program) @@ -333,12 +270,6 @@ void MeshObject::Unbind(ref_ptr program) m_impl->Unbind(); } -void MeshObject::UpdateImpl(ref_ptr context, uint32_t bufferInd) -{ - CHECK(m_impl != nullptr, ()); - m_impl->UpdateBuffer(context, bufferInd); -} - // static std::vector MeshObject::GenerateNormalsForTriangles(std::vector const & vertices, size_t componentsCount) diff --git a/drape/mesh_object.hpp b/drape/mesh_object.hpp index 7483a556cd..8fdd1fb5e3 100644 --- a/drape/mesh_object.hpp +++ b/drape/mesh_object.hpp @@ -5,7 +5,6 @@ #include "drape/pointers.hpp" #include "drape/render_state.hpp" -#include #include #include #include @@ -43,42 +42,13 @@ public: LineStrip }; - MeshObject(ref_ptr context, DrawPrimitive drawPrimitive, - std::string const & debugName = ""); + MeshObject(ref_ptr context, DrawPrimitive drawPrimitive); virtual ~MeshObject(); - template - void SetBuffer(uint32_t bufferInd, std::vector && vertices, uint32_t stride = 0) - { - CHECK_LESS_OR_EQUAL(bufferInd, GetNextBufferIndex(), ()); + void SetBuffer(uint32_t bufferInd, std::vector && vertices, uint32_t stride); + void SetAttribute(std::string const & attributeName, uint32_t bufferInd, uint32_t offset, uint32_t componentsCount); - if (bufferInd == GetNextBufferIndex()) - m_buffers.emplace_back(make_unique_dp>(std::move(vertices), stride)); - else - m_buffers[bufferInd] = make_unique_dp>(std::move(vertices), stride); - - Reset(); - } - - void SetAttribute(std::string const & attributeName, uint32_t bufferInd, uint32_t offset, - uint32_t componentsCount, glConst type = gl_const::GLFloatType); - - template - void UpdateBuffer(ref_ptr context, uint32_t bufferInd, std::vector const & vertices) - { - CHECK(m_initialized, ()); - CHECK_LESS(bufferInd, static_cast(m_buffers.size()), ()); - CHECK(!vertices.empty(), ()); - - auto & buffer = m_buffers[bufferInd]; - CHECK_LESS_OR_EQUAL(static_cast(vertices.size() * sizeof(T)), buffer->GetSizeInBytes(), ()); - memcpy(buffer->GetData(), vertices.data(), vertices.size() * sizeof(T)); - - UpdateImpl(context, bufferInd); - } - - void SetIndexBuffer(std::vector && indices); - void UpdateIndexBuffer(ref_ptr context, std::vector const & indices); + void UpdateBuffer(ref_ptr context, uint32_t bufferInd, std::vector && vertices); template void Render(ref_ptr context, ref_ptr program, @@ -95,34 +65,12 @@ public: Unbind(program); } - template - void Render(ref_ptr context, ref_ptr program, - dp::RenderState const & state, ref_ptr paramsSetter, - TParams const & params, std::function && drawCallback) - { - Bind(context, program); - - ApplyState(context, program, state); - paramsSetter->Apply(context, program, params); - - CHECK(drawCallback, ()); - drawCallback(); - - Unbind(program); - } - uint32_t GetNextBufferIndex() const { return static_cast(m_buffers.size()); } bool IsInitialized() const { return m_initialized; } void Build(ref_ptr context, ref_ptr program); void Reset(); - // Should be called inside draw callback in Render() method - void DrawPrimitivesSubset(ref_ptr context, uint32_t vertexCount, - uint32_t startVertex); - void DrawPrimitivesSubsetIndexed(ref_ptr context, uint32_t indexCount, - uint32_t startIndex); - static std::vector GenerateNormalsForTriangles(std::vector const & vertices, size_t componentsCount); private: @@ -130,51 +78,31 @@ private: { AttributeMapping() = default; - AttributeMapping(std::string const & attributeName, uint32_t offset, uint32_t componentsCount, - glConst type = gl_const::GLFloatType) - : m_attributeName(attributeName) - , m_offset(offset) + AttributeMapping(std::string const & attributeName, uint32_t offset, uint32_t componentsCount) + : m_offset(offset) , m_componentsCount(componentsCount) - , m_type(type) + , m_attributeName(attributeName) {} - std::string m_attributeName; uint32_t m_offset = 0; uint32_t m_componentsCount = 0; - glConst m_type = gl_const::GLFloatType; + std::string m_attributeName; }; - class VertexBufferBase { - public: - virtual ~VertexBufferBase() = default; - virtual void * GetData() = 0; - virtual uint32_t GetSizeInBytes() const = 0; - virtual uint32_t GetStrideInBytes() const = 0; - - uint32_t m_bufferId = 0; - std::vector m_attributes; - }; - - template - class VertexBuffer : public VertexBufferBase + struct VertexBuffer { - public: VertexBuffer() = default; - VertexBuffer(std::vector && data, uint32_t stride = 0) + VertexBuffer(std::vector && data, uint32_t stride) : m_data(std::move(data)) - , m_stride(stride == 0 ? sizeof(T) : stride) - { - CHECK_GREATER_OR_EQUAL(m_stride, sizeof(T), ()); - } + , m_stride(stride) + {} - void * GetData() override { return m_data.data(); } - uint32_t GetSizeInBytes() const override { return static_cast(m_data.size() * sizeof(T)); } - uint32_t GetStrideInBytes() const override { return m_stride; } - - private: - std::vector m_data; + std::vector m_data; uint32_t m_stride = 0; + uint32_t m_bufferId = 0; + + std::vector m_attributes; }; void InitForOpenGL(); @@ -185,20 +113,15 @@ private: void InitForMetal(); #endif - void UpdateImpl(ref_ptr context, uint32_t bufferInd); - void Bind(ref_ptr context, ref_ptr program); void Unbind(ref_ptr program); void DrawPrimitives(ref_ptr context); - std::vector> m_buffers; - std::vector m_indices; + std::vector m_buffers; DrawPrimitive m_drawPrimitive = DrawPrimitive::Triangles; drape_ptr m_impl; bool m_initialized = false; - - std::string m_debugName; }; class MeshObjectImpl @@ -208,12 +131,8 @@ public: virtual void Build(ref_ptr context, ref_ptr program) = 0; virtual void Reset() = 0; virtual void UpdateBuffer(ref_ptr context, uint32_t bufferInd) = 0; - virtual void UpdateIndexBuffer(ref_ptr context) = 0; virtual void Bind(ref_ptr program) = 0; virtual void Unbind() = 0; - virtual void DrawPrimitives(ref_ptr context, uint32_t verticesCount, - uint32_t startVertex) = 0; - virtual void DrawPrimitivesIndexed(ref_ptr context, uint32_t indexCount, - uint32_t startIndex) = 0; + virtual void DrawPrimitives(ref_ptr context, uint32_t verticesCount) = 0; }; } // namespace dp diff --git a/drape/metal/metal_base_context.hpp b/drape/metal/metal_base_context.hpp index fead43e830..5137631af7 100644 --- a/drape/metal/metal_base_context.hpp +++ b/drape/metal/metal_base_context.hpp @@ -49,7 +49,6 @@ public: void Clear(uint32_t clearBits, uint32_t storeBits) override; void Flush() override {} void SetViewport(uint32_t x, uint32_t y, uint32_t w, uint32_t h) override; - void SetScissor(uint32_t x, uint32_t y, uint32_t w, uint32_t h) override; void SetDepthTestEnabled(bool enabled) override; void SetDepthTestFunction(TestFunction depthFunction) override; void SetStencilTestEnabled(bool enabled) override; @@ -57,10 +56,8 @@ public: void SetStencilActions(StencilFace face, StencilAction stencilFailAction, StencilAction depthFailAction, StencilAction passAction) override; void SetStencilReferenceValue(uint32_t stencilReferenceValue) override { m_stencilReferenceValue = stencilReferenceValue; } - void SetCullingEnabled(bool enabled) override; - + id GetMetalDevice() const; - id GetCommandBuffer() const; id GetCommandEncoder() const; id GetDepthStencilState(); id GetPipelineState(ref_ptr program, bool blendingEnabled); @@ -74,8 +71,6 @@ public: void ApplyPipelineState(id state); bool HasAppliedPipelineState() const; void ResetPipelineStatesCache(); - - MTLRenderPassDescriptor * GetRenderPassDescriptor() const; protected: void RecreateDepthTexture(m2::PointU const & screenSize); diff --git a/drape/metal/metal_base_context.mm b/drape/metal/metal_base_context.mm index 25d4dee86b..5ed21aac01 100644 --- a/drape/metal/metal_base_context.mm +++ b/drape/metal/metal_base_context.mm @@ -265,22 +265,6 @@ void MetalBaseContext::SetViewport(uint32_t x, uint32_t y, uint32_t w, uint32_t [encoder setScissorRect:(MTLScissorRect){ x, y, w, h }]; } -void MetalBaseContext::SetScissor(uint32_t x, uint32_t y, uint32_t w, uint32_t h) -{ - id encoder = GetCommandEncoder(); - if (m_renderPassDescriptor.colorAttachments[0].texture != nil) - { - uint32_t const rpWidth = m_renderPassDescriptor.colorAttachments[0].texture.width; - uint32_t const rpHeight = m_renderPassDescriptor.colorAttachments[0].texture.height; - if (x < 0) x = 0; - if (y < 0) y = 0; - if (x + w > rpWidth) w = rpWidth - x; - if (y + h > rpHeight) h = rpHeight - y; - - [encoder setScissorRect:(MTLScissorRect){ x, y, w, h }]; - } -} - void MetalBaseContext::SetDepthTestEnabled(bool enabled) { m_currentDepthStencilKey.m_depthEnabled = enabled; @@ -308,12 +292,6 @@ void MetalBaseContext::SetStencilActions(dp::StencilFace face, { m_currentDepthStencilKey.SetStencilActions(face, stencilFailAction, depthFailAction, passAction); } - -void MetalBaseContext::SetCullingEnabled(bool enabled) -{ - id encoder = GetCommandEncoder(); - [encoder setCullMode: (enabled ? MTLCullModeBack : MTLCullModeNone)]; -} id MetalBaseContext::GetMetalDevice() const { @@ -325,12 +303,6 @@ id MetalBaseContext::GetCommandEncoder() const CHECK(m_currentCommandEncoder != nil, ("Probably encoding commands were called before ApplyFramebuffer.")); return m_currentCommandEncoder; } - -id MetalBaseContext::GetCommandBuffer() const -{ - CHECK(m_frameCommandBuffer != nil, ("Probably encoding commands were called before ApplyFramebuffer.")); - return m_frameCommandBuffer; -} id MetalBaseContext::GetDepthStencilState() { @@ -443,11 +415,6 @@ void MetalBaseContext::DebugSynchronizeWithCPU() [m_frameCommandBuffer waitUntilCompleted]; m_frameCommandBuffer = nil; } - -MTLRenderPassDescriptor * MetalBaseContext::GetRenderPassDescriptor() const -{ - return m_renderPassDescriptor; -} } // namespace metal void RenderFrameMediator(std::function && renderFrameFunction) diff --git a/drape/metal/metal_gpu_buffer_impl.hpp b/drape/metal/metal_gpu_buffer_impl.hpp index 6b961afc5c..72fe6ddb4b 100644 --- a/drape/metal/metal_gpu_buffer_impl.hpp +++ b/drape/metal/metal_gpu_buffer_impl.hpp @@ -1,4 +1,3 @@ -#pragma once #import #include "drape/data_buffer.hpp" diff --git a/drape/metal/metal_mesh_object_impl.mm b/drape/metal/metal_mesh_object_impl.mm index 6c15da0564..377838ce54 100644 --- a/drape/metal/metal_mesh_object_impl.mm +++ b/drape/metal/metal_mesh_object_impl.mm @@ -42,38 +42,28 @@ public: m_geometryBuffers.resize(m_mesh->m_buffers.size()); for (size_t i = 0; i < m_mesh->m_buffers.size(); i++) - { - auto const sizeInBytes = m_mesh->m_buffers[i]->GetSizeInBytes(); - if (sizeInBytes == 0) + { + if (m_mesh->m_buffers[i].m_data.empty()) continue; - m_geometryBuffers[i] = [device newBufferWithBytes:m_mesh->m_buffers[i]->GetData() + auto const sizeInBytes = m_mesh->m_buffers[i].m_data.size() * sizeof(m_mesh->m_buffers[i].m_data[0]); + m_geometryBuffers[i] = [device newBufferWithBytes:m_mesh->m_buffers[i].m_data.data() length:sizeInBytes options:MTLResourceCPUCacheModeWriteCombined]; std::ostringstream ss; - ss << "MeshVB:"; - for (size_t j = 0; j < m_mesh->m_buffers[i]->m_attributes.size(); j++) + for (size_t j = 0; j < m_mesh->m_buffers[i].m_attributes.size(); j++) { - ss << m_mesh->m_buffers[i]->m_attributes[j].m_attributeName; - if (j + 1 < m_mesh->m_buffers[i]->m_attributes.size()) + ss << m_mesh->m_buffers[i].m_attributes[j].m_attributeName; + if (j + 1 < m_mesh->m_buffers[i].m_attributes.size()) ss << "+"; } m_geometryBuffers[i].label = @(ss.str().c_str()); } - - if (!m_mesh->m_indices.empty()) - { - m_indexBuffer = [device newBufferWithBytes:m_mesh->m_indices.data() - length:m_mesh->m_indices.size() * sizeof(uint16_t) - options:MTLResourceCPUCacheModeWriteCombined]; - m_indexBuffer.label = @"MeshIB"; - } } void Reset() override { m_geometryBuffers.clear(); - m_indexBuffer = nil; } void UpdateBuffer(ref_ptr context, uint32_t bufferInd) override @@ -82,31 +72,18 @@ public: CHECK_LESS(bufferInd, static_cast(m_geometryBuffers.size()), ()); auto & buffer = m_mesh->m_buffers[bufferInd]; - auto const sizeInBytes = buffer->GetSizeInBytes(); - CHECK(sizeInBytes != 0, ()); + CHECK(!buffer.m_data.empty(), ()); uint8_t * bufferPointer = (uint8_t *)[m_geometryBuffers[bufferInd] contents]; - memcpy(bufferPointer, buffer->GetData(), sizeInBytes); - } - - void UpdateIndexBuffer(ref_ptr context) override - { - UNUSED_VALUE(context); - CHECK(m_indexBuffer != nil, ()); - - auto const sizeInBytes = m_mesh->m_indices.size() * sizeof(uint16_t); - CHECK(sizeInBytes != 0, ()); - - uint8_t * bufferPointer = (uint8_t *)[m_indexBuffer contents]; - memcpy(bufferPointer, m_mesh->m_indices.data(), sizeInBytes); + auto const sizeInBytes = buffer.m_data.size() * sizeof(buffer.m_data[0]); + memcpy(bufferPointer, buffer.m_data.data(), sizeInBytes); } void Bind(ref_ptr program) override {} void Unbind() override {} - void DrawPrimitives(ref_ptr context, uint32_t vertexCount, - uint32_t startVertex) override + void DrawPrimitives(ref_ptr context, uint32_t verticesCount) override { ref_ptr metalContext = context; if (!metalContext->HasAppliedPipelineState()) @@ -116,34 +93,13 @@ public: for (size_t i = 0; i < m_geometryBuffers.size(); i++) [encoder setVertexBuffer:m_geometryBuffers[i] offset:0 atIndex:i]; - [encoder drawPrimitives:GetPrimitiveType(m_mesh->m_drawPrimitive) - vertexStart:startVertex - vertexCount:vertexCount]; - } - - void DrawPrimitivesIndexed(ref_ptr context, uint32_t indexCount, - uint32_t startIndex) override - { - ref_ptr metalContext = context; - if (!metalContext->HasAppliedPipelineState()) - return; - - id encoder = metalContext->GetCommandEncoder(); - for (size_t i = 0; i < m_geometryBuffers.size(); i++) - [encoder setVertexBuffer:m_geometryBuffers[i] offset:0 atIndex:i]; - - CHECK(m_indexBuffer != nil, ()); - [encoder drawIndexedPrimitives:GetPrimitiveType(m_mesh->m_drawPrimitive) - indexCount:indexCount - indexType:MTLIndexTypeUInt16 - indexBuffer:m_indexBuffer - indexBufferOffset:startIndex * sizeof(uint16_t)]; + [encoder drawPrimitives:GetPrimitiveType(m_mesh->m_drawPrimitive) vertexStart:0 + vertexCount:verticesCount]; } private: ref_ptr m_mesh; std::vector> m_geometryBuffers; - id m_indexBuffer; }; } // namespace metal diff --git a/drape/oglcontext.cpp b/drape/oglcontext.cpp index 91d3398c97..0156d026f2 100644 --- a/drape/oglcontext.cpp +++ b/drape/oglcontext.cpp @@ -180,11 +180,6 @@ void OGLContext::SetViewport(uint32_t x, uint32_t y, uint32_t w, uint32_t h) GLCHECK(GLFunctions::glScissor(x, y, w, h)); } -void OGLContext::SetScissor(uint32_t x, uint32_t y, uint32_t w, uint32_t h) -{ - GLCHECK(GLFunctions::glScissor(x, y, w, h)); -} - void OGLContext::SetDepthTestEnabled(bool enabled) { if (enabled) @@ -219,12 +214,4 @@ void OGLContext::SetStencilActions(StencilFace face, StencilAction stencilFailAc DecodeStencilAction(depthFailAction), DecodeStencilAction(passAction)); } - -void OGLContext::SetCullingEnabled(bool enabled) -{ - if (enabled) - GLFunctions::glEnable(gl_const::GLCullFace); - else - GLFunctions::glDisable(gl_const::GLCullFace); -} } // namespace dp diff --git a/drape/oglcontext.hpp b/drape/oglcontext.hpp index 6271684922..deca3687ac 100644 --- a/drape/oglcontext.hpp +++ b/drape/oglcontext.hpp @@ -22,7 +22,6 @@ public: void Clear(uint32_t clearBits, uint32_t storeBits) override; void Flush() override; void SetViewport(uint32_t x, uint32_t y, uint32_t w, uint32_t h) override; - void SetScissor(uint32_t x, uint32_t y, uint32_t w, uint32_t h) override; void SetDepthTestEnabled(bool enabled) override; void SetDepthTestFunction(TestFunction depthFunction) override; void SetStencilTestEnabled(bool enabled) override; @@ -32,7 +31,5 @@ public: // Do not use custom stencil reference value in OpenGL rendering. void SetStencilReferenceValue(uint32_t stencilReferenceValue) override {} - - void SetCullingEnabled(bool enabled) override; }; } // namespace dp diff --git a/drape/static_texture.cpp b/drape/static_texture.cpp index 6c21ec4804..414bc366dd 100644 --- a/drape/static_texture.cpp +++ b/drape/static_texture.cpp @@ -94,9 +94,6 @@ public: }; } // namespace -StaticTexture::StaticTexture() - : m_info(make_unique_dp()) {} - StaticTexture::StaticTexture(ref_ptr context, std::string const & textureName, std::string const & skinPathName, dp::TextureFormat format, ref_ptr allocator, diff --git a/drape/static_texture.hpp b/drape/static_texture.hpp index fd5a806c4c..699a5d1e42 100644 --- a/drape/static_texture.hpp +++ b/drape/static_texture.hpp @@ -18,8 +18,6 @@ public: static std::string const kDefaultResource; - StaticTexture(); - /// @todo All xxxName can be std::string_view after Platform::GetReader (StyleReader) refactoring. StaticTexture(ref_ptr context, std::string const & textureName, std::string const & skinPathName, dp::TextureFormat format, diff --git a/drape/texture_manager.cpp b/drape/texture_manager.cpp index 00db093e56..2dd84f1ba6 100644 --- a/drape/texture_manager.cpp +++ b/drape/texture_manager.cpp @@ -611,9 +611,4 @@ constexpr size_t TextureManager::GetInvalidGlyphGroup() { return kInvalidGlyphGroup; } - -ref_ptr TextureManager::GetTextureAllocator() const -{ - return make_ref(m_textureAllocator); -} } // namespace dp diff --git a/drape/texture_manager.hpp b/drape/texture_manager.hpp index ff4e507586..01459c3c8a 100644 --- a/drape/texture_manager.hpp +++ b/drape/texture_manager.hpp @@ -123,8 +123,6 @@ public: // Apply must be called on FrontendRenderer. void ApplyInvalidatedStaticTextures(); - ref_ptr GetTextureAllocator() const; - private: struct GlyphGroup { diff --git a/drape/vulkan/vulkan_base_context.cpp b/drape/vulkan/vulkan_base_context.cpp index 898a9a8776..c914ac3f22 100644 --- a/drape/vulkan/vulkan_base_context.cpp +++ b/drape/vulkan/vulkan_base_context.cpp @@ -207,14 +207,6 @@ bool VulkanBaseContext::BeginRendering() return false; } - #if defined(OMIM_OS_MAC) - // MoltenVK returns VK_SUBOPTIMAL_KHR in our configuration, it means that window is not resized that's expected - // in the developer sandbox for macOS - // https://github.com/KhronosGroup/MoltenVK/issues/1753 - if (res == VK_SUBOPTIMAL_KHR) - res = VK_SUCCESS; - #endif - if (res == VK_ERROR_OUT_OF_DATE_KHR || res == VK_SUBOPTIMAL_KHR) { RecreateSwapchainAndDependencies(); @@ -365,24 +357,15 @@ void VulkanBaseContext::ApplyFramebuffer(std::string const & framebufferLabel) auto const depthStencilRef = framebuffer->GetDepthStencilRef(); auto const attachmentsCount = (depthStencilRef != nullptr) ? 2 : 1; colorFormat = VulkanFormatUnpacker::Unpack(framebuffer->GetTexture()->GetFormat()); - VkImageLayout initialDepthStencilLayout = VK_IMAGE_LAYOUT_UNDEFINED; if (depthStencilRef != nullptr) - { depthFormat = VulkanFormatUnpacker::Unpack(depthStencilRef->GetTexture()->GetFormat()); - ASSERT(dynamic_cast(depthStencilRef->GetTexture()->GetHardwareTexture().get()) != nullptr, ()); - ref_ptr depthStencilAttachment = depthStencilRef->GetTexture()->GetHardwareTexture(); - initialDepthStencilLayout = depthStencilAttachment->GetCurrentLayout(); - } fbData.m_packedAttachmentOperations = packedAttachmentOperations; fbData.m_renderPass = CreateRenderPass(attachmentsCount, attachmentsOp, colorFormat, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, - depthFormat, initialDepthStencilLayout, + depthFormat, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL); } - - SET_DEBUG_NAME_VK(VK_OBJECT_TYPE_RENDER_PASS, fbData.m_renderPass, - ("RP: " + framebufferLabel).c_str()); } // Initialize framebuffers. @@ -412,8 +395,6 @@ void VulkanBaseContext::ApplyFramebuffer(std::string const & framebufferLabel) attachmentViews[0] = m_swapchainImageViews[i]; CHECK_VK_CALL(vkCreateFramebuffer(m_device, &frameBufferCreateInfo, nullptr, &fbData.m_framebuffers[i])); - SET_DEBUG_NAME_VK(VK_OBJECT_TYPE_FRAMEBUFFER, fbData.m_framebuffers[i], - ("FB: " + framebufferLabel + std::to_string(i)).c_str()); } } else @@ -450,8 +431,6 @@ void VulkanBaseContext::ApplyFramebuffer(std::string const & framebufferLabel) fbData.m_framebuffers.resize(1); CHECK_VK_CALL(vkCreateFramebuffer(m_device, &frameBufferCreateInfo, nullptr, &fbData.m_framebuffers[0])); - SET_DEBUG_NAME_VK(VK_OBJECT_TYPE_FRAMEBUFFER, fbData.m_framebuffers[0], - ("FB: " + framebufferLabel).c_str()); } } @@ -579,7 +558,6 @@ void VulkanBaseContext::UnregisterHandler(uint32_t id) void VulkanBaseContext::ResetPipelineCache() { - vkDeviceWaitIdle(m_device); if (m_pipeline) m_pipeline->ResetCache(m_device); } @@ -694,11 +672,6 @@ void VulkanBaseContext::SetViewport(uint32_t x, uint32_t y, uint32_t w, uint32_t viewport.maxDepth = 1.0f; vkCmdSetViewport(m_renderingCommandBuffers[m_inflightFrameIndex], 0, 1, &viewport); - SetScissor(x, y, w, h); -} - -void VulkanBaseContext::SetScissor(uint32_t x, uint32_t y, uint32_t w, uint32_t h) -{ VkRect2D scissor = {}; scissor.extent = {w, h}; scissor.offset.x = x; @@ -737,11 +710,6 @@ void VulkanBaseContext::SetStencilReferenceValue(uint32_t stencilReferenceValue) m_stencilReferenceValue = stencilReferenceValue; } -void VulkanBaseContext::SetCullingEnabled(bool enabled) -{ - m_pipelineKey.m_cullingEnabled = enabled; -} - void VulkanBaseContext::SetPrimitiveTopology(VkPrimitiveTopology topology) { m_pipelineKey.m_primitiveTopology = topology; @@ -845,12 +813,8 @@ void VulkanBaseContext::RecreateSwapchain() swapchainCI.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR; swapchainCI.pNext = nullptr; swapchainCI.surface = *m_surface; - // maxImageCount may be 0, that means there is no limit. - // https://registry.khronos.org/vulkan/specs/latest/man/html/VkSurfaceCapabilitiesKHR.html - uint32_t minImagesCount = m_surfaceCapabilities.minImageCount + 1; - if (m_surfaceCapabilities.maxImageCount != 0) - minImagesCount = std::min(minImagesCount, m_surfaceCapabilities.maxImageCount); - swapchainCI.minImageCount = minImagesCount; + swapchainCI.minImageCount = std::min(m_surfaceCapabilities.minImageCount + 1, + m_surfaceCapabilities.maxImageCount); swapchainCI.imageFormat = m_surfaceFormat->format; swapchainCI.imageColorSpace = m_surfaceFormat->colorSpace; swapchainCI.imageExtent = m_surfaceCapabilities.currentExtent; diff --git a/drape/vulkan/vulkan_base_context.hpp b/drape/vulkan/vulkan_base_context.hpp index c29fa5331d..ec81da114a 100644 --- a/drape/vulkan/vulkan_base_context.hpp +++ b/drape/vulkan/vulkan_base_context.hpp @@ -60,7 +60,6 @@ public: void Clear(uint32_t clearBits, uint32_t storeBits) override; void Flush() override {} void SetViewport(uint32_t x, uint32_t y, uint32_t w, uint32_t h) override; - void SetScissor(uint32_t x, uint32_t y, uint32_t w, uint32_t h) override; void SetDepthTestEnabled(bool enabled) override; void SetDepthTestFunction(TestFunction depthFunction) override; void SetStencilTestEnabled(bool enabled) override; @@ -68,7 +67,6 @@ public: void SetStencilActions(StencilFace face, StencilAction stencilFailAction, StencilAction depthFailAction, StencilAction passAction) override; void SetStencilReferenceValue(uint32_t stencilReferenceValue) override; - void SetCullingEnabled(bool enabled) override; void SetPrimitiveTopology(VkPrimitiveTopology topology); void SetBindingInfo(BindingInfoArray const & bindingInfo, uint8_t bindingInfoCount); @@ -84,7 +82,6 @@ public: VkPhysicalDevice GetPhysicalDevice() const { return m_gpu; } VkDevice GetDevice() const { return m_device; } - VkQueue GetQueue() const { return m_queue; } VkPhysicalDeviceProperties const & GetGpuProperties() const { return m_gpuProperties; } uint32_t GetRenderingQueueFamilyIndex() { return m_renderingQueueFamilyIndex; } diff --git a/drape/vulkan/vulkan_context_factory.cpp b/drape/vulkan/vulkan_context_factory.cpp deleted file mode 100644 index d9ec0a3b0c..0000000000 --- a/drape/vulkan/vulkan_context_factory.cpp +++ /dev/null @@ -1,387 +0,0 @@ -#include "drape/vulkan/vulkan_context_factory.hpp" - -#include "drape/drape_diagnostics.hpp" -#include "drape/support_manager.hpp" -#include "drape/vulkan/vulkan_pipeline.hpp" -#include "drape/vulkan/vulkan_utils.hpp" - -#include "base/assert.hpp" -#include "base/logging.hpp" -#include "base/macros.hpp" -#include "base/src_point.hpp" - -#include -#include - -namespace dp -{ -namespace vulkan -{ -namespace -{ -class DrawVulkanContext : public dp::vulkan::VulkanBaseContext -{ -public: - DrawVulkanContext(VkInstance vulkanInstance, VkPhysicalDevice gpu, - VkPhysicalDeviceProperties const & gpuProperties, VkDevice device, - uint32_t renderingQueueFamilyIndex, - ref_ptr objectManager, uint32_t appVersionCode, - bool hasPartialTextureUpdates) - : dp::vulkan::VulkanBaseContext( - vulkanInstance, gpu, gpuProperties, device, renderingQueueFamilyIndex, objectManager, - make_unique_dp(device, appVersionCode), - hasPartialTextureUpdates) - { - VkQueue queue; - vkGetDeviceQueue(device, renderingQueueFamilyIndex, 0, &queue); - SetRenderingQueue(queue); - CreateCommandPool(); - } - - void MakeCurrent() override - { - m_objectManager->RegisterThread(dp::vulkan::VulkanObjectManager::Frontend); - } -}; - -class UploadVulkanContext : public dp::vulkan::VulkanBaseContext -{ -public: - UploadVulkanContext(VkInstance vulkanInstance, VkPhysicalDevice gpu, - VkPhysicalDeviceProperties const & gpuProperties, VkDevice device, - uint32_t renderingQueueFamilyIndex, - ref_ptr objectManager, - bool hasPartialTextureUpdates) - : dp::vulkan::VulkanBaseContext(vulkanInstance, gpu, gpuProperties, device, - renderingQueueFamilyIndex, objectManager, - nullptr /* pipeline */, hasPartialTextureUpdates) - {} - - void MakeCurrent() override - { - m_objectManager->RegisterThread(dp::vulkan::VulkanObjectManager::Backend); - } - - void Present() override {} - - void Resize(int w, int h) override {} - void SetFramebuffer(ref_ptr framebuffer) override {} - void Init(dp::ApiVersion apiVersion) override - { - CHECK_EQUAL(apiVersion, dp::ApiVersion::Vulkan, ()); - } - - void SetClearColor(dp::Color const & color) override {} - void Clear(uint32_t clearBits, uint32_t storeBits) override {} - void Flush() override {} - void SetDepthTestEnabled(bool enabled) override {} - void SetDepthTestFunction(dp::TestFunction depthFunction) override {} - void SetStencilTestEnabled(bool enabled) override {} - void SetStencilFunction(dp::StencilFace face, - dp::TestFunction stencilFunction) override {} - void SetStencilActions(dp::StencilFace face, - dp::StencilAction stencilFailAction, - dp::StencilAction depthFailAction, - dp::StencilAction passAction) override {} -}; -} // namespace - -VulkanContextFactory::VulkanContextFactory(uint32_t appVersionCode, int sdkVersion, bool isCustomROM) -{ - if (InitVulkan() == 0) - { - LOG_ERROR_VK("Could not initialize Vulkan library."); - return; - } - - VkApplicationInfo appInfo = {}; - appInfo.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO; - appInfo.pNext = nullptr; - appInfo.apiVersion = VK_MAKE_VERSION(1, 0, 0); - appInfo.applicationVersion = appVersionCode; - appInfo.engineVersion = appVersionCode; - appInfo.pApplicationName = "OMaps"; - appInfo.pEngineName = "Drape Engine"; - - bool enableDiagnostics = false; -#ifdef ENABLE_VULKAN_DIAGNOSTICS - enableDiagnostics = true; -#endif - m_layers = make_unique_dp(enableDiagnostics); - - VkInstanceCreateInfo instanceCreateInfo = {}; - instanceCreateInfo.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO; - instanceCreateInfo.pNext = nullptr; - instanceCreateInfo.pApplicationInfo = &appInfo; - instanceCreateInfo.enabledExtensionCount = m_layers->GetInstanceExtensionsCount(); - instanceCreateInfo.ppEnabledExtensionNames = m_layers->GetInstanceExtensions(); - instanceCreateInfo.enabledLayerCount = m_layers->GetInstanceLayersCount(); - instanceCreateInfo.ppEnabledLayerNames = m_layers->GetInstanceLayers(); -#if defined(OMIM_OS_MAC) - instanceCreateInfo.flags = VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR; -#endif - - // Enable extra validation features. - VkValidationFeaturesEXT validationFeatures = {}; - const VkValidationFeatureEnableEXT validationFeaturesEnabled[] = { - VK_VALIDATION_FEATURE_ENABLE_SYNCHRONIZATION_VALIDATION_EXT}; - if (m_layers->IsValidationFeaturesEnabled()) - { - validationFeatures.sType = VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT; - validationFeatures.pNext = nullptr; - validationFeatures.enabledValidationFeatureCount = ARRAY_SIZE(validationFeaturesEnabled), - validationFeatures.pEnabledValidationFeatures = validationFeaturesEnabled; - - instanceCreateInfo.pNext = &validationFeatures; - } - - VkResult statusCode; - statusCode = vkCreateInstance(&instanceCreateInfo, nullptr, &m_vulkanInstance); - if (statusCode != VK_SUCCESS) - { - LOG_ERROR_VK_CALL(vkCreateInstance, statusCode); - return; - } - - uint32_t gpuCount = 0; - statusCode = vkEnumeratePhysicalDevices(m_vulkanInstance, &gpuCount, nullptr); - if (statusCode != VK_SUCCESS || gpuCount == 0) - { - LOG_ERROR_VK_CALL(vkEnumeratePhysicalDevices, statusCode); - return; - } - - std::vector tmpGpus(gpuCount); - statusCode = vkEnumeratePhysicalDevices(m_vulkanInstance, &gpuCount, tmpGpus.data()); - if (statusCode != VK_SUCCESS) - { - LOG_ERROR_VK_CALL(vkEnumeratePhysicalDevices, statusCode); - return; - } - m_gpu = tmpGpus[0]; - - VkPhysicalDeviceProperties gpuProperties; - vkGetPhysicalDeviceProperties(m_gpu, &gpuProperties); - dp::SupportManager::Version apiVersion{VK_VERSION_MAJOR(gpuProperties.apiVersion), - VK_VERSION_MINOR(gpuProperties.apiVersion), - VK_VERSION_PATCH(gpuProperties.apiVersion)}; - dp::SupportManager::Version driverVersion{VK_VERSION_MAJOR(gpuProperties.driverVersion), - VK_VERSION_MINOR(gpuProperties.driverVersion), - VK_VERSION_PATCH(gpuProperties.driverVersion)}; - if (dp::SupportManager::Instance().IsVulkanForbidden(gpuProperties.deviceName, apiVersion, driverVersion, isCustomROM)) - { - LOG_ERROR_VK("GPU/Driver configuration is not supported."); - return; - } - - uint32_t queueFamilyCount; - vkGetPhysicalDeviceQueueFamilyProperties(m_gpu, &queueFamilyCount, nullptr); - if (queueFamilyCount == 0) - { - LOG_ERROR_VK("Any queue family wasn't found."); - return; - } - - std::vector queueFamilyProperties(queueFamilyCount); - vkGetPhysicalDeviceQueueFamilyProperties(m_gpu, &queueFamilyCount, - queueFamilyProperties.data()); - - uint32_t renderingQueueFamilyIndex = 0; - for (; renderingQueueFamilyIndex < queueFamilyCount; ++renderingQueueFamilyIndex) - { - if (queueFamilyProperties[renderingQueueFamilyIndex].queueFlags & VK_QUEUE_GRAPHICS_BIT) - break; - } - if (renderingQueueFamilyIndex == queueFamilyCount) - { - LOG_ERROR_VK("Any queue family with VK_QUEUE_GRAPHICS_BIT wasn't found."); - return; - } - - if (!dp::vulkan::VulkanFormatUnpacker::Init(m_gpu)) - return; - - if (!m_layers->Initialize(m_vulkanInstance, m_gpu)) - return; - - float priorities[] = {1.0f}; - VkDeviceQueueCreateInfo queueCreateInfo = {}; - queueCreateInfo.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO; - queueCreateInfo.pNext = nullptr; - queueCreateInfo.flags = 0; - queueCreateInfo.queueCount = 1; - queueCreateInfo.queueFamilyIndex = renderingQueueFamilyIndex; - queueCreateInfo.pQueuePriorities = priorities; - - VkPhysicalDeviceFeatures availableFeatures; - vkGetPhysicalDeviceFeatures(m_gpu, &availableFeatures); - if (!availableFeatures.wideLines) - LOG(LWARNING, ("Widelines Vulkan feature is not supported.")); - - VkDeviceCreateInfo deviceCreateInfo = {}; - VkPhysicalDeviceFeatures enabledFeatures = { - .wideLines = availableFeatures.wideLines, - }; - deviceCreateInfo.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO; - deviceCreateInfo.pNext = nullptr; - deviceCreateInfo.queueCreateInfoCount = 1; - deviceCreateInfo.pQueueCreateInfos = &queueCreateInfo; - deviceCreateInfo.enabledLayerCount = m_layers->GetDeviceLayersCount(); - deviceCreateInfo.ppEnabledLayerNames = m_layers->GetDeviceLayers(); - deviceCreateInfo.enabledExtensionCount = m_layers->GetDeviceExtensionsCount(); - deviceCreateInfo.ppEnabledExtensionNames = m_layers->GetDeviceExtensions(); - deviceCreateInfo.pEnabledFeatures = nullptr; - if (enableDiagnostics) - { - enabledFeatures.robustBufferAccess = VK_TRUE; - deviceCreateInfo.pEnabledFeatures = &enabledFeatures; - } - - statusCode = vkCreateDevice(m_gpu, &deviceCreateInfo, nullptr, &m_device); - if (statusCode != VK_SUCCESS) - { - LOG_ERROR_VK_CALL(vkCreateDevice, statusCode); - return; - } - - INIT_DEBUG_NAME_VK(m_vulkanInstance, m_device); - - VkPhysicalDeviceMemoryProperties memoryProperties; - vkGetPhysicalDeviceMemoryProperties(m_gpu, &memoryProperties); - m_objectManager = make_unique_dp(m_device, gpuProperties.limits, - memoryProperties, - renderingQueueFamilyIndex); - - bool const hasPartialTextureUpdates = - !dp::SupportManager::Instance().IsVulkanTexturePartialUpdateBuggy( - sdkVersion, gpuProperties.deviceName, apiVersion, driverVersion); - - m_drawContext = make_unique_dp( - m_vulkanInstance, m_gpu, gpuProperties, m_device, renderingQueueFamilyIndex, - make_ref(m_objectManager), appVersionCode, hasPartialTextureUpdates); - m_uploadContext = make_unique_dp( - m_vulkanInstance, m_gpu, gpuProperties, m_device, renderingQueueFamilyIndex, - make_ref(m_objectManager), hasPartialTextureUpdates); -} - -VulkanContextFactory::~VulkanContextFactory() -{ - m_drawContext.reset(); - m_uploadContext.reset(); - m_objectManager.reset(); - - if (m_device != nullptr) - { - vkDeviceWaitIdle(m_device); - vkDestroyDevice(m_device, nullptr); - } - - if (m_vulkanInstance != nullptr) - { - m_layers->Uninitialize(m_vulkanInstance); - vkDestroyInstance(m_vulkanInstance, nullptr); - } -} - -bool VulkanContextFactory::IsVulkanSupported() const -{ - return m_vulkanInstance != nullptr && m_gpu != nullptr && m_device != nullptr; -} - -dp::GraphicsContext * VulkanContextFactory::GetDrawContext() -{ - return m_drawContext.get(); -} - -dp::GraphicsContext * VulkanContextFactory::GetResourcesUploadContext() -{ - return m_uploadContext.get(); -} - -bool VulkanContextFactory::IsDrawContextCreated() const -{ - return m_drawContext != nullptr; -} - -bool VulkanContextFactory::IsUploadContextCreated() const -{ - return m_uploadContext != nullptr; -} - -void VulkanContextFactory::SetPresentAvailable(bool available) -{ - if (m_drawContext) - m_drawContext->SetPresentAvailable(available); -} - -bool VulkanContextFactory::QuerySurfaceSize() -{ - auto statusCode = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(m_gpu, m_surface, - &m_surfaceCapabilities); - if (statusCode != VK_SUCCESS) - { - LOG_ERROR_VK_CALL(vkGetPhysicalDeviceSurfaceCapabilitiesKHR, statusCode); - return false; - } - - uint32_t formatCount = 0; - statusCode = vkGetPhysicalDeviceSurfaceFormatsKHR(m_gpu, m_surface, &formatCount, nullptr); - if (statusCode != VK_SUCCESS) - { - LOG_ERROR_VK_CALL(vkGetPhysicalDeviceSurfaceFormatsKHR, statusCode); - return false; - } - - std::vector formats(formatCount); - statusCode = vkGetPhysicalDeviceSurfaceFormatsKHR(m_gpu, m_surface, &formatCount, formats.data()); - if (statusCode != VK_SUCCESS) - { - LOG_ERROR_VK_CALL(vkGetPhysicalDeviceSurfaceFormatsKHR, statusCode); - return false; - } - - uint32_t chosenFormat; - for (chosenFormat = 0; chosenFormat < formatCount; chosenFormat++) - { -#if defined(OMIM_OS_MAC) || defined(OMIM_OS_LINUX) - if (formats[chosenFormat].format == VK_FORMAT_B8G8R8A8_UNORM) - break; -#else - if (formats[chosenFormat].format == VK_FORMAT_R8G8B8A8_UNORM) - break; -#endif - } - if (chosenFormat == formatCount) - { - LOG_ERROR_VK("Any supported surface format wasn't found."); - return false; - } - - if (!(m_surfaceCapabilities.supportedCompositeAlpha & VK_COMPOSITE_ALPHA_INHERIT_BIT_KHR)) - { - LOG_ERROR_VK("Alpha channel is not supported."); - return false; - } - - m_surfaceFormat = formats[chosenFormat]; - m_surfaceWidth = static_cast(m_surfaceCapabilities.currentExtent.width); - m_surfaceHeight = static_cast(m_surfaceCapabilities.currentExtent.height); - return true; -} - -int VulkanContextFactory::GetWidth() const -{ - return m_surfaceWidth; -} - -int VulkanContextFactory::GetHeight() const -{ - return m_surfaceHeight; -} - -VkInstance VulkanContextFactory::GetVulkanInstance() const -{ - return m_vulkanInstance; -} -} // namespace vulkan -} // namespace dp diff --git a/drape/vulkan/vulkan_context_factory.hpp b/drape/vulkan/vulkan_context_factory.hpp deleted file mode 100644 index e1582452e0..0000000000 --- a/drape/vulkan/vulkan_context_factory.hpp +++ /dev/null @@ -1,53 +0,0 @@ -#pragma once - -#include "drape/graphics_context_factory.hpp" -#include "drape/vulkan/vulkan_base_context.hpp" -#include "drape/vulkan/vulkan_object_manager.hpp" -#include "drape/vulkan/vulkan_layers.hpp" -#include "drape/pointers.hpp" - -#include - -namespace dp -{ -namespace vulkan -{ -class VulkanContextFactory : public dp::GraphicsContextFactory -{ -public: - VulkanContextFactory(uint32_t appVersionCode, int sdkVersion, bool isCustomROM); - ~VulkanContextFactory() override; - - bool IsVulkanSupported() const; - - dp::GraphicsContext * GetDrawContext() override; - dp::GraphicsContext * GetResourcesUploadContext() override; - bool IsDrawContextCreated() const override; - bool IsUploadContextCreated() const override; - void SetPresentAvailable(bool available) override; - - int GetWidth() const; - int GetHeight() const; - - VkInstance GetVulkanInstance() const; - -protected: - bool QuerySurfaceSize(); - - VkInstance m_vulkanInstance = nullptr; - drape_ptr m_layers; - VkPhysicalDevice m_gpu = nullptr; - VkDevice m_device = nullptr; - drape_ptr m_objectManager; - drape_ptr m_drawContext; - drape_ptr m_uploadContext; - - VkSurfaceKHR m_surface = 0; - VkSurfaceFormatKHR m_surfaceFormat; - VkSurfaceCapabilitiesKHR m_surfaceCapabilities; - - int m_surfaceWidth = 0; - int m_surfaceHeight = 0; -}; -} // namespace vulkan -} // namespace dp diff --git a/drape/vulkan/vulkan_layers.cpp b/drape/vulkan/vulkan_layers.cpp index a4126b0ef6..2767003358 100755 --- a/drape/vulkan/vulkan_layers.cpp +++ b/drape/vulkan/vulkan_layers.cpp @@ -21,25 +21,11 @@ char const * const kInstanceExtensions[] = { "VK_KHR_android_surface", kDebugReportExtension, kValidationFeaturesExtension, -#if defined(OMIM_OS_MAC) || defined(OMIM_OS_LINUX) - "VK_EXT_debug_utils", -#endif -#if defined(OMIM_OS_MAC) - "VK_KHR_portability_enumeration", - "VK_MVK_macos_surface", - "VK_KHR_get_physical_device_properties2", -#endif -#if defined(OMIM_OS_LINUX) - "VK_KHR_xlib_surface", -#endif }; char const * const kDeviceExtensions[] = { - "VK_KHR_swapchain", -#if defined(OMIM_OS_MAC) - "VK_KHR_portability_subset", -#endif + "VK_KHR_swapchain" }; char const * const kValidationLayers[] = diff --git a/drape/vulkan/vulkan_mesh_object_impl.cpp b/drape/vulkan/vulkan_mesh_object_impl.cpp index e2f998c16d..1d5c852bb9 100644 --- a/drape/vulkan/vulkan_mesh_object_impl.cpp +++ b/drape/vulkan/vulkan_mesh_object_impl.cpp @@ -6,10 +6,8 @@ #include "drape/vulkan/vulkan_utils.hpp" #include "base/assert.hpp" -#include "base/buffer_vector.hpp" #include -#include #include namespace dp @@ -46,43 +44,28 @@ public: CHECK_LESS_OR_EQUAL(m_bindingInfoCount, kMaxBindingInfo, ()); for (size_t i = 0; i < m_mesh->m_buffers.size(); i++) { - auto const sizeInBytes = m_mesh->m_buffers[i]->GetSizeInBytes(); - if (sizeInBytes == 0) + if (m_mesh->m_buffers[i].m_data.empty()) continue; + auto const sizeInBytes = static_cast(m_mesh->m_buffers[i].m_data.size() * + sizeof(m_mesh->m_buffers[i].m_data[0])); m_geometryBuffers[i] = m_objectManager->CreateBuffer(VulkanMemoryManager::ResourceType::Geometry, sizeInBytes, 0 /* batcherHash */); - SET_DEBUG_NAME_VK(VK_OBJECT_TYPE_BUFFER, m_geometryBuffers[i].m_buffer, - ("VB: Mesh (" + m_mesh->m_debugName + ") " + std::to_string(i)).c_str()); + m_objectManager->Fill(m_geometryBuffers[i], m_mesh->m_buffers[i].m_data.data(), sizeInBytes); - m_objectManager->Fill(m_geometryBuffers[i], m_mesh->m_buffers[i]->GetData(), sizeInBytes); - - m_bindingInfo[i] = dp::BindingInfo(static_cast(m_mesh->m_buffers[i]->m_attributes.size()), + m_bindingInfo[i] = dp::BindingInfo(static_cast(m_mesh->m_buffers[i].m_attributes.size()), static_cast(i)); - for (size_t j = 0; j < m_mesh->m_buffers[i]->m_attributes.size(); ++j) + for (size_t j = 0; j < m_mesh->m_buffers[i].m_attributes.size(); ++j) { - auto const & attr = m_mesh->m_buffers[i]->m_attributes[j]; + auto const & attr = m_mesh->m_buffers[i].m_attributes[j]; auto & binding = m_bindingInfo[i].GetBindingDecl(static_cast(j)); binding.m_attributeName = attr.m_attributeName; binding.m_componentCount = static_cast(attr.m_componentsCount); binding.m_componentType = gl_const::GLFloatType; binding.m_offset = static_cast(attr.m_offset); - CHECK_LESS_OR_EQUAL(m_mesh->m_buffers[i]->GetStrideInBytes(), - static_cast(std::numeric_limits::max()), ()); - binding.m_stride = static_cast(m_mesh->m_buffers[i]->GetStrideInBytes()); + binding.m_stride = static_cast(m_mesh->m_buffers[i].m_stride); } } - - if (!m_mesh->m_indices.empty()) - { - auto const sizeInBytes = static_cast(m_mesh->m_indices.size() * sizeof(uint16_t)); - m_indexBuffer = m_objectManager->CreateBuffer(VulkanMemoryManager::ResourceType::Geometry, - sizeInBytes, 0 /* batcherHash */); - SET_DEBUG_NAME_VK(VK_OBJECT_TYPE_BUFFER, m_indexBuffer.m_buffer, - ("IB: Mesh (" + m_mesh->m_debugName + ")").c_str()); - - m_objectManager->Fill(m_indexBuffer, m_mesh->m_indices.data(), sizeInBytes); - } } void Reset() override @@ -91,69 +74,84 @@ public: for (auto const & b : m_geometryBuffers) m_objectManager->DestroyObject(b); m_geometryBuffers.clear(); - - if (m_indexBuffer.m_buffer != VK_NULL_HANDLE) - m_objectManager->DestroyObject(m_indexBuffer); } void UpdateBuffer(ref_ptr context, uint32_t bufferInd) override { CHECK_LESS(bufferInd, static_cast(m_geometryBuffers.size()), ()); + + ref_ptr vulkanContext = context; + VkCommandBuffer commandBuffer = vulkanContext->GetCurrentMemoryCommandBuffer(); + CHECK(commandBuffer != nullptr, ()); + auto & buffer = m_mesh->m_buffers[bufferInd]; - auto const sizeInBytes = buffer->GetSizeInBytes(); - CHECK(sizeInBytes != 0, ()); + CHECK(!buffer.m_data.empty(), ()); - UpdateBufferInternal(context, m_geometryBuffers[bufferInd].m_buffer, - VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT, - buffer->GetData(), sizeInBytes); + auto const sizeInBytes = static_cast(buffer.m_data.size() * sizeof(buffer.m_data[0])); + + // Set up a barrier to prevent data collisions (write-after-write, write-after-read). + VkBufferMemoryBarrier barrier = {}; + barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER; + barrier.pNext = nullptr; + barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT | VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT; + barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; + barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; + barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; + barrier.buffer = m_geometryBuffers[bufferInd].m_buffer; + barrier.offset = 0; + barrier.size = sizeInBytes; + vkCmdPipelineBarrier(commandBuffer, VK_PIPELINE_STAGE_VERTEX_INPUT_BIT | VK_PIPELINE_STAGE_TRANSFER_BIT, + VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 0, nullptr, + 1, &barrier, 0, nullptr); + + // Copy to default or temporary staging buffer. + auto stagingBuffer = vulkanContext->GetDefaultStagingBuffer(); + if (stagingBuffer->HasEnoughSpace(sizeInBytes)) + { + auto staging = stagingBuffer->Reserve(sizeInBytes); + memcpy(staging.m_pointer, buffer.m_data.data(), sizeInBytes); + + // Schedule command to copy from the staging buffer to our geometry buffer. + VkBufferCopy copyRegion = {}; + copyRegion.dstOffset = 0; + copyRegion.srcOffset = staging.m_offset; + copyRegion.size = sizeInBytes; + vkCmdCopyBuffer(commandBuffer, staging.m_stagingBuffer, m_geometryBuffers[bufferInd].m_buffer, + 1, ©Region); + } + else + { + // Here we use temporary staging object, which will be destroyed after the nearest + // command queue submitting. + VulkanStagingBuffer tempStagingBuffer(m_objectManager, sizeInBytes); + CHECK(tempStagingBuffer.HasEnoughSpace(sizeInBytes), ()); + auto staging = tempStagingBuffer.Reserve(sizeInBytes); + memcpy(staging.m_pointer, buffer.m_data.data(), sizeInBytes); + tempStagingBuffer.Flush(); + + // Schedule command to copy from the staging buffer to our geometry buffer. + VkBufferCopy copyRegion = {}; + copyRegion.dstOffset = 0; + copyRegion.srcOffset = staging.m_offset; + copyRegion.size = sizeInBytes; + vkCmdCopyBuffer(commandBuffer, staging.m_stagingBuffer, m_geometryBuffers[bufferInd].m_buffer, + 1, ©Region); + } + + // Set up a barrier to prevent data collisions (read-after-write). + barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; + barrier.dstAccessMask = VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT; + vkCmdPipelineBarrier(commandBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, + VK_PIPELINE_STAGE_VERTEX_INPUT_BIT, 0, 0, nullptr, + 1, &barrier, 0, nullptr); } - void UpdateIndexBuffer(ref_ptr context) override - { - CHECK(!m_mesh->m_indices.empty(), ()); - auto const sizeInBytes = m_mesh->m_indices.size() * sizeof(uint16_t); - CHECK(m_indexBuffer.m_buffer != VK_NULL_HANDLE, ()); - - UpdateBufferInternal(context, m_indexBuffer.m_buffer, - VK_ACCESS_INDEX_READ_BIT, - m_mesh->m_indices.data(), sizeInBytes); - } - - void DrawPrimitives(ref_ptr context, uint32_t vertexCount, - uint32_t startVertex) override + void DrawPrimitives(ref_ptr context, uint32_t verticesCount) override { ref_ptr vulkanContext = context; VkCommandBuffer commandBuffer = vulkanContext->GetCurrentRenderingCommandBuffer(); CHECK(commandBuffer != nullptr, ()); - BindVertexBuffers(context, commandBuffer); - - vkCmdDraw(commandBuffer, vertexCount, 1, startVertex, 0); - } - - void DrawPrimitivesIndexed(ref_ptr context, uint32_t indexCount, - uint32_t startIndex) override - { - ref_ptr vulkanContext = context; - VkCommandBuffer commandBuffer = vulkanContext->GetCurrentRenderingCommandBuffer(); - CHECK(commandBuffer != nullptr, ()); - - BindVertexBuffers(context, commandBuffer); - - CHECK(m_indexBuffer.m_buffer != VK_NULL_HANDLE, ()); - vkCmdBindIndexBuffer(commandBuffer, m_indexBuffer.m_buffer, 0, VK_INDEX_TYPE_UINT16); - - vkCmdDrawIndexed(commandBuffer, indexCount, 1, startIndex, 0, 0); - } - - void Bind(ref_ptr program) override {} - void Unbind() override {} - -private: - void BindVertexBuffers(ref_ptr context, VkCommandBuffer commandBuffer) - { - ref_ptr vulkanContext = context; - vulkanContext->SetPrimitiveTopology(GetPrimitiveType(m_mesh->m_drawPrimitive)); vulkanContext->SetBindingInfo(m_bindingInfo, m_bindingInfoCount); @@ -168,84 +166,20 @@ private: vkCmdBindPipeline(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, vulkanContext->GetCurrentPipeline()); - buffer_vector buffers; - buffer_vector offsets; + VkDeviceSize offsets[1] = {0}; for (uint32_t i = 0; i < static_cast(m_geometryBuffers.size()); ++i) - { - buffers.emplace_back(m_geometryBuffers[i].m_buffer); - offsets.emplace_back(0); - } - vkCmdBindVertexBuffers(commandBuffer, 0, m_geometryBuffers.size(), buffers.data(), - offsets.data()); + vkCmdBindVertexBuffers(commandBuffer, i, 1, &m_geometryBuffers[i].m_buffer, offsets); + + vkCmdDraw(commandBuffer, verticesCount, 1, 0, 0); } - void UpdateBufferInternal(ref_ptr context, VkBuffer buffer, - VkAccessFlagBits bufferAccessMask, - void const * data, uint32_t sizeInBytes) - { - ref_ptr vulkanContext = context; - VkCommandBuffer commandBuffer = vulkanContext->GetCurrentMemoryCommandBuffer(); - CHECK(commandBuffer != nullptr, ()); - - // Set up a barrier to prevent data collisions (write-after-write, write-after-read). - VkBufferMemoryBarrier barrier = {}; - barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER; - barrier.pNext = nullptr; - barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT | bufferAccessMask; - barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; - barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; - barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; - barrier.buffer = buffer; - barrier.offset = 0; - barrier.size = sizeInBytes; - vkCmdPipelineBarrier(commandBuffer, VK_PIPELINE_STAGE_VERTEX_INPUT_BIT | VK_PIPELINE_STAGE_TRANSFER_BIT, - VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 0, nullptr, - 1, &barrier, 0, nullptr); - - // Copy to default or temporary staging buffer. - auto stagingBuffer = vulkanContext->GetDefaultStagingBuffer(); - if (stagingBuffer->HasEnoughSpace(sizeInBytes)) - { - auto staging = stagingBuffer->Reserve(sizeInBytes); - memcpy(staging.m_pointer, data, sizeInBytes); - - // Schedule command to copy from the staging buffer to our geometry buffer. - VkBufferCopy copyRegion = {}; - copyRegion.dstOffset = 0; - copyRegion.srcOffset = staging.m_offset; - copyRegion.size = sizeInBytes; - vkCmdCopyBuffer(commandBuffer, staging.m_stagingBuffer, buffer, 1, ©Region); - } - else - { - // Here we use temporary staging object, which will be destroyed after the nearest - // command queue submitting. - VulkanStagingBuffer tempStagingBuffer(m_objectManager, sizeInBytes); - CHECK(tempStagingBuffer.HasEnoughSpace(sizeInBytes), ()); - auto staging = tempStagingBuffer.Reserve(sizeInBytes); - memcpy(staging.m_pointer, data, sizeInBytes); - tempStagingBuffer.Flush(); - - // Schedule command to copy from the staging buffer to our geometry buffer. - VkBufferCopy copyRegion = {}; - copyRegion.dstOffset = 0; - copyRegion.srcOffset = staging.m_offset; - copyRegion.size = sizeInBytes; - vkCmdCopyBuffer(commandBuffer, staging.m_stagingBuffer, buffer, 1, ©Region); - } - - // Set up a barrier to prevent data collisions (read-after-write). - barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; - barrier.dstAccessMask = bufferAccessMask; - vkCmdPipelineBarrier(commandBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, - VK_PIPELINE_STAGE_VERTEX_INPUT_BIT, 0, 0, nullptr, - 1, &barrier, 0, nullptr); - } + void Bind(ref_ptr program) override {} + void Unbind() override {} +private: ref_ptr m_mesh; ref_ptr m_objectManager; std::vector m_geometryBuffers; - VulkanObject m_indexBuffer; BindingInfoArray m_bindingInfo; uint8_t m_bindingInfoCount = 0; ParamDescriptorUpdater m_descriptorUpdater; diff --git a/drape/vulkan/vulkan_object_manager.cpp b/drape/vulkan/vulkan_object_manager.cpp index 53b2136163..c6e262d16e 100644 --- a/drape/vulkan/vulkan_object_manager.cpp +++ b/drape/vulkan/vulkan_object_manager.cpp @@ -117,11 +117,6 @@ VulkanObject VulkanObjectManager::CreateBuffer(VulkanMemoryManager::ResourceType info.queueFamilyIndexCount = 1; info.pQueueFamilyIndices = &m_queueFamilyIndex; CHECK_VK_CALL(vkCreateBuffer(m_device, &info, nullptr, &result.m_buffer)); - - SET_DEBUG_NAME_VK(VK_OBJECT_TYPE_BUFFER, result.m_buffer, - ((resourceType == VulkanMemoryManager::ResourceType::Geometry ? "B: Geometry (" : - (resourceType == VulkanMemoryManager::ResourceType::Uniform ? "B: Uniform (" : - "B: Staging (")) + std::to_string(sizeInBytes) + " bytes)").c_str()); VkMemoryRequirements memReqs = {}; vkGetBufferMemoryRequirements(m_device, result.m_buffer, &memReqs); @@ -392,7 +387,7 @@ void VulkanObjectManager::FlushUnsafe(VulkanObject object, uint32_t offset, uint if (size == 0) mappedRange.size = object.GetAlignedSize(); else - mappedRange.size = size; + mappedRange.size = mappedRange.offset + size; CHECK_VK_CALL(vkFlushMappedMemoryRanges(m_device, 1, &mappedRange)); } diff --git a/drape/vulkan/vulkan_pipeline.cpp b/drape/vulkan/vulkan_pipeline.cpp index f345ea9290..85300bf506 100644 --- a/drape/vulkan/vulkan_pipeline.cpp +++ b/drape/vulkan/vulkan_pipeline.cpp @@ -270,7 +270,6 @@ void VulkanPipeline::ResetCache(VkDevice device, VkRenderPass renderPass) void VulkanPipeline::Destroy(VkDevice device) { - vkDeviceWaitIdle(device); Dump(device); ResetCache(device); vkDestroyPipelineCache(device, m_vulkanPipelineCache, nullptr); @@ -293,7 +292,7 @@ VkPipeline VulkanPipeline::GetPipeline(VkDevice device, PipelineKey const & key) VkPipelineRasterizationStateCreateInfo rasterizationStateCreateInfo = {}; rasterizationStateCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO; rasterizationStateCreateInfo.polygonMode = VK_POLYGON_MODE_FILL; - rasterizationStateCreateInfo.cullMode = key.m_cullingEnabled ? VK_CULL_MODE_BACK_BIT : VK_CULL_MODE_NONE; + rasterizationStateCreateInfo.cullMode = VK_CULL_MODE_BACK_BIT; rasterizationStateCreateInfo.frontFace = VK_FRONT_FACE_CLOCKWISE; rasterizationStateCreateInfo.lineWidth = 1.0f; @@ -564,10 +563,7 @@ bool VulkanPipeline::PipelineKey::operator<(PipelineKey const & rhs) const if (m_primitiveTopology != rhs.m_primitiveTopology) return m_primitiveTopology < rhs.m_primitiveTopology; - if (m_blendingEnabled != rhs.m_blendingEnabled) - return m_blendingEnabled < rhs.m_blendingEnabled; - - return m_cullingEnabled < rhs.m_cullingEnabled; + return m_blendingEnabled < rhs.m_blendingEnabled; } } // namespace vulkan } // namespace dp diff --git a/drape/vulkan/vulkan_pipeline.hpp b/drape/vulkan/vulkan_pipeline.hpp index 41687723cb..d9e8c5fe9c 100644 --- a/drape/vulkan/vulkan_pipeline.hpp +++ b/drape/vulkan/vulkan_pipeline.hpp @@ -44,7 +44,6 @@ public: uint8_t m_bindingInfoCount = 0; VkPrimitiveTopology m_primitiveTopology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST; bool m_blendingEnabled = false; - bool m_cullingEnabled = true; }; VulkanPipeline(VkDevice device, uint32_t appVersionCode); diff --git a/drape/vulkan/vulkan_texture.hpp b/drape/vulkan/vulkan_texture.hpp index 674cd72c51..edc0cbda6e 100644 --- a/drape/vulkan/vulkan_texture.hpp +++ b/drape/vulkan/vulkan_texture.hpp @@ -38,7 +38,6 @@ public: VkImageView GetTextureView() const { return m_textureObject.m_imageView; } VkImage GetImage() const { return m_textureObject.m_image; } SamplerKey GetSamplerKey() const; - VkImageLayout GetCurrentLayout() const { return m_currentLayout; } void MakeImageLayoutTransition(VkCommandBuffer commandBuffer, VkImageLayout newLayout, diff --git a/drape/vulkan/vulkan_utils.cpp b/drape/vulkan/vulkan_utils.cpp index f32af92f3d..b06ec759a7 100644 --- a/drape/vulkan/vulkan_utils.cpp +++ b/drape/vulkan/vulkan_utils.cpp @@ -15,32 +15,6 @@ uint8_t constexpr kMagFilterByte = 1; uint8_t constexpr kMinFilterByte = 0; } // namespace -VkDevice DebugName::m_device = VK_NULL_HANDLE; -PFN_vkSetDebugUtilsObjectNameEXT DebugName::vkSetDebugUtilsObjectNameEXT = nullptr; - -static bool gUse32bitDepth8bitStencil = false; - -void DebugName::Init(VkInstance instance, VkDevice device) -{ - vkSetDebugUtilsObjectNameEXT = - (PFN_vkSetDebugUtilsObjectNameEXT)vkGetInstanceProcAddr(instance, "vkSetDebugUtilsObjectNameEXT"); - m_device = device; -} - -void DebugName::Set(VkObjectType type, uint64_t handle, char const * name) -{ - if (vkSetDebugUtilsObjectNameEXT == nullptr) - return; - - VkDebugUtilsObjectNameInfoEXT const info = { - .sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT, - .objectType = type, - .objectHandle = handle, - .pObjectName = name, - }; - CHECK_VK_CALL(vkSetDebugUtilsObjectNameEXT(m_device, &info)); -} - std::string GetVulkanResultString(VkResult result) { switch (result) @@ -128,13 +102,8 @@ bool VulkanFormatUnpacker::Init(VkPhysicalDevice gpu) vkGetPhysicalDeviceFormatProperties(gpu, Unpack(TextureFormat::DepthStencil), &formatProperties); if (!(formatProperties.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT)) { - gUse32bitDepth8bitStencil = true; - vkGetPhysicalDeviceFormatProperties(gpu, Unpack(TextureFormat::DepthStencil), &formatProperties); - if (!(formatProperties.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT)) - { - LOG(LWARNING, ("Vulkan error: depth-stencil format is unsupported.")); - return false; - } + LOG(LWARNING, ("Vulkan error: depth-stencil format is unsupported.")); + return false; } std::array framebufferColorFormats = {{Unpack(TextureFormat::RGBA8), @@ -160,11 +129,7 @@ VkFormat VulkanFormatUnpacker::Unpack(TextureFormat format) case TextureFormat::RGBA8: return VK_FORMAT_R8G8B8A8_UNORM; case TextureFormat::Alpha: return VK_FORMAT_R8_UNORM; case TextureFormat::RedGreen: return VK_FORMAT_R8G8_UNORM; -#if defined(OMIM_OS_MAC) - case TextureFormat::DepthStencil: return VK_FORMAT_D32_SFLOAT_S8_UINT; -#else - case TextureFormat::DepthStencil: return gUse32bitDepth8bitStencil ? VK_FORMAT_D32_SFLOAT_S8_UINT : VK_FORMAT_D24_UNORM_S8_UINT; -#endif + case TextureFormat::DepthStencil: return VK_FORMAT_D24_UNORM_S8_UINT; case TextureFormat::Depth: return m_bestDepthFormat; case TextureFormat::Unspecified: CHECK(false, ()); diff --git a/drape/vulkan/vulkan_utils.hpp b/drape/vulkan/vulkan_utils.hpp index 2d6ee6928f..f54c792b01 100644 --- a/drape/vulkan/vulkan_utils.hpp +++ b/drape/vulkan/vulkan_utils.hpp @@ -54,18 +54,6 @@ struct SamplerKey uint32_t m_sampler = 0; }; - -class DebugName -{ -public: - static void Init(VkInstance instance, VkDevice device); - static void Set(VkObjectType type, uint64_t handle, char const * name); - -private: - static VkDevice m_device; - static PFN_vkSetDebugUtilsObjectNameEXT vkSetDebugUtilsObjectNameEXT; -}; - } // namespace vulkan } // namespace dp @@ -93,18 +81,3 @@ private: CHECK(statusCode == VK_SUCCESS, ("Vulkan error:", #method, "finished with code", \ dp::vulkan::GetVulkanResultString(statusCode))); \ } while (false) - -#if defined(OMIM_OS_MAC) || defined(OMIM_OS_LINUX) -#define INIT_DEBUG_NAME_VK(instance, device) \ - do { \ - DebugName::Init(instance, device); \ - } while (false) - -#define SET_DEBUG_NAME_VK(type, handle, name) \ - do { \ - DebugName::Set(type, (uint64_t)handle, name); \ - } while (false) -#else -#define INIT_DEBUG_NAME_VK(instance, device) -#define SET_DEBUG_NAME_VK(type, handle, name) -#endif diff --git a/drape_frontend/arrow3d.cpp b/drape_frontend/arrow3d.cpp index 48bf8f6e60..bd935eec98 100644 --- a/drape_frontend/arrow3d.cpp +++ b/drape_frontend/arrow3d.cpp @@ -290,12 +290,12 @@ Arrow3d::PreloadedData Arrow3d::PreloadMesh(std::optional con Arrow3d::Arrow3d(ref_ptr context, ref_ptr texMng, PreloadedData && preloadedData) - : m_arrowMesh(context, dp::MeshObject::DrawPrimitive::Triangles, "Arrow3d") + : m_arrowMesh(context, dp::MeshObject::DrawPrimitive::Triangles) , m_arrowMeshTexturingEnabled(preloadedData.m_arrowMeshTexturingEnabled) , m_texCoordFlipping(std::move(preloadedData.m_texCoordFlipping)) , m_shadowMesh( preloadedData.m_shadowMeshData.has_value() - ? make_unique_dp(context, dp::MeshObject::DrawPrimitive::Triangles, "Arrow3dShadow") + ? make_unique_dp(context, dp::MeshObject::DrawPrimitive::Triangles) : nullptr) , m_state(CreateRenderState(gpu::Program::Arrow3d, DepthLayer::OverlayLayer)) , m_meshOffset(std::move(preloadedData.m_meshOffset)) diff --git a/drape_frontend/debug_rect_renderer.cpp b/drape_frontend/debug_rect_renderer.cpp index 151d5b8169..4a8a8fdfb8 100644 --- a/drape_frontend/debug_rect_renderer.cpp +++ b/drape_frontend/debug_rect_renderer.cpp @@ -17,9 +17,9 @@ void PixelPointToScreenSpace(ScreenBase const & screen, m2::PointF const & pt, s } drape_ptr CreateMesh(ref_ptr context, ref_ptr program, - std::vector && vertices, std::string const & debugName) + std::vector && vertices) { - auto mesh = make_unique_dp(context, dp::MeshObject::DrawPrimitive::LineStrip, debugName); + auto mesh = make_unique_dp(context, dp::MeshObject::DrawPrimitive::LineStrip); mesh->SetBuffer(0 /* bufferInd */, std::move(vertices), static_cast(sizeof(float) * 2)); mesh->SetAttribute("a_position", 0 /* bufferInd */, 0 /* offset */, 2 /* componentsCount */); mesh->Build(context, program); @@ -70,9 +70,9 @@ void DebugRectRenderer::SetArrow(ref_ptr context, m2::Point ASSERT_LESS_OR_EQUAL(m_currentArrowMesh, m_arrowMeshes.size(), ()); if (m_currentArrowMesh == m_arrowMeshes.size()) - m_arrowMeshes.emplace_back(CreateMesh(context, m_program, std::move(vertices), "DebugArrow")); + m_arrowMeshes.emplace_back(CreateMesh(context, m_program, std::move(vertices))); else - m_arrowMeshes[m_currentArrowMesh]->UpdateBuffer(context, 0 /* bufferInd */, vertices); + m_arrowMeshes[m_currentArrowMesh]->UpdateBuffer(context, 0 /* bufferInd */, std::move(vertices)); } void DebugRectRenderer::SetRect(ref_ptr context, m2::RectF const & rect, @@ -87,9 +87,9 @@ void DebugRectRenderer::SetRect(ref_ptr context, m2::RectF ASSERT_LESS_OR_EQUAL(m_currentRectMesh, m_rectMeshes.size(), ()); if (m_currentRectMesh == m_rectMeshes.size()) - m_rectMeshes.emplace_back(CreateMesh(context, m_program, std::move(vertices), "DebugRect")); + m_rectMeshes.emplace_back(CreateMesh(context, m_program, std::move(vertices))); else - m_rectMeshes[m_currentRectMesh]->UpdateBuffer(context, 0 /* bufferInd */, vertices); + m_rectMeshes[m_currentRectMesh]->UpdateBuffer(context, 0 /* bufferInd */, std::move(vertices)); } void DebugRectRenderer::DrawRect(ref_ptr context, ScreenBase const & screen, diff --git a/drape_frontend/drape_engine.cpp b/drape_frontend/drape_engine.cpp index b5c57af451..547d79ed33 100644 --- a/drape_frontend/drape_engine.cpp +++ b/drape_frontend/drape_engine.cpp @@ -87,8 +87,7 @@ DrapeEngine::DrapeEngine(Params && params) params.m_trafficEnabled, params.m_blockTapEvents, std::move(effects), - params.m_onGraphicsContextInitialized, - std::move(params.m_renderInjectionHandler)); + params.m_onGraphicsContextInitialized); BackendRenderer::Params brParams( params.m_apiVersion, frParams.m_commutator, frParams.m_oglContextFactory, frParams.m_texMng, @@ -199,11 +198,6 @@ void DrapeEngine::Rotate(double azimuth, bool isAnim) AddUserEvent(make_unique_dp(azimuth, isAnim, nullptr /* parallelAnimCreator */)); } -void DrapeEngine::MakeFrameActive() -{ - AddUserEvent(make_unique_dp()); -} - void DrapeEngine::ScaleAndSetCenter(m2::PointD const & centerPt, double scaleFactor, bool isAnim, bool trackVisibleViewport) { diff --git a/drape_frontend/drape_engine.hpp b/drape_frontend/drape_engine.hpp index c843003199..56f007af11 100644 --- a/drape_frontend/drape_engine.hpp +++ b/drape_frontend/drape_engine.hpp @@ -61,8 +61,7 @@ public: bool isRoutingActive, bool isAutozoomEnabled, bool simplifiedTrafficColors, std::optional arrow3dCustomDecl, OverlaysShowStatsCallback && overlaysShowStatsCallback, - OnGraphicsContextInitialized && onGraphicsContextInitialized, - dp::RenderInjectionHandler && renderInjectionHandler) + OnGraphicsContextInitialized && onGraphicsContextInitialized) : m_apiVersion(apiVersion) , m_factory(factory) , m_viewport(viewport) @@ -84,7 +83,6 @@ public: , m_arrow3dCustomDecl(std::move(arrow3dCustomDecl)) , m_overlaysShowStatsCallback(std::move(overlaysShowStatsCallback)) , m_onGraphicsContextInitialized(std::move(onGraphicsContextInitialized)) - , m_renderInjectionHandler(std::move(renderInjectionHandler)) {} dp::ApiVersion m_apiVersion; @@ -109,7 +107,6 @@ public: std::optional m_arrow3dCustomDecl; OverlaysShowStatsCallback m_overlaysShowStatsCallback; OnGraphicsContextInitialized m_onGraphicsContextInitialized; - dp::RenderInjectionHandler m_renderInjectionHandler; }; DrapeEngine(Params && params); @@ -128,8 +125,6 @@ public: void Scroll(double distanceX, double distanceY); void Rotate(double azimuth, bool isAnim); - void MakeFrameActive(); - void ScaleAndSetCenter(m2::PointD const & centerPt, double scaleFactor, bool isAnim, bool trackVisibleViewport); diff --git a/drape_frontend/drape_frontend_tests/user_event_stream_tests.cpp b/drape_frontend/drape_frontend_tests/user_event_stream_tests.cpp index 44acf3227d..2a5eb71dec 100644 --- a/drape_frontend/drape_frontend_tests/user_event_stream_tests.cpp +++ b/drape_frontend/drape_frontend_tests/user_event_stream_tests.cpp @@ -65,8 +65,8 @@ public: void RunTest() { - bool dummy1, dummy2, dummy3; - m_stream.ProcessEvents(dummy1, dummy2, dummy3); + bool dummy1, dummy2; + m_stream.ProcessEvents(dummy1, dummy2); TEST_EQUAL(m_expectation.empty(), true, ()); } diff --git a/drape_frontend/frontend_renderer.cpp b/drape_frontend/frontend_renderer.cpp index 8f0861e488..5b08eb7a58 100755 --- a/drape_frontend/frontend_renderer.cpp +++ b/drape_frontend/frontend_renderer.cpp @@ -187,7 +187,6 @@ FrontendRenderer::FrontendRenderer(Params && params) , m_scenarioManager(new ScenarioManager(this)) #endif , m_notifier(make_unique_dp(params.m_commutator)) - , m_renderInjectionHandler(std::move(params.m_renderInjectionHandler)) { #ifdef DEBUG m_isTeardowned = false; @@ -1733,6 +1732,7 @@ void FrontendRenderer::RenderEmptyFrame() m_context->Clear(dp::ClearBits::ColorBit, dp::ClearBits::ColorBit /* storeBits */); m_context->ApplyFramebuffer("Empty frame"); m_viewport.Apply(m_context); + m_context->EndRendering(); m_context->Present(); } @@ -1753,8 +1753,8 @@ void FrontendRenderer::RenderFrame() auto & scaleFpsHelper = gui::DrapeGui::Instance().GetScaleFpsHelper(); m_frameData.m_timer.Reset(); - bool modelViewChanged, viewportChanged, needActiveFrame; - ScreenBase const & modelView = ProcessEvents(modelViewChanged, viewportChanged, needActiveFrame); + bool modelViewChanged, viewportChanged; + ScreenBase const & modelView = ProcessEvents(modelViewChanged, viewportChanged); if (viewportChanged || m_needRestoreSize) OnResize(modelView); @@ -1762,7 +1762,7 @@ void FrontendRenderer::RenderFrame() return; // Check for a frame is active. - bool isActiveFrame = modelViewChanged || viewportChanged || needActiveFrame; + bool isActiveFrame = modelViewChanged || viewportChanged; if (isActiveFrame) PrepareScene(modelView); @@ -1788,9 +1788,6 @@ void FrontendRenderer::RenderFrame() RenderScene(modelView, isActiveFrameForScene); - if (m_renderInjectionHandler) - m_renderInjectionHandler(m_context, m_texMng, make_ref(m_gpuProgramManager), false); - m_context->EndRendering(); auto const hasForceUpdate = m_forceUpdateScene || m_forceUpdateUserMarks; @@ -2307,9 +2304,6 @@ void FrontendRenderer::OnContextDestroy() { LOG(LINFO, ("On context destroy.")); - if (m_renderInjectionHandler) - m_renderInjectionHandler(m_context, m_texMng, make_ref(m_gpuProgramManager), true); - // Clear all graphics. for (RenderLayer & layer : m_layers) { @@ -2563,12 +2557,10 @@ void FrontendRenderer::OnEnterBackground() m_myPositionController->OnEnterBackground(); } -ScreenBase const & FrontendRenderer::ProcessEvents(bool & modelViewChanged, bool & viewportChanged, - bool & needActiveFrame) +ScreenBase const & FrontendRenderer::ProcessEvents(bool & modelViewChanged, bool & viewportChanged) { TRACE_SECTION("[drape] ProcessEvents"); - ScreenBase const & modelView = m_userEventStream.ProcessEvents(modelViewChanged, viewportChanged, - needActiveFrame); + ScreenBase const & modelView = m_userEventStream.ProcessEvents(modelViewChanged, viewportChanged); gui::DrapeGui::Instance().SetInUserAction(m_userEventStream.IsInUserAction()); // Location- or compass-update could have changed model view on the previous frame. diff --git a/drape_frontend/frontend_renderer.hpp b/drape_frontend/frontend_renderer.hpp index 3108f89b0c..8038ab7c4f 100755 --- a/drape_frontend/frontend_renderer.hpp +++ b/drape_frontend/frontend_renderer.hpp @@ -95,8 +95,7 @@ public: OverlaysShowStatsCallback && overlaysShowStatsCallback, bool allow3dBuildings, bool trafficEnabled, bool blockTapEvents, std::vector && enabledEffects, - OnGraphicsContextInitialized const & onGraphicsContextInitialized, - dp::RenderInjectionHandler&& renderInjectionHandler) + OnGraphicsContextInitialized const & onGraphicsContextInitialized) : BaseRenderer::Params(apiVersion, commutator, factory, texMng, onGraphicsContextInitialized) , m_myPositionParams(std::move(myPositionParams)) , m_viewport(viewport) @@ -109,7 +108,6 @@ public: , m_trafficEnabled(trafficEnabled) , m_blockTapEvents(blockTapEvents) , m_enabledEffects(std::move(enabledEffects)) - , m_renderInjectionHandler(std::move(renderInjectionHandler)) {} MyPositionController::Params m_myPositionParams; @@ -123,7 +121,6 @@ public: bool m_trafficEnabled; bool m_blockTapEvents; std::vector m_enabledEffects; - dp::RenderInjectionHandler m_renderInjectionHandler; }; explicit FrontendRenderer(Params && params); @@ -197,8 +194,7 @@ private: bool HasTransitRouteData() const; bool HasRouteData() const; - ScreenBase const & ProcessEvents(bool & modelViewChanged, bool & viewportChanged, - bool & needActiveFrame); + ScreenBase const & ProcessEvents(bool & modelViewChanged, bool & viewportChanged); void PrepareScene(ScreenBase const & modelView); void UpdateScene(ScreenBase const & modelView); void BuildOverlayTree(ScreenBase const & modelView); @@ -434,8 +430,6 @@ private: drape_ptr m_notifier; - dp::RenderInjectionHandler m_renderInjectionHandler; - struct FrameData { base::Timer m_timer; diff --git a/drape_frontend/user_event_stream.cpp b/drape_frontend/user_event_stream.cpp index 66c4e2315a..0c364f78e7 100644 --- a/drape_frontend/user_event_stream.cpp +++ b/drape_frontend/user_event_stream.cpp @@ -154,8 +154,7 @@ void UserEventStream::AddEvent(drape_ptr && event) m_events.emplace_back(std::move(event)); } -ScreenBase const & UserEventStream::ProcessEvents(bool & modelViewChanged, bool & viewportChanged, - bool & activeFrame) +ScreenBase const & UserEventStream::ProcessEvents(bool & modelViewChanged, bool & viewportChanged) { TEventsList events; { @@ -165,7 +164,6 @@ ScreenBase const & UserEventStream::ProcessEvents(bool & modelViewChanged, bool m2::RectD const prevPixelRect = GetCurrentScreen().PixelRect(); - activeFrame = false; viewportChanged = false; m_modelViewChanged = !events.empty() || m_state == STATE_SCALE || m_state == STATE_DRAG; @@ -270,11 +268,7 @@ ScreenBase const & UserEventStream::ProcessEvents(bool & modelViewChanged, bool TouchCancel(m_touches); } break; - case UserEvent::EventType::ActiveFrame: - { - activeFrame = true; - } - break; + default: ASSERT(false, ()); break; diff --git a/drape_frontend/user_event_stream.hpp b/drape_frontend/user_event_stream.hpp index 47f8ebdfd8..b74dc2998b 100644 --- a/drape_frontend/user_event_stream.hpp +++ b/drape_frontend/user_event_stream.hpp @@ -42,8 +42,7 @@ public: AutoPerspective, VisibleViewport, Move, - Scroll, - ActiveFrame + Scroll }; virtual ~UserEvent() = default; @@ -401,15 +400,6 @@ private: double m_distanceY; }; -// Doesn't have any payload, allows to unfreeze rendering in frontend_renderer -class ActiveFrameEvent : public UserEvent -{ -public: - explicit ActiveFrameEvent(){} - - EventType GetType() const override { return UserEvent::EventType::ActiveFrame; } -}; - class UserEventStream { public: @@ -444,7 +434,7 @@ public: UserEventStream(); void AddEvent(drape_ptr && event); - ScreenBase const & ProcessEvents(bool & modelViewChanged, bool & viewportChanged, bool & activeFrame); + ScreenBase const & ProcessEvents(bool & modelViewChanged, bool & viewportChanged); ScreenBase const & GetCurrentScreen() const; m2::RectD const & GetVisibleViewport() const; diff --git a/iphone/Maps/LocalizedStrings/sr.lproj/Localizable.strings b/iphone/Maps/LocalizedStrings/sr.lproj/Localizable.strings index d3f502e54b..9c3d79818f 100644 --- a/iphone/Maps/LocalizedStrings/sr.lproj/Localizable.strings +++ b/iphone/Maps/LocalizedStrings/sr.lproj/Localizable.strings @@ -265,7 +265,7 @@ "placepage_distance" = "Раздаљина"; -"search_show_on_map" = "Прикажи на мапи"; +"search_show_on_map" = "Погледај на мапи"; /* Text in menu */ "website" = "Веб-сајт"; @@ -310,7 +310,7 @@ "copyright" = "Copyright"; /* Text in menu + Button in the main Help dialog */ -"report_a_bug" = "Пријавите проблем"; +"report_a_bug" = "Пријави проблем"; /* Button in the About screen */ "report_incorrect_map_bug" = "Пријавите или поправите нетачне податке на мапи"; @@ -619,7 +619,7 @@ "invalid_username_or_password" = "Неисправно корисничко име или лозинка"; -"login" = "Пријавите се"; +"login" = "Пријави се"; "login_osm" = "Пријава на OpenStreetMap"; @@ -910,7 +910,7 @@ "traffic_update_maps_text" = "Да би се приказали подаци о саобраћају, мапа мора да се ажурира."; -"big_font" = "Увећана слова на мапи"; +"big_font" = "Повећај слова на мапи"; /* "traffic" as in road congestion */ "traffic_update_app_message" = "Да бисте видели податке о саобраћају, морате да ажурирате апликацију."; @@ -918,7 +918,7 @@ /* "traffic" as in "road congestion" */ "traffic_data_unavailable" = "Подаци о саобраћају нису доступни"; -"enable_logging" = "Снимање лог фајлова"; +"enable_logging" = "Омогући снимање лог фајлова"; "log_file_size" = "Величина лог фајла: %@"; @@ -1027,7 +1027,7 @@ "download_button" = "Преузми"; -"speedcams_alert_title" = "Прекршајне камере"; +"speedcams_alert_title" = "Саобраћајне камере"; "place_description_title" = "Опис места"; @@ -1050,7 +1050,7 @@ "power_managment_setting_manual_max" = "Увек"; -"enable_logging_warning_message" = "Привремено укључите ову опцију да бисте сачували детаљне дијагностичке логове уколико имате неки проблем. Логове можете да нам пошаљете коришћењем опције \"Пријавите проблем\" у прозору Помоћ. Напомена: Логови могу да садрже информације о вашој локацији."; +"enable_logging_warning_message" = "Привремено укључите ову опцију да бисте сачували детаљне дијагностичке логове уколико имате неки проблем. Логове можете да нам пошаљете коришћењем опције \"Пријави проблем\" у прозору Помоћ. Напомена: Логови могу да садрже информације о вашој локацији."; "driving_options_title" = "Опције рутирања"; @@ -1135,7 +1135,7 @@ "ok" = "ОК"; -"speedcams_alert_title_carplay_1" = "Прекршајне камере"; +"speedcams_alert_title_carplay_1" = "Саобраћајне камере"; "speedcams_alert_title_carplay_2" = "Упозорење прекорачења"; @@ -1258,7 +1258,7 @@ "placepage_delete_track_button" = "Обриши путању"; /* The track deletion confirmaion alert message. */ -"placepage_delete_track_confirmation_alert_message" = "Да ли сте сигурни да желите да обришете ову путању?"; +"placepage_delete_track_confirmation_alert_message" = "Are you sure you want to delete this track?"; /* Placeholder for track name input on track edit screen */ "placepage_track_name_hint" = "Назив путање"; diff --git a/map/framework.cpp b/map/framework.cpp index c40cc63f48..b589cd0c18 100644 --- a/map/framework.cpp +++ b/map/framework.cpp @@ -1135,12 +1135,6 @@ void Framework::TouchEvent(df::TouchEvent const & touch) m_drapeEngine->AddTouchEvent(touch); } -void Framework::MakeFrameActive() -{ - if (m_drapeEngine != nullptr) - m_drapeEngine->MakeFrameActive(); -} - int Framework::GetDrawScale() const { if (m_drapeEngine != nullptr) @@ -1562,8 +1556,7 @@ void Framework::CreateDrapeEngine(ref_ptr contextFac params.m_isChoosePositionMode, params.m_isChoosePositionMode, GetSelectedFeatureTriangles(), m_routingManager.IsRoutingActive() && m_routingManager.IsRoutingFollowing(), isAutozoomEnabled, simplifiedTrafficColors, std::nullopt /* arrow3dCustomDecl */, - std::move(overlaysShowStatsFn), std::move(onGraphicsContextInitialized), - std::move(params.m_renderInjectionHandler)); + std::move(overlaysShowStatsFn), std::move(onGraphicsContextInitialized)); m_drapeEngine = make_unique_dp(std::move(p)); m_drapeEngine->SetModelViewListener([this](ScreenBase const & screen) diff --git a/map/framework.hpp b/map/framework.hpp index 63fde1c9e9..9fb29750aa 100644 --- a/map/framework.hpp +++ b/map/framework.hpp @@ -403,7 +403,6 @@ public: bool m_isChoosePositionMode = false; df::Hints m_hints; - dp::RenderInjectionHandler m_renderInjectionHandler; }; void CreateDrapeEngine(ref_ptr contextFactory, DrapeCreationParams && params); @@ -561,8 +560,6 @@ public: void TouchEvent(df::TouchEvent const & touch); - void MakeFrameActive(); - int GetDrawScale() const; void RunFirstLaunchAnimation(); diff --git a/map/search_mark.cpp b/map/search_mark.cpp index db60fd95b5..cdb4a6d417 100644 --- a/map/search_mark.cpp +++ b/map/search_mark.cpp @@ -37,10 +37,6 @@ enum SearchMarkPoint::SearchMarkType : uint8_t Stadium, Museum, Art, - Attraction, - Viewpoint, - Remains, - ArchaeologicalSite, Information, Marketplace, Nightclub, @@ -69,8 +65,6 @@ enum SearchMarkPoint::SearchMarkType : uint8_t Hospital, Clinic, Pharmacy, - DrinkingWater, - DrinkingWaterNo, NotFound, // Service value used in developer tools. Count @@ -106,10 +100,6 @@ std::array const kSymbols = { "search-result-stadium", // Stadium. "search-result-museum", // Museum. "search-result-art", // Art. - "search-result-attraction", // Attraction. - "search-result-viewpoint", // Viewpoint. - "search-result-remains", // Remains. - "search-result-archaeological-site", // ArchaeologicalSite. "search-result-information", // Information. "search-result-marketplace", // Marketplace. "search-result-nightclub", // Nightclub. @@ -138,8 +128,6 @@ std::array const kSymbols = { "search-result-hospital", // Hospital. "search-result-clinic", // Clinic. "search-result-pharmacy", // Pharmacy. - "search-result-drinking-water", // DrinkingWater. - "search-result-drinking-water-no", // DrinkingWaterNo. "non-found-search-result", // NotFound. @@ -195,23 +183,6 @@ private: {{"tourism", "museum"}, SearchMarkType::Museum}, {{"amenity", "arts_centre"}, SearchMarkType::Art}, {{"tourism", "gallery"}, SearchMarkType::Art}, - {{"tourism", "attraction"}, SearchMarkType::Attraction}, - {{"tourism", "viewpoint"}, SearchMarkType::Viewpoint}, - {{"historic", "fort"}, SearchMarkType::Remains}, - {{"historic", "castle"}, SearchMarkType::Remains}, - {{"historic", "castle", "castrum"}, SearchMarkType::Remains}, - {{"historic", "castle", "fortified_church"}, SearchMarkType::Remains}, - {{"historic", "castle", "fortress"}, SearchMarkType::Remains}, - {{"historic", "castle", "hillfort"}, SearchMarkType::Remains}, - {{"historic", "castle", "kremlin"}, SearchMarkType::Remains}, - {{"historic", "castle", "manor"}, SearchMarkType::Remains}, - {{"historic", "castle", "palace"}, SearchMarkType::Remains}, - {{"historic", "castle", "shiro"}, SearchMarkType::Remains}, - {{"historic", "castle", "defensive"}, SearchMarkType::Remains}, - {{"historic", "castle", "stately"}, SearchMarkType::Remains}, - {{"historic", "ruins"}, SearchMarkType::Remains}, - {{"historic", "city_gate"}, SearchMarkType::Remains}, - {{"historic", "archaeological_site"}, SearchMarkType::ArchaeologicalSite}, {{"tourism", "information"}, SearchMarkType::Information}, {{"tourism", "information", "office"}, SearchMarkType::Information}, {{"tourism", "information", "visitor_centre"}, SearchMarkType::Information}, @@ -269,16 +240,6 @@ private: {{"leisure", "sports_hall"}, SearchMarkType::Pitch}, {{"leisure", "swimming_pool"}, SearchMarkType::Swimming}, {{"leisure", "water_park"}, SearchMarkType::Swimming}, - {{"amenity", "drinking_water"}, SearchMarkType::DrinkingWater}, - {{"amenity", "water_point"}, SearchMarkType::DrinkingWater}, - {{"man_made", "water_tap"}, SearchMarkType::DrinkingWater}, - {{"man_made", "water_well"}, SearchMarkType::DrinkingWater}, - {{"natural", "spring"}, SearchMarkType::DrinkingWater}, - {{"natural", "hot_spring"}, SearchMarkType::DrinkingWater}, - {{"amenity", "water_point", "drinking_water_no"}, SearchMarkType::DrinkingWaterNo}, - {{"man_made", "water_tap", "drinking_water_no"}, SearchMarkType::DrinkingWaterNo}, - {{"man_made", "water_well", "drinking_water_no"}, SearchMarkType::DrinkingWaterNo}, - {{"natural", "spring", "drinking_water_no"}, SearchMarkType::DrinkingWaterNo}, }; m_searchMarkTypes.reserve(std::size(table)); diff --git a/qt/CMakeLists.txt b/qt/CMakeLists.txt index f1fb4c66b4..2dc9c6eef0 100644 --- a/qt/CMakeLists.txt +++ b/qt/CMakeLists.txt @@ -192,10 +192,6 @@ if (PLATFORM_MAC) ) endif() -if (PLATFORM_WIN) - target_sources(${PROJECT_NAME} PRIVATE res/windows.rc) -endif() - if (BUILD_DESIGNER) execute_process( COMMAND cp -rf ${OMIM_ROOT}/data/resources-mdpi_light/ ${OMIM_ROOT}/data/resources-mdpi_design/ diff --git a/qt/MapsWithMe.manifest b/qt/MapsWithMe.manifest new file mode 100644 index 0000000000..2f99a7ec86 --- /dev/null +++ b/qt/MapsWithMe.manifest @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/qt/res/windows.ico b/qt/res/windows.ico index d1838e173c..ddb4eabffb 100644 Binary files a/qt/res/windows.ico and b/qt/res/windows.ico differ diff --git a/search/latlon_match.cpp b/search/latlon_match.cpp index 655757fe80..7857537f7e 100644 --- a/search/latlon_match.cpp +++ b/search/latlon_match.cpp @@ -24,6 +24,11 @@ bool IsDecimalMark(char c) return kDecimalMarks.find(c) != string::npos; } +bool IsNegativeSymbol(char c) +{ + return c == '-'; +} + template void SkipSpaces(Char *& s) { @@ -99,6 +104,7 @@ double EatDouble(char const * str, char ** strEnd) bool gotDigitAfterMark = false; char const * markPos = nullptr; char const * p = str; + double modifier = 1.0; while (true) { if (IsDecimalMark(*p)) @@ -115,6 +121,10 @@ double EatDouble(char const * str, char ** strEnd) else gotDigitBeforeMark = true; } + else if (IsNegativeSymbol(*p)) + { + modifier = -1.0; + } else { break; @@ -129,7 +139,7 @@ double EatDouble(char const * str, char ** strEnd) *strEnd = const_cast(p); auto const x1 = atof(part1.c_str()); auto const x2 = atof(part2.c_str()); - return x1 + x2 * pow(10.0, -static_cast(part2.size())); + return x1 + x2 * modifier * pow(10.0, -static_cast(part2.size())); } return strtod(str, strEnd); diff --git a/search/search_tests/latlon_match_test.cpp b/search/search_tests/latlon_match_test.cpp index c807312ff1..3e9459d891 100644 --- a/search/search_tests/latlon_match_test.cpp +++ b/search/search_tests/latlon_match_test.cpp @@ -46,10 +46,38 @@ UNIT_TEST(LatLon_Match_Smoke) TestAlmostEqual(lat, 10.1); TestAlmostEqual(lon, 20.2); + TEST(MatchLatLonDegree("-10,10, 20,20", lat, lon), ()); + TestAlmostEqual(lat, -10.1); + TestAlmostEqual(lon, 20.2); + + TEST(MatchLatLonDegree("10,10, -20,20", lat, lon), ()); + TestAlmostEqual(lat, 10.1); + TestAlmostEqual(lon, -20.2); + + TEST(MatchLatLonDegree("-10,10, -20,20", lat, lon), ()); + TestAlmostEqual(lat, -10.1); + TestAlmostEqual(lon, -20.2); + + TEST(MatchLatLonDegree("-10,10 20,20", lat, lon), ()); + TestAlmostEqual(lat, -10.1); + TestAlmostEqual(lon, 20.2); + + TEST(MatchLatLonDegree("10,10 -20,20", lat, lon), ()); + TestAlmostEqual(lat, 10.1); + TestAlmostEqual(lon, -20.2); + + TEST(MatchLatLonDegree("-10,10 -20,20", lat, lon), ()); + TestAlmostEqual(lat, -10.1); + TestAlmostEqual(lon, -20.2); + TEST(MatchLatLonDegree("-22.3534 -42.7076\n", lat, lon), ()); TestAlmostEqual(lat, -22.3534); TestAlmostEqual(lon, -42.7076); + TEST(MatchLatLonDegree("-22,3534 -42,7076\n", lat, lon), ()); + TestAlmostEqual(lat, -22.3534); + TestAlmostEqual(lon, -42.7076); + // The ".123" form is not accepted, so our best-effort // parse results in "10" and "20". TEST(MatchLatLonDegree(".10, ,20", lat, lon), ()); diff --git a/shaders/CMakeLists.txt b/shaders/CMakeLists.txt index f37d6af0bf..22fd0ef9b5 100644 --- a/shaders/CMakeLists.txt +++ b/shaders/CMakeLists.txt @@ -129,9 +129,10 @@ target_sources(${PROJECT_NAME} vulkan_program_pool.hpp ) -if (PLATFORM_IPHONE OR PLATFORM_MAC) +if (PLATFORM_IPHONE) target_sources(${PROJECT_NAME} PRIVATE + Metal/debug_rect.metal metal_program_params.hpp metal_program_params.mm metal_program_pool.hpp @@ -145,8 +146,4 @@ target_include_directories(${PROJECT_NAME} PUBLIC "${OMIM_ROOT}/3party/glm") target_link_libraries(${PROJECT_NAME} drape) -if (PLATFORM_MAC) - set_target_properties(${PROJECT_NAME} PROPERTIES XCODE_ATTRIBUTE_CLANG_ENABLE_OBJC_ARC YES) -endif() - omim_add_test_subdirectory(shaders_tests) diff --git a/tools/python/descriptions/requirements.txt b/tools/python/descriptions/requirements.txt index 3db310cc50..a9a5f1e71e 100644 --- a/tools/python/descriptions/requirements.txt +++ b/tools/python/descriptions/requirements.txt @@ -1,4 +1,4 @@ -htmlmin2==0.1.13 +htmlmin==0.1.12 requests>=2.31.0 beautifulsoup4==4.9.1 wikidata==0.6.1 diff --git a/tools/python/descriptions/requirements_dev.txt b/tools/python/descriptions/requirements_dev.txt index 3db310cc50..a9a5f1e71e 100644 --- a/tools/python/descriptions/requirements_dev.txt +++ b/tools/python/descriptions/requirements_dev.txt @@ -1,4 +1,4 @@ -htmlmin2==0.1.13 +htmlmin==0.1.12 requests>=2.31.0 beautifulsoup4==4.9.1 wikidata==0.6.1