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 Original line Diff line number Diff line
@@ -29,8 +29,10 @@ public:
    PowerAdvisor();
    PowerAdvisor();
    ~PowerAdvisor() override;
    ~PowerAdvisor() override;


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


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


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


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


} // namespace
} // namespace


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


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


namespace android {
namespace android {

class SurfaceFlinger;

namespace Hwc2 {
namespace Hwc2 {


class PowerAdvisor {
class PowerAdvisor {
public:
public:
    virtual ~PowerAdvisor();
    virtual ~PowerAdvisor();


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


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


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


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


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


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


} // namespace impl
} // namespace impl
+17 −1
Original line number Original line 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)),
        mHwcServiceName(base::GetProperty("debug.sf.hwc_service_name"s, "default"s)),
        mTunnelModeEnabledReporter(new TunnelModeEnabledReporter()),
        mTunnelModeEnabledReporter(new TunnelModeEnabledReporter()),
        mInternalDisplayDensity(getDensityFromProperty("ro.sf.lcd_density", true)),
        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());
    ALOGI("Using HWComposer service: %s", mHwcServiceName.c_str());


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


    mPowerAdvisor.init();

    char primeShaderCache[PROPERTY_VALUE_MAX];
    char primeShaderCache[PROPERTY_VALUE_MAX];
    property_get("service.sf.prime_shader_cache", primeShaderCache, "1");
    property_get("service.sf.prime_shader_cache", primeShaderCache, "1");
    if (atoi(primeShaderCache)) {
    if (atoi(primeShaderCache)) {
@@ -1276,6 +1279,19 @@ void SurfaceFlinger::performSetActiveMode() {
    mSetActiveModePending = true;
    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) {
std::vector<ColorMode> SurfaceFlinger::getDisplayColorModes(PhysicalDisplayId displayId) {
    auto modes = getHwComposer().getColorModes(displayId);
    auto modes = getHwComposer().getColorModes(displayId);
    bool isInternalDisplay = displayId == getInternalDisplayIdLocked();
    bool isInternalDisplay = displayId == getInternalDisplayIdLocked();
+4 −0
Original line number Original line Diff line number Diff line
@@ -331,6 +331,10 @@ public:
    bool mDisableClientCompositionCache = false;
    bool mDisableClientCompositionCache = false;
    void setInputWindowsFinished();
    void setInputWindowsFinished();


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

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