diff options
author | 2023-09-27 11:11:22 +0000 | |
---|---|---|
committer | 2023-09-29 14:28:07 +0000 | |
commit | 5b7855f224cc048fe8c765ad760bca6fd77ae89f (patch) | |
tree | c70ec59697455ce6aae14e6717a7a88ac9b107f1 | |
parent | 102d39dbad6c568fc4daa17493b53380dcb8f0a0 (diff) |
Remove contention from Render Engine early return
An early return optimization path to skip post render cleanup in some
cases was resulting in lock contention so remove it and replace it with
an atomic boolean.
Bug: 273708680
Test: boot device, observe boot animation is smooth
Change-Id: Idd989a2e91a8ef1b71aef4e1c439eb0576511c79
-rw-r--r-- | libs/renderengine/tests/RenderEngineThreadedTest.cpp | 20 | ||||
-rw-r--r-- | libs/renderengine/threaded/RenderEngineThreaded.cpp | 5 | ||||
-rw-r--r-- | libs/renderengine/threaded/RenderEngineThreaded.h | 1 |
3 files changed, 22 insertions, 4 deletions
diff --git a/libs/renderengine/tests/RenderEngineThreadedTest.cpp b/libs/renderengine/tests/RenderEngineThreadedTest.cpp index 475dc15788..7289fe721d 100644 --- a/libs/renderengine/tests/RenderEngineThreadedTest.cpp +++ b/libs/renderengine/tests/RenderEngineThreadedTest.cpp @@ -98,7 +98,6 @@ TEST_F(RenderEngineThreadedTest, supportsProtectedContent_returnsTrue) { } TEST_F(RenderEngineThreadedTest, PostRenderCleanup_skipped) { - EXPECT_CALL(*mRenderEngine, canSkipPostRenderCleanup()).WillOnce(Return(true)); EXPECT_CALL(*mRenderEngine, cleanupPostRender()).Times(0); mThreadedRE->cleanupPostRender(); @@ -107,8 +106,25 @@ TEST_F(RenderEngineThreadedTest, PostRenderCleanup_skipped) { } TEST_F(RenderEngineThreadedTest, PostRenderCleanup_notSkipped) { - EXPECT_CALL(*mRenderEngine, canSkipPostRenderCleanup()).WillOnce(Return(false)); + renderengine::DisplaySettings settings; + std::vector<renderengine::LayerSettings> layers; + std::shared_ptr<renderengine::ExternalTexture> buffer = std::make_shared< + renderengine::impl:: + ExternalTexture>(sp<GraphicBuffer>::make(), *mRenderEngine, + renderengine::impl::ExternalTexture::Usage::READABLE | + renderengine::impl::ExternalTexture::Usage::WRITEABLE); + base::unique_fd bufferFence; + + EXPECT_CALL(*mRenderEngine, useProtectedContext(false)); + EXPECT_CALL(*mRenderEngine, drawLayersInternal) + .WillOnce([&](const std::shared_ptr<std::promise<FenceResult>>&& resultPromise, + const renderengine::DisplaySettings&, + const std::vector<renderengine::LayerSettings>&, + const std::shared_ptr<renderengine::ExternalTexture>&, + base::unique_fd&&) { resultPromise->set_value(Fence::NO_FENCE); }); EXPECT_CALL(*mRenderEngine, cleanupPostRender()).WillOnce(Return()); + ftl::Future<FenceResult> future = + mThreadedRE->drawLayers(settings, layers, buffer, std::move(bufferFence)); mThreadedRE->cleanupPostRender(); // call ANY synchronous function to ensure that cleanupPostRender has completed. diff --git a/libs/renderengine/threaded/RenderEngineThreaded.cpp b/libs/renderengine/threaded/RenderEngineThreaded.cpp index 2cb66cbebc..786a6fef12 100644 --- a/libs/renderengine/threaded/RenderEngineThreaded.cpp +++ b/libs/renderengine/threaded/RenderEngineThreaded.cpp @@ -231,13 +231,13 @@ void RenderEngineThreaded::cleanupPostRender() { ATRACE_NAME("REThreaded::cleanupPostRender"); instance.cleanupPostRender(); }); + mNeedsPostRenderCleanup = false; } mCondition.notify_one(); } bool RenderEngineThreaded::canSkipPostRenderCleanup() const { - waitUntilInitialized(); - return mRenderEngine->canSkipPostRenderCleanup(); + return !mNeedsPostRenderCleanup; } void RenderEngineThreaded::drawLayersInternal( @@ -257,6 +257,7 @@ ftl::Future<FenceResult> RenderEngineThreaded::drawLayers( int fd = bufferFence.release(); { std::lock_guard lock(mThreadMutex); + mNeedsPostRenderCleanup = true; mFunctionCalls.push( [resultPromise, display, layers, buffer, fd](renderengine::RenderEngine& instance) { ATRACE_NAME("REThreaded::drawLayers"); diff --git a/libs/renderengine/threaded/RenderEngineThreaded.h b/libs/renderengine/threaded/RenderEngineThreaded.h index 43ec011b73..1093f5fad3 100644 --- a/libs/renderengine/threaded/RenderEngineThreaded.h +++ b/libs/renderengine/threaded/RenderEngineThreaded.h @@ -89,6 +89,7 @@ private: mutable std::mutex mThreadMutex; std::thread mThread GUARDED_BY(mThreadMutex); std::atomic<bool> mRunning = true; + std::atomic<bool> mNeedsPostRenderCleanup = false; using Work = std::function<void(renderengine::RenderEngine&)>; mutable std::queue<Work> mFunctionCalls GUARDED_BY(mThreadMutex); |