SDV 미디어는 Linux DRM API를 사용하여 OEM 애플리케이션에 사용 가능한 디스플레이를 노출합니다.
프레임 버퍼는 외부에서 할당된 메모리 버퍼로 지원되는 픽셀 데이터 소스입니다.
Plane은 CRTC에서 사용하는 이미지 소스입니다. 프레임 버퍼와 연결되어 있으며 프레임 버퍼의 잘린 뷰를 나타낼 수 있습니다.
CRTC는 전체 디스플레이 파이프라인을 나타냅니다. 여러 플레인을 결합하여 최종 동영상 출력을 만들고 출력을 여러 인코더에 디스패치할 수 있습니다.
인코더는 CRTC의 동영상 출력을 특정 커넥터에 적합한 형식으로 변환합니다.
커넥터는 사용 가능한 디스플레이 커넥터를 나타냅니다. 예를 들어 HDMI 포트가 있습니다.
자세한 내용은 다음을 참고하세요.
API 노출 영역
SDV 미디어는 Linux DRM 인터페이스를 제공합니다. ioctl 시스템 호출을 사용하여 직접 사용할 수 있지만 애플리케이션 개발에는 사용자 공간 도우미 라이브러리를 사용하는 것이 좋습니다. 예를 들면 다음과 같습니다.
- Rust용
drm-rs크레이트 (권장) - C/C++의 경우
libdrm.drm-kms맨 페이지에서는 API와 그 사용법을 광범위하게 개괄적으로 설명합니다.
단일 디스플레이에 렌더링 설정
DRM 기기 (
/dev/dri/card*)를 열고 파일 설명자에서 Linux DRM API (예:libdrm을 통해)를 사용하여 디스플레이와 모드를 선택합니다.일반적으로 호스트 시스템은 단일 가상 GPU 기기만 노출하며 이는
/dev/dri/card0로 표시됩니다.Linux DRM API로 전면 및 후면 버퍼 할당
minigbm의gbm_bo_create()를 사용하여gbm_bo_get_fd()로 DMA-BUF 파일 설명자를 가져오는 것이 좋습니다.할당된 버퍼로 지원되는 GL 프레임버퍼를 만듭니다.
EGL_LINUX_DMA_BUF_EXT(EGL_EXT_image_dma_buf_import확장 프로그램에서)을 사용하여eglCreateImageKHR로 DRM 버퍼에서EGLImage를 만듭니다.GL 텍스처를 만들고
glEGLImageTargetTexture2DOES(GL_OES_EGL_image확장 프로그램에서 가져옴)를 사용하여 텍스처의 스토리지를 이전 단계의EGLImage로 설정합니다.GL 프레임 버퍼를 만들고
glFramebufferTexture2D를 사용하여 지원 텍스처를 이전 단계에서 만든 텍스처로 설정합니다.
프레임을 렌더링하려면 다음 단계를 따르세요.
생성된 GL 프레임버퍼 중 하나를 바인딩합니다.
일반 GLES API로 프레임을 그립니다.
화면에 프레임 표시: Linux DRM API(
drmModeAtomicCommit())를 사용하여 바인드된 GL 프레임버퍼에서 사용되는 DMA-BUF 파일 설명자가 있는DRM_MODE_PAGE_FLIP_EVENT를 전송합니다.
여러 레이어에서 동영상 출력 구성
하드웨어 가속 다중 레이어 (다중 평면) 컴포지션의 경우 각 레이어를 별도의 DRM 커넥터 (가상 디스플레이)로 노출하고 올바른 하드웨어 위치 / 파이프라인에 매핑하는 호스트 시스템에 의존합니다.
자세한 내용은 여러 디스플레이에 렌더링 설정을 참고하세요.
여러 디스플레이에 렌더링 설정
단일 디스플레이 흐름에서와 같이
/dev/dri/card*DRM 기기를 엽니다.사용 가능한 디스플레이 커넥터를 나열합니다.
각 디스플레이는 DRM 기기의 별도 DRM 커넥터로 노출됩니다.
각 디스플레이 커넥터는 다음을 충족해야 합니다.
커넥터와 호환되는 CRTC를 선택합니다. 각 커넥터에는 사용 가능한 인코더 목록이 있으며 각 인코더는 함께 사용할 수 있는 CRTC를 나타냅니다. 항상 하나 이상의 호환 CRTC가 있습니다.
CRTC와 호환되는 요금제를 선택합니다.
GPU 버퍼로 지원되는 DRM 프레임 버퍼를 만듭니다. 이 프로세스는 단일 디스플레이 변형과 동일하게 보입니다.
평면, CRTC, 커넥터를 연결하고 CRTC에서 동영상 모드를 설정합니다.
각 커넥터와 CRTC, 평면 집합에 다음 DRM 속성을 설정하는 원자 API를 사용하여 동시에 여러 디스플레이의 모드를 설정할 수 있습니다.
필수 속성의 전체 목록은 다음과 같습니다.
대상 속성 유형 설명 커넥터 CRTC_IDCRTC ID 커넥터에 할당할 CRTC의 ID입니다. CRTC MODE_IDBLOB ID 선택한 동영상 모드의 drmModeModeInfo구조체를 포함하며drmModeCreatePropertyBlob를 사용하여 생성된 속성 blob의 IDCRTC ACTIVEbool true를 클릭하여 CRTC를 활성 상태로 표시합니다.비행기 FB_ID프레임버퍼 ID 화면에 표시할 DRM 프레임버퍼의 ID 비행기 SRC_X픽셀 프레임 버퍼 소스 이미지 직사각형의 X 좌표 비행기 SRC_Y픽셀 프레임 버퍼 소스 이미지 사각형의 Y 좌표 비행기 SRC_W16.16 고정 소수점 프레임버퍼 소스 이미지 사각형의 너비 (왼쪽으로 16비트 이동된 픽셀) 비행기 SRC_H16.16 고정 소수점 프레임 버퍼 소스 이미지 사각형의 높이 (왼쪽으로 16비트 이동된 픽셀) 비행기 CRTC_X픽셀 CRTC 대상 이미지 직사각형의 X 좌표 비행기 CRTC_Y픽셀 CRTC 대상 이미지 직사각형의 Y 좌표 비행기 CRTC_W픽셀 CRTC 대상 이미지 사각형의 너비 비행기 CRTC_H픽셀 CRTC 대상 이미지 사각형의 높이 렌더링 루프를 입력합니다.
다음 프레임을 렌더링하기 전에 CRTC에서 페이지 플립 이벤트를 기다립니다.
지정된 CRTC+프레임 버퍼의 페이지 전환을 예약하여 프레임을 렌더링하고 화면에 표시합니다.