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.

Triển khai trình soạn nhạc phần cứng HAL

Hardware Composer (HWC) HAL composite lớp nhận được từ SurfaceFlinger, làm giảm số lượng thành phần OpenGL ES (GLES) và GPU thực hiện.

HWC tóm tắt các đối tượng, chẳng hạn như lớp phủ và blitters 2D, thành các bề mặt tổng hợp và giao tiếp với phần cứng thành phần cửa sổ chuyên dụng với các cửa sổ tổng hợp. Sử dụng HWC để kết hợp các cửa sổ thay vì kết hợp SurfaceFlinger với GPU. Hầu hết các GPU không được tối ưu hóa cho bố cục và khi GPU tạo các lớp từ SurfaceFlinger, các ứng dụng không thể sử dụng GPU để kết xuất của riêng chúng.

Việc triển khai HWC nên hỗ trợ:

  • Ít nhất bốn lớp phủ:
    • Thanh trạng thái
    • Thanh hệ thống
    • Ứng dụng
    • Hình nền / nền
  • Các lớp lớn hơn màn hình (ví dụ: hình nền)
  • Hòa trộn alpha trên mỗi pixel được ghép trước đồng thời và hòa trộn alpha trên mỗi mặt phẳng
  • Đường dẫn phần cứng để phát lại video được bảo vệ
  • Thứ tự đóng gói RGBA, các định dạng YUV và các thuộc tính lát gạch, xoáy và sải chân

Để thực hiện HWC:

  1. Thực hiện một HWC không hoạt động và gửi tất cả các công việc tổng hợp đến GLES.
  2. Triển khai một thuật toán để ủy quyền thành phần cho HWC tăng dần. Ví dụ: chỉ ủy quyền ba hoặc bốn bề mặt đầu tiên cho phần cứng lớp phủ của HWC.
  3. Tối ưu hóa HWC. Điều này có thể bao gồm:
    • Chọn các bề mặt tối đa hóa tải cho GPU và gửi chúng đến HWC.
    • Phát hiện xem màn hình có đang cập nhật hay không. Nếu không, hãy ủy quyền thành phần cho GLES thay vì HWC để tiết kiệm điện. Khi màn hình cập nhật lại, hãy tiếp tục tải thành phần xuống HWC.
    • Chuẩn bị cho các trường hợp sử dụng phổ biến như:
      • Màn hình chính, bao gồm thanh trạng thái, thanh hệ thống, cửa sổ ứng dụng và hình nền động
      • Trò chơi toàn màn hình ở chế độ dọc và ngang
      • Video toàn màn hình với phụ đề chi tiết và điều khiển phát lại
      • Phát lại video được bảo vệ
      • Nhiều cửa sổ chia đôi màn hình

Nguyên thủy của HWC

Các HWC cung cấp hai nguyên thủy, lớphiển thị , để đại diện cho công việc sáng tác và tương tác của nó với phần cứng hiển thị. Các HWC cũng cung cấp kiểm soát Vsync và một callback để SurfaceFlinger để thông báo cho nó khi một sự kiện xảy ra Vsync.

Giao diện HIDL

Android 8.0 và cao hơn sử dụng một HIDL giao diện được gọi Composer HAL cho binderized IPC giữa HWC và SurfaceFlinger. HAL Composer thay thế những di sản hwcomposer2.h giao diện. Nếu các nhà cung cấp cung cấp triển khai HAL của Nhà soạn nhạc của HWC, Nhà soạn nhạc HAL trực tiếp chấp nhận các lệnh gọi HIDL từ SurfaceFlinger. Nếu nhà cung cấp cung cấp một thực hiện di sản của HWC, Composer HAL tải chức năng gợi ý từ hwcomposer2.h , chuyển tiếp cuộc gọi HIDL vào cuộc gọi con trỏ hàm.

HWC cung cấp các chức năng để xác định các thuộc tính của một màn hình nhất định; để chuyển đổi giữa các cấu hình hiển thị khác nhau (chẳng hạn như độ phân giải 4k hoặc 1080p) và chế độ màu (chẳng hạn như màu gốc hoặc sRGB thực); và để bật, tắt màn hình hoặc sang chế độ năng lượng thấp nếu được hỗ trợ.

Con trỏ hàm

Nếu các nhà cung cấp triển khai Composer HAL trực tiếp, SurfaceFlinger sẽ gọi các chức năng của nó thông qua HIDL IPC. Ví dụ, để tạo ra một lớp, SurfaceFlinger gọi createLayer() trên HAL Composer.

Nếu nhà cung cấp thực hiện hwcomposer2.h giao diện, các cuộc gọi Composer HAL vào hwcomposer2.h con trỏ hàm. Trong hwcomposer2.h ý kiến, chức năng giao diện HWC được gọi bằng tên lowerCamelCase không tồn tại trong giao diện như các lĩnh vực được đặt tên. Hầu hết các chức năng được nạp bằng cách yêu cầu một con trỏ hàm sử dụng getFunction cung cấp bởi hwc2_device_t . Ví dụ, hàm createLayer là một con trỏ hàm kiểu HWC2_PFN_CREATE_LAYER , mà được trả lại khi giá trị liệt kê HWC2_FUNCTION_CREATE_LAYER được thông qua vào getFunction .

Đối với tài liệu chi tiết về chức năng HAL Composer và chức năng HWC passthrough chức năng, xem composer . Đối với tài liệu chi tiết về chức năng gợi ý HWC, xem hwcomposer2.h .

Tay cầm lớp và màn hình

Các lớp và màn hình được thao tác bởi các chốt do HWC tạo ra. Các tay cầm được làm mờ đục đối với SurfaceFlinger.

Khi SurfaceFlinger tạo ra một lớp mới, nó gọi createLayer , mà trả về kiểu Layer cho việc triển khai trực tiếp hoặc hwc2_layer_t cho việc triển khai passthrough. Khi SurfaceFlinger đổi thuộc tính của lớp đó, SurfaceFlinger vượt qua hwc2_layer_t giá trị vào chức năng sửa đổi thích hợp cùng với bất kỳ thông tin khác cần thiết để thực hiện việc sửa đổi. Các hwc2_layer_t loại là đủ lớn để giữ hoặc một con trỏ hoặc một chỉ mục.

Màn hình vật lý được tạo ra bằng cách cắm nóng. Khi một màn hình vật lý được cắm nóng, HWC sẽ tạo một tay cầm và chuyển tay cầm cho SurfaceFlinger thông qua lệnh gọi lại phích cắm nóng. Màn ảo được tạo ra bởi SurfaceFlinger gọi createVirtualDisplay() để yêu cầu một màn hình. Nếu HWC hỗ trợ thành phần hiển thị ảo, nó sẽ trả về một xử lý. Sau đó, SurfaceFlinger ủy quyền thành phần của màn hình cho HWC. Nếu HWC không hỗ trợ bố cục màn hình ảo, SurfaceFlinger sẽ tạo tay cầm và tổng hợp màn hình.

Hiển thị các hoạt động thành phần

Sau mỗi VSYNC, SurfaceFlinger sẽ hoạt động nếu nó có nội dung mới để tổng hợp. Nội dung mới này có thể là bộ đệm hình ảnh mới từ ứng dụng hoặc thay đổi thuộc tính của một hoặc nhiều lớp. Khi SurfaceFlinger đánh thức nó:

  1. Xử lý các giao dịch, nếu có.
  2. Chốt các bộ đệm đồ họa mới, nếu có.
  3. Thực hiện một bố cục mới, nếu bước 1 hoặc 2 dẫn đến thay đổi nội dung hiển thị.

Để thực hiện một thành phần mới, SurfaceFlinger tạo và phá hủy các lớp hoặc sửa đổi các trạng thái của lớp, nếu có. Nó cũng cập nhật lớp với nội dung hiện tại của họ, sử dụng các cuộc gọi như setLayerBuffer hoặc setLayerColor . Sau khi tất cả các lớp được cập nhật, SurfaceFlinger gọi validateDisplay , mà kể HWC để kiểm tra trạng thái của lớp và xác định cách thành phần sẽ tiến hành. Theo mặc định, SurfaceFlinger cố gắng cấu hình mọi lớp sao cho lớp đó được kết hợp bởi HWC; mặc dù trong một số trường hợp, các lớp tổng hợp SurfaceFlinger thông qua dự phòng GPU.

Sau khi cuộc gọi đến validateDisplay , SurfaceFlinger gọi getChangedCompositionTypes để xem nếu HWC muốn bất kỳ loại thành phần lớp thay đổi trước khi thực hiện các thành phần. Để chấp nhận những thay đổi, SurfaceFlinger gọi acceptDisplayChanges .

Nếu bất kỳ lớp nào được đánh dấu cho thành phần SurfaceFlinger, SurfaceFlinger sẽ tổng hợp chúng vào bộ đệm đích. SurfaceFlinger sau đó gọi setClientTarget để cung cấp cho các bộ đệm để màn hình sao cho bộ đệm có thể được hiển thị trên màn hình hoặc tiếp tục ghép với các lớp chưa được đánh dấu cho các thành phần SurfaceFlinger. Nếu không có lớp nào được đánh dấu cho thành phần SurfaceFlinger, SurfaceFlinger sẽ bỏ qua bước thành phần.

Cuối cùng, SurfaceFlinger gọi presentDisplay để nói với HWC để hoàn tất quá trình sáng tác và trình bày kết quả cuối cùng.

Nhiều màn hình

Android 10 hỗ trợ nhiều màn hình vật lý. Khi thiết kế triển khai HWC nhằm mục đích sử dụng trên Android 7.0 trở lên, có một số hạn chế không có trong định nghĩa HWC:

  • Nó giả định rằng có đúng một màn hình bên trong. Màn hình bên trong là màn hình mà phích cắm nóng ban đầu báo cáo trong quá trình khởi động. Sau khi màn hình bên trong được cắm nóng, nó không thể bị ngắt kết nối.
  • Ngoài màn hình bên trong, bất kỳ số lượng màn hình bên ngoài nào cũng có thể bị cắm nóng trong quá trình hoạt động bình thường của thiết bị. Khung giả định rằng tất cả hotplugs sau khi hiển thị nội đầu tiên là màn hình ngoài, vì vậy nếu có hiển thị nội hơn được thêm vào, họ đang phân loại không đúng như Display.TYPE_HDMI thay vì Display.TYPE_BUILT_IN .

Trong khi các hoạt động SurfaceFlinger được mô tả ở trên được thực hiện trên mỗi màn hình, chúng được thực hiện tuần tự cho tất cả các màn hình đang hoạt động, ngay cả khi nội dung của chỉ một màn hình được cập nhật.

Ví dụ: nếu màn hình bên ngoài được cập nhật, trình tự là:

// In Android 9 and lower:

// Update state for internal display
// Update state for external display
validateDisplay(<internal display>)
validateDisplay(<external display>)
presentDisplay(<internal display>)
presentDisplay(<external display>)

// In Android 10 and higher:

// Update state for internal display
// Update state for external display
validateInternal(<internal display>)
presentInternal(<internal display>)
validateExternal(<external display>)
presentExternal(<external display>)

Thành phần hiển thị ảo

Thành phần hiển thị ảo tương tự như thành phần hiển thị bên ngoài. Sự khác biệt giữa thành phần hiển thị ảo và thành phần hiển thị vật lý là màn hình ảo gửi đầu ra đến bộ đệm Gralloc thay vì đến màn hình. Hardware Composer (HWC) ghi đầu ra vào bộ đệm, cung cấp hàng rào hoàn thành và gửi bộ đệm đến người tiêu dùng (chẳng hạn như bộ mã hóa video, GPU, CPU, v.v.). Màn hình ảo có thể sử dụng 2D / blitter hoặc lớp phủ nếu đường ống hiển thị ghi vào bộ nhớ.

Các chế độ

Mỗi khung là một trong ba chế độ sau SurfaceFlinger gọi validateDisplay() phương pháp HWC:

  • GLES - GPU composite tất cả các lớp, viết trực tiếp đến bộ đệm đầu ra. HWC không tham gia vào quá trình sáng tác.
  • TRỘN - GPU composite một số lớp để framebuffer và HWC composite framebuffer và các lớp còn lại, viết trực tiếp đến bộ đệm đầu ra.
  • HWC - HWC composite tất cả các lớp và ghi trực tiếp vào bộ đệm đầu ra.

Định dạng đầu ra

Các định dạng đầu ra bộ đệm hiển thị ảo phụ thuộc vào chế độ của chúng:

  • Chế độ GLES - Người tài xế EGL đặt định dạng đệm đầu ra trong dequeueBuffer() , thường RGBA_8888 . Người tiêu dùng phải có thể chấp nhận định dạng đầu ra mà trình điều khiển đặt hoặc không thể đọc bộ đệm.
  • Chế độ hỗn hợp và HWC - Nếu người tiêu dùng cần truy cập CPU, người tiêu dùng bộ định dạng này. Nếu không, các định dạng được IMPLEMENTATION_DEFINED , và Gralloc đặt định dạng tốt nhất dựa trên những lá cờ sử dụng. Ví dụ: Gralloc đặt định dạng YCbCr nếu người tiêu dùng là người mã hóa video và HWC có thể ghi định dạng hiệu quả.

Hàng rào đồng bộ hóa

Hàng rào đồng bộ hóa (sync) là một khía cạnh quan trọng của hệ thống đồ họa Android. Hàng rào cho phép hoạt động của CPU tiến hành độc lập với hoạt động đồng thời của GPU, chỉ chặn khi có sự phụ thuộc thực sự.

Ví dụ: khi một ứng dụng gửi một bộ đệm đang được sản xuất trên GPU, nó cũng gửi một đối tượng hàng rào đồng bộ hóa. Hàng rào này báo hiệu khi GPU đã ghi xong vào bộ đệm.

HWC yêu cầu GPU hoàn tất việc ghi bộ đệm trước khi bộ đệm được hiển thị. Hàng rào đồng bộ hóa được chuyển qua đường ống đồ họa với bộ đệm và báo hiệu khi bộ đệm được ghi. Trước khi bộ đệm được hiển thị, HWC sẽ kiểm tra xem hàng rào đồng bộ đã báo hiệu chưa và nếu có, nó sẽ hiển thị bộ đệm.

Để biết thêm thông tin về hàng rào sync thấy Tích hợp phần cứng Composer .