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

Commit 54cc86c6 authored by Vishnu Nair's avatar Vishnu Nair Committed by Automerger Merge Worker
Browse files

Merge "[sf] protect against out of order transactions" into udc-dev am: 69b990e3

parents 2f8936dc 69b990e3
Loading
Loading
Loading
Loading
+9 −6
Original line number Diff line number Diff line
@@ -158,13 +158,16 @@ void RequestedLayerState::merge(const ResolvedComposerState& resolvedComposerSta
                    RequestedLayerState::Changes::VisibleRegion |
                    RequestedLayerState::Changes::Visibility | RequestedLayerState::Changes::Input;
        }
    }
    if (clientState.what & layer_state_t::eBufferChanged) {
        barrierProducerId = std::max(bufferData->producerId, barrierProducerId);
        barrierFrameNumber = std::max(bufferData->frameNumber, barrierFrameNumber);
        // TODO(b/277265947) log and flush transaction trace when we detect out of order updates
        changes |= RequestedLayerState::Changes::Buffer;
    }
    if (clientState.what & layer_state_t::eSidebandStreamChanged) {
        changes |= RequestedLayerState::Changes::SidebandStream;
    }
    }
    if (what & (layer_state_t::eAlphaChanged)) {
        if (oldAlpha == 0 || color.a == 0) {
            changes |= RequestedLayerState::Changes::Visibility |
+2 −0
Original line number Diff line number Diff line
@@ -111,6 +111,8 @@ struct RequestedLayerState : layer_state_t {
    ui::LayerStack layerStackToMirror = ui::INVALID_LAYER_STACK;
    uint32_t touchCropId = UNASSIGNED_LAYER_ID;
    uint32_t bgColorLayerId = UNASSIGNED_LAYER_ID;
    uint64_t barrierFrameNumber = 0;
    uint32_t barrierProducerId = 0;

    // book keeping states
    bool handleAlive = true;
+9 −0
Original line number Diff line number Diff line
@@ -167,6 +167,9 @@ Layer::Layer(const LayerCreationArgs& args)
    mDrawingState.sequence = 0;
    mDrawingState.transform.set(0, 0);
    mDrawingState.frameNumber = 0;
    mDrawingState.barrierFrameNumber = 0;
    mDrawingState.producerId = 0;
    mDrawingState.barrierProducerId = 0;
    mDrawingState.bufferTransform = 0;
    mDrawingState.transformToDisplayInverse = false;
    mDrawingState.crop.makeInvalid();
@@ -3070,7 +3073,13 @@ bool Layer::setBuffer(std::shared_ptr<renderengine::ExternalTexture>& buffer,
    }

    mDrawingState.producerId = bufferData.producerId;
    mDrawingState.barrierProducerId =
            std::max(mDrawingState.producerId, mDrawingState.barrierProducerId);
    mDrawingState.frameNumber = frameNumber;
    mDrawingState.barrierFrameNumber =
            std::max(mDrawingState.frameNumber, mDrawingState.barrierFrameNumber);

    // TODO(b/277265947) log and flush transaction trace when we detect out of order updates
    mDrawingState.releaseBufferListener = bufferData.releaseBufferListener;
    mDrawingState.buffer = std::move(buffer);
    mDrawingState.clientCacheId = bufferData.cachedBuffer;
+7 −0
Original line number Diff line number Diff line
@@ -139,9 +139,16 @@ public:
        ui::Dataspace dataspace;

        uint64_t frameNumber;
        // high watermark framenumber to use to check for barriers to protect ourselves
        // from out of order transactions
        uint64_t barrierFrameNumber;
        ui::Transform transform;

        uint32_t producerId = 0;
        // high watermark producerId to use to check for barriers to protect ourselves
        // from out of order transactions
        uint32_t barrierProducerId = 0;

        uint32_t bufferTransform;
        bool transformToDisplayInverse;
        Region transparentRegionHint;
+2 −2
Original line number Diff line number Diff line
@@ -4228,7 +4228,7 @@ TransactionHandler::TransactionReadiness SurfaceFlinger::transactionReadyBufferC
            // The current producerId is already a newer producer than the buffer that has a
            // barrier. This means the incoming buffer is older and we can release it here. We
            // don't wait on the barrier since we know that's stale information.
            if (layer->getDrawingState().producerId > s.bufferData->producerId) {
            if (layer->getDrawingState().barrierProducerId > s.bufferData->producerId) {
                layer->callReleaseBufferCallback(s.bufferData->releaseBufferListener,
                                                 externalTexture->getBuffer(),
                                                 s.bufferData->frameNumber,
@@ -4239,7 +4239,7 @@ TransactionHandler::TransactionReadiness SurfaceFlinger::transactionReadyBufferC
                return TraverseBuffersReturnValues::DELETE_AND_CONTINUE_TRAVERSAL;
            }

            if (layer->getDrawingState().frameNumber < s.bufferData->barrierFrameNumber) {
            if (layer->getDrawingState().barrierFrameNumber < s.bufferData->barrierFrameNumber) {
                const bool willApplyBarrierFrame =
                        flushState.bufferLayersReadyToPresent.contains(s.surface.get()) &&
                        ((flushState.bufferLayersReadyToPresent.get(s.surface.get()) >=