Android 12(S) 图像显示系统 - createSurface的流程(五)


题外话

刚刚开始着笔写作这篇文章时,正好看电视在采访一位92岁的考古学家,在他的日记中有这样一句话,写在这里与君共勉“不要等待幸运的降临,要去努力的掌握知识”。如此朴实的一句话,此时此刻,正适合我们。


1 前言

回到前面的文章:Android 12(S) 图像显示系统 - 示例应用(二)  ,在上一篇文章中已经讲解了应用如何与SurfaceFlinger建立连接和通信,接下来就要去创建Surface了,当然在此之前,还有获取屏幕Display信息的操作,这不是关注的重点,先不展开讲解。
// create the native surface
sp<SurfaceControl> surfaceControl = surfaceComposerClient->createSurface(mName, 
                                                            resolution.getWidth(), 
                                                            resolution.getHeight(), PIXEL_FORMAT_RGBA_8888,
                                                            ISurfaceComposerClient::eFXSurfaceBufferState,
                                                            /*parent*/ nullptr);

注:本片涉及的代码

/frameworks/native/libs/gui/SurfaceComposerClient.cpp

/frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp

/frameworks/native/services/surfaceflinger/Client.cpp

/frameworks/native/libs/gui/ISurfaceComposer.cpp


 

2 createSurface的流程

先把类图贴这里,待会分析流程便于查看数据的流向
 

SurfaceComposerClient::createSurface

代码如下,比较简单,使用时需要传递一个名字(name),指定宽高信息,指定格式(format)等,返回一个SurfaceControl的指针,这个方法中调用了createSurfaceChecked

* /frameworks/native/libs/gui/SurfaceComposerClient.cpp

sp<SurfaceControl> SurfaceComposerClient::createSurface(const String8& name, uint32_t w, uint32_t h,
                                                        PixelFormat format, uint32_t flags,
                                                        const sp<IBinder>& parentHandle,
                                                        LayerMetadata metadata,
                                                        uint32_t* outTransformHint) {
    sp<SurfaceControl> s;
    createSurfaceChecked(name, w, h, format, &s, flags, parentHandle, std::move(metadata),
                         outTransformHint);
    return s;
}

SurfaceComposerClient::createSurfaceChecked

这个方法的核心是 mClient->createSurface ,前面讲过(sp<ISurfaceComposerClient>  mClient)是Client的代理客户端,最终调用到服务端 Client::createSurface

这个方法中还有两个变量:

sp<IBinder> handle  == 这个代表什么? ==> SurfaceFlinger中创建的Layer的句柄或标识

 
 

关注公众号 Android元宇宙 继续阅读相关文章!

 
posted on 2022-02-08 09:42  二的次方  阅读(10225)  评论(3编辑  收藏  举报