하드웨어 컴포저 HAL용 AIDL

Android T(AOSP 실험용)부터 하드웨어 컴포저(HWC) HAL은 AIDL로 정의되며 android.hardware.graphics.composer@2.1에서 android.hardware.graphics.composer@2.4까지의 HIDL 버전은 지원 중단됩니다.

이 페이지에서는 HWC의 AIDL HAL과 HIDL HAL의 차이점과 AIDL HAL의 구현 및 테스트를 설명합니다.

AIDL의 장점을 고려하여 공급업체는 Android T(AOSP 실험용)부터 HIDL 버전 대신 AIDL 컴포저 HAL을 구현하는 것이 좋습니다. 자세한 내용은 구현 섹션을 참고하세요.

AIDL HAL과 HIDL HAL의 차이점

android.hardware.graphics.composer3이라는 새로운 AIDL 컴포저 HAL은 IComposer.aidl에 정의되어 있습니다. HIDL HAL android.hardware.graphics.composer@2.4와 유사한 API를 다음 변경사항과 함께 노출합니다.

  • 빠른 메시지 대기열(FMQ)을 삭제하고 parcelable 명령어로 대체합니다.

    AIDL HAL은 HIDL에서 FMQ를 통해 직렬화된 명령어와 달리 강타입(strongly typed) parcelable 유형에 따라 명령어 인터페이스를 정의합니다. 이를 통해 안정적인 명령어 인터페이스, 그리고 명령어 페이로드가 해석되는 방식에 관한 더 읽기 쉬운 정의가 제공됩니다.

    executeCommands 메서드는 IComposerClient.aidl에서 다음과 같이 정의됩니다.

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

    여기서 각 명령어는 DisplayCommand.aidl에 정의된 강타입(strongly typed) parcelable 유형입니다. 명령어 응답은 CommandResultPayload.aidl에 정의된 강타입(strongly typed) parcelable입니다.

  • 이 메서드에는 활성 클라이언트가 없으므로 IComposerClient.getClientTargetSupport를 삭제합니다.

  • ASurfaceTransaction_setColor에 정의된 대로 Android의 상단 그래픽 스택에 더 잘 맞도록 색상을 바이트 대신 부동 소수점 수로 나타냅니다.

  • HDR 콘텐츠를 제어하기 위한 새 필드를 추가합니다.

    AIDL HAL에서는 HDR 레이어가 동시에 화면에 표시될 때 혼합 SDR/HDR 레이어 스택이 SDR 레이어의 원활한 어둡게 하기를 지원합니다.

    LayerCommandbrightness 필드를 사용하면 SurfaceFlinger가 레이어별 밝기를 지정할 수 있으므로 HWC가 감마 공간이 아닌 선형 빛 공간에서 레이어의 콘텐츠를 어둡게 할 수 있습니다.

    ClientTargetPropertyWithBrightnessbrightness 필드를 사용하면 HWC가 클라이언트 컴포지션의 밝기 공간을 지정하고, 클라이언트 컴포지션에서 SDR 레이어를 어둡게 할지 여부를 RenderEngine에 지시할 수 있습니다.

    dimmingStage 필드를 사용하면 RenderEngine이 콘텐츠를 어둡게 해야 하는 때를 HWC에서 구성할 수 있습니다. 이는 감마 공간에서 어둡게 하기를 선호할 수 있는 공급업체 정의 ColorModes를 수용하여 색상 파이프라인에서 공급업체 정의 대비 개선사항을 허용합니다.

  • 화면 장식을 위해 Composition.aidl에 새로운 컴포지션 유형 DISPLAY_DECORATION을 추가합니다.

    일부 기기에는 디스플레이의 둥근 모서리와 컷아웃을 부드럽게 하는 알파 마스크 그리기를 최적화하는 전용 하드웨어가 있습니다. 이러한 하드웨어를 사용하는 기기는 새 DisplayDecorationSupport.aidl에 정의된 대로 DisplayDecorationSupport 구조를 반환하는 IComposerClient.getDisplayDecorationSupport를 구현해야 합니다. 이 구조는 기기에 필요한 PixelFormatAlphaInterpretation enum을 설명합니다. 이 구현에서 시스템 UI는 알파 마스크 레이어를 전용 하드웨어를 활용하는 새로운 컴포지션 유형인 DISPLAY_DECORATION으로 표시합니다.

  • DisplayCommand.aidl에 새 expectedPresentTime 필드를 추가합니다.

    expectedPresentTime 필드를 사용하면 SurfaceFlinger가 현재 콘텐츠를 화면에 표시해야 하는 예상 현재 시간을 설정할 수 있습니다. 이 기능을 통해 SurfaceFlinger는 구현에 현재 명령어를 미리 전송하여 더 많은 컴포지션 작업을 파이프라인 처리할 수 있습니다.

  • 부팅 디스플레이 구성을 제어하는 새 API를 추가합니다.

    공급업체는 BOOT_DISPLAY_CONFIG를 사용하여 부팅 디스플레이 구성이 지원되도록 지정할 수 있습니다. setBootDisplayConfig, clearBootDisplayConfig, getPreferredBootDisplayConfig 메서드는 다음과 같이 BOOT_DISPLAY_CONFIG를 사용합니다.

    • 프레임워크는 setBootDisplayConfig를 사용하여 부팅 시간 디스플레이 구성을 공급업체에 알립니다. 공급업체는 부팅 디스플레이 구성에서 캐시하고 다음 재부팅 시 이 구성으로 부팅해야 합니다. 기기가 이 구성으로 부팅되지 않는 경우 공급업체는 이 구성의 해상도 및 화면 재생 빈도와 일치하는 구성을 찾아야 합니다. 이러한 구성이 없으면 공급업체는 기본 디스플레이 구성을 사용해야 합니다.

    • clearBootDisplayConfig를 사용하여 프레임워크는 부팅 디스플레이 구성을 지우고 다음 재부팅 중에 기본 디스플레이 구성으로 부팅하도록 공급업체에 알립니다.

    • 프레임워크는 getPreferredBootDisplayConfig를 사용하여 공급업체의 기본 부팅 모드를 쿼리합니다.

    부팅 디스플레이 구성이 지원되지 않으면 이러한 메서드는 UNSUPPORTED 값을 반환합니다.

  • 디스플레이 유휴 상태 타이머를 제어하는 새 API를 추가합니다.

    • 공급업체는 DISPLAY_IDLE_TIMER를 사용하여 비활성 타이머를 이 디스플레이에 공급업체가 구현한다고 지정할 수 있습니다. 유휴 상태이면 이 기능은 화면 재생 빈도를 더 낮은 설정으로 변경하여 전력을 절약합니다. 플랫폼은 setIdleTimerEnabled를 사용하여 타이머의 시간 제한을 제어하고, 유휴 상태일 때 원치 않는 화면 재생 빈도 전환을 방지하기 위해 사용 중지하는 경우도 있습니다.

    • IComposerCallback.onVsyncIdle 콜백을 사용하면 디스플레이가 유휴 상태이고 vsync 주기가 변경되었음을 플랫폼에 알립니다. 플랫폼은 vsync 모델을 재설정하여 이 콜백에 응답합니다. 다음 프레임에서 vsync를 강제로 다시 동기화하고 새로운 vsync 주기를 학습합니다.

구현

공급업체는 Android T(AOSP 실험용)용 AIDL HAL을 구현하지 않아도 됩니다. 하지만 새로운 기능과 API를 사용하려면 HIDL 버전 대신 AIDL 컴포저 HAL을 구현하는 것이 좋습니다.

AIDL HWC HAL의 참조 구현은 Android Emulator에서 구현됩니다.

테스트

구현을 테스트하려면 VtsHalGraphicsComposer3_TargetTest를 실행합니다.