文档详情

Android60显示系统GraphicBuffer分配内存.doc

发布:2017-03-04约1.9万字共13页下载文档
文本预览下载声明
Android6.0 显示系统GraphicBuffer分配内存 之前分析了显示系统的大致流程,其中有几个地方不是很清楚,这里我专门写几篇专题。 这篇先来看GraphicBuffer分配内存,我们在之前的博客中分析到用户进程创建一个Surface,最后返回的参数gbp是spIGraphicBufferProducer类型的,过程之前都分析过了,我们就不分析了,这个gbp是在Layer的onFirstRef中创建的。 在BufferQueue的createBufferQueue中创建了producer和consumer,然后创建了MonitoredProducer对象,并且用producer来作为参数。 [cpp] view plain copy 在CODE上查看代码片派生到我的代码片 void Layer::onFirstRef() { // Creates a custom BufferQueue for SurfaceFlingerConsumer to use spIGraphicBufferProducer producer; spIGraphicBufferConsumer consumer; BufferQueue::createBufferQueue(producer, consumer); mProducer = new MonitoredProducer(producer, mFlinger); ...... 用户进程和SurfaceFlinger通信的Binder类 MonitoredProducer是继承IGraphicBufferProducer 类。 [cpp] view plain copy 在CODE上查看代码片派生到我的代码片 class MonitoredProducer : public IGraphicBufferProducer { 我们再来看看IGraphicBufferProducer 类的实现,典型的Binder用法,在这个类中有Bp端和Bn端的实现。这个就是用户进程和SurfaceFlinger进程的关于内存的Binder通信。 我们requestBuffer函数,用户进程通过binder和SurfaceFlinger通信,获取数据,然后新建一个GraphicBuffer对象,将数据放入这个对象。 [cpp] view plain copy 在CODE上查看代码片派生到我的代码片 class BpGraphicBufferProducer : public BpInterfaceIGraphicBufferProducer { public: BpGraphicBufferProducer(const spIBinder impl) : BpInterfaceIGraphicBufferProducer(impl) { } virtual ~BpGraphicBufferProducer(); virtual status_t requestBuffer(int bufferIdx, spGraphicBuffer* buf) { Parcel data, reply; data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); data.writeInt32(bufferIdx); status_t result =remote()-transact(REQUEST_BUFFER, data, reply);//通过Binder获取SurfaceFlinger的数据 if (result != NO_ERROR) { return result; } bool nonNull = reply.readInt32(); if (nonNull) { *buf = new GraphicBuffer();//新建一个GraphicBuffer result = reply.read(**buf);//将从SurfaceFlinger获取的数据放入这个新建的对象 if(result != NO_ERROR) { (*b
显示全部
相似文档