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

南京做网站南京乐识好国外最新设计产品

南京做网站南京乐识好,国外最新设计产品,怎么制作一个国外网站,link友情买卖BLASTBufferQueue端的GraphicBuffer怎么和SurfaceFlinger端的BufferStateLayer关联上 引言 在跟进hwc_layer是如何产生的#xff0c;并如何被填充上GraphicBuffer的#xff0c;怎么也找不到被填充的GraphicBuffer的来源#xff0c;最终找到了#xff0c;它的来源是客户端的… 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::optionalSurfaceComposerClient::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 VectorComposerState states,const VectorDisplayState displays, uint32_t flags, const spIBinder applyToken,const InputWindowCommands inputWindowCommands, int64_t desiredPresentTime,bool isAutoTimestamp, const client_cache_t uncacheBuffer, bool hasListenerCallbacks,const std::vectorListenerCallbacks 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;spLayer layer nullptr;layer fromHandle(s.surface).promote();//关键点这个layer是怎么获取的if (what layer_state_t::eBufferChanged) {std::shared_ptrrenderengine::ExternalTexture buffer getExternalTextureFromBufferData(*s.bufferData, layer-getDebugName());//这里并不是真的纹理而是命名像而已if (layer-setBuffer(buffer, *s.bufferData, postTime, desiredPresentTime, isAutoTimestamp,dequeueBufferTimestamp, frameTimelineInfo)) {flags | eTraversalNeeded;}} }这里我们看下fromHandle的实现: //SurfaceFlinger.cpp wpLayer SurfaceFlinger::fromHandle(const spIBinder handle) const {return Layer::fromHandle(handle); }//Layer.cpp wpLayer Layer::fromHandle(const spIBinder 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.spHandle handle static_castHandle*(handleBinder.get());return handle-owner; }那么这个Layer对应的Handle是什么时候被构建的呢是什么时候呢。 status_t SurfaceFlinger::createLayer(LayerCreationArgs args, spIBinder* outHandle,const spIBinder parentHandle, int32_t* outLayerId,const spLayer parentLayer, uint32_t* outTransformHint) {...spLayer layer; createBufferStateLayer(args, outHandle, layer)... } status_t SurfaceFlinger::createBufferStateLayer(LayerCreationArgs args, spIBinder* handle,spLayer* outLayer) {args.textureName getNewTexture();*outLayer getFactory().createBufferStateLayer(args);*handle (*outLayer)-getHandle();return NO_ERROR; }//frameworks/native/services/surfaceflinger/Layer.cpp spIBinder 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 spSurfaceFlinger flinger, const spLayer layer): LayerCleaner(flinger, layer, this), owner(layer) {}const String16 getInterfaceDescriptor() const override { return kDescriptor; }static const String16 kDescriptor;wpLayer owner; }; ... }这里我们要怎么理解这个Handle呢它是对Layer的一个封装不管是BufferStateLayer还是其它的通过它可以让Layer在Binder中传递。 我们接着继续往下看layer-setBuffer会调用子类的setBuffer子类是BufferStateLayer //frameworks/native/services/surfaceflinger/BufferStateLayer.cpp bool BufferStateLayer::setBuffer(std::shared_ptrrenderengine::ExternalTexture buffer,const BufferData bufferData, nsecs_t postTime,nsecs_t desiredPresentTime, bool isAutoTimestamp,std::optionalnsecs_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_ptrFenceTime mFenceTime;spFence 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_ptrrenderengine::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://www.hkea.cn/news/14476113/

相关文章:

  • 受欢迎的天津网站建设同ip多域名做网站
  • 大淘客做的网站打不开网站app简单做
  • 秦淮网站建设品牌推广语
  • 郑州网站建设培训短期班北京营销型网站建设
  • 营销型网站建设推荐乐云seo深圳办公室装修公司哪家好
  • 网站上微信支付功能网页设计宣传海报素材
  • 为什么找别人做网站湘潭网站建设 磐石网络实惠
  • 品牌网站建设费用要多少珠海网站建设报价
  • 成都网站建设的定位wordpress导航栏文字大小不一
  • 网站开发属于软件开发嘉祥网站建设
  • 电商网站的支付模块怎么做个个大公司网站
  • 怎么建立淘宝客网站学生个人网页制作代码模板
  • 网上服务旗舰店seo网站怎么搭建
  • 二级医院做网站网页设计与制作项目化教程
  • 网站开发平台 运行平台企业网站建设实训体会
  • 高清素材图片的网站推广普通话的法律依据主要有
  • 用jsp做的购物网站成都最新数据消息
  • 建设智能家居网站SWOT分析苏州有做网站的公司吗
  • 知名商城网站建设报价建设门户网站的申请
  • 营销网站定制的优势建e网室内设计网母
  • 成都有哪些网站建设的公司网络建站平台
  • 凡客诚品网站推广高端品牌鞋子
  • 企业网站建设规划php网站开发技术优点
  • 东莞定制网站建设服装网站建设目的作用是什么
  • 怎么做网站点击率监控工具h5页面制作免费平台
  • 永康网站优化公司如何制作一个宣传网页
  • 工信部网站域名备案查询系统怎么找缺钱的企业客户
  • 东莞三合一网站制作学做网站的视频教学
  • 电商网站设计费用制作一个app软件
  • 郑州o2o网站建设汉狮求创意设计分享的网站