L'Application Binary Interface per la libreria OpenGL su sistemi Linux/X11.
L'OpenGL ABI è uno standard che si pone due principali obiettivi: il primo è definire delle convenzioni per stabilire l'ambiente runtime utilizzato dalle applicazioni OpenGL in collaborazione con X11 nei sistemi operativi Linux in modo da fornire una interfaccia comune indipendente dalla implementazione OpenGL presente sul sistema.
Il secondo obiettivo è definire l'ambiente di sviluppo per le applicazioni OpenGL, questo comprende la definizione del nome e della posizione dei file header, modalità di utilizzo delle estensioni etc.
Il vantaggio di avere una interfaccia comune per l'ambiente runtime è quella di poter far girare qualsiasi tipo di applicazioni, comprese quelle distribuite in binario (ad esempio prodotti commerciali closed source), su qualsiasi delle diverse implementazioni disponibili della libreria grafica.
L'OpenGL ABI è anche parte del <a href="http://www.linuxbase.org">LSB</a> (Linux Standard Base) ovvero un insieme di specifiche che si pongono come obiettivo lo standardizzazione di alcuni elementi tra le diverse distribuzioni Linux per facilitarne lo sviluppo.
L'ABI precisa che nel suo campo d'azione non rientrano:
- dettagli dell'implementazione interna di OpenGL
- standardizzazione su sistemi non Linux
- modifiche alle API OpenGL
- utilizzo delle OpenGL senza X11/GLX
Le sezioni principali della specifica:
Calling Conventions
La lista dei datatypes OpenGL (GLint, GLfloat etc.) con la loro descrizione e il loro equivalente in gcc su una architettura Intel a 32 bit.
Libraries
L'ABI prevede due librerie dinamiche, libGL e libGLU.
La prima include sia l'implementazione OpenGL che quella delle GLX e generalmente è strettamente dipendente dall'hardware sottostante e/o dall'X server, la seconda è la libreria di utility che utilizza esclusivamente le funzioni presenti nella libGL.
Vengono definiti i nomi dei link simbolici di entrambe le librerie:
libGL.so
libGLU.so
e i nomi runtime (DT_SONAME):
libGL.so.1
libGLU.so.1
Mantenendo separati i due nomi un eventuale update delle librerie runtime viene reso trasparente alle applicazione.
Entrambe le librerie devono essere posizionate in /usr/lib/
.
Dato che OpenGL utilizza un sistema di sviluppo tramite estensioni è necessario specificare
una interfaccia che permetta di verificare la presenza o meno di tali estensioni durante l'esecuzione dell'applicazione.
A tale scopo è stata introdotta la seguente funzione:
void (*glXGetProcAddressARB(const GLubyte *))();
glXGetProcAddressARB prende come argomento il nome di una estensione e ritorna il puntatore alla relativa GL extension se questa è presenti altrimenti ritorna NULL.
Header Files
Sono definiti i seguenti header:
<GL/gl.h> - OpenGL
<GL/glu.h> - GLU
<GL/glx.h> - GLX
<GL/glext.h> - OpenGL Extension
<GL/glext.h> - GLX Extension
Questi file devono essere presenti in /usr/include/GL
.
Extension Headers
Questa sezione tratta in modo più approfondito i file di header per le estensioni di OpenGL e di GLX specificando le convenzioni di identificazione delle estensioni, i metodi per il controllo delle versioni e per il supporto di implementazioni legacy.
Viene inoltre ricordato che gli extension headers vengono mantenuti in modo centralizzato dalla SGI (Silicon Graphics) insieme all'<a href="http://oss.sgi.com/projects/ogl-sample/registry/"></a>extension registry, cioè la lista di tutte le estensioni introdotte.
Lo stesso documento di specifica dell'ABI è mantenuto sul sito della SGI a <a href="http://oss.sgi.com/projects/ogl-sample/ABI/">questo indirizzo</a> e naturalmente ne consiglio la lettura per avere una visione più dettagliata delle varie sezioni e di alcune questioni ancora non completamente risolte.