diff options
-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); |