1. Jason McKesson
  2. glLoadGen

Wiki

Clone wiki

glLoadGen / Style_No_Load_C

The noload_c style works a lot like the near-defunct GLee loader. You don't need to call a function to load all of the function pointers; instead, you simply call the GL functions as normal. If it hasn't been loaded, it will be. This makes it among the most user-friendly of the loader styles.

As a C style, it follows the naming conventions of the pointer_c style. It prefixes enums and functions with GL/WGL/GLX and gl/wgl/glX as appropriate.

The system is designed to be automatic, responding to your application's needs. However, calling a function that cannot be loaded from the implementation will result in a crash.

To help alleviate this, the system does have variables to tell you which extensions are available (at least, according to the extension strings). They are named by this convention ogl/wgl/glx_exts_<extension name>. These are int types. However, unlike the magic function pointers, you have to call another function to initialize them. You must call ogl/wgl/glx_CheckExtensions. This function only checks what is exported by the extension string, so it cannot report on the number of functions that failed to load.

Example

This example is for loading the OpenGL functions; it expects the OpenGL header to be included. For loading WGL/GLX functions, include their headers and change the ogl_ prefixes to wgl or glx as appropriate.

//Create OpenGL context and make it current.

That was a trick question: there is no initialization required. That is the whole point of this style, after all.

However, if you want to query which extensions are around, you need to initialize that:

//Create OpenGL context and make it current.
ogl_CheckExtensions();

The presence of extensions can be checked as follows:

if(ogl_exts_EXT_texture_compression_s3tc)
  glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 256, 256,
    GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, compressedSize, compressedPixels);
else
{
  void *decompressedPixels = DecompressPixels(256, 256,
    compressedSize, compressedPixels);

  glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 256, 256,
    GLRGBA, GL_UNSIGNED_BYTE, decompressedPixels);
  free(decompressedPixels);
}

Versions

When you use this system and provide a version number of OpenGL, noload_c will assume that you are serious about that version number. Which means that if you create a 3.3 header, and you do not supply a context that claims support for at least OpenGL version 3.3, crashing may occur.

In particular, OpenGL changed the mechanism to check for the presence/absence of extensions in version 3.0. Therefore, noload_c will also change how it checks for the presence/absence of extensions based on that. If you provide a version 3.0 or greater, it will use the new style of extension querying. Thus, if your context is only version 2.1, then this style will be unable to function and will likely crash when it fails to load an appropriate function pointer.

Updated