Split RenderEngineType into two enums
Primary motivation is to prepare for making switching RenderEngine to
use Graphite. This is orthogonal to whether or not we're using
RenderEngineThreaded. The enum already encodes orthogonal types, so
split them up in the natural way, rather than adding more combos.
Replace RenderEngine::getRenderEngineType() with isThreaded(), as the
only caller really wants to know whether it's threaded. This allows
fixing a bug where the SKIA_VK_THREADED backend didn't offload
renderScreenImpl for no good reason. (This is not a behavior change
for users or dogfooders, since no one is currently using
SKIA_VK_THREADED.)
Add a vulkan_renderengine option to FlagManager, which will switch
RenderEngine to use Skia's *Ganesh* Vulkan backend. Though this is not
what we intend to ship, this will allow us to get more soak time on
Vulkan before making the switch to Graphite.
Update the comments for PROPERTY_DEBUG_RENDERENGINE_BACKEND, which were
already out of date. Specify that it will *override* the default
settings, which will now be determined by flags.
Bug: 293371537
Test: manual (sysprops)
Test: atest librenderengine_test
Test: atest librenderengine_bench
Change-Id: Ib9b8abb25f4894f1b50b6286720c2abf89ca74e2
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp
index 0c640aa..5455e10 100644
--- a/services/surfaceflinger/SurfaceFlinger.cpp
+++ b/services/surfaceflinger/SurfaceFlinger.cpp
@@ -798,22 +798,26 @@
}));
}
-static std::optional<renderengine::RenderEngine::RenderEngineType>
-chooseRenderEngineTypeViaSysProp() {
+void chooseRenderEngineType(renderengine::RenderEngineCreationArgs::Builder& builder) {
char prop[PROPERTY_VALUE_MAX];
property_get(PROPERTY_DEBUG_RENDERENGINE_BACKEND, prop, "skiaglthreaded");
if (strcmp(prop, "skiagl") == 0) {
- return renderengine::RenderEngine::RenderEngineType::SKIA_GL;
+ builder.setThreaded(renderengine::RenderEngine::Threaded::NO)
+ .setGraphicsApi(renderengine::RenderEngine::GraphicsApi::GL);
} else if (strcmp(prop, "skiaglthreaded") == 0) {
- return renderengine::RenderEngine::RenderEngineType::SKIA_GL_THREADED;
+ builder.setThreaded(renderengine::RenderEngine::Threaded::YES)
+ .setGraphicsApi(renderengine::RenderEngine::GraphicsApi::GL);
} else if (strcmp(prop, "skiavk") == 0) {
- return renderengine::RenderEngine::RenderEngineType::SKIA_VK;
+ builder.setThreaded(renderengine::RenderEngine::Threaded::NO)
+ .setGraphicsApi(renderengine::RenderEngine::GraphicsApi::VK);
} else if (strcmp(prop, "skiavkthreaded") == 0) {
- return renderengine::RenderEngine::RenderEngineType::SKIA_VK_THREADED;
+ builder.setThreaded(renderengine::RenderEngine::Threaded::YES)
+ .setGraphicsApi(renderengine::RenderEngine::GraphicsApi::VK);
} else {
- ALOGE("Unrecognized RenderEngineType %s; ignoring!", prop);
- return {};
+ builder.setGraphicsApi(FlagManager::getInstance().vulkan_renderengine()
+ ? renderengine::RenderEngine::GraphicsApi::VK
+ : renderengine::RenderEngine::GraphicsApi::GL);
}
}
@@ -839,9 +843,7 @@
useContextPriority
? renderengine::RenderEngine::ContextPriority::REALTIME
: renderengine::RenderEngine::ContextPriority::MEDIUM);
- if (auto type = chooseRenderEngineTypeViaSysProp()) {
- builder.setRenderEngineType(type.value());
- }
+ chooseRenderEngineType(builder);
mRenderEngine = renderengine::RenderEngine::create(builder.build());
mCompositionEngine->setRenderEngine(mRenderEngine.get());
mMaxRenderTargetSize =
@@ -8149,13 +8151,8 @@
//
// TODO(b/196334700) Once we use RenderEngineThreaded everywhere we can always defer the call
// to CompositionEngine::present.
- const bool renderEngineIsThreaded = [&]() {
- using Type = renderengine::RenderEngine::RenderEngineType;
- const auto type = mRenderEngine->getRenderEngineType();
- return type == Type::SKIA_GL_THREADED;
- }();
- auto presentFuture = renderEngineIsThreaded ? ftl::defer(std::move(present)).share()
- : ftl::yield(present()).share();
+ auto presentFuture = mRenderEngine->isThreaded() ? ftl::defer(std::move(present)).share()
+ : ftl::yield(present()).share();
for (auto& [layer, layerFE] : layers) {
layer->onLayerDisplayed(ftl::Future(presentFuture)