| 182 | } |
| 183 | |
| 184 | bool Framework::CreateDrapeEngine(JNIEnv * env, jobject jSurface, int densityDpi, bool firstLaunch, |
| 185 | bool launchByDeepLink, uint32_t appVersionCode, bool isCustomROM) |
| 186 | { |
| 187 | // Vulkan is supported only since Android 8.0, because some Android devices with Android 7.x |
| 188 | // have fatal driver issue, which can lead to process termination and whole OS destabilization. |
| 189 | int constexpr kMinSdkVersionForVulkan = 26; |
| 190 | int const sdkVersion = android_get_device_api_level(); |
| 191 | LOG(LINFO, ("Android SDK version in the Drape Engine:", sdkVersion)); |
| 192 | auto const vulkanForbidden = |
| 193 | sdkVersion < kMinSdkVersionForVulkan || dp::SupportManager::Instance().IsVulkanForbidden(); |
| 194 | if (vulkanForbidden) |
| 195 | LOG(LWARNING, ("Vulkan API is forbidden on this device.")); |
| 196 | |
| 197 | m_vulkanContextFactory.reset(); |
| 198 | m_oglContextFactory.reset(); |
| 199 | ::Framework::DrapeCreationParams p; |
| 200 | |
| 201 | if (m_work.LoadPreferredGraphicsAPI() == dp::ApiVersion::Vulkan && !vulkanForbidden) |
| 202 | { |
| 203 | auto vkFactory = make_unique_dp<AndroidVulkanContextFactory>(appVersionCode, sdkVersion, isCustomROM); |
| 204 | if (!vkFactory->IsVulkanSupported()) |
| 205 | { |
| 206 | LOG(LWARNING, ("Vulkan API is not supported.")); |
| 207 | } |
| 208 | else |
| 209 | { |
| 210 | vkFactory->SetSurface(env, jSurface); |
| 211 | if (!vkFactory->IsValid()) |
| 212 | { |
| 213 | LOG(LWARNING, ("Invalid Vulkan API context.")); |
| 214 | } |
| 215 | else |
| 216 | { |
| 217 | p.m_apiVersion = dp::ApiVersion::Vulkan; |
| 218 | p.m_surfaceWidth = vkFactory->GetWidth(); |
| 219 | p.m_surfaceHeight = vkFactory->GetHeight(); |
| 220 | |
| 221 | m_vulkanContextFactory = std::move(vkFactory); |
| 222 | } |
| 223 | } |
| 224 | } |
| 225 | |
| 226 | if (!m_vulkanContextFactory) |
| 227 | { |
| 228 | auto oglFactory = make_unique_dp<AndroidOGLContextFactory>(env, jSurface); |
| 229 | if (!oglFactory->IsValid()) |
| 230 | { |
| 231 | LOG(LWARNING, ("Invalid GL context.")); |
| 232 | return false; |
| 233 | } |
| 234 | p.m_apiVersion = dp::ApiVersion::OpenGLES3; |
| 235 | p.m_surfaceWidth = oglFactory->GetWidth(); |
| 236 | p.m_surfaceHeight = oglFactory->GetHeight(); |
| 237 | |
| 238 | m_oglContextFactory = make_unique_dp<dp::ThreadSafeFactory>(oglFactory.release()); |
| 239 | } |
| 240 | |
| 241 | p.m_visualScale = static_cast<float>(dp::VisualScale(densityDpi)); |
no test coverage detected