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

Commit 0835fab2 authored by Alec Mouri's avatar Alec Mouri Committed by Automerger Merge Worker
Browse files

Merge changes Ifc5f6b19,Iee917bb7 into sc-dev am: 8bd98094

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

Change-Id: Ib595c5ed994a3645e8d8765bc4ff2650c74ccf97
parents 41f06e32 8bd98094
Loading
Loading
Loading
Loading
+1 −3
Original line number Diff line number Diff line
@@ -36,8 +36,7 @@ class Predictor;

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

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

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

    const bool mEnableHolePunch;
    Predictor& mPredictor;

    ui::Size mDisplaySize;

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

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

    bool mPredictorEnabled = false;
};

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

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

using time_point = std::chrono::steady_clock::time_point;
using namespace std::chrono_literals;
@@ -126,8 +125,10 @@ void Flattener::dump(std::string& result) const {
        return left.first < right.first;
    };

    const size_t maxLayerCount = std::max_element(mInitialLayerCounts.cbegin(),
                                                  mInitialLayerCounts.cend(), compareLayerCounts)
    const size_t maxLayerCount = mInitialLayerCounts.empty()
            ? 0u
            : std::max_element(mInitialLayerCounts.cbegin(), mInitialLayerCounts.cend(),
                               compareLayerCounts)
                      ->first;

    result.append("\n    Initial counts:\n");
@@ -408,7 +409,7 @@ void Flattener::buildCachedSets(time_point now) {
    }

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

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

Planner::Planner()
      : mFlattener(mPredictor,
                   base::GetBoolProperty(std::string("debug.sf.enable_hole_punch_pip"), false)) {}
      : mFlattener(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) {
    mFlattener.setDisplaySize(size);
@@ -99,6 +104,7 @@ void Planner::plan(
    const bool layersWereFlattened = hash != mFlattenedHash;
    ALOGV("[%s] Initial hash %zx flattened hash %zx", __func__, hash, mFlattenedHash);

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

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

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

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

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

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

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

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

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

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

protected:
@@ -55,10 +53,6 @@ protected:
    void initializeFlattener(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.
    renderengine::mock::RenderEngine mRenderEngine;
    std::unique_ptr<Flattener> mFlattener;