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 레이어의 원활한 어둡게 하기를 지원합니다.
LayerCommand
의brightness
필드를 사용하면 SurfaceFlinger가 레이어별 밝기를 지정할 수 있으므로 HWC가 감마 공간이 아닌 선형 빛 공간에서 레이어의 콘텐츠를 어둡게 할 수 있습니다.ClientTargetPropertyWithBrightness
의brightness
필드를 사용하면 HWC가 클라이언트 컴포지션의 밝기 공간을 지정하고, 클라이언트 컴포지션에서 SDR 레이어를 어둡게 할지 여부를RenderEngine
에 지시할 수 있습니다.dimmingStage
필드를 사용하면RenderEngine
이 콘텐츠를 어둡게 해야 하는 때를 HWC에서 구성할 수 있습니다. 이는 감마 공간에서 어둡게 하기를 선호할 수 있는 공급업체 정의ColorModes
를 수용하여 색상 파이프라인에서 공급업체 정의 대비 개선사항을 허용합니다.화면 장식을 위해
Composition.aidl
에 새로운 컴포지션 유형DISPLAY_DECORATION
을 추가합니다.일부 기기에는 디스플레이의 둥근 모서리와 컷아웃을 부드럽게 하는 알파 마스크 그리기를 최적화하는 전용 하드웨어가 있습니다. 이러한 하드웨어를 사용하는 기기는 새
DisplayDecorationSupport.aidl
에 정의된 대로DisplayDecorationSupport
구조를 반환하는IComposerClient.getDisplayDecorationSupport
를 구현해야 합니다. 이 구조는 기기에 필요한PixelFormat
및AlphaInterpretation
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
를 실행합니다.