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

Commit 8520206d authored by Dennis Kiilerich's avatar Dennis Kiilerich
Browse files

Indicate optimization policy to SurfaceFlinger from DisplayManager

DisplayManager's never-blank concept is translated in VirtualDisplayAdapter to be a power-optimised display (instead of a performance optimised display) in the downstream components. This concept indicates that these displays typically depend on another display's presence and activeness to be continually rendered and shown. The display they depend on instead optimises for performance when it is on, meaning that all the related displays have good performance.

For cases where power optimisation information is not available (calls to DisplayControl#createVirtualDisplay(String, boolean) and SurfaceComposerClient::createVirtualDisplay), the power optimisation state is defaulted to optimise for power since these are system calls and this preserves the previous behaviour.

Bug: 342681202

Flag: EXEMPT refactor

Test: Flashed build on test device, ran Android Auto Projected
Change-Id: I6a9fdf7c4be080e2f4df6734def8a4fbefde5742
parent ae7eda16
Loading
Loading
Loading
Loading
+6 −1
Original line number Original line Diff line number Diff line
@@ -1391,11 +1391,16 @@ void SurfaceComposerClient::Transaction::enableDebugLogCallPoints() {
// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------


sp<IBinder> SurfaceComposerClient::createVirtualDisplay(const std::string& displayName,
sp<IBinder> SurfaceComposerClient::createVirtualDisplay(const std::string& displayName,
                                                        bool isSecure, const std::string& uniqueId,
                                                        bool isSecure, bool optimizeForPower,
                                                        const std::string& uniqueId,
                                                        float requestedRefreshRate) {
                                                        float requestedRefreshRate) {
    const gui::ISurfaceComposer::OptimizationPolicy optimizationPolicy = optimizeForPower
            ? gui::ISurfaceComposer::OptimizationPolicy::optimizeForPower
            : gui::ISurfaceComposer::OptimizationPolicy::optimizeForPerformance;
    sp<IBinder> display = nullptr;
    sp<IBinder> display = nullptr;
    binder::Status status =
    binder::Status status =
            ComposerServiceAIDL::getComposerService()->createVirtualDisplay(displayName, isSecure,
            ComposerServiceAIDL::getComposerService()->createVirtualDisplay(displayName, isSecure,
                                                                            optimizationPolicy,
                                                                            uniqueId,
                                                                            uniqueId,
                                                                            requestedRefreshRate,
                                                                            requestedRefreshRate,
                                                                            &display);
                                                                            &display);
+10 −1
Original line number Original line Diff line number Diff line
@@ -67,6 +67,11 @@ interface ISurfaceComposer {
        frameRateOverride = 1 << 1,
        frameRateOverride = 1 << 1,
    }
    }


    enum OptimizationPolicy {
        optimizeForPower = 0,
        optimizeForPerformance = 1,
    }

    /**
    /**
     * Signal that we're done booting.
     * Signal that we're done booting.
     * Requires ACCESS_SURFACE_FLINGER permission
     * Requires ACCESS_SURFACE_FLINGER permission
@@ -97,6 +102,10 @@ interface ISurfaceComposer {
     *     The name of the virtual display.
     *     The name of the virtual display.
     * isSecure
     * isSecure
     *     Whether this virtual display is secure.
     *     Whether this virtual display is secure.
     * optimizationPolicy
     *     Whether to optimize for power or performance. Displays that are optimizing for power may
     *     be dependent on a different display that optimizes for performance when they are on,
     *     which will guarantee performance for all of the other displays.
     * uniqueId
     * uniqueId
     *     The unique ID for the display.
     *     The unique ID for the display.
     * requestedRefreshRate
     * requestedRefreshRate
@@ -108,7 +117,7 @@ interface ISurfaceComposer {
     * requires ACCESS_SURFACE_FLINGER permission.
     * requires ACCESS_SURFACE_FLINGER permission.
     */
     */
    @nullable IBinder createVirtualDisplay(@utf8InCpp String displayName, boolean isSecure,
    @nullable IBinder createVirtualDisplay(@utf8InCpp String displayName, boolean isSecure,
            @utf8InCpp String uniqueId, float requestedRefreshRate);
            OptimizationPolicy optimizationPolicy, @utf8InCpp String uniqueId, float requestedRefreshRate);


    /**
    /**
     * Destroy a virtual display.
     * Destroy a virtual display.
+1 −0
Original line number Original line Diff line number Diff line
@@ -396,6 +396,7 @@ public:


    static const std::string kEmpty;
    static const std::string kEmpty;
    static sp<IBinder> createVirtualDisplay(const std::string& displayName, bool isSecure,
    static sp<IBinder> createVirtualDisplay(const std::string& displayName, bool isSecure,
                                            bool optimizeForPower = true,
                                            const std::string& uniqueId = kEmpty,
                                            const std::string& uniqueId = kEmpty,
                                            float requestedRefreshRate = 0);
                                            float requestedRefreshRate = 0);


+5 −4
Original line number Original line Diff line number Diff line
@@ -692,9 +692,10 @@ public:
        return binder::Status::ok();
        return binder::Status::ok();
    }
    }


    binder::Status createVirtualDisplay(const std::string& /*displayName*/, bool /*isSecure*/,
    binder::Status createVirtualDisplay(
                                        const std::string& /*uniqueId*/,
            const std::string& /*displayName*/, bool /*isSecure*/,
                                        float /*requestedRefreshRate*/,
            gui::ISurfaceComposer::OptimizationPolicy /*optimizationPolicy*/,
            const std::string& /*uniqueId*/, float /*requestedRefreshRate*/,
            sp<IBinder>* /*outDisplay*/) override {
            sp<IBinder>* /*outDisplay*/) override {
        return binder::Status::ok();
        return binder::Status::ok();
    }
    }
+21 −0
Original line number Original line Diff line number Diff line
@@ -51,6 +51,17 @@ namespace android {


namespace hal = hardware::graphics::composer::hal;
namespace hal = hardware::graphics::composer::hal;


namespace gui {
inline std::string_view to_string(ISurfaceComposer::OptimizationPolicy optimizationPolicy) {
    switch (optimizationPolicy) {
        case ISurfaceComposer::OptimizationPolicy::optimizeForPower:
            return "optimizeForPower";
        case ISurfaceComposer::OptimizationPolicy::optimizeForPerformance:
            return "optimizeForPerformance";
    }
}
} // namespace gui

DisplayDeviceCreationArgs::DisplayDeviceCreationArgs(
DisplayDeviceCreationArgs::DisplayDeviceCreationArgs(
        const sp<SurfaceFlinger>& flinger, HWComposer& hwComposer, const wp<IBinder>& displayToken,
        const sp<SurfaceFlinger>& flinger, HWComposer& hwComposer, const wp<IBinder>& displayToken,
        std::shared_ptr<compositionengine::Display> compositionDisplay)
        std::shared_ptr<compositionengine::Display> compositionDisplay)
@@ -283,6 +294,7 @@ void DisplayDevice::dump(utils::Dumper& dumper) const {


    dumper.dump("name"sv, '"' + mDisplayName + '"');
    dumper.dump("name"sv, '"' + mDisplayName + '"');
    dumper.dump("powerMode"sv, mPowerMode);
    dumper.dump("powerMode"sv, mPowerMode);
    dumper.dump("optimizationPolicy"sv, mOptimizationPolicy);


    if (mRefreshRateSelector) {
    if (mRefreshRateSelector) {
        mRefreshRateSelector->dump(dumper);
        mRefreshRateSelector->dump(dumper);
@@ -305,6 +317,15 @@ void DisplayDevice::setSecure(bool secure) {
    mCompositionDisplay->setSecure(secure);
    mCompositionDisplay->setSecure(secure);
}
}


gui::ISurfaceComposer::OptimizationPolicy DisplayDevice::getOptimizationPolicy() const {
    return mOptimizationPolicy;
}

void DisplayDevice::setOptimizationPolicy(
        gui::ISurfaceComposer::OptimizationPolicy optimizationPolicy) {
    mOptimizationPolicy = optimizationPolicy;
}

const Rect DisplayDevice::getBounds() const {
const Rect DisplayDevice::getBounds() const {
    return mCompositionDisplay->getState().displaySpace.getBoundsAsRect();
    return mCompositionDisplay->getState().displaySpace.getBoundsAsRect();
}
}
Loading