同步處理架構會明確說明 Android 圖形系統中的各種非同步作業。架構 這類 API 可讓元件指出緩衝區釋放時間。架構還 可讓同步處理基元從核心之間傳遞到驅動程式 以及使用者空間程序本身
例如,應用程式可以將工作排入佇列,以便在 GPU 中執行。 GPU 隨即開始繪圖。雖然圖片尚未繪製 進入記憶體後,緩衝區指標會傳遞至視窗 以及表示 GPU 工作 完成。視窗合成器會提前開始處理 將工作傳遞到顯示控制器。CPU 運作時 就完成了GPU 完成後,顯示控制器 圖片會立即顯示
同步處理架構也能讓實作者 共用硬體元件最後, 方便您查看圖形管道 以及偵錯
明確同步處理
明確同步處理可讓圖形緩衝區的製作者和取用者 在停止使用緩衝區時發出信號。明確同步處理為 並在核心空間中實作。
明確同步處理的優點包括:
- 裝置間的行為差異較小
- 改善偵錯支援
- 經過改良的測試指標
同步處理架構有三種物件類型:
sync_timeline
sync_pt
sync_fence
同步處理時程
sync_timeline
是一個單調遞增的時間軸,
廠商應為每個驅動程式執行個體實作,例如 GL 情境
螢幕控制器或 2D 圓餅圖次數:sync_timeline
傳送到特定硬體的核心工作。
sync_timeline
會針對作業順序提供保證
以及啟用硬體專屬的實作程序
實作 sync_timeline
時,請遵循下列準則:
- 為所有司機、時間軸和圍欄提供實用名稱,以簡化 以及偵錯
- 導入
timeline_value_str
和pt_value_str
時間軸中的運算子,讓輸出的偵錯更容易理解。 - 實作填入
driver_data
以取得使用者空間程式庫, 例如 GL 程式庫,可視需要存取私人時間軸資料。data_driver
可讓供應商傳遞不可變動的資訊 使用sync_fence
和sync_pts
建構指令列 據此做出調整 - 不允許使用者空間明確建立或發出圍欄。明確 建立信號/圍欄會導致阻斷服務攻擊, 能終止管道的功能
- 請勿存取
sync_timeline
、sync_pt
或sync_fence
元素。這個 API 提供了 函式。
Sync_pt
sync_pt
是數字上的單一值或點
sync_timeline
。點
共有三種狀態:有效、已信號和錯誤。積分會以有效狀態開始
並轉換成信號或錯誤狀態例如圖片中
使用者不再需要緩衝區,系統會發出 sync_pt
訊號
讓圖片製作者知道可以再次寫入緩衝區。
同步處理圍欄
sync_fence
是一組 sync_pt
值
經常
有不同的 sync_timeline
父項 (例如針對螢幕)
和 GPU)。sync_fence
、sync_pt
和
sync_timeline
是驅動因素和使用者空間的主要基本功能
來傳達其依附元件圍欄發出訊號時
所以不保證能完成
核心驅動程式或硬體區塊會依序執行指令。
同步處理架構可讓多位消費者或生產者
使用緩衝區完成,並與一個函式通訊依附元件資訊
參數。Fences 受檔案描述元支援,並由
將核心空間對應至使用者空間例如,一個圍欄可以包含兩個
sync_pt
值,用於表示兩張圖片消費者分別完成的操作
讀取緩衝區圍欄發出訊號時,圖片製作者會知道兩者皆是
包括所得體驗
柵欄 (例如 sync_pt
值) 會啟動,並根據以下條件變更狀態
點數的狀態如果所有 sync_pt
值都變成信號,系統就會判定
sync_fence
已發出訊號。如果一個 sync_pt
下降
變成錯誤狀態,整個 sync_fence
都有錯誤狀態。
圍欄開往後就無法變更「sync_fence
」的成員資格
已建立。如要在一個圍欄中取得多個資料點,合併作業是
執行時,會將兩個不同圍欄的點新增到第三個圍欄。
如果有其中一個點落在原圍欄的訊號範圍中,但另一個訊號沒有傳送,
也不會處於訊號狀態。
如要實作明確同步處理,請提供下列資訊:
- 實作同步處理架構的核心空間子系統
特定硬體驅動程式的安裝記錄需具備圍欄感知能力的駕駛人
以及任何存取或與 Hardware Composer 通訊的內容。
主要檔案包括:
- 核心實作:
kernel/common/include/linux/sync.h
kernel/common/drivers/base/sync.c
kernel/common/Documentation/sync.txt
的說明文件- 這個程式庫可用來與
platform/system/core/libsync
- 核心實作:
- 供應商必須提供適當的同步處理作業
做為
validateDisplay()
和 HAL 中使用presentDisplay()
函式。 - 兩個圍欄相關 GL 擴充功能 (
EGL_ANDROID_native_fence_sync
和EGL_ANDROID_wait_sync
) 在圖形中支援圍欄 驅動程式庫。
個案研究:實作顯示器驅動程式
如要使用支援同步處理函式的 API,
開發具有顯示緩衝區函式的顯示驅動程式。之前
此時此函式將收到 dma-buf
這些緩衝區,請在顯示器上放置這些緩衝區,當緩衝區顯示時,接著封鎖。例如:
/* * assumes buffer is ready to be displayed. returns when buffer is no longer on * screen. */ void display_buffer(struct dma_buf *buffer);
透過同步處理架構,display_buffer
函式
較複雜在顯示畫面上顯示緩衝區時,該緩衝區會與
以及表示緩衝區準備時間的圍欄。可加入待播清單
待圍欄消除後再開始工作
在圍欄消除後排出及啟動工作不會阻擋任何現象。 您會立即傳回自己的圍欄,表示緩衝時間 則會從螢幕關閉將緩衝區排入佇列時,核心清單 與同步處理架構的依附元件:
/* * displays buffer when fence is signaled. returns immediately with a fence * that signals when buffer is no longer displayed. */ struct sync_fence* display_buffer(struct dma_buf *buffer, struct sync_fence *fence);
同步整合
本節說明如何整合核心空間同步架構與 Android 架構的使用者空間部分和必須通訊的驅動程式 彼此之間的通訊核心空間物件會在 使用者空間
整合慣例
遵循 Android HAL 介面慣例:
- 如果 API 提供參照
sync_pt
的檔案描述元, 使用 API 的廠商驅動程式或 HAL 必須關閉檔案描述元。 - 如果廠商驅動程式或 HAL 傳遞的檔案描述元
對 API 函式的
sync_pt
,供應商驅動程式或 HAL 不得 關閉檔案描述元 - 如要繼續使用圍欄檔案描述元、供應商驅動程式或 HAL 必須複製描述元。
每次通過 BufferQueue 時,Fence 物件都會重新命名。
核心圍欄支援可讓 Fences 擁有名稱字串,因此同步處理
架構會使用目前正在排入佇列的視窗名稱和緩衝區索引
圍欄,例如 SurfaceView:0
。這個
有助偵錯在名稱顯示時,找出死結的來源
會列於 /d/sync
和錯誤報告的輸出內容中。
ANativeWindow 整合
ANativeWindow 會偵測圍欄。dequeueBuffer
,
queueBuffer
和 cancelBuffer
具有圍欄參數。
OpenGL ES 整合
OpenGL ES 同步處理整合功能需要使用兩個 EGL 擴充功能:
EGL_ANDROID_native_fence_sync
可讓您 納入或建立原生 Android 圍欄檔案描述元EGLSyncKHR
物件。EGL_ANDROID_wait_sync
允許 GPU 端的停頓 而非 CPU 端,因此 GPU 會等待EGLSyncKHR
。EGL_ANDROID_wait_sync
副檔名與EGL_KHR_wait_sync
擴充功能。
如要單獨使用這些擴充功能,請導入
EGL_ANDROID_native_fence_sync
個擴充功能和相關聯的
核心支援接著,請啟用 EGL_ANDROID_wait_sync
。EGL_ANDROID_native_fence_sync
擴充功能由獨特的原生圍欄 EGLSyncKHR
物件組成
類型。因此,凡是套用至現有EGLSyncKHR
的額外資訊
物件類型不一定適用於 EGL_ANDROID_native_fence
避免不必要的互動
EGL_ANDROID_native_fence_sync
擴充功能採用對應的原生程式碼
圍欄檔案描述元屬性只能在建立時設定,
無法直接從現有的同步物件查詢。此屬性
可設為以下兩種模式之一:
- 有效的圍欄檔案描述元會包裝現有的原生檔案
EGLSyncKHR
物件中的 Android 圍欄檔案描述元。 - -1 會根據
EGLSyncKHR
物件。
使用 DupNativeFenceFD()
函式呼叫來擷取
從原生 Android 圍欄檔案描述元中擷取 EGLSyncKHR
物件。
這相當於查詢 set 屬性的結果,但會遵守
收件者關閉圍欄的慣例 (因此
作業)。最後,刪除 EGLSyncKHR
物件會關閉
輸入內部圍欄屬性
Hardware Composer 整合
Hardware Composer 會處理三種類型的同步圍欄:
- 取得圍欄會連同輸入緩衝區一併傳遞給
setLayerBuffer
和setClientTarget
呼叫。 這些代表待處理的寫入緩衝區,且必須在 SurfaceFlinger 或 HWC 會嘗試從相關聯的緩衝區讀取資料 表演構圖 - 釋放圍欄會在呼叫
使用
getReleaseFences
呼叫presentDisplay
。 這些代表來自相同圖層上前一個緩衝區的待處理讀取。A 罩杯 當 HWC 不再使用上一個緩衝區時,釋出圍欄信號 因為目前的緩衝區已取代螢幕上先前的緩衝區。 發布柵欄會與先前使用的緩衝區一起傳遞給應用程式 會在目前的組合期間替換。應用程式必須等待 先釋放柵欄信號,再將新內容寫入緩衝區 傳回的訊息。 - 系統會傳回存在圍欄,每個頁框一個,屬於
對
presentDisplay
的呼叫。圍欄 是指 這個影格完成 或 相反地 不再需要前一個影格的組合結果。實體適用 螢幕,presentDisplay
會在 螢幕上就會顯示目前的畫面傳回存在的柵欄後, 您可以放心地再次寫入 SurfaceFlinger 目標緩衝區 如果是虛擬螢幕,系統會在 表示安全。