HAL層Buffer可以分為兩類:ImageBuffer和CmdBuffer。接下來對系統中ImageBuffer模塊分析介紹。
模塊結構與組成
圖1-1 ImageBuffer靜態模型
ImageBufferManager通過注冊的方式獲取MemPoolBufferManager操作句柄,ImageBuffer通過ImageBufferManage注冊的MemPoolBuffer Manager完成相應MemPoolGoup的激活/去活。
從ImageBuffer模型中可以看出ImageBuffer有兩種,一種是來自CSL設備的CSLBuffer,一種來自Gralloc的GrallocBuffer。那么這兩種類型的ImageBuffer區別:
緩沖區的來源不同,CSL是Hw camera module的CSL內存;Gralloc是Hw Gralloc module的內存。Gralloc是Android圖形架構中的一個角色,由此看來Gralloc大概是Hw中連接顯示和Camera的內存分配模塊。Gralloc分配的內存需要映射到CSL設備后,供Camera使用。
圖1-2 Buffer組件關系
MemPoolBuffer中的memPoolBufferManager指向創建該MemPoolBuffer的MemPoolGroup中m_bufferManagerList中創建注冊的某個Mgr。MemPoolGroup好比是池子,池中有一個個小池子,MemPoolBuffer相當於池子中的小池子。
圖1-3 ImageBuffer管理模塊框圖
ImageBuffer對外提供管理的示意圖。這里先學習CSL類型的Buffer。
模塊實現邏輯
核心MemPoolMgr,ImageBufferManager是對MemPoolMgr的封裝。
ImageBuffer Manager根據使用場景,分為兩種類型:
- CamxBufferManager Camx中創建,一般立即創建
- ChiBufferManager Chi usecase通過BufferManagerOps創建
緩沖池管理器的實現
1.注冊緩沖池管理器
創建ImageBufferManager時注冊ImageBuffer管理器到MemPoolGroup,沒有CSL buffer和Gralloc buffer區分。注冊管理后,全局memPoolMgr會對注冊管理的MemPoolGroup進行統一的回收管理。
圖2-1 注冊BufferManager的過程
2.取消緩沖池管理器的注冊
圖2-2 取消緩沖管理器注冊的過程
3.緩沖池管理器監控線程
圖2-3 緩沖池管理器監控線程運行原理
4.緩沖池的激活
圖2-4 緩沖池激活過程
一個緩沖池組激活的過程實質是一次緩沖池的分配過程。根據MemPoolMgr緩沖池管理器釋放完成狀態時可以進行下一次的激活,一次buffer分配,即AllocateBuffer。上圖緩存分配部分是CSL類型Buffer分配過程的描述,后邊會對Gralloc類型緩存分配進行說明。
Gralloc類型緩存的激活:通過Gralloc模塊最終調用Hw module實現緩沖區的分配和釋放。Gralloc模塊以單例模式提供全局模塊對象。由於Gralloc模塊在Android圖形中和BufferQueue比較緊密,這里暫時不做過多介紹,放在圖形系統進一步研究學習。
5.緩沖池的去活
圖2-5 緩沖池組去活過程
緩沖池組掛在緩沖池管理器上進行管理,去活即不再受緩沖器管理器的管理
緩沖池資源的使用
1.分配緩存
圖2-6 從緩沖池獲取緩存的過程
從緩沖池獲取緩存時,第一次沒獲取到緩存時(0階段)會進行二外兩次的嘗試獲取(0', 0''),如果再次嘗試獲取還是不成功時則真正的獲取失敗。這里會涉及一個緩存到設備注冊的過程,后續會單獨介紹。
2.釋放緩存
圖2-7 釋放從緩沖池獲取的緩存
可以參考“從緩沖池獲取緩存中的圈5:node關聯到MemPoolBufferManager”
3.映射緩存到dev
圖2-8 緩沖區的映射過程
通過圖2-8 緩沖區映射示意圖可以看出最終通過CSL(相機服務層)模塊完成映射。通常有兩種情況需要保留映射關系:Gralloc類型緩存(和緩存使用類型有關,需要通過Gralloc將生產的數據交給圖形架構Surface);給UMD准備的CSL類型緩存(即用戶空間要訪問的)。CSL模塊映射具體實現將在CSL模塊介紹。通過返回的信息,大概可以知道,CSL UMD映射的應該類似於linux的 fd remap(將文件中的數據通過文件句柄映射到一塊內存中),是不是這樣?CSL模塊整理后確認。
映射規則:
給定緩沖區允許的最大增量映射為4。即一個緩沖區最大映射到4個dev
兩種映射:Gralloc Buffer,CSLMapNativeBuffer; CSL Buffer, CSLMapBuffer
CSL映射返回的映射信息和緩存的類型有關,如果Gralloc類型緩存,需要更新CSLBufferInfo類型信息到要映射的緩存結構;對於CSL類型的緩存,如果允許UMD訪問,則需要將虛擬地址更新到輸入的緩存結構中。
memPoolGroup -> CSLMapNativeBuffer -> CSLMapNativeBufferHW -> CSLMapBufferHW
4.獲取buffer info
根據輸入的緩沖管理句柄檢查要查詢的緩沖池組是不是在緩沖池管理器的管理管理池組鏈表(m_groupList)中,當要查詢的緩存所屬的緩沖池組將好在緩沖池管理器的管理鏈表中時,緩沖池組根據輸入的緩沖句柄獲取具體的MemPoolBuffer info。
模塊接口
管理相關接口
- 注冊管理
創建並注冊一個新的MemPoolGroup到緩沖管理器: MemPoolMgr::RegisterNewMemPoolGroup
將一個已存在MemPoolGroup注冊到緩沖管理器: MemPoolMgr::RegisterBufferManager
2.取消注冊
注銷緩沖管理器對某個MemPoolGroup的管理: MemPoolMgr::UnregisterBufferManager
3.激活
實際是MemPoolGroup分配的觸發:MemPoolMgr::ActivateBufferManager
4.去活
實際是手動失效MemPoolMgr管理的緩沖池組,退還到freeList: MemPoolMgr:: DeactivateBufferManager
緩沖池分配回收接口
1.從緩沖池里獲取緩沖
MemPoolMgr:: GetBufferFromPool
2.釋放緩存,歸還到MemPoolGroup
MemPoolMgr::ReleaseBufferToPool
4.映射緩存到設備
MemPoolMgr::MapBufferToDevices
具體怎么用的暫時不了解
5.獲取Buffer信息
MemPoolMgr::GetBufferInfo
模塊應用
-
Gralloc 類型緩存
-
CSL類型緩存
CSLBufferManager
1.Gralloc類型緩存的應用
2.CSL類型緩存的應用