<p><strong>Question 1</strong> -- Usually the EXT version comes first as a collaboration between two or more vendors. ARB extensions require more discussion among voting members of Khronos and can have changes from the EXT version before getting approved. See the GL_ARB_direct_state_access extension which has many changes compared to GL_EXT_direct_state_access.</p>

<p><strong>Question 2</strong> --
The Issues section of the GL_ARB_framebuffer_object extension states why the functions do not have ARB suffixes:</p>

<blockquote>
  <p>(8) Why don't the new tokens and entry points in this extension have suffixes like other ARB extensions?</p>

<pre><code>   RESOLVED: Unlike most ARB extensions, this is a strict subset of
   functionality already approved in OpenGL 3.0. This extension
   exists only to support that functionality on older hardware that
   cannot implement a full OpenGL 3.0 driver. Since there are no
   possible behavior changes between the ARB extension and core
   features, source code compatibility is improved by not using
   suffixes on the extension.
</code></pre>
</blockquote>

<p><strong>Question 3</strong> --
If you want to use framebuffer objects on a context where the GL version is less than 3.0 you need to look at the extension string:</p>

<ol>
<li>If GL_ARB_framebuffer_object is supported, use the non ARB functions.</li>
<li>If only GL_EXT_framebuffer_object is supported, use the EXT functions.</li>
<li>If neither extension are supported, you need to fall back to OS level offscreen rendering like pbuffers.</li>
</ol>

CC BY-SA 3.0
2015-12-16T01:03:39.430Z
2015-12-16T01:03:39.430Z
Jason Allen
<p>I thought I had formed a general understanding of how OpenGL naming conventions and extensions worked, until I stumbled upon a case that confused me.</p>

<hr>

<p>Here's my understanding so far:</p>

<p><strong>No suffix</strong> -- e.g. <code>glGenBuffers()</code>. This function is a part of the core profile. The <a href="https://www.opengl.org/wiki/GLAPI/glGenBuffers">wiki page</a> tells me that this was added to the core profile starting from version 1.5.</p>

<p><strong>ARB</strong> -- e.g. <code>glGenBuffersARB()</code>. This function is part of the standardized <code>GL_ARB_vertex_buffer_object</code> extension. The <a href="https://www.opengl.org/registry/specs/ARB/vertex_buffer_object.txt">spec</a> of this extension clearly declares <code>GenBuffersARB()</code> in the "New Procedures and Functions" section. The "Dependencies" section tells me that I can potentially access this from a 1.4+ context, if the hardware supports the extension.</p>

<p><strong>EXT</strong> -- These are vendor-specific extensions and functions that only some vendors may support. Vertex buffer object doesn't seem to have an EXT extension in the registry.</p>

<hr>

<p>Here's where my understanding breaks down:</p>

<p><code>glGenFramebuffers</code>, as the <a href="https://www.opengl.org/wiki/GLAPI/glGenFramebuffers">wiki</a> shows, was added to the core in 3.0.</p>

<p>Now I want to access the frame buffer features at a lower core profile version than 3.0. So I want to use it as an extension. The spec registry tells me that there are two available extensions - <a href="https://www.opengl.org/registry/specs/ARB/framebuffer_object.txt">ARB</a> and <a href="https://www.opengl.org/registry/specs/EXT/framebuffer_object.txt">EXT</a>.</p>

<p><strong>Question 1</strong> -- If an ARB extension exists, why does an EXT extension exist? Wouldn't you always choose the standardized one over the vendor-specific one?</p>

<p>A look at the ARB spec in the "New procedures and functions" section tells me that the extension defines the <code>GenRenderbuffers()</code> function. No ARB suffix this time. GLEW doesn't have a function prototype for <code>glGenRenderbuffersARB()</code> at all. Weird.</p>

<p>The EXT spec does however have a <code>GenRenderbuffersEXT()</code> function in the new functions section, and GLEW also has<code>glGenRenderbuffersEXT()</code>.</p>

<p><strong>Question 2</strong> -- Why no ARB suffix if there's an EXT suffix? How does this work for ARB, given that the names of the ARB function and the core function are the same? </p>

<p><strong>Question 3</strong> -- I ultimately want Framebuffer features from a 1.4 profile. Which extension and which function-set should I use so that I get maximum hardware compatibility coverage?</p>

<opengl>
OpenGL compatibility, naming conventions and ARB vs EXT
ApoorvaJ
# OpenGL compatibility, naming conventions and ARB vs EXT

(Asked by: username_0 on 2015-12-15)

I thought I had formed a general understanding of how OpenGL naming conventions and extensions worked, until I stumbled upon a case that confused me.

---

Here's my understanding so far:

**No suffix** -- e.g. `glGenBuffers()`. This function is a part of the core profile. The [wiki page](https://www.opengl.org/wiki/GLAPI/glGenBuffers) tells me that this was added to the core profile starting from version 1.5.

**ARB** -- e.g. `glGenBuffersARB()`. This function is part of the standardized `GL_ARB_vertex_buffer_object` extension. The [spec](https://www.opengl.org/registry/specs/ARB/vertex_buffer_object.txt) of this extension clearly declares `GenBuffersARB()` in the "New Procedures and Functions" section. The "Dependencies" section tells me that I can potentially access this from a 1.4+ context, if the hardware supports the extension.

**EXT** -- These are vendor-specific extensions and functions that only some vendors may support. Vertex buffer object doesn't seem to have an EXT extension in the registry.

---

Here's where my understanding breaks down:

`glGenFramebuffers`, as the [wiki](https://www.opengl.org/wiki/GLAPI/glGenFramebuffers) shows, was added to the core in 3.0.

Now I want to access the frame buffer features at a lower core profile version than 3.0. So I want to use it as an extension. The spec registry tells me that there are two available extensions - [ARB](https://www.opengl.org/registry/specs/ARB/framebuffer_object.txt) and [EXT](https://www.opengl.org/registry/specs/EXT/framebuffer_object.txt).

**Question 1** -- If an ARB extension exists, why does an EXT extension exist? Wouldn't you always choose the standardized one over the vendor-specific one?

A look at the ARB spec in the "New procedures and functions" section tells me that the extension defines the `GenRenderbuffers()` function. No ARB suffix this time. GLEW doesn't have a function prototype for `glGenRenderbuffersARB()` at all. Weird.

The EXT spec does however have a `GenRenderbuffersEXT()` function in the new functions section, and GLEW also has`glGenRenderbuffersEXT()`.

**Question 2** -- Why no ARB suffix if there's an EXT suffix? How does this work for ARB, given that the names of the ARB function and the core function are the same?

**Question 3** -- I ultimately want Framebuffer features from a 1.4 profile. Which extension and which function-set should I use so that I get maximum hardware compatibility coverage?

**Tags:** opengl

---

## 1 answers

### Answer by username_1 on 2015-12-16. Score: 9 | Accepted answer

Question 1 -- Usually the EXT version comes first as a collaboration between two or more vendors. ARB extensions require more discussion among voting members of Khronos and can have changes from the EXT version before getting approved. See the GL_ARB_direct_state_access extension which has many changes compared to GL_EXT_direct_state_access.
Question 2 --
The Issues section of the GL_ARB_framebuffer_object extension states why the functions do not have ARB suffixes:

(8) Why don't the new tokens and entry points in this extension have suffixes like other ARB extensions?
   RESOLVED: Unlike most ARB extensions, this is a strict subset of
   functionality already approved in OpenGL 3.0. This extension
   exists only to support that functionality on older hardware that
   cannot implement a full OpenGL 3.0 driver. Since there are no
   possible behavior changes between the ARB extension and core
   features, source code compatibility is improved by not using
   suffixes on the extension.


Question 3 --
If you want to use framebuffer objects on a context where the GL version is less than 3.0 you need to look at the extension string:

If GL_ARB_framebuffer_object is supported, use the non ARB functions.
If only GL_EXT_framebuffer_object is supported, use the EXT functions.
If neither extension are supported, you need to fall back to OS level offscreen rendering like pbuffers.


---

