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

Commit 6a710e1b authored by Alex Careja's avatar Alex Careja Committed by Android (Google) Code Review
Browse files

Merge "Remove contention from Render Engine early return" into main

parents 9e840766 5b7855f2
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);