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

Commit c7fbe1af authored by Siddharth Kapoor's avatar Siddharth Kapoor Committed by Automerger Merge Worker
Browse files

Merge "Disable expensive rendering during static screen" into sc-dev am: caf9f1b6

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/native/+/15098837

Change-Id: I334977727308cae25287d1b6b450bf6de4dad5fd
parents de25999f caf9f1b6
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -29,8 +29,10 @@ public:
    PowerAdvisor();
    ~PowerAdvisor() override;

    MOCK_METHOD0(init, void());
    MOCK_METHOD0(onBootFinished, void());
    MOCK_METHOD2(setExpensiveRenderingExpected, void(DisplayId displayId, bool expected));
    MOCK_METHOD0(isUsingExpensiveRendering, bool());
    MOCK_METHOD0(notifyDisplayUpdateImminent, void());
};

+17 −8
Original line number Diff line number Diff line
@@ -32,6 +32,7 @@
#include "../SurfaceFlingerProperties.h"

#include "PowerAdvisor.h"
#include "SurfaceFlinger.h"

namespace android {
namespace Hwc2 {
@@ -61,14 +62,22 @@ int32_t getUpdateTimeout() {

} // namespace

PowerAdvisor::PowerAdvisor()
      : mUseUpdateImminentTimer(getUpdateTimeout() > 0),
        mUpdateImminentTimer(
PowerAdvisor::PowerAdvisor(SurfaceFlinger& flinger)
      : mFlinger(flinger),
        mUseScreenUpdateTimer(getUpdateTimeout() > 0),
        mScreenUpdateTimer(
                "UpdateImminentTimer", OneShotTimer::Interval(getUpdateTimeout()),
                /* resetCallback */ [this] { mSendUpdateImminent.store(false); },
                /* timeoutCallback */ [this] { mSendUpdateImminent.store(true); }) {
    if (mUseUpdateImminentTimer) {
        mUpdateImminentTimer.start();
                /* timeoutCallback */
                [this] {
                    mSendUpdateImminent.store(true);
                    mFlinger.disableExpensiveRendering();
                }) {}

void PowerAdvisor::init() {
    // Defer starting the screen update timer until SurfaceFlinger finishes construction.
    if (mUseScreenUpdateTimer) {
        mScreenUpdateTimer.start();
    }
}

@@ -122,8 +131,8 @@ void PowerAdvisor::notifyDisplayUpdateImminent() {
        }
    }

    if (mUseUpdateImminentTimer) {
        mUpdateImminentTimer.reset();
    if (mUseScreenUpdateTimer) {
        mScreenUpdateTimer.reset();
    }
}

+12 −3
Original line number Diff line number Diff line
@@ -25,14 +25,20 @@
#include "DisplayIdentification.h"

namespace android {

class SurfaceFlinger;

namespace Hwc2 {

class PowerAdvisor {
public:
    virtual ~PowerAdvisor();

    // Initializes resources that cannot be initialized on construction
    virtual void init() = 0;
    virtual void onBootFinished() = 0;
    virtual void setExpensiveRenderingExpected(DisplayId displayId, bool expected) = 0;
    virtual bool isUsingExpensiveRendering() = 0;
    virtual void notifyDisplayUpdateImminent() = 0;
};

@@ -50,11 +56,13 @@ public:
        virtual bool notifyDisplayUpdateImminent() = 0;
    };

    PowerAdvisor();
    PowerAdvisor(SurfaceFlinger& flinger);
    ~PowerAdvisor() override;

    void init() override;
    void onBootFinished() override;
    void setExpensiveRenderingExpected(DisplayId displayId, bool expected) override;
    bool isUsingExpensiveRendering() override { return mNotifiedExpensiveRendering; }
    void notifyDisplayUpdateImminent() override;

private:
@@ -67,9 +75,10 @@ private:
    std::unordered_set<DisplayId> mExpensiveDisplays;
    bool mNotifiedExpensiveRendering = false;

    const bool mUseUpdateImminentTimer;
    SurfaceFlinger& mFlinger;
    const bool mUseScreenUpdateTimer;
    std::atomic_bool mSendUpdateImminent = true;
    scheduler::OneShotTimer mUpdateImminentTimer;
    scheduler::OneShotTimer mScreenUpdateTimer;
};

} // namespace impl
+17 −1
Original line number Diff line number Diff line
@@ -345,7 +345,8 @@ SurfaceFlinger::SurfaceFlinger(Factory& factory, SkipInitializationTag)
        mHwcServiceName(base::GetProperty("debug.sf.hwc_service_name"s, "default"s)),
        mTunnelModeEnabledReporter(new TunnelModeEnabledReporter()),
        mInternalDisplayDensity(getDensityFromProperty("ro.sf.lcd_density", true)),
        mEmulatedDisplayDensity(getDensityFromProperty("qemu.sf.lcd_density", false)) {
        mEmulatedDisplayDensity(getDensityFromProperty("qemu.sf.lcd_density", false)),
        mPowerAdvisor(*this) {
    ALOGI("Using HWComposer service: %s", mHwcServiceName.c_str());

    mSetInputWindowsListener = new SetInputWindowsListener([&]() { setInputWindowsFinished(); });
@@ -819,6 +820,8 @@ void SurfaceFlinger::init() {
    // set initial conditions (e.g. unblank default device)
    initializeDisplays();

    mPowerAdvisor.init();

    char primeShaderCache[PROPERTY_VALUE_MAX];
    property_get("service.sf.prime_shader_cache", primeShaderCache, "1");
    if (atoi(primeShaderCache)) {
@@ -1276,6 +1279,19 @@ void SurfaceFlinger::performSetActiveMode() {
    mSetActiveModePending = true;
}

void SurfaceFlinger::disableExpensiveRendering() {
    schedule([=]() MAIN_THREAD {
        ATRACE_CALL();
        if (mPowerAdvisor.isUsingExpensiveRendering()) {
            const auto& displays = ON_MAIN_THREAD(mDisplays);
            for (const auto& [_, display] : displays) {
                const static constexpr auto kDisable = false;
                mPowerAdvisor.setExpensiveRenderingExpected(display->getId(), kDisable);
            }
        }
    }).wait();
}

std::vector<ColorMode> SurfaceFlinger::getDisplayColorModes(PhysicalDisplayId displayId) {
    auto modes = getHwComposer().getColorModes(displayId);
    bool isInternalDisplay = displayId == getInternalDisplayIdLocked();
+4 −0
Original line number Diff line number Diff line
@@ -331,6 +331,10 @@ public:
    bool mDisableClientCompositionCache = false;
    void setInputWindowsFinished();

    // Disables expensive rendering for all displays
    // This is scheduled on the main thread
    void disableExpensiveRendering();

protected:
    // We're reference counted, never destroy SurfaceFlinger directly
    virtual ~SurfaceFlinger();
Loading