Android4.0 图形系统学习

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默认启用硬件加速来绘图;



你可能感兴趣的:(Android4.0 图形系统学习)