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元宇宙 繼續閱讀相關文章!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM