Khung đồng bộ hoá mô tả rõ ràng các phần phụ thuộc giữa các hoạt động không đồng bộ khác nhau trong hệ thống đồ hoạ Android. Khung cung cấp một API cho phép các thành phần cho biết thời điểm giải phóng vùng đệm. Khung này cũng cho phép truyền dữ liệu gốc đồng bộ hoá giữa các trình điều khiển từ nhân hệ điều hành vào không gian người dùng và giữa các quy trình của không gian người dùng.
Ví dụ: một ứng dụng có thể thêm công việc vào hàng đợi để thực hiện trong GPU. GPU bắt đầu vẽ hình ảnh đó. Mặc dù hình ảnh chưa được vẽ vào bộ nhớ, con trỏ vùng đệm được truyền đến cửa sổ trình tổng hợp cùng với một hàng rào cho biết thời điểm GPU hoạt động kết thúc. Trình tổng hợp cửa sổ bắt đầu xử lý trước và truyền công việc cho bộ điều khiển hiển thị. Tương tự như vậy, CPU hoạt động được thực hiện trước thời hạn. Sau khi GPU kết thúc, bộ điều khiển hiển thị sẽ hiển thị hình ảnh ngay lập tức.
Khung đồng bộ hoá cũng cho phép người triển khai tận dụng trong các thành phần phần cứng của riêng chúng. Cuối cùng, khung cung cấp khả năng hiển thị trong quy trình đồ hoạ để giúp gỡ lỗi.
Đồng bộ hoá rõ ràng
Hoạt động đồng bộ hoá tường minh cho phép nhà sản xuất và người sử dụng vùng đệm đồ hoạ để báo hiệu khi chúng sử dụng xong bộ đệm. Đồng bộ hoá rõ ràng được triển khai trong không gian nhân.
Lợi ích của tính năng đồng bộ hoá tường minh bao gồm:
- Ít thay đổi hơn về hành vi giữa các thiết bị
- Hỗ trợ gỡ lỗi hiệu quả hơn
- Cải thiện các chỉ số kiểm thử
Khung đồng bộ hoá có 3 loại đối tượng:
sync_timeline
sync_pt
sync_fence
đồng bộ hoá dòng thời gian
sync_timeline
là dòng thời gian tăng đơn điệu
nên triển khai cho từng thực thể trình điều khiển (chẳng hạn như ngữ cảnh GL),
bộ điều khiển màn hình hoặc công cụ 2D. Số lượng sync_timeline
công việc được gửi tới nhân hệ điều hành cho một phần cứng cụ thể.
sync_timeline
đảm bảo về thứ tự của các toán tử
và cho phép triển khai theo phần cứng cụ thể.
Hãy làm theo các nguyên tắc sau khi triển khai sync_timeline
:
- Cung cấp tên hữu ích cho tất cả người lái xe, dòng thời gian và hàng rào để đơn giản hoá gỡ lỗi.
- Triển khai
timeline_value_str
vàpt_value_str
trong tiến trình để làm cho kết quả gỡ lỗi dễ đọc hơn. - Triển khai
driver_data
lấp đầy để cung cấp cho các thư viện không gian người dùng, chẳng hạn như thư viện GL, truy cập vào dữ liệu dòng thời gian riêng tư, nếu muốn.data_driver
cho phép nhà cung cấp truyền thông tin về thuộc tính bất biếnsync_fence
vàsync_pts
để tạo các dòng lệnh dựa trên chúng. - Không cho phép không gian người dùng tạo hoặc báo hiệu rõ ràng cho hàng rào. Rõ ràng việc tạo ra tín hiệu/hàng rào sẽ dẫn đến cuộc tấn công từ chối dịch vụ tạm dừng chức năng của quy trình.
- Không truy cập
sync_timeline
,sync_pt
hoặc Các phần tửsync_fence
một cách rõ ràng. API này cung cấp tất cả thông tin bắt buộc .
đồng bộ hoá
sync_pt
là một giá trị hoặc điểm duy nhất trên
sync_timeline
. Một điểm
có 3 trạng thái: đang hoạt động, được báo hiệu và lỗi. Điểm bắt đầu ở trạng thái đang hoạt động
và chuyển sang trạng thái được báo hiệu hoặc lỗi. Ví dụ: khi một hình ảnh
người tiêu dùng không còn cần vùng đệm, sync_pt
được báo hiệu
để trình tạo hình ảnh biết rằng có thể ghi lại vào bộ đệm.
hàng_bào_đồng_bộ
sync_fence
là một tập hợp sync_pt
giá trị
thường xuyên
có sync_timeline
mẹ khác nhau (chẳng hạn như đối với màn hình
bộ điều khiển và GPU). sync_fence
, sync_pt
và
sync_timeline
là các dữ liệu gốc chính mà trình điều khiển và không gian người dùng
dùng để truyền đạt các phần phụ thuộc. Khi hàng rào được báo hiệu, tất cả
được đưa ra trước hàng rào được đảm bảo hoàn chỉnh vì
trình điều khiển nhân hệ điều hành hoặc khối phần cứng sẽ thực thi các lệnh theo thứ tự.
Khung đồng bộ hoá cho phép nhiều người tiêu dùng hoặc nhà sản xuất đưa ra tín hiệu khi họ
đã sử dụng xong một vùng đệm, giao tiếp thông tin về phần phụ thuộc bằng một hàm
. Hàng rào được hỗ trợ bằng một chỉ số mô tả tệp và được truyền từ
không gian nhân hệ điều hành sang không gian người dùng. Ví dụ: một hàng rào có thể chứa hai
Giá trị sync_pt
biểu thị khi hai đối tượng sử dụng hình ảnh riêng biệt hoàn tất
đọc một bộ đệm. Khi hàng rào được báo hiệu, người sản xuất hình ảnh biết rằng cả hai
mà người tiêu dùng đã xem.
Hàng rào, như giá trị sync_pt
, bắt đầu hoạt động và thay đổi trạng thái dựa trên
trạng thái điểm của họ. Nếu tất cả giá trị sync_pt
được báo hiệu, thì giá trị
sync_fence
sẽ được báo hiệu. Nếu có một sync_pt
rơi
chuyển sang trạng thái lỗi, toàn bộ sync_fence
sẽ có trạng thái lỗi.
Thành viên trong sync_fence
là không thể thay đổi sau khi hàng rào được
đã tạo. Để có nhiều điểm trong một hàng rào, ô hợp nhất sẽ được
được thực hiện tại nơi các điểm từ hai hàng rào riêng biệt được thêm vào hàng rào thứ ba.
Nếu một trong các điểm đó được báo hiệu trong hàng rào ban đầu còn điểm kia thì không,
hàng rào thứ ba cũng sẽ không ở trạng thái được báo hiệu.
Để triển khai quá trình đồng bộ hoá rõ ràng, hãy cung cấp thông tin sau:
- Một hệ thống con trong không gian nhân triển khai khung đồng bộ hoá
cho một trình điều khiển phần cứng cụ thể. Những người lái xe cần nhận thức được rằng bạn cần phải cảnh giác
thường là mọi thứ truy cập hoặc giao tiếp với Hardware Composer (Trình tổng hợp phần cứng).
Các tệp chính bao gồm:
- Cách triển khai cốt lõi:
kernel/common/include/linux/sync.h
kernel/common/drivers/base/sync.c
- Tài liệu tại
kernel/common/Documentation/sync.txt
- Thư viện để giao tiếp với không gian nhân trong
platform/system/core/libsync
- Cách triển khai cốt lõi:
- Nhà cung cấp phải thực hiện đồng bộ hoá thích hợp
hàng rào làm tham số cho
validateDisplay()
và HàmpresentDisplay()
trong HAL. - Hai tiện ích GL liên quan đến hàng rào (
EGL_ANDROID_native_fence_sync
vàEGL_ANDROID_wait_sync
) cũng như hỗ trợ hàng rào trong đồ hoạ trình điều khiển.
Nghiên cứu điển hình: Triển khai trình điều khiển hiển thị
Để sử dụng API hỗ trợ chức năng đồng bộ hoá,
phát triển một trình điều khiển hiển thị có chức năng vùng đệm hiển thị. Trước
đã tồn tại khung đồng bộ hoá, hàm này sẽ nhận được dma-buf
đối tượng, đặt các vùng đệm đó lên màn hình và chặn trong khi vùng đệm đó hiển thị. Ví dụ:
/* * assumes buffer is ready to be displayed. returns when buffer is no longer on * screen. */ void display_buffer(struct dma_buf *buffer);
Với khung đồng bộ hoá, hàm display_buffer
phức tạp hơn. Khi hiển thị một vùng đệm, vùng đệm đó sẽ được liên kết
có hàng rào cho biết thời điểm vùng đệm sẽ sẵn sàng. Bạn có thể thêm vào danh sách chờ
và bắt đầu công việc sau khi hàng rào dọn dẹp.
Việc xếp hàng đợi và bắt đầu công việc sau khi hàng rào dọn dẹp không chặn bất cứ thứ gì. Bạn sẽ ngay lập tức trả về hàng rào của riêng mình, việc này đảm bảo khi vùng đệm sẽ tắt màn hình. Khi bạn xếp hàng đợi bộ đệm, nhân hệ điều hành sẽ liệt kê các phần phụ thuộc có khung đồng bộ hoá:
/* * 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);
Tích hợp tính năng đồng bộ hoá
Phần này giải thích cách tích hợp khung đồng bộ hoá không gian nhân hệ điều hành với các phần không gian người dùng của khung Android và các trình điều khiển phải giao tiếp với nhau. Đối tượng không gian hạt nhân được biểu thị dưới dạng chỉ số mô tả tệp trong không gian người dùng.
Quy ước tích hợp
Tuân thủ các quy ước giao diện HAL (Lớp trừu tượng phần cứng) cho Android:
- Nếu API cung cấp chỉ số mô tả tệp tham chiếu đến
sync_pt
, trình điều khiển của nhà cung cấp hoặc HAL (Lớp trừu tượng phần cứng) sử dụng API phải đóng chỉ số mô tả tệp. - Nếu trình điều khiển của nhà cung cấp hoặc HAL truyền một chỉ số mô tả tệp có chứa
sync_pt
vào một hàm API, thì trình điều khiển của nhà cung cấp hoặc HAL không được đóng chỉ số mô tả tệp. - Để tiếp tục sử dụng chỉ số mô tả tệp của hàng rào, trình điều khiển của nhà cung cấp hoặc HAL (Lớp trừu tượng phần cứng) phải sao chép phần mô tả.
Một đối tượng hàng rào được đổi tên mỗi khi đối tượng đó đi qua BufferQueue.
Tính năng hỗ trợ hàng rào hạt nhân cho phép hàng rào có chuỗi tên, vì vậy, quá trình đồng bộ hoá
khung sử dụng tên cửa sổ và chỉ mục bộ đệm đang được xếp hàng đợi theo tên
hàng rào, chẳng hạn như SurfaceView:0
. Chiến dịch này
rất hữu ích trong việc gỡ lỗi để xác định nguồn gây tắc nghẽn khi tên xuất hiện
trong kết quả của /d/sync
và báo cáo lỗi.
Tích hợp ANativeWindow
ANativeWindow có thể nhận biết được hàng rào. dequeueBuffer
,
queueBuffer
và cancelBuffer
có tham số hàng rào.
Tích hợp OpenGL ES
Tính năng tích hợp đồng bộ hoá OpenGL ES dựa trên 2 tiện ích EGL:
EGL_ANDROID_native_fence_sync
cung cấp một cách để bao bọc hoặc tạo chỉ số mô tả tệp gốc của hàng rào Android trong Đối tượngEGLSyncKHR
.EGL_ANDROID_wait_sync
cho phép quầy hàng phía GPU thay vì phía CPU, khiến GPU phải đợiEGLSyncKHR
. Chiến lược phát hành đĩa đơn Phần mở rộngEGL_ANDROID_wait_sync
giống vớiEGL_KHR_wait_sync
.
Để sử dụng các tiện ích mở rộng này một cách độc lập, hãy triển khai
EGL_ANDROID_native_fence_sync
tiện ích cùng với tiện ích được liên kết
hỗ trợ kernel. Tiếp theo, hãy bật EGL_ANDROID_wait_sync
tiện ích bổ sung trong trình điều khiển của bạn. EGL_ANDROID_native_fence_sync
tiện ích bao gồm một đối tượng EGLSyncKHR
hàng rào riêng biệt
loại. Do đó, các tiện ích áp dụng cho EGLSyncKHR
hiện tại
kiểu đối tượng không nhất thiết phải áp dụng cho EGL_ANDROID_native_fence
để tránh các hoạt động tương tác không mong muốn.
Tiện ích EGL_ANDROID_native_fence_sync
sử dụng một quảng cáo gốc tương ứng
Thuộc tính mô tả tệp hàng rào chỉ có thể được đặt tại thời điểm tạo và
không thể truy vấn trực tiếp trở đi từ đối tượng đồng bộ hoá hiện có. Thuộc tính này
có thể đặt ở một trong hai chế độ:
- Phần mô tả tệp hàng rào hợp lệ bao bọc một mã gốc hiện có
Chỉ số mô tả tệp của hàng rào Android trong đối tượng
EGLSyncKHR
. - -1 tạo chỉ số mô tả tệp hàng rào Android gốc từ một
Đối tượng
EGLSyncKHR
.
Sử dụng lệnh gọi hàm DupNativeFenceFD()
để trích xuất
EGLSyncKHR
trong chỉ số mô tả tệp gốc của hàng rào Android.
Thao tác này có kết quả tương tự như truy vấn thuộc tính tập hợp, nhưng tuân thủ
quy ước rằng người nhận đóng hàng rào (do đó mã trùng lặp
hoạt động). Cuối cùng, việc huỷ đối tượng EGLSyncKHR
sẽ đóng
thuộc tính hàng rào bên trong.
Tích hợp Hardware Composer (Trình tổng hợp phần cứng)
Hardware Composer xử lý 3 loại hàng rào đồng bộ hoá:
- Có được hàng rào được truyền cùng với vùng đệm đầu vào để
các lệnh gọi
setLayerBuffer
vàsetClientTarget
. Các đối tượng này biểu thị một lệnh ghi đang chờ xử lý vào bộ đệm và phải báo hiệu trước khi SurfaceFlinger hoặc HWC cố gắng đọc từ vùng đệm liên kết để thực hiện soạn thảo. - Hàng rào thả được truy xuất sau lệnh gọi đến
presentDisplay
bằng lệnh gọigetReleaseFences
. Các đối tượng này đại diện cho hoạt động đọc đang chờ xử lý từ vùng đệm trước trên cùng một lớp. Đáp giải phóng tín hiệu hàng rào khi HWC không còn sử dụng vùng đệm trước đó vì bộ đệm hiện tại đã thay thế bộ đệm trước đó trên màn hình. Hàng rào phát hành được chuyển trở lại ứng dụng cùng với các vùng đệm trước đó sẽ được thay thế trong cấu trúc hiện tại. Ứng dụng phải đợi cho đến khi giải phóng tín hiệu hàng rào trước khi ghi nội dung mới vào vùng đệm đã được trả lại cho họ. - Hàng rào trình bày được trả về, một hàng rào cho mỗi khung hình như một phần của
lệnh gọi đến
presentDisplay
. Hàng rào hiện tại biểu thị thời điểm cấu trúc của khung này đã hoàn thành, hoặc luân phiên, khi kết quả tổng hợp của khung trước không còn cần thiết nữa. Cho vật lý hiển thị,presentDisplay
sẽ trả về hàng rào hiện tại khi khung hiện tại sẽ xuất hiện trên màn hình. Sau khi hàng rào hiện tại được trả về, có thể ghi an toàn vào bộ đệm mục tiêu SurfaceFlinger, nếu có thể áp dụng. Đối với màn hình ảo, hàng rào hiện tại sẽ được trả về khi an toàn để đọc từ vùng đệm đầu ra.