当前位置: 首页 > news >正文

费县做网站百度搜索百度

费县做网站,百度搜索百度,dwcs5怎么做网站,直播平台如何搭建BLASTBufferQueue端的GraphicBuffer怎么和SurfaceFlinger端的BufferStateLayer关联上 引言 在跟进hwc_layer是如何产生的,并如何被填充上GraphicBuffer的,怎么也找不到被填充的GraphicBuffer的来源,最终找到了,它的来源是客户端的…

BLASTBufferQueue端的GraphicBuffer怎么和SurfaceFlinger端的BufferStateLayer关联上



引言

在跟进hwc_layer是如何产生的,并如何被填充上GraphicBuffer的,怎么也找不到被填充的GraphicBuffer的来源,最终找到了,它的来源是客户端的BLASTBufferQueue传递过来的,我们这里跟进下这个流程。

这里使用的代码是Android 13 aosp



一. BLASTBufferQueue是如何传递GraphicBuffer到SurfaceFlinger端的BufferStateLayer的

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

///rameworks/native/libs/gui/BLASTBufferQueue.cpp
void BLASTBufferQueue::onFrameAvailable(const BufferItem& item) {...acquireNextBufferLocked(mSyncTransaction)...
}void BLASTBufferQueue::acquireNextBufferLocked(const std::optional<SurfaceComposerClient::Transaction*> transaction) {...status_t status =mBufferItemConsumer->acquireBuffer(&bufferItem, 0 /* expectedPresent */, false); auto buffer = bufferItem.mGraphicBuffer;t->setBuffer(mSurfaceControl, buffer, fence, bufferItem.mFrameNumber, releaseBufferCallback);t->setApplyToken(mApplyToken).apply(false, true);...
}

apply最终会通过Binder调用到SurfaceFlinger的>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) {...queueTransaction(state);//将相关的transaction状态存起来...}       

后续vsync会触发SurfaceFlinger执行如下逻辑:

MessageQueue::Handler::handleMessagecompositor.commitSurfaceFlinger::commitflushTransactionQueuesSurfaceFlinger::applyTransactionStateSurfaceFlinger::setClientStateLockedlayer->setBufferuint32_t SurfaceFlinger::setClientStateLocked(const FrameTimelineInfo& frameTimelineInfo,ComposerState& composerState,int64_t desiredPresentTime, bool isAutoTimestamp,int64_t postTime, uint32_t permissions) {layer_state_t& s = composerState.state;sp<Layer> layer = nullptr;layer = fromHandle(s.surface).promote();//关键点,这个layer是怎么获取的if (what & layer_state_t::eBufferChanged) {std::shared_ptr<renderengine::ExternalTexture> buffer =getExternalTextureFromBufferData(*s.bufferData, layer->getDebugName());//这里并不是真的纹理,而是命名像而已if (layer->setBuffer(buffer, *s.bufferData, postTime, desiredPresentTime, isAutoTimestamp,dequeueBufferTimestamp, frameTimelineInfo)) {flags |= eTraversalNeeded;}}
}

这里我们看下fromHandle的实现:

//SurfaceFlinger.cpp
wp<Layer> SurfaceFlinger::fromHandle(const sp<IBinder>& handle) const {return Layer::fromHandle(handle);
}//Layer.cpp
wp<Layer> Layer::fromHandle(const sp<IBinder>& handleBinder) {if (handleBinder == nullptr) {return nullptr;}BBinder* b = handleBinder->localBinder();if (b == nullptr || b->getInterfaceDescriptor() != Handle::kDescriptor) {return nullptr;}// We can safely cast this binder since its local and we verified its interface descriptor.sp<Handle> handle = static_cast<Handle*>(handleBinder.get());return handle->owner;
}

那么这个Layer对应的Handle是什么时候被构建的呢,是什么时候呢。

status_t SurfaceFlinger::createLayer(LayerCreationArgs& args, sp<IBinder>* outHandle,const sp<IBinder>& parentHandle, int32_t* outLayerId,const sp<Layer>& parentLayer, uint32_t* outTransformHint) {...sp<Layer> layer;       createBufferStateLayer(args, outHandle, &layer)...
}    status_t SurfaceFlinger::createBufferStateLayer(LayerCreationArgs& args, sp<IBinder>* handle,sp<Layer>* outLayer) {args.textureName = getNewTexture();*outLayer = getFactory().createBufferStateLayer(args);*handle = (*outLayer)->getHandle();return NO_ERROR;
}//frameworks/native/services/surfaceflinger/Layer.cpp
sp<IBinder> Layer::getHandle() {Mutex::Autolock _l(mLock);if (mGetHandleCalled) {ALOGE("Get handle called twice" );return nullptr;}mGetHandleCalled = true;return new Handle(mFlinger, this);
}//frameworks/native/services/surfaceflinger/Layer.h
class Handle : public BBinder, public LayerCleaner {
public:Handle(const sp<SurfaceFlinger>& flinger, const sp<Layer>& layer): LayerCleaner(flinger, layer, this), owner(layer) {}const String16& getInterfaceDescriptor() const override { return kDescriptor; }static const String16 kDescriptor;wp<Layer> owner;
};
...
}

这里我们要怎么理解这个Handle呢,它是对Layer的一个封装,不管是BufferStateLayer还是其它的,通过它可以让Layer在Binder中传递

我们接着继续往下看,layer->setBuffer会调用子类的setBuffer,子类是BufferStateLayer

//frameworks/native/services/surfaceflinger/BufferStateLayer.cpp
bool BufferStateLayer::setBuffer(std::shared_ptr<renderengine::ExternalTexture>& buffer,const BufferData& bufferData, nsecs_t postTime,nsecs_t desiredPresentTime, bool isAutoTimestamp,std::optional<nsecs_t> dequeueTime,const FrameTimelineInfo& info) {...mDrawingState.frameNumber = frameNumber;mDrawingState.releaseBufferListener = bufferData.releaseBufferListener;mDrawingState.buffer = std::move(buffer);mDrawingState.clientCacheId = bufferData.cachedBuffer;setTransactionFlags(eTransactionNeeded);...
}

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

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

status_t BufferStateLayer::updateActiveBuffer() {const State& s(getDrawingState());...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是在哪里调用的:

MessageQueue::Handler::handleMessagecompositor.commitSurfaceFlinger::commitlatchBuffers()for (const auto& layer : mLayersWithQueuedFrames) {if (layer->latchBuffer(visibleRegions, latchTime, expectedPresentTime)) {mLayersPendingRefresh.push_back(layer);newDataLatched = true;}layer->useSurfaceDamage();}            


二. BufferStateLayer的GraphicBuffer怎么传递到hwc_layer中去的

这个我们要知道的是BufferStateLayer的GraphicBuffer最终传递到hwc_layer中,是要经过OputputLayer的,通过前面我们知道此时的GraphicBuffer存储在BufferInfo中,如下:

class BufferLayer : public Layer {...struct BufferInfo {nsecs_t mDesiredPresentTime;std::shared_ptr<FenceTime> mFenceTime;sp<Fence> mFence;uint32_t mTransform{0};ui::Dataspace mDataspace{ui::Dataspace::UNKNOWN};Rect mCrop;uint32_t mScaleMode{NATIVE_WINDOW_SCALING_MODE_FREEZE};Region mSurfaceDamage;HdrMetadata mHdrMetadata;int mApi;PixelFormat mPixelFormat{PIXEL_FORMAT_NONE};bool mTransformToDisplayInverse{false};std::shared_ptr<renderengine::ExternalTexture> mBuffer;//存放GraphicBufferuint64_t mFrameNumber;int mBufferSlot{BufferQueue::INVALID_BUFFER_SLOT};bool mFrameLatencyNeeded{false};};    BufferInfo mBufferInfo;...}

我们先看怎么传递到OutputLayer的:

MessageQueue::Handler::handleMessage(...)compositor.composite(...)SurfaceFlinger::composite(...)mCompositionEngine->present(...)//CompositionEngine.cppupdateLayerStateFromFE(args)output->updateLayerStateFromFE(args)//Output.cppfor (auto* layer : getOutputLayersOrderedByZ()) {layer->getLayerFE().prepareCompositionState(args.updatingGeometryThisFrame ? LayerFE::StateSubset::GeometryAndContent: LayerFE::StateSubset::Content);}                    //frameworks/native/services/surfaceflinger/Layer.cppvoid Layer::prepareCompositionState(compositionengine::LayerFE::StateSubset subset) {using StateSubset = compositionengine::LayerFE::StateSubset;switch (subset) {case StateSubset::BasicGeometry:prepareBasicGeometryCompositionState();break;case StateSubset::GeometryAndContent:prepareBasicGeometryCompositionState();prepareGeometryCompositionState();preparePerFrameCompositionState();//调用子类BufferLayer的break;case StateSubset::Content:preparePerFrameCompositionState();break;case StateSubset::Cursor:prepareCursorCompositionState();break;}
}  //frameworks/native/services/surfaceflinger/BufferLayer.cpp
void BufferLayer::preparePerFrameCompositionState() {Layer::preparePerFrameCompositionState();...compositionState->buffer = getBuffer();compositionState->bufferSlot = (mBufferInfo.mBufferSlot == BufferQueue::INVALID_BUFFER_SLOT)? 0: mBufferInfo.mBufferSlot;compositionState->acquireFence = mBufferInfo.mFence;compositionState->frameNumber = mBufferInfo.mFrameNumber;compositionState->sidebandStreamHasFrame = false;
}


分析layer是否参与合成

最简单的SurfaceFlinger应用程序

Android14 SurfaceFlinger-BLASTBufferQueue的创建

Android 14 SurfaceFlinger-Layer visibleRegion的计算过程

SurfaceFlinger的commit/handleTransaction分析

这里重点关注各种State!


文章转载自:
http://fenestella.jqLx.cn
http://disclaimation.jqLx.cn
http://inh.jqLx.cn
http://isochroous.jqLx.cn
http://blida.jqLx.cn
http://scrootch.jqLx.cn
http://aerobiologic.jqLx.cn
http://bot.jqLx.cn
http://forehand.jqLx.cn
http://matriliny.jqLx.cn
http://close.jqLx.cn
http://atebrin.jqLx.cn
http://feldspathic.jqLx.cn
http://neural.jqLx.cn
http://seneca.jqLx.cn
http://pyrognostics.jqLx.cn
http://ream.jqLx.cn
http://anesthesiologist.jqLx.cn
http://possible.jqLx.cn
http://colourbred.jqLx.cn
http://extramarginal.jqLx.cn
http://metalogic.jqLx.cn
http://cacophonous.jqLx.cn
http://filmfest.jqLx.cn
http://premillennialism.jqLx.cn
http://jangler.jqLx.cn
http://cyanosed.jqLx.cn
http://gynander.jqLx.cn
http://flurr.jqLx.cn
http://remonstration.jqLx.cn
http://genuflection.jqLx.cn
http://aglossia.jqLx.cn
http://sonant.jqLx.cn
http://dioptrics.jqLx.cn
http://mawkish.jqLx.cn
http://antiterrorism.jqLx.cn
http://scissile.jqLx.cn
http://cytophagic.jqLx.cn
http://intoxication.jqLx.cn
http://curling.jqLx.cn
http://growly.jqLx.cn
http://sharpeville.jqLx.cn
http://encyclopaedist.jqLx.cn
http://overswing.jqLx.cn
http://grimy.jqLx.cn
http://chemigraphic.jqLx.cn
http://keratitis.jqLx.cn
http://coordinate.jqLx.cn
http://suntan.jqLx.cn
http://quinnat.jqLx.cn
http://federalese.jqLx.cn
http://observational.jqLx.cn
http://carousal.jqLx.cn
http://ophthalmitis.jqLx.cn
http://breathed.jqLx.cn
http://subadolescent.jqLx.cn
http://prostration.jqLx.cn
http://gee.jqLx.cn
http://coindication.jqLx.cn
http://aspergill.jqLx.cn
http://exorability.jqLx.cn
http://tabernacle.jqLx.cn
http://jaa.jqLx.cn
http://oxidimetry.jqLx.cn
http://setout.jqLx.cn
http://iconoclast.jqLx.cn
http://sham.jqLx.cn
http://imburse.jqLx.cn
http://souvenir.jqLx.cn
http://junction.jqLx.cn
http://prelect.jqLx.cn
http://entoderm.jqLx.cn
http://tasman.jqLx.cn
http://autosomal.jqLx.cn
http://backscratching.jqLx.cn
http://closemouthed.jqLx.cn
http://chary.jqLx.cn
http://tamure.jqLx.cn
http://crud.jqLx.cn
http://northpaw.jqLx.cn
http://radiesthesia.jqLx.cn
http://hypohypophysism.jqLx.cn
http://physiological.jqLx.cn
http://agglomerant.jqLx.cn
http://metasilicate.jqLx.cn
http://bioactivity.jqLx.cn
http://uncommercial.jqLx.cn
http://snax.jqLx.cn
http://meticulosity.jqLx.cn
http://unmindful.jqLx.cn
http://criminological.jqLx.cn
http://eelspear.jqLx.cn
http://puggaree.jqLx.cn
http://bohr.jqLx.cn
http://chloroethene.jqLx.cn
http://birdshit.jqLx.cn
http://cabinetmaker.jqLx.cn
http://culprit.jqLx.cn
http://whitepox.jqLx.cn
http://onthe.jqLx.cn
http://www.hrbkazy.com/news/73196.html

相关文章:

  • 网站开发供应商排名真正免费建站网站
  • wordpress手机上用的seo自动点击排名
  • 牌具做网站可以吗网络营销广告
  • 广州金将令做网站怎么样一键建站
  • 专门做设计文案的网站seo sem优化
  • wordpress建站毕业论文网页平台做个业务推广
  • 2017政府网站建设工作总结百度网站站长工具
  • 福州做网站的公司浙江网络推广公司
  • 网站字体江东怎样优化seo
  • 美国二手表网站seo优化费用
  • 界面设计网站推荐山东百度推广代理商
  • javaweb个人博客视频优化软件
  • 做网站应该用多少分辨率福州seo推广服务
  • 关于大创做网站的项目计划书汕头网络营销公司
  • 游学做的好的网站网站描述和关键词怎么写
  • python做的网站如何打开北京网站优化推广公司
  • portfolio做网站推广网站有效的免费方法
  • 为了爱我可以做任何事俄剧网站潜江seo
  • 国外商品网站网站客服
  • 企业展厅建设的原则seo培训学什么
  • 做个自己的网站需要多少钱360优化大师app下载
  • wordpress目录只显示第一个图片抚州seo外包
  • 网站开发学生鉴定表深圳网络推广服务公司
  • 做网站运营跟专业有关吗企业网站模板 免费
  • 网站建设解决方网站开发教程
  • 网站免费空间免备案小红书seo
  • ui设计师是啥seo零基础教学视频
  • 夫妻做网站西安网络seo公司
  • 做白日梦的哪个网站站长素材音效网
  • wordpress页面侧边栏消失青岛seo培训