diff options
| author | 2024-06-29 01:17:02 +0000 | |
|---|---|---|
| committer | 2024-08-19 08:19:47 +0000 | |
| commit | 7e84455e4c8a0b751c4524ebfed8f0c12c9f29a0 (patch) | |
| tree | 8056fd7255f37a92cc060692e0a600fde0edddd7 | |
| parent | 20007465c7ff61740fd27b1fa9454ee55de9bda4 (diff) | |
Enable single hop screenshots for only threaded re
Fixes a deadlock where screenshot requests are blocked
on the main thread which inturn is blocked by the
screenshot request finishing.
Flag: EXEMPT bug fix
Bug: 349776684
Bug: 349741485
Bug: 352267188
Test: presubmit
(cherry picked from https://googleplex-android-review.googlesource.com/q/commit:5aadd249f326b21e5ef6cadfebc15b6a0a016816)
Merged-In: Ibf038ad6db3e87c84508d3e101ca1eb144836d7c
Change-Id: Ibf038ad6db3e87c84508d3e101ca1eb144836d7c
| -rw-r--r-- | services/surfaceflinger/RegionSamplingThread.cpp | 2 | ||||
| -rw-r--r-- | services/surfaceflinger/SurfaceFlinger.cpp | 8 |
2 files changed, 4 insertions, 6 deletions
diff --git a/services/surfaceflinger/RegionSamplingThread.cpp b/services/surfaceflinger/RegionSamplingThread.cpp index 5add290e96..2ad70bb169 100644 --- a/services/surfaceflinger/RegionSamplingThread.cpp +++ b/services/surfaceflinger/RegionSamplingThread.cpp @@ -356,7 +356,7 @@ void RegionSamplingThread::captureSample() { FenceResult fenceResult; if (FlagManager::getInstance().single_hop_screenshot() && - FlagManager::getInstance().ce_fence_promise()) { + FlagManager::getInstance().ce_fence_promise() && mFlinger.mRenderEngine->isThreaded()) { std::vector<sp<LayerFE>> layerFEs; auto displayState = mFlinger.getDisplayAndLayerSnapshotsFromMainThread(renderAreaBuilder, diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index 596ec12d9e..abab49da96 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -8184,7 +8184,7 @@ void SurfaceFlinger::captureScreenCommon(RenderAreaBuilderVariant renderAreaBuil } if (FlagManager::getInstance().single_hop_screenshot() && - FlagManager::getInstance().ce_fence_promise()) { + FlagManager::getInstance().ce_fence_promise() && mRenderEngine->isThreaded()) { std::vector<sp<LayerFE>> layerFEs; auto displayState = getDisplayAndLayerSnapshotsFromMainThread(renderAreaBuilder, getLayerSnapshotsFn, @@ -8558,10 +8558,8 @@ ftl::SharedFuture<FenceResult> SurfaceFlinger::renderScreenImpl( // to CompositionEngine::present. ftl::SharedFuture<FenceResult> presentFuture; if (FlagManager::getInstance().single_hop_screenshot() && - FlagManager::getInstance().ce_fence_promise()) { - presentFuture = mRenderEngine->isThreaded() - ? ftl::yield(present()).share() - : mScheduler->schedule(std::move(present)).share(); + FlagManager::getInstance().ce_fence_promise() && mRenderEngine->isThreaded()) { + presentFuture = ftl::yield(present()).share(); } else { presentFuture = mRenderEngine->isThreaded() ? ftl::defer(std::move(present)).share() : ftl::yield(present()).share(); |