專家
圖片 Pipe 2
定義於 fuchsia.images/image_pipe2.fidl
ImagePipe 是一種在生產端與可能在不同程序中執行的取用端串流共用映像檔的機制。
概念上,映像檔管道會保留生產者提供的圖片資源資料表,並會將該資料表儲存在哪個表示法佇列中,其中含有生產者要求消費者呈現的一系列圖片。
簡報佇列一開始是空的,
簡報佇列中的每個項目都包含一張圖片,以及一組選用的同步柵欄:
- 取得圍欄:製作人會在圖片準備就緒時發出信號
- 發布圍欄:消費者可在圖片可以自由釋放或修改圖片時,發出信號
製作者會執行下列一系列步驟來呈現內容:
- 分配一些 BufferCollections 並新增至圖片管道,讓取用者設定限制。
- 分配一些圖片 (通常是 2 或 3) 並新增至映像檔管道,以使用
AddImage()
建立集區。 - 從集區取得下一張可用的映像檔。
- 要求取用者使用
PresentImage()
將圖片排入佇列,並提供柵欄。 - 開始轉譯圖片。
- 算繪完成時,請發出圖片的收景圍欄。
- 循環展示更多圖片,監聽發布柵欄的信號,將圖片回收回集區。
取用端會針對展示佇列中的佇列中的每張圖片執行下列步驟:
- 請等待圖片的收購柵欄上的信號。
- 如果無法滿足圍欄等待要求或偵測到其他錯誤,請關閉圖片管道。否則,即可開始展示圖片內容。
- 將先前顯示的圖片 (如有) 從顯示佇列中淘汰,並在不再需要時發出釋放圍框。
- 繼續展示同一張圖片,直到下一張圖片準備就緒為止。迴圈。
如果生產端想要關閉映像檔管道,則應:
- 關閉連接端。
- 等待透過
PresentImage()
提交的所有發布柵欄的緩衝區。 - 繼續執行資源清除作業。
當取用者偵測到圖片管道關閉時,應該:
- 停止使用/呈現管道的任何圖片。
- 取消對應所有與管道中圖片相關聯的記憶體物件。
- 關閉所有 BufferCollection 資源。
- 為顯示和排入佇列的緩衝區發出所有發布圍欄。
- 關閉圍欄的所有控點。
- 關閉連接端。
當任一方偵測到圍欄已棄權 (在沒有訊號的情況下從遠端關閉),應假設相關聯的映像檔處於不確定狀態。一般來說,當另一方 (或其委派對象) 當機時,就會發生這種情況。最安全的做法是關閉映像檔管道、釋出與其他方共用的所有資源,然後重新建立連線即可復原。
新增緩衝區集合
將 BufferCollection 資源新增至圖片管道。
生產端應針對透過 AddImage()
新增的映像檔設定這項資源的限制。取用端可在 buffer_collection_token
前後設定限制。請注意,只有在所有 BufferCollectionToken 執行個體都設定在生產端和取用端端的限制的情況下,系統才會分配緩衝區。詳情請參閱 collection.fidl。
下列錯誤會造成連線關閉:
- 「
buffer_collection_id
」已註冊
要求
名稱 | 類型 |
---|---|
buffer_collection_id |
uint32
|
buffer_collection_token |
fuchsia.sysmem/BufferCollectionToken
|
新增圖片
將圖片資源新增至圖片管道。
buffer_collection_id
是指透過 AddBufferCollection()
註冊的 BufferCollectionToken 執行個體。配置的基礎記憶體物件可用來處理圖片資料。buffer_collection_index
是在 BufferCollection 中所分配的記憶體物件索引。
image_format
指定圖片屬性。coded_width
和 coded_height
是用來設定圖片尺寸。
建立由同一個記憶體物件支援的多張圖片是有效的,這些圖片甚至可以重疊。消費者必須偵測到這項行為,並據此進行處理。
下列錯誤會造成連線關閉:
- 「
image_id
」已註冊 buffer_collection_id
是指未註冊的 BufferCollection。buffer_collection_index
會指向初始化 BufferCollection 邊界內的資源索引- 已註冊的 BufferCollection 未分配任何資源。
要求
名稱 | 類型 |
---|---|
image_id |
uint32
|
buffer_collection_id |
uint32
|
buffer_collection_index |
uint32
|
image_format |
fuchsia.sysmem/ImageFormat_2
|
展示圖片
將指定圖片排入佇列,以供取用者呈現。
acquire_fences
是一組圍欄,生產者必須在消費者顯示圖片前發出信號。release_fences
是一組圍欄,會通知生產者可以放心任意釋放或修改 image_id
圖片,而且您可以在 acquire_fences
中放心重複使用圍欄。當 image_id
不再顯示後,取用端必須發出 release_fences
中的所有圍欄。收到任何 release_fences
訊號後,生產端可能會重複使用資源。
這項設計可讓生產端將影像處理作業分散到多個執行緒 / 程序,而不會發生不必要的協調延遲。每個執行緒 / 程序在轉譯自身的 image_id
片段時,會在 acquire_fences
中發出自身的圍欄,並在 release_fences
中等待自己進入柵欄,以便在 image_id
中算繪新內容。
presentation_time
會指定用戶端應在何時開始顯示已加入佇列的作業 (螢幕上的燈號像素),以 CLOCK_MONOTONIC
時間集的奈秒表示。所需的顯示時間必須是單調遞增。
presentation_info
會傳回所提交影格和未來影格的時間資訊 (請參閱 deck_info.fidl)。
生產端可能會決定不向圖片發出 acquire_fences
信號。在此情況下,如果較新圖片已排入佇列,且之後圖片的 presentation_time
出現,則當較新圖片的 acquire_fences
收到訊號時,取用端就會顯示較新圖片。取用端也會發出較早圖片的 release_fences
,並從顯示佇列中移除。這個序列具有取消機制。
下列錯誤會造成連線關閉:
image_id
並未參照目前註冊的圖片資源
要求
名稱 | 類型 |
---|---|
image_id |
uint32
|
presentation_time |
uint64
|
acquire_fences |
vector<event>[16]
|
release_fences |
vector<event>[16]
|
回應
名稱 | 類型 |
---|---|
presentation_info |
PresentationInfo
|
移除緩衝區集合
從管道中移除 BufferCollection 資源。
buffer_collection_id
資源以及與該 BufferCollection 相關聯的所有映像檔都會遭到卸離。產生的結果與在 buffer_collection_id
的所有圖片上呼叫 RemoveImage()
相同。
由於圖片可能仍在展示佇列中,因此生產端必須等待所有與映像檔相關聯的發布柵欄收到訊號,才能釋出或修改基礎記憶體物件。
下列錯誤會造成連線關閉:
buffer_collection_id
並未參照目前已註冊的 BufferCollection
要求
名稱 | 類型 |
---|---|
buffer_collection_id |
uint32
|
移除圖片
從管道中移除圖片資源。
image_id
會從映像檔資源卸離,您可任意重複使用來新增圖片資源。
從圖片管道移除圖片,不會影響展示佇列或目前顯示的圖片。
由於圖片可能仍在展示佇列中,因此生產端必須等待與圖片相關聯的所有發布柵欄收到訊號,才能釋出或修改基礎記憶體物件。
下列錯誤會造成連線關閉:
image_id
並未參照目前註冊的圖片資源
要求
名稱 | 類型 |
---|---|
image_id |
uint32
|
結構
圖片資訊
定義於 fuchsia.images/image_info.fidl
圖像圖片 (紋理) 的相關資訊,包括格式和大小。
欄位 | 類型 | 說明 | 預設 |
---|---|---|---|
transform |
Transform
|
指定是否應先鏡像顯示圖片再顯示。 |
Transform.NORMAL |
width |
uint32
|
圖片的寬度和高度 (以像素為單位)。 |
無預設 |
height |
uint32
|
無預設 | |
stride |
uint32
|
圖片緩衝區中每個資料列的位元組數。 |
無預設 |
pixel_format |
PixelFormat
|
圖片的像素格式。 |
PixelFormat.BGRA_8 |
color_space |
ColorSpace
|
像素色域。 |
ColorSpace.SRGB |
tiling |
Tiling
|
記憶體中的像素排列方式。 |
傾斜。 |
alpha_format |
AlphaFormat
|
指定 Alpha 管道 (如果有的話) 的解釋, |
AlphaFormat.OPAQUE |
簡報資訊
定義於 fuchsia.images/presentation_info.fidl
當取用者開始準備含有顯示內容的第一個影格時,由 ImagePipe.PresentImage()
和 Session.Present()
等方法回傳的資訊。
欄位 | 類型 | 說明 | 預設 |
---|---|---|---|
presentation_time |
uint64
|
預計佇列作業實際生效的時間,以 這個值會隨著每個新影格單調遞增,通常會以 |
無預設 |
presentation_interval |
uint64
|
預期在連續呈現影格之間經過的時間,以奈秒表示。算繪至螢幕時,間隔通常會衍生自螢幕重新整理頻率。 這個值不是零。有時可能有所不同,例如變更顯示模式時。 |
無預設 |
表情符號
AlphaFormat strict
類型:uint32
定義於 fuchsia.images/image_info.fidl
指定 Alpha 資訊的解讀方式。
名稱 | 值 | 說明 |
---|---|---|
不連續 |
0 |
系統會將圖片視為不透明。系統會忽略 Alpha 版。混合函式為:src.RGB |
預先闢謠 |
1 |
色彩管道已由 Alpha 版本乘以。混合函式為:src.RGB + (landing.RGB * (1 - src.A)) |
未預先闢謠 |
2 |
尚未套用 Alpha 色版。混合函式為:(src.RGB * src.A) + (dest.RGB * (1 - src.A)) |
ColorSpace strict -
類型:uint32
定義於 fuchsia.images/image_info.fidl
指定系統應如何解讀像素顏色資訊。
名稱 | 值 | 說明 |
---|---|---|
SRGB |
0 |
MemoryType strict
類型:uint32
定義於 fuchsia.images/memory_type.fidl
指定 VMO 記憶體的類型。
名稱 | 值 | 說明 |
---|---|---|
主機_MEMORY |
0 |
VMO 是一般的主機 CPU 記憶體。 |
VK_裝置_MEMORY |
1 |
使用包裝 VkMemoryAllocateInfo 的 VkImportMemoryFuchsiaHandleInfoKHR 呼叫 VkAllocateMemory 後,即可將 VMO 匯入為 VkDeviceMemory。 |
像素格式嚴格
類型:uint32
定義於 fuchsia.images/image_info.fidl
指定圖片緩衝區中的像素表示方式。
名稱 | 值 | 說明 |
---|---|---|
BGRA_8 |
0 |
BGRA_8 32 位元四元件無正負號整數格式。
位元組順序:B、G、R、A (小端子 ARGB 封裝 32 位元單字)。
等同於 Skia |
YUY2 |
1 |
YUY2 4:2:2 (2x 水平向下取樣 UV;垂直完全垂直 UV) 包含 2 像素資訊的 32 位元元件:位元組順序:Y1、U、Y2、V 解壓縮至 2 RGB 像素,其中 RGB1 = func(Y1, U, V) 和 RGB2 = func(Y2, U, V) 與 YUV422 相等 |
NV12 |
2 |
NV12 4:2:0 (雙向取樣 2 倍的紫外線) 偏移 0: 每像素 Y 平面 8 位元,搭配位元組 YYY。 偏移高度 * 步長: 8 位元 UV 資料交錯位元組,做為 UVUV Y 平面的線條步距 >= 寬度。 在這種情況下,寬度和高度都必須為均等。 UV 資料會分為「線」,每個「行」的位元組寬度與 Y 資料的行距相同,且「行」步距與 Y 資料行距相同。UV 資料的高度 / 2「線」。 將 RGB 資料轉換為 RGB 時,兩個方向的整體 UV 資料縮放比例為 2 倍。此註解刻意顯示 UV 提升階段/篩選/訊號處理程序的運作方式,這是很複雜的主題,可能會因實作方式而改變,通常不會降低向上擴充的速度和品質。您可以查看相關轉換程式碼中的註解,瞭解任何指定轉換路徑的做法。UV 資料的精確相對階段目前不會傳達。 |
YV12 |
3 |
YV12 與 I420 類似,但有 V 和 U 互換除外。 4:2:0 (雙向取樣 2 倍的紫外線) 偏移 0: 每像素 Y 平面 8 位元,搭配位元組 YYY。 偏移高度 * 步長: 8 位元 V 資料 (含 uv_stride = stride / 2 Offset 高度 * stride + uv_stride * height / 2: 8 位元 U 資料,含 uv_stride = stride / 2) Y 平面的線條步距 >= 寬度。 寬度和高度都必須一致。 |
R8G8B8A8 |
4 |
R8G8B8A8 32 位元四元件無正負號整數格式。
位元組順序:R、G、B、A (小端的 ABGR 封裝的 32 位元單字)。
等同於 Skia 這個格式只能搭配 VK_DEVICE_MEMORY 使用。 |
並排測試嚴格
類型:uint32
定義於 fuchsia.images/image_info.fidl
指定記憶體中的像素排列方式。
名稱 | 值 | 說明 |
---|---|---|
首選頻道 |
0 |
像素會以線性方式封裝。等同於 |
GPU 最佳化 |
1 |
像素是以 GPU 為依據的最佳格式。等同於 |
轉換嚴格
類型:uint32
定義於 fuchsia.images/image_info.fidl
名稱 | 值 | 說明 |
---|---|---|
一般 |
0 |
Pixel 會正常顯示, |
FLIP_HORIZONTAL |
1 |
像素皆朝左方向鏡像。 |
FLIP_VERTICAL |
2 |
Pixel 會垂直翻轉。 |
FLIP_VERTICAL_和_HORIZONTAL |
3 |
垂直翻轉像素,方向為左右翻轉。 |
場景
名稱 | 值 | 類型 | 說明 |
---|---|---|---|
MAX_ACQUIRE_RELEASE_FENCE_COUNT 人 |
16
|
int32 |
已淘汰:13
|