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

Commit caf9f1b6 authored by Siddharth Kapoor's avatar Siddharth Kapoor Committed by Android (Google) Code Review
Browse files

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

parents bfaff607 dea1ac5f
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