Loading libs/renderengine/tests/RenderEngineThreadedTest.cpp +18 −2 Original line number Diff line number Diff line Loading @@ -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(); Loading @@ -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. Loading libs/renderengine/threaded/RenderEngineThreaded.cpp +3 −2 Original line number Diff line number Diff line Loading @@ -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( Loading @@ -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"); Loading libs/renderengine/threaded/RenderEngineThreaded.h +1 −0 Original line number Diff line number Diff line Loading @@ -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); Loading Loading
libs/renderengine/tests/RenderEngineThreadedTest.cpp +18 −2 Original line number Diff line number Diff line Loading @@ -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(); Loading @@ -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. Loading
libs/renderengine/threaded/RenderEngineThreaded.cpp +3 −2 Original line number Diff line number Diff line Loading @@ -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( Loading @@ -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"); Loading
libs/renderengine/threaded/RenderEngineThreaded.h +1 −0 Original line number Diff line number Diff line Loading @@ -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); Loading