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

Commit 3e2a2991 authored by Robert Carr's avatar Robert Carr
Browse files

Avoid traversal in tunnel mode reporter

We can just track whether we have a sideband stream or not using
a counter.

Test: Existing tests pass. simpleperf
Bug: 186200583
Change-Id: I40b0217c186517fc67fe55d8aecf26198561bc39
parent 0aa188a3
Loading
Loading
Loading
Loading
+7 −1
Original line number Diff line number Diff line
@@ -540,10 +540,16 @@ bool BufferStateLayer::setApi(int32_t api) {

bool BufferStateLayer::setSidebandStream(const sp<NativeHandle>& sidebandStream) {
    if (mDrawingState.sidebandStream == sidebandStream) return false;

    if (mDrawingState.sidebandStream != nullptr && sidebandStream == nullptr) {
        mFlinger->mTunnelModeEnabledReporter->decrementTunnelModeCount();
    } else if (sidebandStream != nullptr) {
        mFlinger->mTunnelModeEnabledReporter->incrementTunnelModeCount();
    }

    mDrawingState.sidebandStream = sidebandStream;
    mDrawingState.modified = true;
    setTransactionFlags(eTransactionNeeded);

    if (!mSidebandStreamChanged.exchange(true)) {
        // mSidebandStreamChanged was false
        mFlinger->signalLayerUpdate();
+5 −0
Original line number Diff line number Diff line
@@ -70,6 +70,7 @@
#include "MonitoredProducer.h"
#include "SurfaceFlinger.h"
#include "TimeStats/TimeStats.h"
#include "TunnelModeEnabledReporter.h"
#include "input/InputWindow.h"

#define DEBUG_RESIZE 0
@@ -172,6 +173,10 @@ Layer::~Layer() {

    mFrameTracker.logAndResetStats(mName);
    mFlinger->onLayerDestroyed(this);

    if (mDrawingState.sidebandStream != nullptr) {
        mFlinger->mTunnelModeEnabledReporter->decrementTunnelModeCount();
    }
}

LayerCreationArgs::LayerCreationArgs(SurfaceFlinger* flinger, sp<Client> client, std::string name,
+1 −1
Original line number Diff line number Diff line
@@ -342,6 +342,7 @@ SurfaceFlinger::SurfaceFlinger(Factory& factory, SkipInitializationTag)
        mEventQueue(mFactory.createMessageQueue()),
        mCompositionEngine(mFactory.createCompositionEngine()),
        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)) {
    ALOGI("Using HWComposer service: %s", mHwcServiceName.c_str());
@@ -3169,7 +3170,6 @@ void SurfaceFlinger::initScheduler(const DisplayDeviceState& displayState) {
    mRegionSamplingThread =
            new RegionSamplingThread(*this, RegionSamplingThread::EnvironmentTimingTunables());
    mFpsReporter = new FpsReporter(*mFrameTimeline, *this);
    mTunnelModeEnabledReporter = new TunnelModeEnabledReporter(*this);
    // Dispatch a mode change request for the primary display on scheduler
    // initialization, so that the EventThreads always contain a reference to a
    // prior configuration.
+1 −0
Original line number Diff line number Diff line
@@ -364,6 +364,7 @@ private:
    // For unit tests
    friend class TestableSurfaceFlinger;
    friend class TransactionApplicationTest;
    friend class TunnelModeEnabledReporterTest;

    using RefreshRate = scheduler::RefreshRateConfigs::RefreshRate;
    using VsyncModulator = scheduler::VsyncModulator;
+2 −9
Original line number Diff line number Diff line
@@ -26,17 +26,10 @@

namespace android {

TunnelModeEnabledReporter::TunnelModeEnabledReporter(SurfaceFlinger& flinger) : mFlinger(flinger) {}
TunnelModeEnabledReporter::TunnelModeEnabledReporter() {}

void TunnelModeEnabledReporter::updateTunnelModeStatus() {
    bool tunnelModeEnabled = false;
    mFlinger.mCurrentState.traverse([&](Layer* layer) {
        auto& state = layer->getDrawingState();
        if (state.sidebandStream != nullptr) {
            tunnelModeEnabled = true;
            return;
        }
    });
    bool tunnelModeEnabled = mTunnelModeCount > 0;
    dispatchTunnelModeEnabled(tunnelModeEnabled);
}

Loading