前面的分析发现创建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()
这样看下来整个流程就非常清晰了。这次懒了一下没用画图[狗头],担待一下吧。
创作不易,欢迎点赞收藏。