- 1、本文档共13页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Android60显示系统GraphicBuffer分配内存
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
您可能关注的文档
- 2016年荆州市专业技术人才知识更新工程测试.doc
- 2016当代科学技术新知识读本单选题.doc
- 2016年高考生物母题题源系列专题15细胞结构(含解析).doc
- 2016汕头二模语文答案.doc
- 2016年高考生物母题题源系列专题04DNA与遗传信息的传递和表达细胞增殖的关系(含解析).doc
- 2016浙江事业单位考试马哲模块.docx
- 2016版高中政治第二单元第三课文化的多样性与文化传播课时跟踪检测新人教版必修3.doc
- 2016省考县级申论真题及解释doc.doc
- 2016达州二诊生物试题及答案.doc
- 2016高考历史二轮复习古代中华文明的奠基形成和发展先秦秦汉的政治经济思想文化课时冲关练(一).doc
文档评论(0)