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

Commit f8cf14d4 authored by Lloyd Pique's avatar Lloyd Pique
Browse files

SF: Move doDebugFlashRegions to CompositionEngine

Test: atest libsurfaceflinger_unittest libcompositionengine_test
Bug: 121291683
Change-Id: I0ea71e6c86231d6fedca7309889001cea3ecf47b
parent d37aeeb1
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -16,6 +16,9 @@

#pragma once

#include <chrono>
#include <optional>

#include <compositionengine/Display.h>
#include <compositionengine/Layer.h>

@@ -35,6 +38,12 @@ struct CompositionRefreshArgs {
    // the layers is important, and should be in traversal order from back to
    // front.
    Layers layers;

    // If true, forces the entire display to be considered dirty and repainted
    bool repaintEverything{false};

    // If set, causes the dirty regions to flash with the delay
    std::optional<std::chrono::microseconds> devOptFlashDirtyRegionsDelay;
};

} // namespace android::compositionengine
+5 −0
Original line number Diff line number Diff line
@@ -43,6 +43,8 @@ class LayerFE;
class RenderSurface;
class OutputLayer;

struct CompositionRefreshArgs;

namespace impl {
struct OutputCompositionState;
} // namespace impl
@@ -157,6 +159,9 @@ public:
    // Prepares a frame for display
    virtual void prepareFrame() = 0;

    // Performs any debug related screen flashing due to the update
    virtual void devOptRepaintFlash(const CompositionRefreshArgs&) = 0;

    // Performs client composition as needed for layers on the output. The
    // output fence is set to a fence to signal when client composition is
    // finished.
+1 −0
Original line number Diff line number Diff line
@@ -77,6 +77,7 @@ public:

    void beginFrame() override;
    void prepareFrame() override;
    void devOptRepaintFlash(const compositionengine::CompositionRefreshArgs&) override;
    bool composeSurfaces(const Region&, base::unique_fd*) override;
    void postFramebuffer() override;

+3 −0
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

#pragma once

#include <compositionengine/CompositionRefreshArgs.h>
#include <compositionengine/DisplayColorProfile.h>
#include <compositionengine/Layer.h>
#include <compositionengine/LayerFE.h>
@@ -77,6 +78,8 @@ public:
    MOCK_METHOD0(prepareFrame, void());
    MOCK_METHOD0(chooseCompositionStrategy, void());

    MOCK_METHOD1(devOptRepaintFlash, void(const compositionengine::CompositionRefreshArgs&));

    MOCK_METHOD2(composeSurfaces, bool(const Region&, base::unique_fd*));
    MOCK_CONST_METHOD0(getSkipColorTransform, bool());

+27 −0
Original line number Diff line number Diff line
@@ -14,8 +14,11 @@
 * limitations under the License.
 */

#include <thread>

#include <android-base/stringprintf.h>
#include <compositionengine/CompositionEngine.h>
#include <compositionengine/CompositionRefreshArgs.h>
#include <compositionengine/DisplayColorProfile.h>
#include <compositionengine/Layer.h>
#include <compositionengine/LayerFE.h>
@@ -299,6 +302,30 @@ void Output::prepareFrame() {
    mRenderSurface->prepareFrame(mState.usesClientComposition, mState.usesDeviceComposition);
}

void Output::devOptRepaintFlash(const compositionengine::CompositionRefreshArgs& refreshArgs) {
    if (CC_LIKELY(!refreshArgs.devOptFlashDirtyRegionsDelay)) {
        return;
    }

    if (mState.isEnabled) {
        // transform the dirty region into this screen's coordinate space
        const Region dirtyRegion = getDirtyRegion(refreshArgs.repaintEverything);
        if (!dirtyRegion.isEmpty()) {
            base::unique_fd readyFence;
            // redraw the whole screen
            composeSurfaces(dirtyRegion, &readyFence);

            mRenderSurface->queueBuffer(std::move(readyFence));
        }
    }

    postFramebuffer();

    std::this_thread::sleep_for(*refreshArgs.devOptFlashDirtyRegionsDelay);

    prepareFrame();
}

bool Output::composeSurfaces(const Region& debugRegion, base::unique_fd* readyFence) {
    ATRACE_CALL();
    ALOGV(__FUNCTION__);
Loading