分析layer是否参与合成

        前面的分析发现创建SurfaceControl的时候会调用createSurface,surfaceflinger会创建一个layer;SurfaceControl->getSurface()的时候也会在surfaceflinger创建一个Layer。那么就有个疑问,这两个layer都会参与合成吗?应该不是,分析下为什么,参与合成的是哪个layer。

        合成调用的是Output::ensureOutputLayerIfVisible,

void Output::ensureOutputLayerIfVisible(sp<compositionengine::LayerFE>& layerFE,
                                        compositionengine::Output::CoverageState& coverage) {
    if (!coverage.latchedLayers.count(layerFE)) {
        coverage.latchedLayers.insert(layerFE);
        layerFE->prepareCompositionState(compositionengine::LayerFE::StateSubset::BasicGeometry);
    }

        // handle hidden surfaces by setting the visible region to empty
    if (CC_UNLIKELY(!layerFEState->isVisible)) {
        return;
    }
}

layerFEState->isVisible为false,不参与合成;layerFEState->isVisible在哪里赋值的呢?

android12\frameworks\native\services\surfaceflinger\Layer.cpp
void Layer::prepareBasicGeometryCompositionState() {
    auto* compositionState = editCompositionState();

    compositionState->isVisible = isVisible();
    compositionState->isOpaque = opaque && !usesRoundedCorners && alpha == 1.f;

    compositionState->blendMode = static_cast<Hwc2::IComposerClient::BlendMode>(blendMode);
    compositionState->alpha = alpha;
}

isVisible(),会调用子类的函数

android12\frameworks\native\services\surfaceflinger\BufferLayer.cpp
bool BufferLayer::isVisible() const {
    return !isHiddenByPolicy() && getAlpha() > 0.0f &&
            (mBufferInfo.mBuffer != nullptr || mSidebandStream != nullptr);
}

其中一个条件mBufferInfo.mBuffer = nullptr,则是不可见

谁调用的prepareBasicGeometryCompositionState

void Layer::prepareCompositionState(compositionengine::LayerFE::StateSubset subset) {
    using StateSubset = compositionengine::LayerFE::StateSubset;

    switch (subset) {
        case StateSubset::BasicGeometry:
            prepareBasicGeometryCompositionState();
            break;

        case StateSubset::GeometryAndContent:
            prepareBasicGeometryCompositionState();
            prepareGeometryCompositionState();
            preparePerFrameCompositionState();
            break;

        case StateSubset::Content:
            preparePerFrameCompositionState();
            break;

        case StateSubset::Cursor:
            prepareCursorCompositionState();
            break;
    }
}

这下就很清晰了:

这下就很清晰了:
ensureOutputLayerIfVisible
    ->layerFE->prepareCompositionState(compositionengine::LayerFE::StateSubset::BasicGeometry);
        ->Layer::prepareBasicGeometryCompositionState();
            ->Layer::prepareBasicGeometryCompositionState()
                ->BufferLayer::isVisible()

完成compositionState->isVisible的赋值,通过surfaceComposerClient->createSurface创建的layer没有mBuffer,所以不会参与合成

通过surfaceControl->getSurface()创建的layer会创建BLSTBufferQueue,mBuffer不为空,会参与合成。

还有个问题,buffer什么时候给的呢?

当BufferQueueProducer完成绘制queueBuffer后,会调用BLASTBufferQueue::onFrameAvailable

void BLASTBufferQueue::onFrameAvailable(const BufferItem& item) {
    。。。 。。。
    processNextBufferLocked(nextTransactionSet /* useNextTransaction */);
}

void BLASTBufferQueue::processNextBufferLocked(bool useNextTransaction) {
    mBufferItemConsumer->acquireBuffer(&bufferItem, 0 /* expectedPresent */, false);

    t->setBuffer(mSurfaceControl, buffer, releaseCallbackId, releaseBufferCallback);
    t->merge(std::move(transaction));
    
    t->setApplyToken(mApplyToken).apply();
}

 apply 会调用sf->setTransactionState

status_t SurfaceFlinger::setTransactionState(
        const FrameTimelineInfo& frameTimelineInfo, const Vector<ComposerState>& states,
        const Vector<DisplayState>& displays, uint32_t flags, const sp<IBinder>& applyToken,
        const InputWindowCommands& inputWindowCommands, int64_t desiredPresentTime,
        bool isAutoTimestamp, const client_cache_t& uncacheBuffer, bool hasListenerCallbacks,
        const std::vector<ListenerCallbacks>& listenerCallbacks, uint64_t transactionId) {
    ATRACE_CALL();
    queueTransaction(state);
}
SurfaceFlinger::onMessageInvalidate
    ->SurfaceFlinger::handleMessageTransaction()
        ->SurfaceFlinger::flushTransactionQueues()
            -> SurfaceFlinger::applyTransactionState
                ->SurfaceFlinger::setClientStateLocked
                    ->layer->setBuffer

layer->setBuffer会调用子类的setBuffer,子类是BufferStateLayer 

android12\frameworks\native\services\surfaceflinger\BufferStateLayer.cpp

bool BufferStateLayer::setBuffer(const std::shared_ptr<renderengine::ExternalTexture>& buffer,
                                 const sp<Fence>& acquireFence, nsecs_t postTime,
                                 nsecs_t desiredPresentTime, bool isAutoTimestamp,
                                 const client_cache_t& clientCacheId, uint64_t frameNumber,
                                 std::optional<nsecs_t> dequeueTime, const FrameTimelineInfo& info,
                                 const sp<ITransactionCompletedListener>& releaseBufferListener) {

    mDrawingState.frameNumber = frameNumber;
    mDrawingState.releaseBufferListener = releaseBufferListener;
    mDrawingState.buffer = buffer;
    mDrawingState.clientCacheId = clientCacheId;
    mDrawingState.modified = true;
    setTransactionFlags(eTransactionNeeded);
}

这里只是把buffer赋值给mDrawingState.buffer了,肯定有地方把mDrawingState.buffer赋值mBufferInfo.mBuffer;

接着找,在updateActiveBuffer找到了mBufferInfo.mBuffer = s.buffer。updateActiveBuffer又是在哪里调用的呢?

status_t BufferStateLayer::updateActiveBuffer() {
    const State& s(getDrawingState());

    mPreviousReleaseCallbackId = {getCurrentBufferId(), mBufferInfo.mFrameNumber};
    mBufferInfo.mBuffer = s.buffer;
    mBufferInfo.mFence = s.acquireFence;
    mBufferInfo.mFrameNumber = s.frameNumber;

}

在BufferStateLayer的父类BufferLayer::latchBuffer里调用

bool BufferLayer::latchBuffer(bool& recomputeVisibleRegions, nsecs_t latchTime,
                              nsecs_t expectedPresentTime) {
... ...
    status_t err = updateTexImage(recomputeVisibleRegions, latchTime, expectedPresentTime);

    err = updateActiveBuffer();

    err = updateFrameNumber(latchTime);
}

接下来看下latchBuffer是在哪里调用的

SurfaceFlinger::onMessageInvalidate
    ->SurfaceFlinger::handleMessageInvalidate()
        ->SurfaceFlinger::handlePageFlip()
            ->layer->latchBuffer

现在和上面的setBuffer结合一下

Surface::queueBuffer
    |-> mGraphicBufferProducer->queueBuffer //    BufferQueueProducer::queueBuffer
        |-> frameAvailableListener->onFrameAvailable(item)  //BLASTBufferQueue::onFrameAvailable
            |-> BLASTBufferQueue::processNextBufferLocked
                |-> mBufferItemConsumer->acquireBuffer
                |-> t->setBuffer(mSurfaceControl, buffer, releaseCallbackId, releaseBufferCallback);
                |-> t->xxx
                |-> t->merge(std::move(transaction))
                |-> t->setApplyToken(mApplyToken).apply()
                    |->SurfaceComposerClient::Transaction::apply
                        |-> sf->setTransactionState

surfaceFlinger端
status_t SurfaceFlinger::setTransactionState(
        const FrameTimelineInfo& frameTimelineInfo, const Vector<ComposerState>& states,
        const Vector<DisplayState>& displays, uint32_t flags, const sp<IBinder>& applyToken,
        const InputWindowCommands& inputWindowCommands, int64_t desiredPresentTime,
        bool isAutoTimestamp, const client_cache_t& uncacheBuffer, bool hasListenerCallbacks,
        const std::vector<ListenerCallbacks>& listenerCallbacks, uint64_t transactionId) {
    ATRACE_CALL();
    queueTransaction(state);
}


SurfaceFlinger刷新
SurfaceFlinger::onMessageInvalidate
    |->SurfaceFlinger::handleMessageTransaction()
    |    ->SurfaceFlinger::flushTransactionQueues()
    |        ->SurfaceFlinger::applyTransactionState
    |            ->SurfaceFlinger::setClientStateLocked
    |                ->layer->setBuffer
    |->SurfaceFlinger::handleMessageInvalidate()
        ->SurfaceFlinger::handlePageFlip()
            ->layer->latchBuffer
    |->SurfaceFlinger::onMessageRefresh() //里调用Output::ensureOutputLayerIfVisible进行计算可见区域
        ->Output::ensureOutputLayerIfVisible
            ->layerFE->prepareCompositionState(compositionengine::LayerFE::StateSubset::BasicGeometry);
                ->Layer::prepareBasicGeometryCompositionState();
                    ->Layer::prepareBasicGeometryCompositionState()
                        ->BufferLayer::isVisible()

这样看下来整个流程就非常清晰了。这次懒了一下没用画图[狗头],担待一下吧。

创作不易,欢迎点赞收藏。

  • 10
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值