Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5b7855f2 authored by Alex Careja's avatar Alex Careja
Browse files

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
parent 102d39db
Loading
Loading
Loading
Loading
+18 −2
Original line number Diff line number Diff line
@@ -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.
+3 −2
Original line number Diff line number Diff line
@@ -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");
+1 −0
Original line number Diff line number Diff line
@@ -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);