flextGL is an OpenGL extension loader generator.
It is a bit different than other comparable systems:
- Gives complete control over exposed version and extensions
- (Optionally) exports only core-profile functions
- Only requested extensions are loaded
- Bindings directly generated from the OpenGL registry's
- Flexible python template system for source-generation
- Source templates easy to adapt to project requirements
- Explicitly define the functions that need to be loaded(optional)
You will need the following dependencies:
January 30 2015: Adding function whitelist and
August 7 2014: Adding support for generating OpenGL ES loading code
July 10 2014: flextGL now parses
gl.xmlinstead of the deprecated
The generator script.
The parsing code
The sub-directories in here contain the different template sets. You can add your own template by simply creating a new folder in there.
Some example profile files to give you an idea on how to write your own. 'profiles/exampleProfile.txt' contains a lot of comments to get you up to speed.
This directory is automatically created by the script to store the downloaded OpenGL .spec files.
You create your loader code by writing a profile file and passing it to the script.
Here is what a typical profile might look like:
version 3.3 core extension EXT_texture_filter_anisotropic optional extension ARB_tesselation_shader optional
This requests an OpenGL core profile and the extensions for anisotropic filtering and tesselation shaders. Those extensions were requested as 'optional'. This means that a missing extension won't cause an error. Instead, the programmer will have to check before using it. This can be easily done by testing a generated global variable. For OpenGL ES a typical profile might look like:
version 3.0 es extension OES_standard_derivatives optional extension OES_vertex_array_object optional
The profile file is then passed to the script like this:
$ python flextGLgen.py -D generated profile.txt
This will create the requested source code and put it in the 'generated' directory.
The best way to work with flextGL is to integrate it in your build-system. The example project demonstrates this for Make and CMake here.
The generated API boils down to a few things:
Initializes the OpenGL functions after context creation.
The OpenGL major version defined in the profile file.
The OpenGL minor version defined in the profile file.
Boolean variable. Is GL_TRUE, if the profile file defined a core profile.
Generated global variables for checking if a specific extension is supported.
Take a look at the example program to get an idea on how it's used.
At the moment, there are three template sets available:
This loads the extensions using a framework-agnostic method with WGL AGL or GLX. This is probably a sensible default for most people.
This uses GLFW 2's functions for loading and testing for OpenGL extensions. It will obviously only work with GLFW, but is well tested and the generated source code is very easy to understand.
This works like the
glfwtemplate, but uses GLFW 3 instead. In this template, a pointer to the GLFWwindow has to be passed as a parameter of
Used for generating OpenGL ES loading code.
A variant of the
compatibletemplate that generates more compact code It has not been thoroughly tested yet, though.
Installing Wheezy Template on Windows
If you have Python 3.4+ installed you should be able to install Wheezy using pip.
$ pip install --user wheezy.template
--user does a local install in your home-folder. You can omit it if you want
to do a system-wide installation.
If you have an older version of Python or don't have pip for some reason, then you need to install it first.
The "compatible" template uses a few code snippets from Slavomir Kaslev's gl3w OpenGL core profile loader for portable loading of procedures and checking minor/major version in OpenGL < 3.0.
Mykhailo Parfeniuk(sopyer) provided most of the
gl.xml parsing code.
Vladimír Vondruš(mosra) added support for OpenGL ES loader generation.
Leander Beernaert(LeanderBB) did various fixes on the compatible template.
eternalrain added support for function white-lists and created the
(C) Thomas Weber, 2011-2015 ginko (at) cg (dot) tuwien (dot) ac (dot) at