Google cam kết thúc đẩy công bằng chủng tộc cho Cộng đồng người da đen. Xem cách thực hiện.

Khung đồng bộ hóa

Khung đồng bộ hóa mô tả rõ ràng sự phụ thuộc giữa các hoạt động không đồng bộ khác nhau trong hệ thống đồ họa Android. Khung công tác cung cấp một API cho phép các thành phần chỉ ra khi nào bộ đệm được phát hành. Khuôn khổ này cũng cho phép các nguyên tắc đồng bộ hóa được chuyển giữa các trình điều khiển từ hạt nhân đến không gian người dùng và giữa chính các quy trình trong không gian người dùng.

Ví dụ: một ứng dụng có thể xếp hàng đợi công việc được thực hiện trong GPU. GPU bắt đầu vẽ hình ảnh đó. Mặc dù hình ảnh vẫn chưa được đưa vào bộ nhớ, nhưng con trỏ bộ đệm sẽ được chuyển đến trình tổng hợp cửa sổ cùng với một hàng rào cho biết khi nào công việc GPU sẽ kết thúc. Trình tổng hợp cửa sổ bắt đầu xử lý trước thời hạn và chuyển công việc cho bộ điều khiển hiển thị. Theo cách tương tự, công việc của CPU được thực hiện trước thời hạn. Khi GPU kết thúc, bộ điều khiển hiển thị ngay lập tức hiển thị hình ảnh.

Khung đồng bộ hóa cũng cho phép người triển khai tận dụng tài nguyên đồng bộ hóa trong các thành phần phần cứng của riêng họ. Cuối cùng, khuôn khổ cung cấp khả năng hiển thị vào đường ống đồ họa để giúp gỡ lỗi.

Đồng bộ hóa rõ ràng

Đồng bộ hóa rõ ràng cho phép nhà sản xuất và người tiêu dùng bộ đệm đồ họa báo hiệu khi họ sử dụng bộ đệm xong. Đồng bộ hóa rõ ràng được thực hiện trong không gian hạt nhân.

Các lợi ích của đồng bộ hóa rõ ràng bao gồm:

  • Ít thay đổi hành vi giữa các thiết bị
  • Hỗ trợ gỡ lỗi tốt hơn
  • Các chỉ số thử nghiệm được cải thiện

Khung đồng bộ có ba loại đối tượng:

  • sync_timeline
  • sync_pt
  • sync_fence

sync_timeline

sync_timeline là một dòng thời gian tăng đơn điệu mà các nhà cung cấp nên triển khai cho từng phiên bản trình điều khiển, chẳng hạn như bối cảnh GL, bộ điều khiển hiển thị hoặc bộ điều khiển 2D. sync_timeline đếm các công việc được gửi tới hạt nhân cho một phần cứng cụ thể. sync_timeline cung cấp đảm bảo về thứ tự hoạt động và cho phép triển khai phần cứng cụ thể.

Thực hiện theo các nguyên tắc sau khi triển khai sync_timeline :

  • Cung cấp các tên hữu ích cho tất cả các trình điều khiển, dòng thời gian và hàng rào để đơn giản hóa việc gỡ lỗi.
  • Triển khai toán tử timeline_value_strpt_value_str trong dòng thời gian để làm cho đầu ra gỡ lỗi dễ đọc hơn.
  • Triển khai điền driver_data để 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, quyền 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 các nhà cung cấp chuyển thông tin về sync_fencesync_pts không thể thay đổi để xây dựng 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 một cách rõ ràng hàng rào. Việc tạo ra các tín hiệu / hàng rào một cách rõ ràng dẫn đến một cuộc tấn công từ chối dịch vụ làm tạm dừng chức năng của đường ống.
  • Không truy cập rõ ràng vào các phần tử sync_timeline , sync_pt hoặc sync_fence . API cung cấp tất cả các chức năng cần thiết.

sync_pt

sync_pt là một giá trị hoặc điểm duy nhất trên dòng sync_timeline . Một điểm có ba trạng thái: hoạt động, báo hiệu và lỗi. Các điểm bắt đầu ở trạng thái hoạt động và chuyển sang trạng thái báo hiệu hoặc trạng thái lỗi. Ví dụ: khi người tiêu dùng hình ảnh không còn cần bộ đệm nữa, thì sync_pt sẽ được báo hiệu để nhà sản xuất hình ảnh biết rằng có thể ghi lại vào bộ đệm.

sync_fence

sync_fence là tập hợp các giá trị sync_pt thường có cha mẹ sync_timeline khác nhau (chẳng hạn như cho bộ điều khiển hiển thị và GPU). sync_fence , sync_ptsync_timeline là những nguyên thủy chính mà trình điều khiển và không gian người dùng sử dụng để giao tiếp các phụ thuộc của chúng. Khi một hàng rào được báo hiệu, tất cả các lệnh được đưa ra trước hàng rào được đảm bảo là hoàn tất vì trình điều khiển hạt nhân hoặc khối phần cứng thực hiện các lệnh theo thứ tự.

Khung đồng bộ cho phép nhiều người tiêu dùng hoặc nhà sản xuất báo hiệu khi họ sử dụng xong bộ đệm, truyền thông tin phụ thuộc bằng một tham số chức năng. Hàng rào được hỗ trợ bởi một bộ mô tả tệp và được chuyển từ không gian hạt nhân 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 người tiêu dùng hình ảnh riêng biệt đọc xong bộ đệm. Khi hàng rào được báo hiệu, các nhà sản xuất hình ảnh biết rằng cả hai người tiêu dùng đã hoàn tất việc tiêu thụ.

Các 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 của các điểm của chúng. Nếu tất cả các giá trị sync_pt trở thành tín hiệu, thì sync_fence sẽ được báo hiệu. Nếu một sync_pt rơi vào trạng thái lỗi, toàn bộ sync_fence có trạng thái lỗi.

Tư cách thành viên trong sync_fence là bất biến sau khi hàng rào được tạo. Để có được nhiều hơn một điểm trong hàng rào, quá trình hợp nhất được tiến hành trong đó 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 những điểm đó đã được báo hiệu trong hàng rào ban đầu và điểm còn lại 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 đồng bộ hóa rõ ràng, hãy cung cấp thông tin sau:

  • Một hệ thống con không gian hạt nhân triển khai khung đồng bộ cho một trình điều khiển phần cứng cụ thể. Trình điều khiển cần phải biết hàng rào nói chung là bất kỳ thứ gì truy cập hoặc giao tiếp với Trình soạn thảo phần cứng. Các tệp chính bao gồm:
    • Thực hiện 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 hạt nhân trong platform/system/core/libsync
  • Nhà cung cấp phải cung cấp các hàng rào đồng bộ hóa thích hợp làm tham số cho các hàm validateDisplay()presentDisplay() trong HAL.
  • Hai phần mở rộng GL liên quan đến hàng rào ( EGL_ANDROID_native_fence_syncEGL_ANDROID_wait_sync ) và hỗ trợ hàng rào trong trình điều khiển đồ họa.

Nghiên cứu điển hình: Triển khai trình điều khiển màn hình

Để sử dụng API hỗ trợ chức năng đồng bộ hóa, hãy phát triển trình điều khiển hiển thị có chức năng đệm hiển thị. Trước khi khung đồng bộ hóa tồn tại, hàm này sẽ nhận các đối tượng dma-buf , đặt các bộ đệm đó trên màn hình và chặn trong khi bộ đệ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ộ hóa, display_buffer phức tạp hơn. Trong khi hiển thị bộ đệm, bộ đệm được liên kết với một hàng rào cho biết khi nào bộ đệm sẽ sẵn sàng. Bạn có thể xếp hàng và bắt đầu công việc sau khi hàng rào được xóa.

Xếp hàng và bắt đầu công việc sau khi hàng rào được xóa không cản trở bất cứ điều gì. Bạn ngay lập tức trả lại hàng rào của riêng mình, điều này đảm bảo khi bộ đệm sẽ không hiển thị. Khi bạn xếp hàng các bộ đệm, hạt nhân liệt kê các phần phụ thuộc với khung đồng bộ hóa:

/*
 * 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 đồng bộ hóa

Phần này giải thích cách tích hợp khuôn khổ đồng bộ không gian hạt nhân với các phần không gian người dùng của khuôn khổ Android và các trình điều khiển phải giao tiếp với nhau. Các đối tượng không gian hạt nhân được biểu diễn dưới dạng bộ mô tả tệp trong không gian người dùng.

Quy ước tích hợp

Tuân theo các quy ước về giao diện HAL của Android:

  • Nếu API cung cấp bộ mô tả tệp tham chiếu đến sync_pt , thì trình điều khiển của nhà cung cấp hoặc HAL sử dụng API phải đóng bộ mô tả tệp.
  • Nếu trình điều khiển của nhà cung cấp hoặc HAL chuyển một trình mô tả tệp có chứa sync_pt tới 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 trình mô tả tệp.
  • Để tiếp tục sử dụng bộ mô tả tệp hàng rào, trình điều khiển của nhà cung cấp hoặc HAL phải sao chép bộ mô tả.

Một đối tượng hàng rào được đổi tên mỗi khi nó đi qua BufferQueue. Hỗ trợ hàng rào hạt nhân cho phép hàng rào có chuỗi cho tên, vì vậy khung đồng bộ sử dụng tên cửa sổ và chỉ mục bộ đệm đang được xếp hàng để đặt tên cho hàng rào, chẳng hạn như SurfaceView:0 . Điều này rất hữu ích trong việc gỡ lỗi để xác định nguồn gốc của bế tắc khi tên xuất hiện trong đầu ra của /d/sync và báo cáo lỗi.

Tích hợp ANativeWindow

ANativeWindow nhận thức được hàng rào. dequeueBuffer , queueBuffercancelBuffer có các tham số hàng rào.

Tích hợp OpenGL ES

Tích hợp đồng bộ hóa OpenGL ES dựa trên hai phần mở rộng EGL:

  • EGL_ANDROID_native_fence_sync cung cấp một cách để bọc hoặc tạo bộ mô tả tệp hàng rào Android gốc trong các đối tượng EGLSyncKHR .
  • EGL_ANDROID_wait_sync cho phép ngăn chặn phía GPU thay vì phía CPU, khiến GPU phải đợi EGLSyncKHR . Phần mở rộng EGL_ANDROID_wait_sync giống với phần mở rộng EGL_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 tiện ích mở rộng EGL_ANDROID_native_fence_sync cùng với hỗ trợ hạt nhân liên quan. Tiếp theo, bật tiện ích mở rộng EGL_ANDROID_wait_sync trong trình điều khiển của bạn. Phần mở rộng EGL_ANDROID_native_fence_sync bao gồm loại đối tượng EGLSyncKHR hàng rào gốc riêng biệt. Do đó, các tiện ích mở rộng áp dụng cho các loại đối tượng EGLSyncKHR hiện có không nhất thiết phải áp dụng cho các đối tượng EGL_ANDROID_native_fence , tránh các tương tác không mong muốn.

Phần mở rộng EGL_ANDROID_native_fence_sync sử dụng thuộc tính mô tả tệp hàng rào gốc tương ứng 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ộ hiện có. Thuộc tính này có thể được đặt thành một trong hai chế độ:

  • Bộ mô tả tệp hàng rào hợp lệ bao bọc bộ mô tả tệp hàng rào Android gốc hiện có trong đối tượng EGLSyncKHR .
  • -1 tạo bộ mô tả tệp hàng rào Android gốc từ đối tượng EGLSyncKHR .

Sử dụng lệnh gọi hàm DupNativeFenceFD() để trích xuất đối tượng EGLSyncKHR từ bộ mô tả tệp hàng rào Android gốc. Điều này có kết quả tương tự như truy vấn thuộc tính set, nhưng tuân theo quy ước rằng người nhận đóng hàng rào (do đó hoạt động trùng lặp). Cuối cùng, việc phá hủy đối tượng EGLSyncKHR đóng thuộc tính hàng rào bên trong.

Tích hợp phần cứng Composer

Phần cứng Composer xử lý ba loại hàng rào đồng bộ:

  • Các hàng rào thu được được chuyển cùng với các bộ đệm đầu vào cho các lệnh gọi setLayerBuffersetClientTarget . Chúng đại diện cho việc 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ừ bộ đệm liên quan để thực hiện thành phần.
  • Giải phóng hàng rào được truy xuất sau cuộc gọi tới presentDisplay bằng cách sử dụng lời gọi getReleaseFences . Chúng đại diện cho một lần đọc đang chờ xử lý từ bộ đệm trước đó trên cùng một lớp. Hàng rào giải phóng báo hiệu khi HWC không còn sử dụng bộ đệm trước đó nữa 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 bộ đệm trước đó sẽ được thay thế trong quá trình sáng tác hiện tại. Ứng dụng phải đợi cho đến khi hàng rào phát hành báo hiệu trước khi ghi nội dung mới vào bộ đệm được trả lại cho chúng.
  • Các hàng rào hiện tại được trả về, một hàng rào trên mỗi khung hình, như một phần của lệnh gọi tới presentDisplay . Hàng rào hiện tại biểu thị khi thành phần của khung này đã hoàn thành, hoặc thay thế, khi kết quả thành phần của khung trước đó không còn cần thiết nữa. Đối với màn hình vật lý, presentDisplay trả về các hàng rào hiện tại khi khung hiện tại xuất hiện trên màn hình. Sau khi các hàng rào hiện tại được trả lại, có thể an toàn để ghi lại vào bộ đệm đích SurfaceFlinger, nếu có. Đối với màn hình ảo, hàng rào hiện tại được trả về khi nó an toàn để đọc từ bộ đệm đầu ra.