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
; }