Android平台——Surfaceflinger机制
看到有人在blog上留言,说希望看到Surfaceflinger这一部分的内容,最近没有时间写blog,只能先暂时掐断Binder机制,写这部分
的内容。同样从几个月前的工作笔记中摘录下来。也没有细细去回顾一下,全当交个差。忙过了这段,我一定会回过头来整理的!!!
首先声明,我们忽略Binder机制的细节。
从头开始查找数据的流向,也就是SurfaceFlinger类这一层从上层接受数据的过程,先看一组继承关系以便于分析(这个总略图将帮你看清数据流向):
MSN的图片太不清楚了 抑郁!,大家凑和看吧!!
这里LayerBuffer的创建是在SurfaceFlinger中由SurfaceFlinger的友员类BClient调用createSurface函数new出LayBuffer对象。 数据流向过程,以opencore解码举例:opencore中调用ISuface的postBuff,实际ISurface的继承类BpSurface中的postBuffer被调用,通过Binder机制向同样是ISurface的继承类的BnSurface请求服务(通过发送POST_BUFFER命令): virtual void BpSurface ::postBuffer(ssize_t offset) { ………………………………………………. remote()->transact(POST_BUFFER, data, &reply, IBinder::FLAG_ONEWAY); } BnSurface响应相应命令,同样调用postBuffer函数: case POST_BUFFER: { ……………………………. postBuffer(offset); ……………………………. } 实际将会调用BnSurface的继承类Surface的postBuffer函数(class Surface : public BnSurface),Surface是LayBaseClient的嵌入类,而Surface类的postBuffer函数未实现,这会导致最终调用Surface类的继承类SurfaceBuffer的postBuffer函数(class SurfaceBuffer : public LayerBaseClient::Surface): void LayerBuffer::SurfaceBuffer::postBuffer(ssize_t offset) { …………………………………………….. owner->postBuffer(offset); } SurfaceBuffer类是LayBaseClient的继承类LayerBuffer的嵌入类,SurfaceBuffer的postBuffer最终会调用LayerBuffer的postBuffer函数: void LayerBuffer::postBuffer(ssize_t offset) { ……………………………………………. sp<Buffer> buffer; if (heap != 0) { buffer = new Buffer(heap, offset, w, h, hs, vs, f); if (buffer->getStatus() != NO_ERROR) buffer.clear(); setBuffer(buffer); //这个函数将会置mBuffer指针 invalidate(); } } 在此函数中将会创建Buffer类用来存储数据,LayerBuffer类中的mBuffer指针会指向这个数据区由BClient利用。
另一方面,关于LayerBuffer类的创建。 在Java层,我们调用Surface_init函数之后,会对应于android_view_Surface.cpp函数中的Surface_init函数,此函数会调用SurfaceComposerClient类的createSurface函数, sp<Surface> SurfaceComposerClient::createSurface( int pid, DisplayID display, uint32_t w, uint32_t h, PixelFormat format, uint32_t flags) { ……………………………………………..
sp<ISurface> surface = mClient->createSurface(&data, pid, display, w, h, format, flags); if (surface != 0) { if (uint32_t(data.token) < NUM_LAYERS_MAX) { result = new Surface(this, surface, data, w, h, format, flags); } } …………………………………………….. } 红色代码行将会调用BpSurfaceFlingerClient类的CreateSurface函数(mClient是BpSurfaceFlingerClient类指针)同样使用Binder机制向BnSurfaceFlingerClient类请求服务(通过发送命令CREATE_SURFACE): virtual sp<ISurface> createSurface( surface_data_t* params, int pid, DisplayID display, uint32_t w, uint32_t h, PixelFormat format, uint32_t flags) { ………………………………………..
remote()->transact(CREATE_SURFACE, data, &reply); ……………………………………….. } BnSurfaceFlingerClient对CREATE_SURFACE的相应将同样调用CreateSurface函数。但此函数在这个类中未实现。 case CREATE_SURFACE: { ……………………………………………..
sp<ISurface> s = createSurface(¶ms, pid, display, w, h, format, flags); ……………………………………………….. } 因此这个函数会由其继承类BClient来调用,BClient类调用CreateSurface时会导致其友员类 SurfaceFlinger类的createSurface函数被调用而new出LayerBuffer的对象: sp<ISurface> BClient::createSurface( ISurfaceFlingerClient::surface_data_t* params, int pid, DisplayID display, uint32_t w, uint32_t h, PixelFormat format, uint32_t flags) { //BClient类的调用会调用SurfaceFlinger类的createSurface return mFlinger->createSurface(mId, pid, params, display, w, h, format, flags); //这里从JAVA层来看,将会完成对LayerBuffer对象的创建,这个对象是图像合成的关键。 }
sp<ISurface> SurfaceFlinger::createSurface(ClientID clientId, int pid, ISurfaceFlingerClient::surface_data_t* params, DisplayID d, uint32_t w, uint32_t h, PixelFormat format, uint32_t flags) { ……………………………………………….
switch (flags & eFXSurfaceMask) { case eFXSurfaceNormal: if (UNLIKELY(flags & ePushBuffers)) { layer = createPushBuffersSurfaceLocked(c, d, id, w, h, flags); //这个函数会new出LayerBuffer对象 } else { layer = createNormalSurfaceLocked(c, d, id, w, h, format, flags); //Layer对象 } break; case eFXSurfaceBlur: layer = createBlurSurfaceLocked(c, d, id, w, h, flags); //LayerBlur对象 break; case eFXSurfaceDim: layer = createDimSurfaceLocked(c, d, id, w, h, flags); //LayerDim对象 break; } ………………………………………….. } 在这里我们开始进入SurfaceFlinger的服务。 注意: 关于SurfaceComposerClient类的作用,它是用来产生Binder机制的,举例: status_t SurfaceComposerClient::freezeDisplay(DisplayID dpy, uint32_t flags) { const sp<ISurfaceComposer>& sm(_get_surface_manager()); return sm->freezeDisplay(dpy, flags); }
const sp<ISurfaceComposer>& _get_surface_manager() { if (gSurfaceManager != 0) { return gSurfaceManager; }
sp<IBinder> binder; sp<IServiceManager> sm = defaultServiceManager(); do { binder = sm->getService(String16("SurfaceFlinger")); if (binder == 0) { LOGW("SurfaceFlinger not published, waiting..."); usleep(500000); // 0.5 s } } while(binder == 0); sp<ISurfaceComposer> sc(interface_cast<ISurfaceComposer>(binder));
Mutex::Autolock _l(gLock); if (gSurfaceManager == 0) { gSurfaceManager = sc; } return gSurfaceManager; } 这是一个全局函数,我们在Binder机制中说明过,这个函数的作用就是用来生成继承自 ISurfaceComposer的BpSurfaceComposer继承类对象。使得return sm->freezeDisplay(dpy, flags);调用的是BpSurfaceComposer类的函数。 SurfaceComposerClient另一个作用,它还可以调用BpSurfaceFlingerClient类的相应函数,同时也可以设置其他类的类成员,也就是说它是一个对外的总接口。
这里先写到这儿,Surfaceflinger也是非常复杂,我的工作笔记还有一半多的内容,在贴完工作笔记后,我会给出一个总结来理顺大家的思路!!! |
|