GraphicBuffer和Gralloc模块

Gralloc硬件抽象层:申请释放渲染图像缓冲,驱动屏幕的显示

  • open函数,打开设备,通过name区分了不同的设备
   int gralloc_device_open(const hw_module_t* module, const char* name,
        hw_device_t** device){
         if(name=="gpu0"){
           device=new alloc_device_t();
         }else if(name=="fb0"){
           device=new framebuffer_device_t();
         }
   }

  •  支持2中类型的设备
     (1.) alloc_device_t   申请释放图像缓冲,保存了一堆函数指针,主要是
          申请内存
          alloc 

          释放内存
          free

         注意:
          alloc指向gralloc_alloc函数 ,支持在fb和共享内存中申请graphicbuffer
           if (usage & GRALLOC_USAGE_HW_FB) {
            //用fb中映射的显存
                err = gralloc_alloc_framebuffer(dev, size, usage, pHandle);

            } else {
           //创建共享内存
                err = gralloc_alloc_buffer(dev, size, usage, pHandle);

            }


   (2.)framebuffer_device_t 渲染图像缓存,通过(/dev/fbx 驱动)显示到屏幕上 ,保存了一堆函数指针,主要是
          丢一个buffer,等vsync信号来了再渲染出来,这很重要的函数,调用post把输入buffer刷新到屏幕上(调用了fb驱动),屏幕的显示都是直接或间接调用了post
          post

          设置刷新间隔
          setswapinterval

          加载fb成功后,通过mmap把fb映射到进程的地址空间中,首地址保存到framebuffer->base中,   framebuffer->base就是显存了,
          会根据屏幕大小分成几段, 加载fb驱动后就会把显存整个映射到进程的内存中。



  • GraphicBuffer包装了底层的buffer
      graphicbuffer的初始化依赖 GraphicBufferAllocator
      
     //调用initsize后这个buffer就有效了
status_t GraphicBuffer :: initSize ( uint32_t w , uint32_t h , PixelFormat format ,
        uint32_t reqUsage )
{
    GraphicBufferAllocator & allocator = GraphicBufferAllocator :: get ();
    // handle 保存的底层的句柄
    status_t err = allocator . alloc ( w , h , format , reqUsage , & handle , & stride );
    if ( err == NO_ERROR ) {
        this -> width   = w ;
        this -> height = h ;
        this -> format = format ;
        this -> usage   = reqUsage ;
    }
    return err ;
}

继承关系
  GraphicBuffer
    : public ANativeObjectBase < ANativeWindowBuffer , GraphicBuffer , RefBase >,
      public Flattenable < GraphicBuffer >

Flattenable:序列化的接口,为了跨进程传递这个GraphicBuffer,这个不分析,就是吧一堆变量,句柄按格式从内存中读写
     ANativeObjectBase < ANativeWindowBuffer , GraphicBuffer , RefBase >:就是一个 ANativeWindowBuffer ,主要的就是保存了硬件抽象层中生成的句柄,handle是主要的东西

     //获取buffer的一堆属性 
    uint32_t getWidth () const            { return width ; }
    uint32_t getHeight () const           { return height ; }
    uint32_t getStride () const           { return stride ; }
    uint32_t getUsage () const            { return usage ; }
   
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值