Vous êtes ici

Porter une application OpenGL de X11 vers Wayland (avec jwzGLES & EGLX)

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

Le monde Linux est en migration rapide 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.

Plusieurs API OpenGL incompatibles sont utilisées aujourd'hui (GL1, GL2, GL3, GLES1, GLES2...) ; sur le poste de travail, la plus populaire a longtemps été GL1/G2, alors que GLES, par contraste, est surtout utilisée sur les systèmes mobiles (Android, iOS...).
Il y a aussi nécessité d'autre chose qu'OpenGL pour dessiner concrètement : un lien avec le système d'affichage sous-jacent. Il s'agit de WGL sous Windows, CGL sous Mac OS X, et traditionnellement GLX sous Linux/X11.

Par exemple, notre bon vieux test glxgears s'exécute sous X11 via OpenGL1 and GLX :


glxgears avec GL/GLX

Et nous pouvons maintenant aborder le problème : Wayland ne gère pas GL ni GLX.
En lieu et place, il utilise GLES via une nouvelle API nommée EGL.

Nous serions normalement forcés de réécrire tout notre code d'implémentation. Mais nous allons voir un moyen de résoudre ceci avec un minimum d'efforts.

Traduire OpenGL avec jwzGLES

Il y a environ un an, jwz a eu la nécessite de porter xscreensaver vers l'iPhone. Etant donné que l'iPhone n'utilise que GLES, il a écrit un traducteur GL-vers-GLES1 que l'on peut se procurer à différents emplacements.

Donc pour un code ayant des entêtes GL :

#include <GL/gl.h>

il suffit de les remplacer par ceux de jwzGLES/GLES1 ;

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

Et pour lier remplacer :
-lGL
par :
-lGLESv1_CM -DHAVE_JWZGLES -ljwzgles

Traduire GLX avec EGLX

J'ai récemment eu besoin de porter un programme GLX vers Wayland ; j'ai donc écrit un traducteur nommé EGLX, qui retranscrit les appels GLX en EGL-Wayland (d'où le nom ;-) ).

Vous pouvez le récupérer depuis ce dépôt en faisant :
git clone https://github.com/Tarnyko/EGLX.git
ou télécharger une archive :
EGLX_0.1.tar.bz2 (88,9 Ko)

Donc pour un code contenant les entêtes GLX :

#include <GL/glx.h>

on les remplace avec ceux d'EGLX ;

#include "EGLX.h"

et rajoute au début de la fonction main() :

EGLX_main (0); 

Et pour lier :
-lEGLX

Implémentation concrète: 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 "examples/glxgears.c".
Puis compilez-la avec :
./compile_glxgears.sh
Et exécutez-la avec :
./glxgears


glxgears "traduit" sous Wayland ; on peut déplacer la surface avec le pointeur

Voilà !

Une vidéo est aussi consultable ICI.