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

Commit 6b7c5c94 authored by Vishnu Nair's avatar Vishnu Nair
Browse files

Pass in framenumbers if submitting buffers via BlastBufferQueue

The framenumber generated by the graphics producer is forwarded to mimic BufferQueue behaviour.

Test: atest SurfaceViewBufferTests
Bug: 168504870
Change-Id: Ic652a585d10d7e14c9dd94afaabd0e485e209ede
parent dab9409d
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -270,6 +270,7 @@ void BLASTBufferQueue::processNextBufferLocked(bool useNextTransaction) {
    t->setTransform(mSurfaceControl, bufferItem.mTransform);
    t->setTransformToDisplayInverse(mSurfaceControl, bufferItem.mTransformToDisplayInverse);
    t->setDesiredPresentTime(bufferItem.mTimestamp);
    t->setFrameNumber(mSurfaceControl, bufferItem.mFrameNumber);

    if (applyTransaction) {
        t->apply();
+9 −3
Original line number Diff line number Diff line
@@ -45,7 +45,7 @@ status_t layer_state_t::write(Parcel& output) const
    SAFE_PARCEL(output.write, crop_legacy);
    SAFE_PARCEL(output.writeStrongBinder, barrierHandle_legacy);
    SAFE_PARCEL(output.writeStrongBinder, reparentHandle);
    SAFE_PARCEL(output.writeUint64, frameNumber_legacy);
    SAFE_PARCEL(output.writeUint64, barrierFrameNumber);
    SAFE_PARCEL(output.writeInt32, overrideScalingMode);
    SAFE_PARCEL(output.writeStrongBinder, IInterface::asBinder(barrierGbp_legacy));
    SAFE_PARCEL(output.writeStrongBinder, relativeLayerHandle);
@@ -108,6 +108,7 @@ status_t layer_state_t::write(Parcel& output) const
    SAFE_PARCEL(output.writeFloat, frameRate);
    SAFE_PARCEL(output.writeByte, frameRateCompatibility);
    SAFE_PARCEL(output.writeUint32, fixedTransformHint);
    SAFE_PARCEL(output.writeUint64, frameNumber);
    return NO_ERROR;
}

@@ -134,7 +135,7 @@ status_t layer_state_t::read(const Parcel& input)
    SAFE_PARCEL(input.read, crop_legacy);
    SAFE_PARCEL(input.readNullableStrongBinder, &barrierHandle_legacy);
    SAFE_PARCEL(input.readNullableStrongBinder, &reparentHandle);
    SAFE_PARCEL(input.readUint64, &frameNumber_legacy);
    SAFE_PARCEL(input.readUint64, &barrierFrameNumber);
    SAFE_PARCEL(input.readInt32, &overrideScalingMode);

    sp<IBinder> tmpBinder;
@@ -213,6 +214,7 @@ status_t layer_state_t::read(const Parcel& input)
    SAFE_PARCEL(input.readByte, &frameRateCompatibility);
    SAFE_PARCEL(input.readUint32, &tmpUint32);
    fixedTransformHint = static_cast<ui::Transform::RotationFlags>(tmpUint32);
    SAFE_PARCEL(input.readUint64, &frameNumber);
    return NO_ERROR;
}

@@ -340,7 +342,7 @@ void layer_state_t::merge(const layer_state_t& other) {
        what |= eDeferTransaction_legacy;
        barrierHandle_legacy = other.barrierHandle_legacy;
        barrierGbp_legacy = other.barrierGbp_legacy;
        frameNumber_legacy = other.frameNumber_legacy;
        barrierFrameNumber = other.barrierFrameNumber;
    }
    if (other.what & eOverrideScalingModeChanged) {
        what |= eOverrideScalingModeChanged;
@@ -456,6 +458,10 @@ void layer_state_t::merge(const layer_state_t& other) {
        what |= eFixedTransformHintChanged;
        fixedTransformHint = other.fixedTransformHint;
    }
    if (other.what & eFrameNumberChanged) {
        what |= eFrameNumberChanged;
        frameNumber = other.frameNumber;
    }
    if ((other.what & what) != other.what) {
        ALOGE("Unmerged SurfaceComposer Transaction properties. LayerState::merge needs updating? "
              "other.what=0x%" PRIu64 " what=0x%" PRIu64,
+16 −2
Original line number Diff line number Diff line
@@ -1000,7 +1000,7 @@ SurfaceComposerClient::Transaction::deferTransactionUntil_legacy(const sp<Surfac
    }
    s->what |= layer_state_t::eDeferTransaction_legacy;
    s->barrierHandle_legacy = handle;
    s->frameNumber_legacy = frameNumber;
    s->barrierFrameNumber = frameNumber;

    registerSurfaceControlForCallback(sc);
    return *this;
@@ -1017,7 +1017,7 @@ SurfaceComposerClient::Transaction::deferTransactionUntil_legacy(const sp<Surfac
    }
    s->what |= layer_state_t::eDeferTransaction_legacy;
    s->barrierGbp_legacy = barrierSurface->getIGraphicBufferProducer();
    s->frameNumber_legacy = frameNumber;
    s->barrierFrameNumber = frameNumber;

    registerSurfaceControlForCallback(sc);
    return *this;
@@ -1307,6 +1307,20 @@ SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::notifyPr
    return *this;
}

SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setFrameNumber(
        const sp<SurfaceControl>& sc, uint64_t frameNumber) {
    layer_state_t* s = getLayerState(sc);
    if (!s) {
        mStatus = BAD_INDEX;
        return *this;
    }

    s->what |= layer_state_t::eFrameNumberChanged;
    s->frameNumber = frameNumber;

    return *this;
}

SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::detachChildren(
        const sp<SurfaceControl>& sc) {
    layer_state_t* s = getLayerState(sc);
+9 −3
Original line number Diff line number Diff line
@@ -125,6 +125,7 @@ struct layer_state_t {
        eBackgroundBlurRadiusChanged = 0x80'00000000,
        eProducerDisconnect = 0x100'00000000,
        eFixedTransformHintChanged = 0x200'00000000,
        eFrameNumberChanged = 0x400'00000000,
    };

    layer_state_t()
@@ -142,7 +143,7 @@ struct layer_state_t {
            crop_legacy(Rect::INVALID_RECT),
            cornerRadius(0.0f),
            backgroundBlurRadius(0),
            frameNumber_legacy(0),
            barrierFrameNumber(0),
            overrideScalingMode(-1),
            transform(0),
            transformToDisplayInverse(false),
@@ -159,7 +160,8 @@ struct layer_state_t {
            frameRateSelectionPriority(-1),
            frameRate(0.0f),
            frameRateCompatibility(ANATIVEWINDOW_FRAME_RATE_COMPATIBILITY_DEFAULT),
            fixedTransformHint(ui::Transform::ROT_INVALID) {
            fixedTransformHint(ui::Transform::ROT_INVALID),
            frameNumber(0) {
        matrix.dsdx = matrix.dtdy = 1.0f;
        matrix.dsdy = matrix.dtdx = 0.0f;
        hdrMetadata.validTypes = 0;
@@ -195,7 +197,7 @@ struct layer_state_t {
    uint32_t backgroundBlurRadius;
    sp<IBinder> barrierHandle_legacy;
    sp<IBinder> reparentHandle;
    uint64_t frameNumber_legacy;
    uint64_t barrierFrameNumber;
    int32_t overrideScalingMode;

    sp<IGraphicBufferProducer> barrierGbp_legacy;
@@ -259,6 +261,10 @@ struct layer_state_t {
    // a buffer of a different size. -1 means the transform hint is not set,
    // otherwise the value will be a valid ui::Rotation.
    ui::Transform::RotationFlags fixedTransformHint;

    // Used by BlastBufferQueue to forward the framenumber generated by the
    // graphics producer.
    uint64_t frameNumber;
};

struct ComposerState {
+2 −0
Original line number Diff line number Diff line
@@ -487,6 +487,8 @@ public:

        // ONLY FOR BLAST ADAPTER
        Transaction& notifyProducerDisconnect(const sp<SurfaceControl>& sc);
        // Set the framenumber generated by the graphics producer to mimic BufferQueue behaviour.
        Transaction& setFrameNumber(const sp<SurfaceControl>& sc, uint64_t frameNumber);

        // Detaches all child surfaces (and their children recursively)
        // from their SurfaceControl.
Loading