Tarnyko's website
Tarnyko's website
about

[Tutoriel] Porter une application X11/OpenGL vers Wayland/OpenGL ES

2013-10-09

Objectif : exécuter un programme X11/GLX nativement sous Wayland/EGL, en modifiant au minimum le code source.

wayland_logo

Le monde Linux est en migration de l'ancien système d'affichage X11 vers Wayland.
Il y a beaucoup de motifs à ce changement, mais le plus simple est de regarder cette conférence pour comprendre les raisons de l'obsolescence de X :

Cependant, cela pose certains problèmes, et particulièrement s'agissant des applications OpenGL historiques.

Pour résumer, deux catégories d'API OpenGL incompatibles sont utilisées aujourd'hui :

Il y a aussi nécessité d'autre chose qu'OpenGL pour dessiner concrètement : un lien ou "glu" avec le système d'affichage sous-jacent. Il s'agit par exemple de :

Nous avons une contrainte sous Tizen Common : ne pas dépendre de X11. Seuls les paquets Wayland doivent être présents dans notre "profil de base".
Il paraît donc évident qu'il faut utiliser une alternative à GLX (dont rien que le nom indique qu'il "tire" X11)... et le Khronos Group propose justement dans ce but la nouvelle API neutre EGL :

Parfait ! Tout est donc bien qui finit bien ? Pas vraiment...

Le problème : OpenGL "bureau" dépend de GLX

Historiquement, le projet Mesa fournit les implémentations open-source d'OpenGL sous Linux.

La version "bureau" d'OpenGL correspond donc à un bibliothèque "libGL.so".
Et GLX pour le fenêtrage X11 alors ? Y a-t-il une "libGLX.so" annexe ?
Eh bien... pas du tout.
L'implémentation de GLX se trouve elle aussi dans "libGL.so".

Vous avez bien lu ! Cela veut dire qu'en hiérarchie de depéndance, on a :

libGL.so -> libX11.so

et qu'en retirant X11... eh bien on retire mécaniquement OpenGL "bureau" de la distribution Linux !

Eh oui, ce n'est pas pour rien que nous ne fournissons pas l'exemple "weston-gears" sous Tizen Common :

weston-gears

Il est écrit avec la très conviviale API OpenGL 1.x (aussi utilisée par le plus connu "glxgears")... et absente de l'OS.

Ce qu'il nous reste en réalité sous Tizen Common, c'est OpenGL ES 1/2 pour l'embarqué. Bien à propos car c'est justement notre matériel cible !

Mais cela veut dire que fournir une application OpenGL historique sous Tizen Common nécessite soit :

C'est ce dernier point, plus réaliste, qui sera notre sujet du jour.

1) jwzGLES : OpenGL -> OpenGL ES 1

Il y a environ un an, le très réputé jwz a eu la nécessité de porter XScreenSaver vers iOS.
Etant donné que l'iPhone ne fournit que GL ES, il a écrit un traducteur GL->GL ES1 nommé jwzGLES que l'on peut se procurer à différentes sources.

Donc pour un code ayant des entêtes GL :

#include <GL/gl.h>

il suffit au départ de les remplacer par ceux de jwzGLES :

#include <GLES/gl.h>
#include "jwzgles.h"

Et pour la compilation de remplacer :

-lGL

par :

-DHAVE_JWZGLES ... -lGLESv1_CM -ljwzgles

2) EGLX : GLX -> EGL

Ma bibliothèque EGLX traduit les appels de fenêtrage GLX en combinaison d'EGL et wayland-egl.

Vous pouvez la récupérer simplement, ou en téléchargeant une archive :

git clone https://github.com/Tarnyko/EGLX
# ou
wget https://tarnyko.net/dl/EGLX_0.1.tar.bz2

Donc pour un code ayant des entêtes GLX :

#include <GL/glx.h>

il suffit de les remplacer par ceux d'EGLX, et de rajouter un appel EGLX_main() au début de la fonction main() ;

#include "EGLX.h"
[...]

int main(int argc, char* argv[])
{
    EGLX_main(0);

Et pour la compilation de rajouter :

-lEGLX

Exemple concret : "glxgears" sous Wayland

Dans l'arbre source d'EGLX, une fois que vous avez compilé la bibliothèque, prenez le temps d'analyser la version légèrement adaptée de "glxgears" : examples/glxgears.c .

Puis compilez-la avec :

./compile_glxgears.sh

et exécutez-la avec :

./glxgears

glxgears-eglx

Sur le compositeur Weston, on peut déplacer la surface avec le pointeur

Ta-daam 😃 !