网站界面设计需要首先做市场研究吗,腾讯云wordpress优化,北京建设网站合同下载,建筑公司企业理念SurfaceFinger layer创建过程 引言
本篇博客重点分析app创建Surface时候#xff0c;SurfaceFlinger是如何构建对应的Layer的主要工作有那些#xff01; 这里参考的Android源码是Android 13 aosp#xff01; app端创建Surface
其核心流程可以分为如下接部分: app使用w,h,fo…SurfaceFinger layer创建过程 引言
本篇博客重点分析app创建Surface时候SurfaceFlinger是如何构建对应的Layer的主要工作有那些 这里参考的Android源码是Android 13 aosp app端创建Surface
其核心流程可以分为如下接部分: app使用w,h,format等参数调用SurfaceComposerClient::createSurface createSurface调用SurfaceComposerClient::createSurfaceCheckedcreateSurfaceChecked调用mClient-createSurfacemClient是surfaceflinger client的代理mClient的初始化还没介绍后面单独写一篇介绍。 mClient-createSurface会调用到android12\frameworks\native\services\surfaceflinger\Client.cpp 中Client::createSurface Client::createSurface调用mFlinger-createLayer
核心逻辑代码如下:
surfaceComposerClient-createSurface(String8(SurfaceTestDemo), resolution.getWidth(),resolution.getHeight(), PIXEL_FORMAT_RGBA_8888,ISurfaceComposerClient::eFXSurfaceBufferState,/*parent*/ nullptr);spSurfaceControl SurfaceComposerClient::createSurface(const String8 name, uint32_t w, uint32_t h,PixelFormat format, uint32_t flags,const spIBinder parentHandle,LayerMetadata metadata,uint32_t* outTransformHint) {spSurfaceControl s;createSurfaceChecked(name, w, h, format, s, flags, parentHandle, std::move(metadata),outTransformHint);return s;
}status_t SurfaceComposerClient::createSurfaceChecked(const String8 name, uint32_t w, uint32_t h,PixelFormat format,spSurfaceControl* outSurface, uint32_t flags,const spIBinder parentHandle,LayerMetadata metadata,uint32_t* outTransformHint) {status_t err mStatus;if (mStatus NO_ERROR) {spIBinder handle;spIGraphicBufferProducer gbp;err mClient-createSurface(name, w, h, format, flags, parentHandle, std::move(metadata),handle, gbp, id, transformHint);*outSurface new SurfaceControl(this, handle, gbp, id, w, h, format, transformHint, flags);}return err;
}SurfaceFlinger端创建layer过程
SurfaceFlinger构建Layer的核心流程如下: 根据app的flags确定创建layer类型createBufferStateLayercreateEffectLayer还是createContainerLayer目前尚不清楚不同layer之间的区别以createBufferStateLayer为例 将传入参数放入LayerCreationArgs args调用getFactory().createBufferStateLayer(args)创建BufferStateLayer获取layer handle并返回 调用SurfaceFlinger::addClientLayer创建LayerCreatedState放入mCreatedLayers[handle-localBinder()]使用handle等参数创建composerState并传入SurfaceFlinger::setTransactionState 创建TransactionState state并将其放入mTransactionQueue.emplace(state) 这里我们重点看下SurfaceFlinger::addClientLayer的实现因为后面会用到它。
status_t SurfaceFlinger::addClientLayer(const spClient client, const spIBinder handle,const spLayer layer, const wpLayer parent,bool addToRoot, uint32_t* outTransformHint) {
... {std::scoped_lockstd::mutex lock(mCreatedLayersLock);mCreatedLayers.emplace_back(layer, parent, addToRoot);} // attach this layer to the clientif (client ! nullptr) {client-attachLayer(handle, layer);mLayers.add(handle, layer); } setTransactionFlags(eTransactionNeeded) //提交eTransactionNeeded...
}//这个什么时候会触发这个transaction呢大概流程如下:MessageQueue::Handler::handleMessage(...)//frameworks/native/services/surfaceflinger/Scheduler/MessageQueue.cppcompositor.commit()//这里的compositor指向SurfaceFlingerif (clearTransactionFlags(eTransactionFlushNeeded)) {needsTraversal | commitCreatedLayers();needsTraversal | flushTransactionQueues(vsyncId);}bool SurfaceFlinger::commitCreatedLayers() {for (const auto createdLayer : createdLayers) {handleLayerCreatedLocked(createdLayer);}
}void SurfaceFlinger::handleLayerCreatedLocked(const LayerCreatedState state) {spLayer layer state.layer.promote();if (!layer) {ALOGD(Layer was destroyed soon after creation %p, state.layer.unsafe_get());return;}spLayer parent;bool addToRoot state.addToRoot;if (state.initialParent ! nullptr) {parent state.initialParent.promote();if (parent nullptr) {ALOGD(Parent was destroyed soon after creation %p, state.initialParent.unsafe_get());addToRoot false;}}if (parent nullptr addToRoot) {layer-setIsAtRoot(true);mCurrentState.layersSortedByZ.add(layer);//注意这里对应的Layer是BufferStateLayer} else if (parent nullptr) {layer-onRemovedFromCurrentState();} else if (parent-isRemovedFromCurrentState()) {parent-addChild(layer);layer-onRemovedFromCurrentState();} else {parent-addChild(layer);}layer-updateTransformHint(mActiveDisplayTransformHint);mInterceptor-saveSurfaceCreation(layer);
} 其中SurfaceFlinger端各种Layer的关系如下: 这里需要注意的点是
SurfaceFlinger::setTransactionState中比较复杂容易忽略将TransactionState state放入mTransactionQueue的过程mTransactionQueue在后面创建hwc layer的时候会用到 遗留思考问题
在Android 11中添加了一个彩蛋就是增加了BLASTBufferQueue这个我们要怎么理解它呢它的核心作用就是将Android GraphicBuffer的管理全部交由App应用端处理而不经过SurfaceFlinger处理。这里我存在的疑问就是:
App端渲染完成之后怎么将这些buffer提交给SurfaceFlinger进行继续处理呢!App端申请的Surface Buffer怎么和SF端对应的Layer关联起来呢 App端构建的SurfaceControl在App端和SurfaceFlinger的交互中的作用是什么