vulkan_renderengine: Check for support first
The vulkan_renderengine flag allows us to switch some users to using
Vulkan as part of the trunk stable process. But not all devices support
Vulkan.
Move canSupportSkiaVkRenderEngine into the RenderEngine header, so it
can be used by SurfaceFlinger. When the vulkan_renderengine flag is set,
check for support before choosing Vulkan. Do *not* log an error, since
this is specified broadly, so it is expected that the flag will be set
for devices that do not have support.
This introduces an extra call to initVulkanInterface, so log the amount
of time it takes. On my device, the first call is only ~17ms, so this
seems fine. The next call is much faster, ~4ms. The next call is not
interestingly different, possibly because the first call was already
made.
Bug: 293371537
Bug: 325619183
Test: atest librenderengine_test
Test: manual
Change-Id: Iba66e67347c69b95dc9c05ca838fa1391ef4ab81
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp
index 5bb5508..edba50b 100644
--- a/services/surfaceflinger/SurfaceFlinger.cpp
+++ b/services/surfaceflinger/SurfaceFlinger.cpp
@@ -816,9 +816,10 @@
builder.setThreaded(renderengine::RenderEngine::Threaded::YES)
.setGraphicsApi(renderengine::RenderEngine::GraphicsApi::VK);
} else {
- builder.setGraphicsApi(FlagManager::getInstance().vulkan_renderengine()
- ? renderengine::RenderEngine::GraphicsApi::VK
- : renderengine::RenderEngine::GraphicsApi::GL);
+ const auto kVulkan = renderengine::RenderEngine::GraphicsApi::VK;
+ const bool useVulkan = FlagManager::getInstance().vulkan_renderengine() &&
+ renderengine::RenderEngine::canSupport(kVulkan);
+ builder.setGraphicsApi(useVulkan ? kVulkan : renderengine::RenderEngine::GraphicsApi::GL);
}
}