From c77162c2df4ea1d1fb3310e5f16cbcffe73f088d Mon Sep 17 00:00:00 2001 From: Leon Scroggins III Date: Tue, 16 Nov 2021 17:13:08 -0500 Subject: Move sysprop check for RenderEngineType into SF As brought up in I455d5d613ccaa210dc748969e025dc86c78080b8, we should read the sysprop in SF, so that clients (e.g. tests or benchmarks) that specify using a particular Type actually use that type, regardless of any sysprop set. If the sysprop is not set, or is set to an invalid value, just respect the default that is already set by RenderEngineCreationArgs::Builder. Bug: 193240340 Test: adb shell setprop debug.renderengine.backend verify via logcat that the proper type is used Change-Id: Iaf425fde6333f54d5b190df66cb7a79e1d491e63 --- services/surfaceflinger/SurfaceFlinger.cpp | 47 +++++++++++++++++++++--------- 1 file changed, 34 insertions(+), 13 deletions(-) (limited to 'services/surfaceflinger/SurfaceFlinger.cpp') diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index 45e0a3f616..4752caf138 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -772,6 +772,25 @@ void SurfaceFlinger::deleteTextureAsync(uint32_t texture) { ATRACE_INT("TexturePoolSize", mTexturePool.size()); } +static std::optional +chooseRenderEngineTypeViaSysProp() { + char prop[PROPERTY_VALUE_MAX]; + property_get(PROPERTY_DEBUG_RENDERENGINE_BACKEND, prop, ""); + + if (strcmp(prop, "gles") == 0) { + return renderengine::RenderEngine::RenderEngineType::GLES; + } else if (strcmp(prop, "threaded") == 0) { + return renderengine::RenderEngine::RenderEngineType::THREADED; + } else if (strcmp(prop, "skiagl") == 0) { + return renderengine::RenderEngine::RenderEngineType::SKIA_GL; + } else if (strcmp(prop, "skiaglthreaded") == 0) { + return renderengine::RenderEngine::RenderEngineType::SKIA_GL_THREADED; + } else { + ALOGE("Unrecognized RenderEngineType %s; ignoring!", prop); + return {}; + } +} + // Do not call property_set on main thread which will be blocked by init // Use StartPropertySetThread instead. void SurfaceFlinger::init() { @@ -782,19 +801,21 @@ void SurfaceFlinger::init() { // Get a RenderEngine for the given display / config (can't fail) // TODO(b/77156734): We need to stop casting and use HAL types when possible. // Sending maxFrameBufferAcquiredBuffers as the cache size is tightly tuned to single-display. - mCompositionEngine->setRenderEngine(renderengine::RenderEngine::create( - renderengine::RenderEngineCreationArgs::Builder() - .setPixelFormat(static_cast(defaultCompositionPixelFormat)) - .setImageCacheSize(maxFrameBufferAcquiredBuffers) - .setUseColorManagerment(useColorManagement) - .setEnableProtectedContext(enable_protected_contents(false)) - .setPrecacheToneMapperShaderOnly(false) - .setSupportsBackgroundBlur(mSupportsBlur) - .setContextPriority( - useContextPriority - ? renderengine::RenderEngine::ContextPriority::REALTIME - : renderengine::RenderEngine::ContextPriority::MEDIUM) - .build())); + auto builder = renderengine::RenderEngineCreationArgs::Builder() + .setPixelFormat(static_cast(defaultCompositionPixelFormat)) + .setImageCacheSize(maxFrameBufferAcquiredBuffers) + .setUseColorManagerment(useColorManagement) + .setEnableProtectedContext(enable_protected_contents(false)) + .setPrecacheToneMapperShaderOnly(false) + .setSupportsBackgroundBlur(mSupportsBlur) + .setContextPriority( + useContextPriority + ? renderengine::RenderEngine::ContextPriority::REALTIME + : renderengine::RenderEngine::ContextPriority::MEDIUM); + if (auto type = chooseRenderEngineTypeViaSysProp()) { + builder.setRenderEngineType(type.value()); + } + mCompositionEngine->setRenderEngine(renderengine::RenderEngine::create(builder.build())); mMaxRenderTargetSize = std::min(getRenderEngine().getMaxTextureSize(), getRenderEngine().getMaxViewportDims()); -- cgit v1.2.3-59-g8ed1b