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

Commit 4dccc413 authored by Lloyd Pique's avatar Lloyd Pique
Browse files

SF: Separate SurfaceInterceptor into interface and impl

SurfaceInterceptor is now an abstract interface.
impl::SurfaceInterceptor is the normal implementation.

This allows unit tests to replace it with a GMock.

Test: Builds
Bug: 74827900
Change-Id: I4d5bb2649b0c7a8ec1e6c0abf01ab53174d06a19
parent c9903eff
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -683,7 +683,7 @@ void BufferLayer::onFrameAvailable(const BufferItem& item) {
    // Add this buffer from our internal queue tracker
    { // Autolock scope
        Mutex::Autolock lock(mQueueItemLock);
        mFlinger->mInterceptor.saveBufferUpdate(this, item.mGraphicBuffer->getWidth(),
        mFlinger->mInterceptor->saveBufferUpdate(this, item.mGraphicBuffer->getWidth(),
                                                 item.mGraphicBuffer->getHeight(),
                                                 item.mFrameNumber);
        // Reset the frame number tracker when we receive the first buffer after
+1 −1
Original line number Diff line number Diff line
@@ -217,7 +217,7 @@ Vector<sp<EventThread::Connection> > EventThread::waitForEventLocked(
            if (timestamp) {
                // we have a vsync event to dispatch
                if (mInterceptVSyncs) {
                    mFlinger.mInterceptor.saveVSyncEvent(timestamp);
                    mFlinger.mInterceptor->saveVSyncEvent(timestamp);
                }
                *event = mVSyncEvent[i];
                mVSyncEvent[i].header.timestamp = 0;
+5 −1
Original line number Diff line number Diff line
@@ -66,6 +66,10 @@ class SurfaceFlinger;
class LayerDebugInfo;
class LayerBE;

namespace impl {
class SurfaceInterceptor;
}

// ---------------------------------------------------------------------------

struct CompositionInfo {
@@ -583,7 +587,7 @@ protected:

    virtual void onFirstRef();

    friend class SurfaceInterceptor;
    friend class impl::SurfaceInterceptor;

    void commitTransaction(const State& stateToCommit);

+12 −13
Original line number Diff line number Diff line
@@ -185,7 +185,6 @@ SurfaceFlinger::SurfaceFlinger(SurfaceFlinger::SkipInitializationTag)
        mLastTransactionTime(0),
        mBootFinished(false),
        mForceFullDamage(false),
        mInterceptor(this),
        mPrimaryDispSync("PrimaryDispSync"),
        mPrimaryHWVsyncEnabled(false),
        mHWVsyncAvailable(false),
@@ -344,7 +343,7 @@ sp<IBinder> SurfaceFlinger::createDisplay(const String8& displayName,
    DisplayDeviceState info(DisplayDevice::DISPLAY_VIRTUAL, secure);
    info.displayName = displayName;
    mCurrentState.displays.add(token, info);
    mInterceptor.saveDisplayCreation(info);
    mInterceptor->saveDisplayCreation(info);
    return token;
}

@@ -362,7 +361,7 @@ void SurfaceFlinger::destroyDisplay(const sp<IBinder>& display) {
        ALOGE("destroyDisplay called for non-virtual display");
        return;
    }
    mInterceptor.saveDisplayDeletion(info.displayId);
    mInterceptor->saveDisplayDeletion(info.displayId);
    mCurrentState.displays.removeItemsAt(idx);
    setTransactionFlags(eDisplayTransactionNeeded);
}
@@ -2126,14 +2125,14 @@ void SurfaceFlinger::processDisplayHotplugEventsLocked() {
            info.displayName = displayType == DisplayDevice::DISPLAY_PRIMARY ?
                    "Built-in Screen" : "External Screen";
            mCurrentState.displays.add(mBuiltinDisplays[displayType], info);
            mInterceptor.saveDisplayCreation(info);
            mInterceptor->saveDisplayCreation(info);
        } else {
            ALOGV("Removing built in display %d", displayType);

            ssize_t idx = mCurrentState.displays.indexOfKey(mBuiltinDisplays[displayType]);
            if (idx >= 0) {
                const DisplayDeviceState& info(mCurrentState.displays.valueAt(idx));
                mInterceptor.saveDisplayDeletion(info.displayId);
                mInterceptor->saveDisplayDeletion(info.displayId);
                mCurrentState.displays.removeItemsAt(idx);
            }
            mBuiltinDisplays[displayType].clear();
@@ -3057,8 +3056,8 @@ void SurfaceFlinger::setTransactionState(
    }

    if (transactionFlags) {
        if (mInterceptor.isEnabled()) {
            mInterceptor.saveTransaction(states, mCurrentState.displays, displays, flags);
        if (mInterceptor->isEnabled()) {
            mInterceptor->saveTransaction(states, mCurrentState.displays, displays, flags);
        }

        // this triggers the transaction
@@ -3361,7 +3360,7 @@ status_t SurfaceFlinger::createLayer(
    if (result != NO_ERROR) {
        return result;
    }
    mInterceptor.saveSurfaceCreation(layer);
    mInterceptor->saveSurfaceCreation(layer);

    setTransactionFlags(eTransactionNeeded);
    return result;
@@ -3433,7 +3432,7 @@ status_t SurfaceFlinger::onLayerRemoved(const sp<Client>& client, const sp<IBind
    status_t err = NO_ERROR;
    sp<Layer> l(client->getLayerUser(handle));
    if (l != nullptr) {
        mInterceptor.saveSurfaceDeletion(l);
        mInterceptor->saveSurfaceDeletion(l);
        err = removeLayer(l);
        ALOGE_IF(err<0 && err != NAME_NOT_FOUND,
                "error removing layer=%p (%s)", l.get(), strerror(-err));
@@ -3515,14 +3514,14 @@ void SurfaceFlinger::setPowerModeInternal(const sp<DisplayDevice>& hw,
        return;
    }

    if (mInterceptor.isEnabled()) {
    if (mInterceptor->isEnabled()) {
        ConditionalLock lock(mStateLock, !stateLockHeld);
        ssize_t idx = mCurrentState.displays.indexOfKey(hw->getDisplayToken());
        if (idx < 0) {
            ALOGW("Surface Interceptor SavePowerMode: invalid display token");
            return;
        }
        mInterceptor.savePowerModeUpdate(mCurrentState.displays.valueAt(idx).displayId, mode);
        mInterceptor->savePowerModeUpdate(mCurrentState.displays.valueAt(idx).displayId, mode);
    }

    if (currentMode == HWC_POWER_MODE_OFF) {
@@ -4324,11 +4323,11 @@ status_t SurfaceFlinger::onTransact(
                n = data.readInt32();
                if (n) {
                    ALOGV("Interceptor enabled");
                    mInterceptor.enable(mDrawingState.layersSortedByZ, mDrawingState.displays);
                    mInterceptor->enable(mDrawingState.layersSortedByZ, mDrawingState.displays);
                }
                else{
                    ALOGV("Interceptor disabled");
                    mInterceptor.disable();
                    mInterceptor->disable();
                }
                return NO_ERROR;
            }
+2 −1
Original line number Diff line number Diff line
@@ -776,7 +776,8 @@ private:
    bool mBootFinished;
    bool mForceFullDamage;
    bool mPropagateBackpressure = true;
    SurfaceInterceptor mInterceptor;
    std::unique_ptr<SurfaceInterceptor> mInterceptor =
            std::make_unique<impl::SurfaceInterceptor>(this);
    SurfaceTracing mTracing;
    bool mUseHwcVirtualDisplays = false;

Loading