PyOpenGLng est un module visant à expérimenter de nouveaux concepts autour de l'intégration de l'API OpenGL au sein de Python. Les objectifs de ce module sont d'apporter une simplification par rapport à l'implémentation de référence PyOpenGL, d'implémenter une interface basée sur CFFI et d'offrir une API de haut niveau pour les versions modernes d'OpenGL.
Jusqu'à présent les interfaces Python de l'API OpenGL étaient générées à partir d'un script qui lit le fichier d'en-tête C afin d'en extraire l'API. Cette approche n'a rien de choquant en soi et c'est d'ailleurs l'approche choisie par l'interface CFFI. Mais pour l'API OpenGL nous pouvons utiliser une autre approche puisque l'organisme en charge de la spécification d'OpenGL, le groupe Khronos, fournit un fichier XML appelé Registry qui décrit l'API et ses extensions officielles en fonction de la version, du profile (compatibilité ou core) et de sa variante desktop ou embarquée. Ce point est d'une grande importance car une des particularités de l'API OpenGL est qu'il n'y a pas une seule API mais plusieurs. L'autre particularité de l'API OpenGL est qu'elle est relativement simple puisque elle est uniquement composée d'énumérants et de fonctions mettant en œuvre des types fondamentaux. L'API ne définit par exemple aucun type de données composées.
L'interface de PyOpenGLng repose sur deux composants essentiels, le premier est une interface orientée-objet de l'OpenGL Registry et le deuxième est la partie qui gère l'interface C-Python à proprement parlé.
L'interface orientée-objet de l'OpenGL Registry permet de générer au vol l'API OpenGL souhaitée par l'utilisateur sous la forme d'un module Python, c.à.d. la liste des énumérants et des fonctions correspondant à l'API demandée. En comparaison PyOpenGL compte pas moins de mille fichiers pour couvrir toute l'API OpenGL et ses extensions. De plus il est relativement aisé d'obtenir la dernière version de l'API en téléchargeant le fichier XML depuis le serveur CVS de Khronos.
Au fil du temps l'API OpenGL a subit une révolution avec l'arrivée des GPUs qui a introduit à partir de la version 3 une approche basée sur un pipeline programmable. Cette nouvelle approche a occasionné des changements radicaux au niveau de l'API et sur la manière de travailler avec. Aujourd'hui OpenGL est essentiellement une interface orientée graphisme pour les processeurs de flux (GPU), de la même manière qu'OpenCL est une interface orientée calcule. Par conséquent l'usage de l'API en Python va essentiellement consister à modifier des variables d'états et échanger des tableaux Numpy via leurs adresses.
Cette relative simplicité est mise à contribution dans l'interface C-Python via une translation automatique basée sur les prototypes des fonctions. Ce mécanisme tient dans un seul fichier et requiert actuellement moins de 500 lignes de codes. Par conséquent il est relativement aisé de comprendre ce qui se passe entre le code utilisateur et l'API OpenGL. De plus il est implémenté avec ctypes et CFFI, ce qui permet d'être compatible avec l'interpréteur pypy.
Cette présentation sera l'occasion de faire un tour d'horizon des différentes approches possibles pour lier une bibliothèque C à Python et avec dans ce cas précis une approche originale puisque elle est basé sur une API décrite par un fichier XML.
Afin d'illustrer l'utilisation de ce module, je présenterais brièvement un module Python qui permet d'interpréter les fichiers DVI générés par LaTeX et un viewer mettant en œuvre un rendu du texte accéléré par GPU.
Lien vers les dépôts Git et leurs documentations: