한국어
Qt
 

Embedded Linux 에서 Qt 및 Graphics Stack

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

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 86836
179 가상키보드(Qt Virtual Keyboard)를 사용하는 방법 [32] file makersweb 2019.05.03 222926
178 콘솔에서 사용자 입력받기 file makersweb 2020.03.22 51907
177 QString 문자열 다루기 예제 운영자 2019.01.26 40915
176 Windows에서 Qt 설치 따라하기 file makersweb 2019.10.14 31081
175 Qt의 시그널 슬롯 시스템 file makersweb 2015.10.20 23872
174 QThread 소개 및 예제 makersweb 2019.12.25 19868
173 QtCreator Design으로 GUI만들기 (QML로 만드는 Hello World -2) [1] file makersweb 2019.05.26 15170
172 초보자를 위한 첫번째 프로젝트 - QML로 만드는 Hello World file makersweb 2018.03.16 14657
171 Qt 프로그래밍의 시작 makersweb 2015.10.25 14494
170 Qml과 C++로 구현하는 GUI어플리케이션 file makersweb 2018.12.25 14198
169 QML과 QtQuick 모듈 개념과 기본 타입들 makersweb 2019.04.26 13537
168 Windows에서 라즈베리파이3용 Qt5.10.0 크로스컴파일 [20] file makersweb 2018.02.23 13240
167 Qt의 오픈소스 라이센스 소개 file makersweb 2019.12.15 12813
166 Qml 기본 컴포넌트 강좌 (1) file makersweb 2019.01.03 12256
165 QtSerialPort를 사용한 시리얼(Serial)통신 [3] makersweb 2019.05.21 12208
164 Qt Installer Framework - 패키징, 설치프로그램 제작 file makersweb 2018.10.14 11802
163 Qt 응용프로그램 배포(windows) file makersweb 2018.10.10 11587
162 Ubuntu Linux에서 Qt Creator 설치 file makersweb 2016.03.06 10736
161 Qt의 스레드간 시그널 슬롯의 커넥션타입 [1] makersweb 2015.10.24 10350
160 Qt애플리케이션 객체(QCoreApplication, QGuiApplication, QApplication) 에 대해서 makersweb 2019.11.11 10301