1、Android4.0中GraphicBuffer的申请流程:
1)、Android4.0中GraphicBuffer的申请是在SurfaceTextureClient::dequeueBuffer()函数中进行的,调用流程如下:
---------------------------------------------------------client->
SurfaceTextureClient::dequeueBuffer
BpSurfaceTexture::dequeueBuffer
-----------------------------------------------------server->
BnSurfaceTexture::onTransact(case DEQUEUE_BUFFER)
SurfaceTexture::dequeueBuffer
GraphicBufferAlloc::createGraphicBuffer
new GraphicBuffer
GraphicBuffer::initSize
GraphicBufferAllocator::alloc
gralloc_alloc()
gralloc_alloc_buffer()
ashmem_create_region()
mapBuffer()
gralloc_map()
----------------------------------------------------client->
BpSurfaceTexture::requestBuffer()
-----------------------------------------------------server->
BnSurfaceTexture::onTransact(case REQUEST_BUFFER)
SurfaceTexture::requestBuffer()
------------------------------------------------client->
Parcel::read()
GraphicBuffer::unflatten()
GraphicBufferMapper::registerBuffer()
gralloc_register_buffer()
gralloc_map()
get the pointer of buffer
2)、 GraphicBuffer::flatten的职能就是将GraphicBuffer的handle变量信息写到Parcel句中,接收端利用GraphicBuffer::unflatten读取
3)、 在Parcel::read()中会通过dup()来完成从Server端传递的共享内存fd句柄的复制;
2、OpenGLRenderer学习:
1)、在Loader::init_api()函数函数中,会动态打开libGLES_android1.so库,来注册相关API,如果库中没有实现,会把gl_unimplemented函数指针给当前函数;当调用此函数时会打印called unimplemented OpenGL ES API;
2)、在GLES20Canvas构造函数中初始化mRenderer,实际初始化的是DisplayListRenderer:
protected GLES20Canvas(boolean record, boolean translucent) {
mOpaque = !translucent;
if (record) {
mRenderer = nCreateDisplayListRenderer();
} else {
mRenderer = nCreateRenderer();
}
setupFinalizer();
}
DisplayListRenderer的函数把绘图动作记录起来,由DisplayList::replay()函数调用OpenGLRenderer的相关绘图API;
DisplayList::replay()函数由OpenGLRenderer::drawDisplayList()调用;
3、在1280*720的分辨率下,com.android.systemui默认启用硬件加速来绘图;