AIDL cho trình soạn nhạc phần cứng HAL

Bắt đầu từ Android 13, HAL của Trình soạn thảo phần cứng (HWC) được xác định trong AIDL và các phiên bản HIDL từ android.hardware.graphics.composer@2.1 đến android.hardware.graphics.composer@2.4 đều không được dùng nữa.

Trang này mô tả sự khác biệt giữa AIDL và HIDL HAL cho HWC cũng như việc triển khai và thử nghiệm AIDL HAL.

Do những lợi ích mà AIDL mang lại, các nhà cung cấp được khuyến khích triển khai HAL soạn thảo AIDL bắt đầu từ Android 13 thay vì phiên bản HIDL. Xem phần Thực hiện để biết thêm thông tin.

Sự khác biệt giữa AIDL và HIDL HAL

HAL soạn thảo AIDL mới, có tên android.hardware.graphics.composer3 , được xác định trong IComposer.aidl . Nó hiển thị một API tương tự như HIDL HAL android.hardware.graphics.composer@2.4 với những thay đổi sau:

  • Loại bỏ Hàng đợi Tin nhắn Nhanh (FMQ) để thay thế cho các lệnh có thể phân phối.

    AIDL HAL xác định giao diện lệnh dựa trên các loại có thể phân chia được định kiểu mạnh, trái ngược với các lệnh được tuần tự hóa qua FMQ trong HIDL. Điều này cung cấp một giao diện ổn định cho các lệnh và định nghĩa dễ đọc hơn về cách diễn giải tải trọng lệnh.

    Phương thức executeCommands được định nghĩa trong IComposerClient.aidl

    CommandResultPayload[] executeCommands(in DisplayCommand[] commands);
    

    trong đó mỗi lệnh là một loại có thể phân loại được định kiểu mạnh được xác định trong DisplayCommand.aidl . Phản hồi lệnh là các gói có thể được gõ mạnh được xác định trong CommandResultPayload.aidl .

  • Xóa IComposerClient.getClientTargetSupport vì không có ứng dụng khách nào đang hoạt động cho phương pháp này.

  • Việc biểu diễn màu sắc dưới dạng số float thay vì byte để căn chỉnh tốt hơn với ngăn xếp đồ họa phía trên trong Android như được xác định trong ASurfaceTransaction_setColor .

  • Bổ sung các trường mới để kiểm soát nội dung HDR.

    Trong AIDL HAL, các ngăn xếp lớp SDR/HDR hỗn hợp hỗ trợ làm mờ các lớp SDR liền mạch khi một lớp HDR xuất hiện đồng thời trên màn hình.

    Trường brightness trong LayerCommand cho phép SurfaceFlinger chỉ định độ sáng trên mỗi lớp, do đó HWC làm mờ nội dung của lớp trong không gian ánh sáng tuyến tính, trái ngược với không gian gamma.

    Trường brightness trong ClientTargetPropertyWithBrightness cho phép HWC chỉ định không gian độ sáng cho thành phần máy khách và hướng dẫn RenderEngine xem có làm mờ các lớp SDR trong thành phần máy khách hay không.

    Trường dimmingStage cho phép HWC định cấu hình khi RenderEngine làm mờ nội dung. Điều này phù hợp với ColorModes do nhà cung cấp xác định, có thể thích làm mờ trong không gian gamma, để cho phép các cải tiến về độ tương phản do nhà cung cấp xác định trong quy trình màu của họ.

  • Bổ sung loại bố cục mới DISPLAY_DECORATION trong Composition.aidl để trang trí màn hình.

    Một số thiết bị có phần cứng chuyên dụng để tối ưu hóa việc vẽ mặt nạ alpha giúp làm mịn các góc tròn và vết cắt trên màn hình. Các thiết bị có phần cứng như vậy phải triển khai IComposerClient.getDisplayDecorationSupport để trả về cấu trúc DisplayDecorationSupport như được xác định trong DisplayDecorationSupport.aidl mới. Cấu trúc này mô tả các enum PixelFormatAlphaInterpretation mà thiết bị yêu cầu. Sau khi triển khai này, Giao diện người dùng hệ thống đánh dấu lớp mặt nạ alpha là DISPLAY_DECORATION , một loại thành phần mới tận dụng phần cứng chuyên dụng.

  • Bổ sung trường expectedPresentTime mới vào DisplayCommand.aidl .

    Trường expectedPresentTime cho phép SurfaceFlinger đặt thời gian hiện tại dự kiến ​​khi nội dung hiện tại phải được hiển thị trên màn hình. Với tính năng này, SurfaceFlinger sẽ gửi lệnh hiện tại tới quá trình triển khai trước thời hạn, cho phép nó thực hiện nhiều công việc sáng tác hơn.

  • Bổ sung các API mới để kiểm soát cấu hình hiển thị khởi động.

    Bằng cách sử dụng BOOT_DISPLAY_CONFIG , nhà cung cấp có thể chỉ định rằng cấu hình hiển thị khởi động được hỗ trợ. Các phương thức setBootDisplayConfig , clearBootDisplayConfiggetPreferredBootDisplayConfig sử dụng BOOT_DISPLAY_CONFIG như sau:

    • Bằng cách sử dụng setBootDisplayConfig , khung này sẽ thông báo cho nhà cung cấp về cấu hình hiển thị thời gian khởi động. Nhà cung cấp phải lưu vào bộ nhớ đệm trong cấu hình màn hình khởi động và khởi động ở cấu hình này trong lần khởi động lại tiếp theo. Nếu thiết bị không khởi động được ở cấu hình này, nhà cung cấp phải tìm cấu hình phù hợp với độ phân giải và tốc độ làm mới của cấu hình này. Nếu không có cấu hình như vậy thì nhà cung cấp nên sử dụng cấu hình hiển thị ưa thích của họ.

    • Sử dụng clearBootDisplayConfig , khung thông báo cho nhà cung cấp xóa cấu hình hiển thị khởi động và khởi động ở cấu hình hiển thị ưa thích của họ trong lần khởi động lại tiếp theo.

    • Sử dụng getPreferredBootDisplayConfig , khung truy vấn chế độ khởi động ưa thích của nhà cung cấp.

    Khi cấu hình màn hình khởi động không được hỗ trợ, các phương thức này trả về giá trị UNSUPPORTED .

  • Bổ sung các API mới để kiểm soát bộ đếm thời gian không hoạt động của màn hình.

    • Bằng cách sử dụng DISPLAY_IDLE_TIMER , nhà cung cấp có thể chỉ định rằng bộ hẹn giờ không hoạt động được nhà cung cấp triển khai cho màn hình này. Khi không hoạt động, khả năng này sẽ thay đổi tốc độ làm mới thành cài đặt thấp hơn để tiết kiệm năng lượng. Nền tảng này sử dụng setIdleTimerEnabled để kiểm soát thời gian chờ của bộ hẹn giờ và trong một số trường hợp, tắt nó nhằm ngăn chặn việc chuyển đổi tốc độ làm mới không mong muốn khi không hoạt động.

    • Việc sử dụng lệnh gọi lại IComposerCallback.onVsyncIdle cho nền tảng biết rằng màn hình không hoạt động và nhịp vsync đã thay đổi. Nền tảng phản hồi cuộc gọi lại này bằng cách đặt lại mô hình vsync của nó. Nó buộc đồng bộ lại vsync trên khung tiếp theo và tìm hiểu nhịp vsync mới.

Thực hiện

Các nhà cung cấp không bắt buộc phải triển khai AIDL HAL cho Android 13. Tuy nhiên, họ được khuyến khích triển khai HAL soạn thảo AIDL thay vì phiên bản HIDL để sử dụng chức năng và API mới.

Việc triển khai tham chiếu cho AIDL HWC HAL được triển khai trong trình mô phỏng Android.

Kiểm tra

Để kiểm tra việc triển khai của bạn, hãy chạy VtsHalGraphicsComposer3_TargetTest .