한국어
Qt
 

Embedded Linux 에서 Qt 및 Graphics Stack

운영자 2020.05.27 12:55 조회 수 : 619

Qt5의 구조와 Integration

 
Qt5 Framework는 비GUI 적인 기능을 포함하는 Core와 플랫폼 윈도우 추상 레이어인 QPA 를 기반으로 Widget 및 그래픽 요소를 포함하는 Qt GUI구조를 이룬다. 여기서 QPA(Qt Platform Abstraction)는 플랫폼 기본 윈도우 시스템의 추상 레이어로써 플러그인 형태로 구현되며 Qt Application 시작 시 동적으로 로드된다.
 
기본으로 제공되는 주요 플러그인들이 있으며 다음과 같다.
  1. linuxfb: Linux Framebuffer
  2. EGLFS: OpenGL / OpenGL ES 를 위한 EGL 플랫폼 인터페이스.
  3. DirectFB: 가속 렌더링 지원 기능을 갖춘 경량 윈도우 시스템.
  4. X11/XCB: 전통적 리눅스 X 윈도우 시스템을 위한 것으로 XCB library를 사용.
  5. Wayland: OpenGL/ES 를 사용하는 경량의 리눅스 윈도우 시스템.
 이 중 EGLFS는 EGL 인터페이스를 사용하여 하나의 전체화면크기 창을 생성하는 것으로 GPU를 포함하고 OpenGL ES를 지원하는 임베디드 리눅스 장치에서 멀티 윈도우 및 응용프로그램이 필요 없는 요구사항에서 적합하다. EGLFS에는 몇 가지 기본으로 제공되는 포트가 있는데 다음과 같다.
  1. KMS (GBM): Kernel Mode Setting (DRM) with Mesa's Generic Buffer Management
  2. KMS (EGLDevice): Kernel Mode Setting with NVidia's EGLDevice
  3. viv, viv_wl: Vivante's framebuffer API
  4. brcm: Broadcom's framebuffer API for Raspberry PI
  5. mali: Framebuffer API for Mali chips
OpenGL ES 2.0, 3.0 및 EGL을 지원하는경우 기본으로 제공되는 EGLFS를 사용하거나 따로 개발할 수 있다. 아래의 다이어그램은 EGLFS의 QEglFSVivIntegrationPlugin 을 구현하는 클래스 관계를 나타낸 것이다. 플랫폼 서페이스 생성에 대한 공통적인 인터페이스 사용을 위해 추상 클래스를 서브클래싱하여 플러그인을 구현한다.
image.png
 
아래의 리스트는 QEglFSVivIntegration 클래스 구현의 일부분이다. 플러그인은 EGL/eglvivante.h 를 포함하고 EGL인터페이스를 통해 초기화, 표면을 생성, 삭제등을 구현한다.
#include <EGL/eglvivante.h>
…
void QEglFSVivIntegration::platformInit()
{
    QEglFSDeviceIntegration::platformInit();
    int width, height;
...
#ifdef Q_OS_INTEGRITY
    VivanteInit();
    mNativeDisplay = fbGetDisplay();
#else
    mNativeDisplay =  static_cast<EGLNativeDisplayType>(fbGetDisplayByIndex(framebufferIndex()));
#endif
    fbGetDisplayGeometry(mNativeDisplay, &width, &height);
      mScreenSize.setHeight(height);
      mScreenSize.setWidth(width);
}
...
EGLNativeWindowType  QEglFSVivIntegration::createNativeWindow(QPlatformWindow *window, const QSize  &size, const QSurfaceFormat &format)
{
...
    EGLNativeWindowType  eglWindow = static_cast<EGLNativeWindowType>(fbCreateWindow(mNativeDisplay, 0, 0, size.width(),  size.height()));
    return eglWindow;
}
void QEglFSVivIntegration::destroyNativeWindow(EGLNativeWindowType  window)
{
    fbDestroyWindow(window);
}
 시스템 전체 범위로 확대하여 구조를 파악할 필요가 있다. 아래의 그림은 임베디드 리눅스에서 프레임버퍼 장치를 기반으로 Qt Framework의 EGLFS와 OpenGL ES / EGL을 사용하는 그래픽 스택이다.
 

qt.png

 

OpenGL ES / EGL이 어떻게 사용되고 또 그 흐름을 간단하게 설명하면 다음과 같다.
  1. 먼저 Qt 는 Application이 실행될 때 QPA 플러그인으로 EGLFS를 사용하여 EGL Surface를 생성한다.
  2. 응용프로그램에서QOpenGLWidget 또는 QML을 사용하는 GUI는 OpenGL ES를 통해 H/W가속이 먼저 이뤄진다.
  3. 그밖에 PaintEngine으로 그려진 그 외의 그래픽 요소들(QWidget)을 텍스처로 만들고 그것들을 QPA 플러그인(EGLFS)에서 최종 합성한다.
  4. GPU결과는 EGL 인터페이스를 통해 리눅스 프레임버퍼장치의 DMA 버퍼에 쓰고 DMA컨트롤러에 의해 Display컨트롤러로 보낸다.
번호 제목 글쓴이 날짜 조회 수
공지 Qt프로그래밍(QtQuick) Beginner를 위한 글 읽는 순서 운영자 2019.01.05 86179
139 멀티 스레드환경, 스레드에 안전한 이벤트처리 makersweb 2016.10.27 5050
138 C++로 구현된 모델을 QML의 ListView에서 참조 file makersweb 2019.09.07 4939
137 Qt 멀티 스레드 프로그래밍 시 유의해야 할 몇 가지 makersweb 2020.01.13 4896
136 Qml 기본 컴포넌트 강좌 (3) - 배치(positioning) 컴포넌트 file 운영자 2019.02.10 4890
135 QNetworkAccessManager를 통해 HTTP POST 하는 예제 makersweb 2019.01.17 4801
134 Windows에서 Qt D-Bus를 사용하여 프로세스간 통신(IPC) file makersweb 2019.05.02 4510
133 Qt응용프로그램 실행 시 콘솔창(터미널)같이 띄우기 file makersweb 2019.01.16 4502
132 라즈베리파이4에 대한 Qt 5.14.1 크로스컴파일 [1] file makersweb 2020.02.12 4459
131 QML에서 동적으로 텍스트 다국어 처리 file makersweb 2018.11.04 4234
130 Qt기반의 오픈소스 프로젝트들 - 2 운영자 2019.07.21 4023
129 QPA 플러그인과 EGLFS file makersweb 2017.11.21 3941
128 열거형(enum)을 QML에서 사용하는 방법과 문자열(QString)로 얻기 makersweb 2019.08.20 3900
127 QML에서 앵커(anchors)로 위치 지정 file makersweb 2021.10.05 3881
126 Qt 를 사용하거나 기반으로 하는 응용프로그램 file makersweb 2021.01.30 3851
125 Qt 3D Studio 시작하기 file makersweb 2018.01.11 3830
124 Qt Logging Rule, Qt 프레임워크 로그 출력 makersweb 2017.01.13 3713
123 Qml에서 키보드 입력 이벤트 핸들링 file makersweb 2018.08.09 3608
122 Qt Bluetooth를 이용한 시리얼(Serial) 통신 file makersweb 2019.02.17 3601
121 Qt Version확인 방법 makersweb 2018.03.29 3534
120 QML, 이미지, 폰트등을 바이너리 리소스로 만들기 makersweb 2019.06.24 3525