Семинар «Российские информационные технологии ответственного назначения»

«Применение технологий OpenGL в QNX» Докучаев Андрей, СВД Встраиваемые Системы Содержание выступления

• Обзор QNX Mesa 3D • Интеграция с графической подсистемой • Архитектура графического драйвера • Организация видео памяти • Организация композитного окружения • Аппаратные слои графического контроллера • OpenGL / GF3D • OpenGL / FreeGLUT • GLES / EGL Обзор QNX Mesa 3D

QNX Mesa 3D QNX Mesa 3D — кроссплатформенная реализация технологий разработки приложений, которым требуется аппаратная акселерация в рамках стандартов OpenGL 3.1, OpenGL ES 2.0 и OpenVG 1.1.

Драйвер: Mesa 9.2.3 / ‐ Multi‐display Mesa 10.3.1 ‐ 2D ускорение ‐ OpenGL 3.0 ‐ OpenGL ES 2.0 ‐ OpenVG 1.1 ЗОСРВ "Нейтрино" КПДА.10964‐01, QNX Neutrino 6.5.0

Архитектуры: x86, PPC, Эльбрус Контроллеры: AMD Radeon R600/RV610/RV620 /RV630/RV635/RV670/RV710 /RV730/RV740/RV770 Обзор QNX Mesa 3D

Внутреннее устройство QNX Mesa 3D

Контроль состояний конвейера: растеризация, Z буфер, смешивание API Аппаратное представление: GLSL компилятор, матричные представления, текстурирование, трансляция команд контроллера

Интеграция: VRAM, установка видео режима, очередь команд, блиттинг Обзор QNX Mesa 3D

QNX Mesa 3D development Roadmap

AMD Radeon Портирование QNX Mesa 3D Evergreen Series QNX Mesa 3D Mesa 10.3.? для Photon / Qt драйвер на Эльбрус AMD Radeon Mesa 10.3.1 AMD Radeon Intel HD драйвер Northen Island OpenGL 3.3 Series драйвер E8860 драйвер

AMD Radeon AMD Radeon E6460 драйвер E6760 драйвер

Портирование QNX Mesa 3D на ARM и MIPS

Q1’15 Q2’15 Q3’15 Q4’15 Содержание выступления

• Обзор QNX Mesa 3D • Интеграция с графической подсистемой • Архитектура графического драйвера • Организация видео памяти • Организация композитного окружения • Аппаратные слои графического контроллера • OpenGL / GF3D • OpenGL / FreeGLUT • GLES / EGL Интеграция QNX Mesa 3D с графической подсистемой

Архитектура графического драйвера

QNX Mesa 3D io‐display

Memory Command GF Driver management transmitter API VRAM interface

Driver Command 3D engine 2D engine receiver

HW command queue GF3D GL API Интеграция QNX Mesa 3D с графической подсистемой

Архитектура графического драйвера

QNX Mesa 3D io‐display

Driver VRAM interface

Driver Command 3D engine 2D engine receiver

HW command queue

Функционально драйвер разделен на два модуля: 1. Стандартный драйвер io‐display (2D акселерация, управление памятью, инициализация); 2. Опциональный модуль, реализующий 3D акселерацию приложений, которым требуется OpenGL [ES], OpenVG и Qt. Интеграция QNX Mesa 3D с графической подсистемой

Организация видео памяти

Qt 4.x.x / Qt 5.x Photon

QWS / QPA io‐graphics

QNX Mesa 3D io‐display

Memory Command GF Driver management transmitter API VRAM interface

VRAM Ph Qt Mesa

Layer Интеграция QNX Mesa 3D с графической подсистемой

Организация видео памяти

Переход от ассоциации ресурсов приложений с аппаратными слоями контроллера к гибкой организации видео памяти позволяет комбинировать технологии разработки графических интерфейсов в едином окружении

Layer

VRAM Ph Qt Mesa Содержание выступления

• Обзор QNX Mesa 3D • Интеграция с графической подсистемой • Архитектура графического драйвера • Организация видео памяти • Организация композитного окружения • Аппаратные слои графического контроллера • OpenGL / GF3D • OpenGL / FreeGLUT • GLES / EGL Организация композитного окружения

Программные интерфейсы для работы с 3D

GF3D

QNX Graphics Framework API (GF) Организация композитного окружения

Аппаратные слои графического контроллера

Прозрачно для приложения. Композиция реализуется аппаратно. Не требуется избыточное копирование памяти. Слои могут поддерживать alpha / chroma – ключи, масштабирование, панорамирование, оключение …

Требуется поддержка со стороны контроллера. Layer 1: OpenGL / Layer 0: Photon OpenGL ES Количество слоев редко превышает 1‐4.

Управление слоями в GLES / EGL В будущих версиях QNX Mesa 3D EGL API позволяет установить номер графического будет учтена возможность контроллера / дисплея / аппаратного слоя для установки chroma‐ключа отображения посредством переменных для GLES/EGL окружения. окружения: env: MESA_QNX_EGL_LAYER_CHROMA # export MESA_QNX_EGL_DEVNO=0 # export MESA_QNX_EGL_DISPNO=0 # export MESA_QNX_EGL_LAYER=1 Организация композитного окружения

Аппаратные слои графического контроллера

GL / GF GL / GLUT

Стандартное API QNX Graphics Framework: FreeGLUT для управления слоями позволяет использовать как опции командной строки, так gf_dev_attach( &dev, и переменные окружения. Опции командной GF_DEVICE_INDEX(0), &gdev_info ); строки имеют приоритет. dispno = 0; # export DISPLAY= gf_display_attach( &display, dev, # ./ -display= dispno, &di ); – имя утилиты, использующей GLUT. layer_index = di.main_layer_index; –“display:screen.layer”: gf_layer_attach( &layer, display, 1:0 – адаптер 1, дисплей 0, слой основной layer_index, 0 ); :.1 – адаптер/дисплей 0, слой 1 1 – адаптер 1, дисплей 0, слой основной

GF3D Организация композитного окружения

OpenGL / GF3D

Низкоуровневый интерфейс доступа к драйверу. Инициализация приложения Photon Является базисом для FreeGLUT / EGL. #include Для используемой памяти доступен весь GF3D потенциал 2D акселерации . void main() { Требуются дополнительные операции блиттинга. /* Инициализация GF */ GF является исключительно QNX‐специфичной init_gf(); технологией. ... /* Функция отображения кадра */ PtSetArg( args, Pt_ARG_RAW_DRAW_F, flush, 0); ... /* Функция рисования кадра (сцены)*/ PtAppAddWorkProc(NULL, draw, NULL); ... } Организация композитного окружения

OpenGL / GF3D

Инициализация GF / GF3D Рисование / отображение кадра int init_gf() int draw_frame( void *data ) { GF3D GF3D { gf_dev_attach( &dev, ..., &info ); /* OpenGL */ gf_display_attach( ... ); /* Синхронизация и отображение */ /* Создание 3D контекста */ glFinish(); gf3d_context_t ctx = PtDamageWidget( widget ); gf3d_create_context( dev, &info ); } gf_surface_create( &surf, ..., void flush( PtWidget_t*, PhTile_t* ) GF_SURFACE_CREATE_SHAREABLE ); { /* Блиттинг surf -> widget */ /* Назначение поверхност контексту */ PgContextBlit( ph_ctx, ... ); gf3d_make_current( ctx, surf ); /* Отображение и синхронизация */ ph_ctx = PgFFlush( Ph_DONE_DRAW ); PdCreateOffscreenContextGF(surf); PgWaitHWIdle(); GF3D } } GF3D Организация композитного окружения

OpenGL / FeeeGLUT

GL / GLUT

void main ( int argc, char *argv[] ) { /* Инициализация */ glutInit( &argc, argv ); glutInitDisplayMode( GLUT_RGB ); glutInitWindowSize( 500, 500 ); glutInitWindowPosition( 10, 10 );

/* Создание окна */ glutCreateWindow( "Заголовок" );

Апробированный интерфейс. /* Функция рисования сцены */ Библиотека FreeGLUT кроссплатформенная. glutDisplayFunc( display ); Автоматическая композиция с окружением Photon glutMainLoop (); Micro GUI, при обнаружении сервера Photon. }

Требуются дополнительные операции блиттинга. Меньшая гибкость в сравнении с GF3D. Организация композитного окружения

GLES / EGL

Стандартизованный интерфейс. Пример инициализации EGL Стандарт EGL охватывает как GL ES, так и OpenVG. void main ( int argc, char *argv[] ) В разработке автоматическая композиция с { окружением Photon (по аналогии с GL / GLUT). /* Инициализация */ eglGetDisplay( ... ); Требуются дополнительные операции блиттинга. eglInitialize( ... );

Меньшая гибкость в сравнении с GF3D. /* Создание окна */ eglCreateWindowSurface( ... ); eglCreateContext( ... ); eglMakeCurrent( ... );

/* Дополнительная конфигурация */ eglSwapInterval( ... ); eglQuerySurface( ... ); ... } Андрей Докучаев ведущий инженер‐программист (812) 346‐89‐56 доп. 104 [email protected] www.kpda.ru www.swd.ru