android graphic(13)—surface flinger中的“事务”
来源:互联网 发布:录音师2.0淘宝价格低 编辑:程序博客网 时间:2024/06/06 08:32
- surfaceflinger中的事务flags
- 设置和处理flags
- 创建layer时设置flag
surfaceflinger中的事务flags
surfacefligner中所涉及事务的flag包括下面几种,
enum { //需要处理事务 eTransactionNeeded = 0x01, //需要遍历 eTraversalNeeded = 0x02, //需要处理display的事务 eDisplayTransactionNeeded = 0x04, eTransactionMask = 0x07};
设置和处理flags
mTransactionFlags是surface flinger中的一个成员,注意在layer中也存在一个同名的mTransactionFlags,通过下面的函数设置该flag,
uint32_t SurfaceFlinger::setTransactionFlags(uint32_t flags) { //或返回的是mTransactionFlags旧的值 uint32_t old = android_atomic_or(flags, &mTransactionFlags); //如果旧值和flags没有bit是相同的?? if ((old & flags)==0) { // wake the server up signalTransaction(); } return old;}
在surfaceflinger中,a, createLayer(),removeLayer(),setClientStateLocked都会去设置事务flag为eTransactionNeeded;b, setClientStateLocked()会去设置eTraversalNeeded;c, createDisplay(),destroyDisplay(),onHotplugReceived(),setDisplayStateLocked()会去设置eDisplayTransactionNeeded。
/*----------------------SurfaceFlinger.cpp-------------------------------*/void SurfaceFlinger::signalTransaction() { mEventQueue.invalidate();}
进而调用,
#define INVALIDATE_ON_VSYNC 1/*----------------------MessageQueue.cpp-------------------------------*/void MessageQueue::invalidate() {// INVALIDATE_ON_VSYNC宏默认为true#if INVALIDATE_ON_VSYNC mEvents->requestNextVsync();#else mHandler->dispatchInvalidate();#endif}
mEvents就是EventThread类中的Connection类,
/*----------------------EventThread.cpp-------------------------------*/void EventThread::Connection::requestNextVsync() { mEventThread->requestNextVsync(this);}// 关于Connection中的count,当为0时为一次性的事件,即触发一次sync信号// count >= 1 : continuous event. count is the vsync rate// count == 0 : one-shot event that has not fired// count ==-1 : one-shot event that fired this round / disabled int32_t count;void EventThread::requestNextVsync( const sp<EventThread::Connection>& connection) { Mutex::Autolock _l(mLock); if (connection->count < 0) { connection->count = 0; mCondition.broadcast(); }}
从上面代码分析,各种事务都会去触发一次vsync,前面文章分析过,在每次vsync信号到来时,会去调用,
/*----------------------SurfaceFlinger.cpp-------------------------------*/void SurfaceFlinger::onMessageReceived(int32_t what) { ATRACE_CALL(); switch (what) { case MessageQueue::TRANSACTION: handleMessageTransaction(); break; //这个分支 case MessageQueue::INVALIDATE: handleMessageTransaction(); handleMessageInvalidate(); signalRefresh(); break; case MessageQueue::REFRESH: handleMessageRefresh(); break; }}
进而调用handleMessageTransaction
,进而根据mTransactionFlags中设置的bit值做相应的处理。
/*----------------------SurfaceFlinger.cpp-------------------------------*/void SurfaceFlinger::handleMessageTransaction() { uint32_t transactionFlags = peekTransactionFlags(eTransactionMask); if (transactionFlags) { handleTransaction(transactionFlags); }}
创建layer时设置flag
下面以surface flinger在创建layer时为例,
/*----------------------SurfaceFlinger.cpp-------------------------------*/status_t SurfaceFlinger::createLayer( const String8& name, const sp<Client>& client, uint32_t w, uint32_t h, PixelFormat format, uint32_t flags, sp<IBinder>* handle, sp<IGraphicBufferProducer>* gbp){ //ALOGD("createLayer for (%d x %d), name=%s", w, h, name.string()); if (int32_t(w|h) < 0) { ALOGE("createLayer() failed, w or h is negative (w=%d, h=%d)", int(w), int(h)); return BAD_VALUE; } status_t result = NO_ERROR; sp<Layer> layer; switch (flags & ISurfaceComposerClient::eFXSurfaceMask) { case ISurfaceComposerClient::eFXSurfaceNormal: result = createNormalLayer(client, name, w, h, flags, format, handle, gbp, &layer); break; case ISurfaceComposerClient::eFXSurfaceDim: result = createDimLayer(client, name, w, h, flags, handle, gbp, &layer); break; default: result = BAD_VALUE; break; } if (result == NO_ERROR) { //①将handle和layer保存到client中 //②将gbp,也就是server端的BufferQueue放到mGraphicBufferProducerList中 addClientLayer(client, *handle, *gbp, layer); //因为新建了layer,所以设置事务flag为需要处理事务eTransactionNeeded setTransactionFlags(eTransactionNeeded); } return result;}
关于Handle,就是个BBinder,其中保存了surfacefligner和layer,用来传递给client,同时继承了 LayerCleaner ,顾名思义,就是删除layer时做一些工作,
sp<IBinder> Layer::getHandle() { Mutex::Autolock _l(mLock); LOG_ALWAYS_FATAL_IF(mHasSurface, "Layer::getHandle() has already been called"); mHasSurface = true; /* * The layer handle is just a BBinder object passed to the client * (remote process) -- we don't keep any reference on our side such that * the dtor is called when the remote side let go of its reference. * * LayerCleaner ensures that mFlinger->onLayerDestroyed() is called for * this layer when the handle is destroyed. */ class Handle : public BBinder, public LayerCleaner { wp<const Layer> mOwner; public: Handle(const sp<SurfaceFlinger>& flinger, const sp<Layer>& layer) : LayerCleaner(flinger, layer), mOwner(layer) { } }; return new Handle(mFlinger, this);}
/*----------------------Layer.cpp-------------------------------*/// LayerCleaner仅仅保存了layer和surfaceflinger,// 在析构时,会调用surfaceflinger的onLayerDestroyed(mLayer)函数,去做// 删除Layer的工作Layer::LayerCleaner::LayerCleaner(const sp<SurfaceFlinger>& flinger, const sp<Layer>& layer) : mFlinger(flinger), mLayer(layer) {}Layer::LayerCleaner::~LayerCleaner() { // destroy client resources mFlinger->onLayerDestroyed(mLayer);}
/*----------------------SurfaceFlinger.cpp-------------------------------*/void SurfaceFlinger::addClientLayer(const sp<Client>& client, const sp<IBinder>& handle, const sp<IGraphicBufferProducer>& gbc, const sp<Layer>& lbc){ // attach this layer to the client client->attachLayer(handle, lbc); // add this layer to the current state list Mutex::Autolock _l(mStateLock); // 将新建的layer添加到mCurrentState的layersSortedByZ mCurrentState.layersSortedByZ.add(lbc); // 将BufferQueue添加到mGraphicBufferProducerList // SortedVector< wp<IBinder> > mGraphicBufferProducerList; mGraphicBufferProducerList.add(gbc->asBinder());}
/*----------------------Client.cpp-------------------------------*/// 应该是每个app对应一个Client// 每个Client里面有这个app对应的所有layers// DefaultKeyedVector< wp<IBinder>, wp<Layer> > mLayers;// handle就是将这个layer和surfaceflinger的信息保存起来,用来析构时候用void Client::attachLayer(const sp<IBinder>& handle, const sp<Layer>& layer){ Mutex::Autolock _l(mLock); mLayers.add(handle, layer);}
0 0
- android graphic(13)—surface flinger中的“事务”
- android graphic(13)—surface flinger中的“事务”
- Android Display System — Surface Flinger
- android surface flinger
- Android Display System --- Surface Flinger
- Android Display System --- Surface Flinger
- Android Display System --- Surface Flinger
- Android Display System --- Surface Flinger
- Android Display System --- Surface Flinger
- Android Display System --- Surface Flinger
- Android Display System Surface Flinger
- Android Display System --- Surface Flinger
- Android Display System --- Surface Flinger
- Android Display System --- Surface Flinger
- Android Display System --- Surface Flinger
- Android Display System --- Surface Flinger
- Android Display System --- Surface Flinger
- Android Display System --- Surface Flinger
- Misbehaving servers(服务器停止运转)
- SQLite 数据库的最佳实践
- Android中JNI程序的编写
- SQL 动态行转列
- java学习之服务端和客服端
- android graphic(13)—surface flinger中的“事务”
- STL中的常用算法
- 日期时间解析类 android.text.format.DateFormat
- iBatis SqlMap的配置总结
- 【Music】音乐切换封面没有变化
- 四种方法解决ScrollView嵌套listview的滑动冲突问题
- RK3288核心板
- CentOS6.2调整home分区大小
- yum install mysql 5.7