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

Commit 08b6b20a authored by Alec Mouri's avatar Alec Mouri
Browse files

Flag off predictor usage in layer caching.

Currently the predictor is not used. Put the usage behind a flag that's
default-disabled to de-risk memory/resource consumption.

Bug: 187448248
Test: builds, boots
Change-Id: Ifc5f6b1925e13d96f28f30c0ec8b555b91da864d
parent 73fa2665
Loading
Loading
Loading
Loading
+1 −3
Original line number Original line Diff line number Diff line
@@ -36,8 +36,7 @@ class Predictor;


class Flattener {
class Flattener {
public:
public:
    Flattener(Predictor& predictor, bool enableHolePunch = false)
    Flattener(bool enableHolePunch = false) : mEnableHolePunch(enableHolePunch) {}
          : mEnableHolePunch(enableHolePunch), mPredictor(predictor) {}


    void setDisplaySize(ui::Size size) { mDisplaySize = size; }
    void setDisplaySize(ui::Size size) { mDisplaySize = size; }


@@ -64,7 +63,6 @@ private:
    void buildCachedSets(std::chrono::steady_clock::time_point now);
    void buildCachedSets(std::chrono::steady_clock::time_point now);


    const bool mEnableHolePunch;
    const bool mEnableHolePunch;
    Predictor& mPredictor;


    ui::Size mDisplaySize;
    ui::Size mDisplaySize;


+2 −0
Original line number Original line Diff line number Diff line
@@ -76,6 +76,8 @@ private:


    std::optional<Predictor::PredictedPlan> mPredictedPlan;
    std::optional<Predictor::PredictedPlan> mPredictedPlan;
    NonBufferHash mFlattenedHash = 0;
    NonBufferHash mFlattenedHash = 0;

    bool mPredictorEnabled = false;
};
};


} // namespace compositionengine::impl::planner
} // namespace compositionengine::impl::planner
+1 −2
Original line number Original line Diff line number Diff line
@@ -20,7 +20,6 @@


#include <compositionengine/impl/planner/Flattener.h>
#include <compositionengine/impl/planner/Flattener.h>
#include <compositionengine/impl/planner/LayerState.h>
#include <compositionengine/impl/planner/LayerState.h>
#include <compositionengine/impl/planner/Predictor.h>


using time_point = std::chrono::steady_clock::time_point;
using time_point = std::chrono::steady_clock::time_point;
using namespace std::chrono_literals;
using namespace std::chrono_literals;
@@ -410,7 +409,7 @@ void Flattener::buildCachedSets(time_point now) {
    }
    }


    // TODO(b/181192467): Actually compute new LayerState vector and corresponding hash for each run
    // TODO(b/181192467): Actually compute new LayerState vector and corresponding hash for each run
    mPredictor.getPredictedPlan({}, 0);
    // and feedback into the predictor


    ++mCachedSetCreationCount;
    ++mCachedSetCreationCount;
    mCachedSetCreationCost += mNewCachedSet->getCreationCost();
    mCachedSetCreationCost += mNewCachedSet->getCreationCost();
+33 −14
Original line number Original line Diff line number Diff line
@@ -27,8 +27,13 @@
namespace android::compositionengine::impl::planner {
namespace android::compositionengine::impl::planner {


Planner::Planner()
Planner::Planner()
      : mFlattener(mPredictor,
      : mFlattener(base::GetBoolProperty(std::string("debug.sf.enable_hole_punch_pip"), false)) {
                   base::GetBoolProperty(std::string("debug.sf.enable_hole_punch_pip"), false)) {}
    // Implicitly, layer caching must also be enabled.
    // E.g., setprop debug.sf.enable_layer_caching 1, or
    // adb shell service call SurfaceFlinger 1040 i32 1 [i64 <display ID>]
    mPredictorEnabled =
            base::GetBoolProperty(std::string("debug.sf.enable_planner_prediction"), false);
}


void Planner::setDisplaySize(ui::Size size) {
void Planner::setDisplaySize(ui::Size size) {
    mFlattener.setDisplaySize(size);
    mFlattener.setDisplaySize(size);
@@ -99,6 +104,7 @@ void Planner::plan(
    const bool layersWereFlattened = hash != mFlattenedHash;
    const bool layersWereFlattened = hash != mFlattenedHash;
    ALOGV("[%s] Initial hash %zx flattened hash %zx", __func__, hash, mFlattenedHash);
    ALOGV("[%s] Initial hash %zx flattened hash %zx", __func__, hash, mFlattenedHash);


    if (mPredictorEnabled) {
        mPredictedPlan =
        mPredictedPlan =
                mPredictor.getPredictedPlan(layersWereFlattened ? std::vector<const LayerState*>()
                mPredictor.getPredictedPlan(layersWereFlattened ? std::vector<const LayerState*>()
                                                                : mCurrentLayers,
                                                                : mCurrentLayers,
@@ -109,9 +115,14 @@ void Planner::plan(
            ALOGV("[%s] No prediction found\n", __func__);
            ALOGV("[%s] No prediction found\n", __func__);
        }
        }
    }
    }
}


void Planner::reportFinalPlan(
void Planner::reportFinalPlan(
        compositionengine::Output::OutputLayersEnumerator<compositionengine::Output>&& layers) {
        compositionengine::Output::OutputLayersEnumerator<compositionengine::Output>&& layers) {
    if (!mPredictorEnabled) {
        return;
    }

    Plan finalPlan;
    Plan finalPlan;
    const GraphicBuffer* currentOverrideBuffer = nullptr;
    const GraphicBuffer* currentOverrideBuffer = nullptr;
    bool hasSkippedLayers = false;
    bool hasSkippedLayers = false;
@@ -185,7 +196,9 @@ void Planner::dump(const Vector<String16>& args, std::string& result) {
                return;
                return;
            }
            }


            if (mPredictorEnabled) {
                mPredictor.compareLayerStacks(leftHash, rightHash, result);
                mPredictor.compareLayerStacks(leftHash, rightHash, result);
            }
        } else if (command == "--describe" || command == "-d") {
        } else if (command == "--describe" || command == "-d") {
            if (args.size() < 3) {
            if (args.size() < 3) {
                base::StringAppendF(&result,
                base::StringAppendF(&result,
@@ -209,7 +222,9 @@ void Planner::dump(const Vector<String16>& args, std::string& result) {
                return;
                return;
            }
            }


            if (mPredictorEnabled) {
                mPredictor.describeLayerStack(hash, result);
                mPredictor.describeLayerStack(hash, result);
            }
        } else if (command == "--help" || command == "-h") {
        } else if (command == "--help" || command == "-h") {
            dumpUsage(result);
            dumpUsage(result);
        } else if (command == "--similar" || command == "-s") {
        } else if (command == "--similar" || command == "-s") {
@@ -232,7 +247,9 @@ void Planner::dump(const Vector<String16>& args, std::string& result) {
                return;
                return;
            }
            }


            if (mPredictorEnabled) {
                mPredictor.listSimilarStacks(*plan, result);
                mPredictor.listSimilarStacks(*plan, result);
            }
        } else if (command == "--layers" || command == "-l") {
        } else if (command == "--layers" || command == "-l") {
            mFlattener.dumpLayers(result);
            mFlattener.dumpLayers(result);
        } else {
        } else {
@@ -247,8 +264,10 @@ void Planner::dump(const Vector<String16>& args, std::string& result) {
    mFlattener.dump(result);
    mFlattener.dump(result);
    result.append("\n");
    result.append("\n");


    if (mPredictorEnabled) {
        mPredictor.dump(result);
        mPredictor.dump(result);
    }
    }
}


void Planner::dumpUsage(std::string& result) const {
void Planner::dumpUsage(std::string& result) const {
    result.append("Planner command line interface usage\n");
    result.append("Planner command line interface usage\n");
+1 −7
Original line number Original line Diff line number Diff line
@@ -18,7 +18,6 @@
#include <compositionengine/impl/planner/CachedSet.h>
#include <compositionengine/impl/planner/CachedSet.h>
#include <compositionengine/impl/planner/Flattener.h>
#include <compositionengine/impl/planner/Flattener.h>
#include <compositionengine/impl/planner/LayerState.h>
#include <compositionengine/impl/planner/LayerState.h>
#include <compositionengine/impl/planner/Predictor.h>
#include <compositionengine/mock/LayerFE.h>
#include <compositionengine/mock/LayerFE.h>
#include <compositionengine/mock/OutputLayer.h>
#include <compositionengine/mock/OutputLayer.h>
#include <gtest/gtest.h>
#include <gtest/gtest.h>
@@ -31,7 +30,6 @@ using namespace std::chrono_literals;
using impl::planner::Flattener;
using impl::planner::Flattener;
using impl::planner::LayerState;
using impl::planner::LayerState;
using impl::planner::NonBufferHash;
using impl::planner::NonBufferHash;
using impl::planner::Predictor;


using testing::_;
using testing::_;
using testing::ByMove;
using testing::ByMove;
@@ -47,7 +45,7 @@ namespace {


class FlattenerTest : public testing::Test {
class FlattenerTest : public testing::Test {
public:
public:
    FlattenerTest() : mFlattener(std::make_unique<Flattener>(mPredictor, true)) {}
    FlattenerTest() : mFlattener(std::make_unique<Flattener>(true)) {}
    void SetUp() override;
    void SetUp() override;


protected:
protected:
@@ -55,10 +53,6 @@ protected:
    void initializeFlattener(const std::vector<const LayerState*>& layers);
    void initializeFlattener(const std::vector<const LayerState*>& layers);
    void expectAllLayersFlattened(const std::vector<const LayerState*>& layers);
    void expectAllLayersFlattened(const std::vector<const LayerState*>& layers);


    // TODO(b/181192467): Once Flattener starts to do something useful with Predictor,
    // mPredictor should be mocked and checked for expectations.
    Predictor mPredictor;

    // mRenderEngine may be held as a pointer to mFlattener, so mFlattener must be destroyed first.
    // mRenderEngine may be held as a pointer to mFlattener, so mFlattener must be destroyed first.
    renderengine::mock::RenderEngine mRenderEngine;
    renderengine::mock::RenderEngine mRenderEngine;
    std::unique_ptr<Flattener> mFlattener;
    std::unique_ptr<Flattener> mFlattener;