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 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 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 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 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 hơn 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 mốc thời gian đơn điệu tăng mà các nhà cung cấp nên thực hiện cho mỗi trường hợp tài xế, chẳng hạn như một bối cảnh GL, điều khiển hiển thị, hoặc blitter 2D. sync_timeline đếm việc nộp cho cơ hạt nhân cho một đoạn cụ thể của phần cứng. sync_timeline cung cấp bảo lãnh về thứ tự của các hoạt động và cho phép triển khai phần cứng cụ thể.

Thực hiện theo các hướng dẫn khi thực hiện sync_timeline :

  • Cung cấp 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.
  • Thực hiện timeline_value_strpt_value_str nhà khai thác trong dòng thời gian để thực hiện gỡ lỗi đầu ra dễ đọc hơn.
  • Thực hiện điền driver_data để cung cấp cho userspace thư viện, chẳng hạn như thư viện GL, truy cập dữ liệu thời gian tư nhân, nếu muốn. data_driver cho phép các nhà cung cấp chuyển thông tin về bất biến sync_fencesync_pts đến dòng lệnh xây dựng 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 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 sync_timeline , sync_pt , hoặc sync_fence yếu tố một cách rõ ràng. 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ị duy nhất hoặc một điểm trên một 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 một người tiêu dùng hình ảnh không còn cần một bộ đệm, một sync_pt là tín hiệu do đó, một nhà sản xuất hình ảnh biết rằng nó okay để viết vào bộ đệm một lần nữa.

sync_fence

sync_fence là một tập hợp các sync_pt giá trị mà thường có khác nhau sync_timeline cha mẹ (ví dụ như đối với bộ điều khiển màn hình và GPU). sync_fence , sync_pt , và sync_timeline là các cơ sở chính mà trình điều khiển và sử dụng không gian người dùng để giao tiếp phụ thuộc của họ. 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 sync_pt giá trị mà biểu thị khi hai người tiêu dùng hình ảnh riêng biệt được đọc xong một 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 thành việc tiêu thụ.

Hàng rào, như sync_pt giá trị, bắt đầu hoạt động và thay đổi trạng thái dựa trên tình trạng điểm của họ. Nếu tất cả sync_pt giá trị trở nên hiệu, các sync_fence trở nên hiệu. Nếu một sync_pt rơi vào một trạng thái lỗi, toàn bộ sync_fence có một trạng thái lỗi.

Thành viên trong một sync_fence là không thay đổi sau hàng rào được tạo ra. Để 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 nhân thực hiện khuôn khổ đồng bộ hóa 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 vũ trụ hạt nhân trong platform/system/core/libsync
  • Các nhà cung cấp phải cung cấp các hàng rào đồng bộ hóa thích hợp như tham số cho các validateDisplay()presentDisplay() chức năng trong HAL.
  • Hai phần mở rộng hàng rào liên quan đến GL ( EGL_ANDROID_native_fence_syncEGL_ANDROID_wait_sync ) và hàng rào hỗ trợ 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 khuôn khổ đồng bộ hóa tồn tại, chức năng này sẽ nhận được dma-buf đối tượng, đưa những bộ đệm trên màn hình, và ngăn chặn trong khi bộ đệm là nhìn thấy được. 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 khuôn khổ đồng bộ, các display_buffer chức năng là phức tạp hơn. Trong khi đặt một bộ đệm được hiển thị, 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 một mô tả tập tin đó đề cập đến một sync_pt , tài xế của nhà cung cấp hoặc HAL sử dụng API phải đóng bộ mô tả tập tin.
  • Nếu tài xế nhà cung cấp hoặc HAL qua một bộ mô tả tập tin có chứa một sync_pt tới một hàm API, tài xế nhà cung cấp hoặc HAL không được đóng bộ mô tả tập tin.
  • Để 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. Kernel hàng rào hỗ trợ cho phép hàng rào có dây cho tên, vì vậy khuôn khổ đồng bộ sử dụng tên cửa sổ và đệm chỉ số đó được xếp hàng để đặt tên cho hàng rào, chẳng hạn như SurfaceView:0 . Đây là hữu ích trong việc gỡ lỗi để xác định nguồn gốc của một bế tắc như 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 , queueBuffer , và cancelBuffer có thông 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 để quấn hoặc tạo Android mô tả hàng rào tập tin gốc trong EGLSyncKHR đối tượng.
  • EGL_ANDROID_wait_sync cho phép GPU-side quầy hàng hơn là CPU-side, làm cho sự chờ đợi GPU cho EGLSyncKHR . Các EGL_ANDROID_wait_sync phần mở rộng là giống như EGL_KHR_wait_sync mở rộng.

Để sử dụng các phần mở rộng độc lập, thực hiện EGL_ANDROID_native_fence_sync mở rộng cùng với sự hỗ trợ hạt nhân liên quan. Tiếp theo, cho phép EGL_ANDROID_wait_sync mở rộng trong trình điều khiển của bạn. Các EGL_ANDROID_native_fence_sync mở rộng bao gồm một bản địa hàng rào riêng biệt EGLSyncKHR loại đối tượng. Kết quả là, mở rộng áp dụng cho hiện EGLSyncKHR loại đối tượng không nhất thiết áp dụng cho EGL_ANDROID_native_fence đối tượng, tránh tương tác không mong muốn.

Các EGL_ANDROID_native_fence_sync mở rộng sử dụng một ứng nguồn gốc hàng rào tập tin mô tả thuộc tính có thể được thiết lập chỉ lúc sáng tạo và không thể được truy vấn trực tiếp trở đi từ mộ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ế độ:

  • Một mô tả hàng rào hồ sơ hợp lệ kết thúc tốt đẹp một mô tả hàng rào tập tin Android gốc hiện có trong một EGLSyncKHR đối tượng.
  • -1 tạo ra một hàng rào Android mô tả tập tin có nguồn gốc từ một EGLSyncKHR đối tượng.

Sử dụng các DupNativeFenceFD() chức năng cuộc gọi để trích xuất các EGLSyncKHR đối tượng từ Android mô tả hàng rào tập tin 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, phá hủy EGLSyncKHR đối tượng đóng các thuộc tính hàng rào nội bộ.

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ộ:

  • Hàng rào Acquire được truyền cùng với bộ đệm đầu vào cho setLayerBuffersetClientTarget cuộc gọi. 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.
  • Hàng rào phát hành được lấy ra sau khi cuộc gọi đến presentDisplay sử dụng getReleaseFences gọi. 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.
  • Hàng rào hiện nay được trả về, một trong mỗi khung hình, như một phần của cuộc gọi đến 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ả hàng rào mặt 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.