Composer HAL의 핫 플러그 ​​처리

디스플레이 기능(디스플레이 모드 및 지원되는 HDR 유형 등)은 Android TV 셋톱박스(STB) 및 OTT(over-the-top)와 같이 외부적으로 연결된 디스플레이(HDMI 또는 DisplayPort를 통해)가 있는 장치에서 동적으로 변경될 수 있습니다. 장치. 이 변경은 사용자가 한 디스플레이에서 다른 디스플레이로 전환하거나 연결된 디스플레이 없이 장치를 부팅하는 경우와 같이 HDMI 핫 플러그 ​​신호의 결과로 발생할 수 있습니다. Android 12부터 핫 플러깅 및 동적 표시 기능을 처리하기 위해 프레임워크가 변경되었습니다.

이 페이지에서는 Composer HAL 구현에서 디스플레이 핫 플러그 ​​및 디스플레이 기능의 변경 사항을 처리하는 방법을 다룹니다. 또한 관련 프레임 버퍼를 관리하고 이러한 상황에서 경쟁 조건을 방지하는 방법에 대해 설명합니다.

디스플레이 기능 업데이트

이 섹션에서는 Android 프레임워크가 Composer HAL에 의해 시작된 디스플레이 기능의 변경 사항을 처리하는 방법을 설명합니다.

Android가 디스플레이 기능의 변경 사항을 적절하게 처리할 수 있으려면 OEM이 Composer HAL을 구현하여 onHotplug(display, connection=CONNECTED) 를 사용하여 디스플레이 기능에 대한 변경 사항을 프레임워크에 알리도록 해야 합니다. 구현되면 Android는 다음과 같이 표시 기능에 대한 변경 사항을 처리합니다.

  1. 디스플레이 기능의 변경을 감지하면 프레임워크는 onHotplug(display, connection=CONNECTED) 알림을 받습니다.
  2. 알림을 수신하면 프레임워크는 표시 상태를 삭제하고 getActiveConfig , getDisplayConfigs , getDisplayAttribute , getColorModes , getHdrCapabilitiesgetDisplayCapabilities 메소드를 사용하여 HAL의 새 기능으로 다시 만듭니다.
  3. 프레임워크가 새 디스플레이 상태를 다시 생성하면 해당 이벤트를 수신하는 앱에 onDisplayChanged 콜백을 보냅니다.

프레임워크는 후속 onHotplug(display, connection=CONNECTED) 이벤트에서 프레임 버퍼를 재할당합니다. 이를 처리하는 방법에 대한 자세한 내용은 프레임 버퍼 메모리 관리 를 참조하세요.

일반적인 연결 시나리오 처리

이 섹션에서는 기본 디스플레이가 연결 및 연결 해제된 경우 구현에서 다양한 연결 시나리오를 적절하게 처리하는 방법을 다룹니다.

모바일 장치용으로 구축된 Android 프레임워크에는 연결이 끊긴 기본 디스플레이에 대한 지원이 내장되어 있지 않습니다. 대신 HAL은 기본 디스플레이가 물리적으로 연결 해제된 경우 프레임워크와의 상호 작용에서 기본 디스플레이를 자리 표시자 디스플레이로 교체해야 합니다.

디스플레이가 외부에 연결되어 있고 연결이 끊길 수 있는 셋톱박스 및 TV 동글에서 다음과 같은 시나리오가 발생할 수 있습니다. 이러한 시나리오에 대한 지원을 구현하려면 아래 표의 정보를 사용하십시오.

대본 손질
부팅 시 연결된 디스플레이 없음
  • Composer HAL에서 프레임워크로 onHotplug(display, connection=CONNECTED) 신호를 보냅니다.
  • Composer HAL 내부의 물리적 표시 상태를 자리 표시자 표시 상태로 바꿉니다.

    참고: 이 디스플레이 모드는 대부분의 앱에서 지원되므로 1080x1920의 해상도와 60hz의 재생 빈도로 단일 지원 모드를 사용하는 자리 표시자 디스플레이를 권장합니다.

기본 디스플레이가 물리적으로 연결됨
기본 디스플레이가 물리적으로 연결 해제됨
  • Composer HAL에서 프레임워크로 다른 onHotplug(display, connection=CONNECTED) 이벤트를 보냅니다.
  • Composer HAL 내부의 물리적 표시 상태를 자리 표시자 표시 상태로 바꿉니다. 자리 표시자 표시에는 단일 표시 모드가 있어야 프레임워크가 onDisplayChanged 콜백을 앱에 보낼 수 있습니다(지원되는 모드 집합이 변경되었기 때문에). 이 단일 디스플레이 모드는 연결 해제 전 실제 디스플레이의 마지막 활성 모드와 일치해야 앱이 구성 변경 이벤트 를 수신하지 않습니다.

프레임 버퍼 메모리 관리

이미 연결된 디스플레이가 후속 onHotplug(display, connection=CONNECTED) 알림 이벤트를 수신하면 프레임워크는 이 디스플레이와 연결된 프레임 버퍼를 재할당합니다. 기기 구현은 이 동작을 예상하고 프레임 버퍼 메모리를 적절하게 관리해야 합니다. 구현 시 다음 지침을 사용하십시오.

  • 후속 onHotplug(display, connection=CONNECTED) 알림 이벤트를 보내기 전에 시스템이 재할당하기 전에 프레임 버퍼에 핸들을 적절하게 할당 해제할 수 있도록 핸들을 해제해야 합니다. 할당 해제에 성공하지 못하면 메모리 부족으로 인해 재할당이 실패할 수 있습니다.

  • 나머지 그래픽 메모리 버퍼와 별도로 프레임 버퍼에 전용 메모리 풀을 할당하는 것이 좋습니다.

이것은 프레임 버퍼의 할당 해제와 재할당 사이에 타사 프로세스가 그래픽 메모리 할당을 시도할 수 있기 때문에 중요합니다. 프레임 버퍼에서 동일한 그래픽 메모리 풀을 사용하고 그래픽 메모리가 가득 차면 타사 프로세스가 프레임 버퍼에 의해 이전에 할당된 그래픽 메모리를 점유할 수 있으므로 프레임 버퍼 재할당(또는 메모리 공간을 조각화할 수 있음)을 위한 메모리가 부족할 수 있습니다. .

경쟁 조건을 방지하기 위해 순차 구성 ID 사용

Composer HAL이 setActiveConfig 또는 setActiveConfigWithConstraints 를 호출하는 프레임워크와 동시에 지원되는 디스플레이 구성을 업데이트하는 경우 경쟁 조건이 발생할 수 있습니다. 해결책은 순차 ID를 사용하고 이 문제를 방지하기 위해 Composer HAL을 구현하는 것입니다.

이 섹션에서는 경쟁 조건이 어떻게 발생할 수 있는지 설명하고 Composer HAL을 구현하여 이러한 조건을 방지하기 위해 순차 ID를 사용하는 방법에 대해 자세히 설명합니다.

새로운 순차 ID가 새 디스플레이 구성에 할당되지 않아 경합 상태가 발생하는 경우 다음 이벤트 시퀀스를 고려하십시오.

  1. 지원되는 디스플레이 구성 ID는 다음과 같습니다.

    • 아이디=1 , 1080x1920 60hz
    • 아이디=2 , 1080x1920 50hz
  2. 프레임워크는 setActiveConfig(display, config=1) 호출합니다.

  3. 동시에 Composer HAL은 디스플레이 구성 변경을 처리하고 내부 상태를 다음과 같이 새로운 디스플레이 구성 세트로 업데이트합니다.

    • 아이디=1 , 2160x3840 60hz
    • 아이디=2 , 2160x3840 50hz
    • 아이디=3 , 1080x1920 60hz
    • 아이디=4 , 1080x1920 50hz
  4. Composer HAL은 프레임워크에 onHotplug 이벤트를 전송하여 지원되는 모드 집합이 변경되었음을 알립니다.

  5. Composer HAL은 2단계에서 setActiveConfig(display, config=1) 수신합니다.

  6. HAL은 프레임워크가 2160x3840 60hz 로 구성 변경을 요청했다고 해석하지만 실제로는 1080x1920 60hz 가 필요했습니다.

비순차 ID 할당을 사용하는 프로세스는 원하는 구성 변경에 대한 잘못된 해석으로 여기서 끝납니다.

순차 ID를 사용하도록 Composer HAL 구성

이러한 경쟁 조건을 피하기 위해 OEM은 다음과 같이 Composer HAL을 구현해야 합니다.

  • Composer HAL은 지원되는 디스플레이 구성을 업데이트할 때 새 디스플레이 구성에 새로운 순차적 ID를 할당합니다.
  • 프레임워크가 잘못된 구성 ID로 setActiveConfig 또는 setActiveConfigWithConstraints 를 호출하면 Composer HAL은 호출을 무시합니다.

이러한 단계는 다음 논의에서 볼 수 있는 경쟁 조건을 방지하는 역할을 합니다.

새 디스플레이 구성에 새 순차 ID가 할당되면 다음 이벤트 순서를 고려하십시오.

  1. 지원되는 디스플레이 구성 ID는 다음과 같습니다.

    • 아이디=1 , 1080x1920 60hz
    • 아이디=2 , 1080x1920 50hz
  2. 프레임워크는 setActiveConfig(display, config=1) 호출합니다.

  3. 디스플레이 구성 변경이 처리되면 다음과 같이 사용되지 않은 다음 정수부터 시작하여 다음 구성 ID 세트가 할당됩니다.

    • 아이디=3 , 2160x3840 60hz

    • 아이디=4 , 2160x3840 50hz

    • 아이디=5 , 1080x1920 60hz

    • 아이디=6 , 1080x1920 50hz

  4. Composer HAL은 지원되는 모드 집합이 변경되었음을 알리기 위해 onHotplug 이벤트를 프레임워크에 보냅니다.

  5. Composer HAL은 2단계에서 setActiveConfig(display, config=1) 수신합니다.

  6. Composer HAL은 ID가 더 이상 유효하지 않으므로 호출을 무시합니다.

  7. 프레임워크는 4단계에서 onHotplug 이벤트를 수신하고 처리합니다. 프레임워크는 getDisplayConfigsgetDisplayAttribute 함수를 사용하여 Composer HAL을 호출합니다. 이러한 기능을 통해 프레임워크는 1080x1920 및 60Hz의 원하는 해상도와 재생 빈도에 대한 새 ID(5)를 식별합니다.

  8. 프레임워크는 업데이트된 ID가 5인 다른 setActiveConfig 이벤트를 보냅니다.

  9. Composer HAL은 5단계에서 setActiveConfig(display, config=5) 를 수신합니다.

  10. HAL은 프레임워크가 1080x1920 60hz로의 구성 변경을 요청했다고 올바르게 해석합니다.

위의 예에서 볼 수 있듯이 순차 ID 할당을 사용하는 프로세스는 경쟁 조건이 방지되고 올바른 디스플레이 구성 변경이 업데이트되도록 합니다.