[cogl/wip/combined-driver-build: 2/3] Move all of the GL function pointers directly to CoglContext



commit ba173839e858fb2a46c53783c18433e48aca4e6f
Author: Neil Roberts <neil linux intel com>
Date:   Wed Jul 6 18:59:20 2011 +0100

    Move all of the GL function pointers directly to CoglContext
    
    Instead of storing all of the feature function pointers in the driver
    specific data of the CoglContext they are now all stored directly in
    CoglContext. There is a single header containing the description of
    the functions which gets included by cogl-context.h. There is a single
    function in cogl-feature-private.c to check for all of these
    functions.
    
    The name of the function pointer variables have been changed from
    ctx->drv.pf_glWhatever to just ctx->glWhatever.
    
    The feature flags that get set when an extension is available are now
    separated from the table of extensions. This is necessary because
    different extensions can mean different things on GLES and GL. For
    example, having access to glMapBuffer implies read and write support
    on GL but only write support on GLES. The flags are instead set in the
    driver specific init function by checking whether the function
    pointers were successfully resolved.
    
    _cogl_feature_check has been changed to assume the feature is
    supported if any of the listed extensions are available instead of
    requiring all of them. This makes it more convenient to specify
    alternate names for the extension. Nothing else had previously listed
    more than one name for an extension so this shouldn't cause any
    problems.

 cogl/Makefile.am                               |    3 +-
 cogl/cogl-attribute.c                          |   26 +-
 cogl/cogl-blend-string.c                       |    2 +-
 cogl/cogl-buffer.c                             |   16 +-
 cogl/cogl-context-private.h                    |   21 ++
 cogl/cogl-context.c                            |    2 +-
 cogl/cogl-ext-functions.h                      |  438 ++++++++++++++++++++++++
 cogl/cogl-feature-private.c                    |   69 ++++-
 cogl/cogl-feature-private.h                    |   25 ++-
 cogl/cogl-framebuffer.c                        |   24 +-
 cogl/cogl-pipeline-fragend-arbfp.c             |   12 +-
 cogl/cogl-pipeline-fragend-glsl.c              |   12 +-
 cogl/cogl-pipeline-opengl.c                    |   40 +--
 cogl/cogl-pipeline-progend-glsl.c              |   22 +-
 cogl/cogl-pipeline-vertend-glsl.c              |   12 +-
 cogl/cogl-program.c                            |   42 ++--
 cogl/cogl-shader.c                             |   20 +-
 cogl/cogl-texture-2d.c                         |    2 +-
 cogl/cogl-texture-3d.c                         |    4 +-
 cogl/driver/gl/cogl-context-driver-gl.h        |   20 +-
 cogl/driver/gl/cogl-feature-functions-gl.h     |  435 -----------------------
 cogl/driver/gl/cogl-gl.c                       |   80 ++---
 cogl/driver/gl/cogl-texture-driver-gl.c        |    4 +-
 cogl/driver/gles/cogl-context-driver-gles.h    |   20 +-
 cogl/driver/gles/cogl-feature-functions-gles.h |  153 ---------
 cogl/driver/gles/cogl-gles.c                   |   78 ++---
 cogl/driver/gles/cogl-texture-driver-gles.c    |    4 +-
 cogl/winsys/cogl-winsys-egl.c                  |    4 +-
 cogl/winsys/cogl-winsys-glx.c                  |   14 +-
 cogl/winsys/cogl-winsys-wgl.c                  |    4 +-
 30 files changed, 750 insertions(+), 858 deletions(-)
---
diff --git a/cogl/Makefile.am b/cogl/Makefile.am
index a2093b2..802fc30 100644
--- a/cogl/Makefile.am
+++ b/cogl/Makefile.am
@@ -104,7 +104,6 @@ cogl_driver_sources =
 
 if COGL_DRIVER_GL
 cogl_driver_sources += \
-	$(srcdir)/driver/gl/cogl-feature-functions-gl.h	\
 	$(srcdir)/driver/gl/cogl-gl.c			\
 	$(srcdir)/driver/gl/cogl-texture-driver-gl.c	\
 	$(srcdir)/driver/gl/cogl-context-driver-gl.h	\
@@ -113,7 +112,6 @@ endif
 
 if COGL_DRIVER_GLES
 cogl_driver_sources += \
-	$(srcdir)/driver/gles/cogl-feature-functions-gles.h	\
 	$(srcdir)/driver/gles/cogl-gles.c			\
 	$(srcdir)/driver/gles/cogl-texture-driver-gles.c	\
 	$(srcdir)/driver/gles/cogl-context-driver-gles.h	\
@@ -210,6 +208,7 @@ cogl_sources_c = \
 	$(srcdir)/cogl-clip-state.c			\
 	$(srcdir)/cogl2-clip-state.h 			\
 	$(srcdir)/cogl2-clip-state.c 			\
+	$(srcdir)/cogl-ext-functions.h			\
 	$(srcdir)/cogl-feature-private.h                \
 	$(srcdir)/cogl-feature-private.c                \
 	$(srcdir)/cogl-fixed.c		    		\
diff --git a/cogl/cogl-attribute.c b/cogl/cogl-attribute.c
index d0bd85c..0e5e106 100644
--- a/cogl/cogl-attribute.c
+++ b/cogl/cogl-attribute.c
@@ -49,26 +49,26 @@
 
 #if defined (HAVE_COGL_GL)
 
-#define glGenBuffers ctx->drv.pf_glGenBuffers
-#define glBindBuffer ctx->drv.pf_glBindBuffer
-#define glBufferData ctx->drv.pf_glBufferData
-#define glBufferSubData ctx->drv.pf_glBufferSubData
-#define glGetBufferSubData ctx->drv.pf_glGetBufferSubData
-#define glDeleteBuffers ctx->drv.pf_glDeleteBuffers
-#define glMapBuffer ctx->drv.pf_glMapBuffer
-#define glUnmapBuffer ctx->drv.pf_glUnmapBuffer
-#define glClientActiveTexture ctx->drv.pf_glClientActiveTexture
+#define glGenBuffers ctx->glGenBuffers
+#define glBindBuffer ctx->glBindBuffer
+#define glBufferData ctx->glBufferData
+#define glBufferSubData ctx->glBufferSubData
+#define glGetBufferSubData ctx->glGetBufferSubData
+#define glDeleteBuffers ctx->glDeleteBuffers
+#define glMapBuffer ctx->glMapBuffer
+#define glUnmapBuffer ctx->glUnmapBuffer
+#define glClientActiveTexture ctx->glClientActiveTexture
 #ifndef GL_ARRAY_BUFFER
 #define GL_ARRAY_BUFFER GL_ARRAY_BUFFER_ARB
 #endif
 
-#define glVertexAttribPointer ctx->drv.pf_glVertexAttribPointer
-#define glEnableVertexAttribArray ctx->drv.pf_glEnableVertexAttribArray
-#define glDisableVertexAttribArray ctx->drv.pf_glDisableVertexAttribArray
+#define glVertexAttribPointer ctx->glVertexAttribPointer
+#define glEnableVertexAttribArray ctx->glEnableVertexAttribArray
+#define glDisableVertexAttribArray ctx->glDisableVertexAttribArray
 #define MAY_HAVE_PROGRAMABLE_GL
 
 #define glDrawRangeElements(mode, start, end, count, type, indices) \
-  ctx->drv.pf_glDrawRangeElements (mode, start, end, count, type, indices)
+  ctx->glDrawRangeElements (mode, start, end, count, type, indices)
 
 #else /* GLES 1/2 */
 
diff --git a/cogl/cogl-blend-string.c b/cogl/cogl-blend-string.c
index 921b809..aaba5cf 100644
--- a/cogl/cogl-blend-string.c
+++ b/cogl/cogl-blend-string.c
@@ -222,7 +222,7 @@ validate_blend_statements (CoglBlendStringStatement *statements,
   if (n_statements == 2)
     {
       /* glBlendEquationSeperate is GL 2.0 only */
-      if (!ctx->drv.pf_glBlendEquationSeparate &&
+      if (!ctx->glBlendEquationSeparate &&
           statements[0].function->type != statements[1].function->type)
         {
           error_string = "Separate blend functions for the RGB an A "
diff --git a/cogl/cogl-buffer.c b/cogl/cogl-buffer.c
index 2892fd9..eae7e0c 100644
--- a/cogl/cogl-buffer.c
+++ b/cogl/cogl-buffer.c
@@ -51,18 +51,18 @@
 
 #if defined (HAVE_COGL_GL)
 
-#define glGenBuffers ctx->drv.pf_glGenBuffers
-#define glBindBuffer ctx->drv.pf_glBindBuffer
-#define glBufferData ctx->drv.pf_glBufferData
-#define glBufferSubData ctx->drv.pf_glBufferSubData
-#define glGetBufferSubData ctx->drv.pf_glGetBufferSubData
-#define glDeleteBuffers ctx->drv.pf_glDeleteBuffers
+#define glGenBuffers ctx->glGenBuffers
+#define glBindBuffer ctx->glBindBuffer
+#define glBufferData ctx->glBufferData
+#define glBufferSubData ctx->glBufferSubData
+#define glGetBufferSubData ctx->glGetBufferSubData
+#define glDeleteBuffers ctx->glDeleteBuffers
 
 #endif
 
 /* These two are always accessed through an extension, even on GLES */
-#define glMapBuffer ctx->drv.pf_glMapBuffer
-#define glUnmapBuffer ctx->drv.pf_glUnmapBuffer
+#define glMapBuffer ctx->glMapBuffer
+#define glUnmapBuffer ctx->glUnmapBuffer
 
 #ifndef GL_PIXEL_PACK_BUFFER
 #define GL_PIXEL_PACK_BUFFER 0x88EB
diff --git a/cogl/cogl-context-private.h b/cogl/cogl-context-private.h
index 2bc6528..386407f 100644
--- a/cogl/cogl-context-private.h
+++ b/cogl/cogl-context-private.h
@@ -264,6 +264,27 @@ struct _CoglContext
   unsigned int winsys_features
     [COGL_FLAGS_N_INTS_FOR_SIZE (COGL_WINSYS_FEATURE_N_FEATURES)];
   void *winsys;
+
+  /* This defines a list of function pointers that Cogl uses from
+     either GL or GLES. All functions are accessed indirectly through
+     these pointers rather than linking to them directly */
+#ifndef APIENTRY
+#define APIENTRY
+#endif
+
+#define COGL_EXT_BEGIN(name, \
+                       min_gl_major, min_gl_minor, \
+                       gles_availability, \
+                       extension_suffixes, extension_names)
+#define COGL_EXT_FUNCTION(ret, name, args) \
+  ret (APIENTRY * name) args;
+#define COGL_EXT_END()
+
+#include "cogl-ext-functions.h"
+
+#undef COGL_EXT_BEGIN
+#undef COGL_EXT_FUNCTION
+#undef COGL_EXT_END
 };
 
 CoglContext *
diff --git a/cogl/cogl-context.c b/cogl/cogl-context.c
index 837b70d..884ec4a 100644
--- a/cogl/cogl-context.c
+++ b/cogl/cogl-context.c
@@ -47,7 +47,7 @@
 
 #ifdef HAVE_COGL_GL
 #include "cogl-pipeline-fragend-arbfp-private.h"
-#define glActiveTexture _context->drv.pf_glActiveTexture
+#define glActiveTexture _context->glActiveTexture
 #endif
 
 /* This isn't defined in the GLES headers */
diff --git a/cogl/cogl-ext-functions.h b/cogl/cogl-ext-functions.h
new file mode 100644
index 0000000..e73e4dc
--- /dev/null
+++ b/cogl/cogl-ext-functions.h
@@ -0,0 +1,438 @@
+/*
+ * Cogl
+ *
+ * An object oriented GL/GLES Abstraction/Utility Layer
+ *
+ * Copyright (C) 2009, 2011 Intel Corporation.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ *
+ *
+ */
+
+/* This is included multiple times with different definitions for
+ * these macros. The macros are given the following arguments:
+ *
+ * COGL_EXT_BEGIN:
+ *
+ * @name: a unique symbol name for this feature
+ *
+ * @min_gl_major: the major part of the minimum GL version where these
+ * functions are available in core, or 255 if it isn't available in
+ * any version.
+ * @min_gl_minor: the minor part of the minimum GL version where these
+ * functions are available in core, or 255 if it isn't available in
+ * any version.
+ *
+ * @gles_availability: flags to specify which versions of GLES the
+ * functions are available in. Should be a combination of
+ * COGL_EXT_IN_GLES and COGL_EXT_IN_GLES2.
+ *
+ * @extension_suffixes: A zero-separated list of suffixes in a
+ * string. These are appended to the extension name to get a complete
+ * extension name to try. The suffix is also appended to all of the
+ * function names. The suffix can optionally include a ':' to specify
+ * an alternate suffix for the function names.
+ *
+ * @extension_names: A list of extension names to try. If any of these
+ * extensions match then it will be used.
+ */
+COGL_EXT_BEGIN (offscreen,
+                255, 255,
+                COGL_EXT_IN_GLES2,
+                /* for some reason the ARB version of this
+                   extension doesn't have an ARB suffix for the
+                   functions */
+                "ARB:\0EXT\0OES\0",
+                "framebuffer_object\0")
+COGL_EXT_FUNCTION (void, glGenRenderbuffers,
+                   (GLsizei               n,
+                    GLuint               *renderbuffers))
+COGL_EXT_FUNCTION (void, glDeleteRenderbuffers,
+                   (GLsizei               n,
+                    const GLuint         *renderbuffers))
+COGL_EXT_FUNCTION (void, glBindRenderbuffer,
+                   (GLenum                target,
+                    GLuint                renderbuffer))
+COGL_EXT_FUNCTION (void, glRenderbufferStorage,
+                   (GLenum                target,
+                    GLenum                internalformat,
+                    GLsizei               width,
+                    GLsizei               height))
+COGL_EXT_FUNCTION (void, glGenFramebuffers,
+                   (GLsizei               n,
+                    GLuint               *framebuffers))
+COGL_EXT_FUNCTION (void, glBindFramebuffer,
+                   (GLenum                target,
+                    GLuint                framebuffer))
+COGL_EXT_FUNCTION (void, glFramebufferTexture2D,
+                   (GLenum                target,
+                    GLenum                attachment,
+                    GLenum                textarget,
+                    GLuint                texture,
+                    GLint                 level))
+COGL_EXT_FUNCTION (void, glFramebufferRenderbuffer,
+                   (GLenum                target,
+                    GLenum                attachment,
+                    GLenum                renderbuffertarget,
+                    GLuint                renderbuffer))
+COGL_EXT_FUNCTION (GLenum, glCheckFramebufferStatus,
+                   (GLenum                target))
+COGL_EXT_FUNCTION (void, glDeleteFramebuffers,
+                   (GLsizei               n,
+                    const                 GLuint *framebuffers))
+COGL_EXT_FUNCTION (void, glGenerateMipmap,
+                   (GLenum                target))
+COGL_EXT_FUNCTION (void, glGetFramebufferAttachmentParameteriv,
+                   (GLenum                target,
+                    GLenum                attachment,
+                    GLenum                pname,
+                    GLint                *params))
+COGL_EXT_END ()
+
+COGL_EXT_BEGIN (offscreen_blit, 255, 255,
+                0, /* not in either GLES */
+                "EXT\0ANGLE\0",
+                "framebuffer_blit\0")
+COGL_EXT_FUNCTION (void, glBlitFramebuffer,
+                   (GLint                 srcX0,
+                    GLint                 srcY0,
+                    GLint                 srcX1,
+                    GLint                 srcY1,
+                    GLint                 dstX0,
+                    GLint                 dstY0,
+                    GLint                 dstX1,
+                    GLint                 dstY1,
+                    GLbitfield            mask,
+                    GLenum                filter))
+COGL_EXT_END ()
+
+COGL_EXT_BEGIN (offscreen_multisample, 255, 255,
+                0, /* not in either GLES */
+                "EXT\0",
+                "framebuffer_multisample\0")
+COGL_EXT_FUNCTION (void, glRenderbufferStorageMultisample,
+                   (GLenum                target,
+                    GLsizei               samples,
+                    GLenum                internalformat,
+                    GLsizei               width,
+                    GLsizei               height))
+COGL_EXT_END ()
+
+/* ARB_fragment_program */
+COGL_EXT_BEGIN (arbfp, 255, 255,
+                0, /* not in either GLES */
+                "ARB\0",
+                "fragment_program\0")
+COGL_EXT_FUNCTION (void, glGenPrograms,
+                   (GLsizei               n,
+                    GLuint               *programs))
+COGL_EXT_FUNCTION (void, glDeletePrograms,
+                   (GLsizei               n,
+                    GLuint               *programs))
+COGL_EXT_FUNCTION (void, glBindProgram,
+                   (GLenum                target,
+                    GLuint                program))
+COGL_EXT_FUNCTION (void, glProgramString,
+                   (GLenum                target,
+                    GLenum                format,
+                    GLsizei               len,
+                    const void           *program))
+COGL_EXT_FUNCTION (void, glProgramLocalParameter4fv,
+                   (GLenum                target,
+                    GLuint                index,
+                    GLfloat              *params))
+COGL_EXT_END ()
+
+/* The function names in OpenGL 2.0 are different so we can't easily
+   just check for GL 2.0 */
+COGL_EXT_BEGIN (shaders_glsl, 2, 0,
+                COGL_EXT_IN_GLES2,
+                "\0",
+                "\0")
+COGL_EXT_FUNCTION (GLuint, glCreateProgram,
+                   (void))
+COGL_EXT_FUNCTION (GLuint, glCreateShader,
+                   (GLenum                shaderType))
+COGL_EXT_FUNCTION (void, glShaderSource,
+                   (GLuint                shader,
+                    GLsizei               count,
+                    const GLchar        **string,
+                    const GLint          *length))
+COGL_EXT_FUNCTION (void, glCompileShader,
+                   (GLuint                shader))
+COGL_EXT_FUNCTION (void, glDeleteShader,
+                   (GLuint                shader))
+COGL_EXT_FUNCTION (void, glAttachShader,
+                   (GLuint                program,
+                    GLuint                shader))
+COGL_EXT_FUNCTION (void, glLinkProgram,
+                   (GLuint                program))
+COGL_EXT_FUNCTION (void, glUseProgram,
+                   (GLuint                program))
+COGL_EXT_FUNCTION (GLint, glGetUniformLocation,
+                   (GLuint                program,
+                    const GLchar         *name))
+COGL_EXT_FUNCTION (void, glDeleteProgram,
+                   (GLuint                program))
+COGL_EXT_FUNCTION (void, glGetShaderInfoLog,
+                   (GLuint                shader,
+                    GLsizei               maxLength,
+                    GLsizei              *length,
+                    GLchar               *infoLog))
+COGL_EXT_FUNCTION (void, glGetShaderiv,
+                   (GLuint                shader,
+                    GLenum                pname,
+                    GLint                *params))
+
+COGL_EXT_FUNCTION (void, glVertexAttribPointer,
+                   (GLuint		 index,
+                    GLint		 size,
+                    GLenum		 type,
+                    GLboolean		 normalized,
+                    GLsizei		 stride,
+                    const GLvoid		*pointer))
+COGL_EXT_FUNCTION (void, glEnableVertexAttribArray,
+                   (GLuint		 index))
+COGL_EXT_FUNCTION (void, glDisableVertexAttribArray,
+                   (GLuint		 index))
+
+COGL_EXT_FUNCTION (void, glUniform1f,
+                   (GLint                 location,
+                    GLfloat               v0))
+COGL_EXT_FUNCTION (void, glUniform2f,
+                   (GLint                 location,
+                    GLfloat               v0,
+                    GLfloat               v1))
+COGL_EXT_FUNCTION (void, glUniform3f,
+                   (GLint                 location,
+                    GLfloat               v0,
+                    GLfloat               v1,
+                    GLfloat               v2))
+COGL_EXT_FUNCTION (void, glUniform4f,
+                   (GLint                 location,
+                    GLfloat               v0,
+                    GLfloat               v1,
+                    GLfloat               v2,
+                    GLfloat               v3))
+COGL_EXT_FUNCTION (void, glUniform1fv,
+                   (GLint                 location,
+                    GLsizei               count,
+                    const GLfloat *       value))
+COGL_EXT_FUNCTION (void, glUniform2fv,
+                   (GLint                 location,
+                    GLsizei               count,
+                    const GLfloat *       value))
+COGL_EXT_FUNCTION (void, glUniform3fv,
+                   (GLint                 location,
+                    GLsizei               count,
+                    const GLfloat *       value))
+COGL_EXT_FUNCTION (void, glUniform4fv,
+                   (GLint                 location,
+                    GLsizei               count,
+                    const GLfloat *       value))
+COGL_EXT_FUNCTION (void, glUniform1i,
+                   (GLint                 location,
+                    GLint                 v0))
+COGL_EXT_FUNCTION (void, glUniform2i,
+                   (GLint                 location,
+                    GLint                 v0,
+                    GLint                 v1))
+COGL_EXT_FUNCTION (void, glUniform3i,
+                   (GLint                 location,
+                    GLint                 v0,
+                    GLint                 v1,
+                    GLint                 v2))
+COGL_EXT_FUNCTION (void, glUniform4i,
+                   (GLint                 location,
+                    GLint                 v0,
+                    GLint                 v1,
+                    GLint                 v2,
+                    GLint                 v3))
+COGL_EXT_FUNCTION (void, glUniform1iv,
+                   (GLint                 location,
+                    GLsizei               count,
+                    const GLint *         value))
+COGL_EXT_FUNCTION (void, glUniform2iv,
+                   (GLint                 location,
+                    GLsizei               count,
+                    const GLint *         value))
+COGL_EXT_FUNCTION (void, glUniform3iv,
+                   (GLint                 location,
+                    GLsizei               count,
+                    const GLint *         value))
+COGL_EXT_FUNCTION (void, glUniform4iv,
+                   (GLint                 location,
+                    GLsizei               count,
+                    const GLint *         value))
+COGL_EXT_FUNCTION (void, glUniformMatrix2fv,
+                   (GLint                 location,
+                    GLsizei               count,
+                    GLboolean             transpose,
+                    const GLfloat        *value))
+COGL_EXT_FUNCTION (void, glUniformMatrix3fv,
+                   (GLint                 location,
+                    GLsizei               count,
+                    GLboolean             transpose,
+                    const GLfloat        *value))
+COGL_EXT_FUNCTION (void, glUniformMatrix4fv,
+                   (GLint                 location,
+                    GLsizei               count,
+                    GLboolean             transpose,
+                    const GLfloat        *value))
+
+COGL_EXT_FUNCTION (void, glGetProgramiv,
+                   (GLuint                program,
+                    GLenum                pname,
+                    GLint                *params))
+
+COGL_EXT_FUNCTION (void, glGetProgramInfoLog,
+                   (GLuint                program,
+                    GLsizei               bufSize,
+                    GLsizei              *length,
+                    GLchar               *infoLog))
+
+COGL_EXT_END ()
+
+COGL_EXT_BEGIN (vbos, 1, 5,
+                COGL_EXT_IN_GLES |
+                COGL_EXT_IN_GLES2,
+                "ARB\0",
+                "vertex_buffer_object\0")
+COGL_EXT_FUNCTION (void, glGenBuffers,
+                   (GLuint		 n,
+                    GLuint		*buffers))
+COGL_EXT_FUNCTION (void, glBindBuffer,
+                   (GLenum		 target,
+                    GLuint		 buffer))
+COGL_EXT_FUNCTION (void, glBufferData,
+                   (GLenum		 target,
+                    GLsizeiptr		 size,
+                    const GLvoid		*data,
+                    GLenum		 usage))
+COGL_EXT_FUNCTION (void, glBufferSubData,
+                   (GLenum		 target,
+                    GLintptr		 offset,
+                    GLsizeiptr		 size,
+                    const GLvoid		*data))
+COGL_EXT_FUNCTION (void, glDeleteBuffers,
+                   (GLsizei		 n,
+                    const GLuint		*buffers))
+COGL_EXT_END ()
+
+/* GLES doesn't support mapping buffers in core so this has to be a
+   separate check */
+COGL_EXT_BEGIN (map_vbos, 1, 5,
+                0, /* not in GLES core */
+                "ARB\0OES\0",
+                "vertex_buffer_object\0mapbuffer\0")
+COGL_EXT_FUNCTION (void *, glMapBuffer,
+                   (GLenum		 target,
+                    GLenum		 access))
+COGL_EXT_FUNCTION (GLboolean, glUnmapBuffer,
+                   (GLenum		 target))
+COGL_EXT_END ()
+
+COGL_EXT_BEGIN (draw_range_elements, 1, 2,
+                0, /* not in either GLES */
+                "\0",
+                "\0")
+COGL_EXT_FUNCTION (void, glDrawRangeElements,
+                   (GLenum                mode,
+                    GLuint                start,
+                    GLuint                end,
+                    GLsizei               count,
+                    GLenum                type,
+                    const GLvoid         *indices))
+COGL_EXT_END ()
+
+COGL_EXT_BEGIN (blending, 1, 2,
+                COGL_EXT_IN_GLES2,
+                "\0",
+                "\0")
+COGL_EXT_FUNCTION (void, glBlendEquation,
+                   (GLenum                mode))
+COGL_EXT_FUNCTION (void, glBlendColor,
+                   (GLclampf              red,
+                    GLclampf              green,
+                    GLclampf              blue,
+                    GLclampf              alpha))
+COGL_EXT_END ()
+
+COGL_EXT_BEGIN (texture_3d, 1, 2,
+                0, /* not in either GLES */
+                "OES\0",
+                "texture_3D\0")
+COGL_EXT_FUNCTION (void, glTexImage3D,
+                   (GLenum target, GLint level,
+                    GLint internalFormat,
+                    GLsizei width, GLsizei height,
+                    GLsizei depth, GLint border,
+                    GLenum format, GLenum type,
+                    const GLvoid *pixels))
+COGL_EXT_FUNCTION (void, glTexSubImage3D,
+                   (GLenum target, GLint level,
+                    GLint xoffset, GLint yoffset,
+                    GLint zoffset, GLsizei width,
+                    GLsizei height, GLsizei depth,
+                    GLenum format,
+                    GLenum type, const GLvoid *pixels))
+COGL_EXT_END ()
+
+/* Available in GL 1.3, the multitexture extension or GLES. These are
+   required */
+COGL_EXT_BEGIN (multitexture, 1, 3,
+                COGL_EXT_IN_GLES |
+                COGL_EXT_IN_GLES2,
+                "ARB\0",
+                "multitexture\0")
+COGL_EXT_FUNCTION (void, glActiveTexture,
+                   (GLenum                texture))
+COGL_EXT_FUNCTION (void, glClientActiveTexture,
+                   (GLenum                texture))
+COGL_EXT_END ()
+
+/* Optional, declared in 1.4 or GLES 1.2 */
+COGL_EXT_BEGIN (blend_func_separate, 1, 4,
+                COGL_EXT_IN_GLES2,
+                "EXT\0",
+                "blend_func_separate\0")
+COGL_EXT_FUNCTION (void, glBlendFuncSeparate,
+                   (GLenum                srcRGB,
+                    GLenum                dstRGB,
+                    GLenum                srcAlpha,
+                    GLenum                dstAlpha))
+COGL_EXT_END ()
+
+/* Optional, declared in 2.0 */
+COGL_EXT_BEGIN (blend_equation_separate, 2, 0,
+                COGL_EXT_IN_GLES2,
+                "EXT\0",
+                "blend_equation_separate\0")
+COGL_EXT_FUNCTION (void, glBlendEquationSeparate,
+                   (GLenum                modeRGB,
+                    GLenum                modeAlpha))
+COGL_EXT_END ()
+
+COGL_EXT_BEGIN (EGL_image, 255, 255,
+                0, /* not in either GLES */
+                "OES\0",
+                "EGL_image\0")
+COGL_EXT_FUNCTION (void, glEGLImageTargetTexture2D,
+                   (GLenum           target,
+                    GLeglImageOES    image))
+COGL_EXT_FUNCTION (void, glEGLImageTargetRenderbufferStorage,
+                   (GLenum           target,
+                    GLeglImageOES    image))
+COGL_EXT_END ()
diff --git a/cogl/cogl-feature-private.c b/cogl/cogl-feature-private.c
index 1b60afd..27c806c 100644
--- a/cogl/cogl-feature-private.c
+++ b/cogl/cogl-feature-private.c
@@ -36,8 +36,9 @@ gboolean
 _cogl_feature_check (const CoglWinsysVtable *winsys,
                      const char *driver_prefix,
                      const CoglFeatureData *data,
-                     unsigned int gl_major,
-                     unsigned int gl_minor,
+                     int gl_major,
+                     int gl_minor,
+                     CoglExtGlesAvailability gles_version,
                      const char *extensions_string,
                      void *function_table)
 
@@ -48,7 +49,8 @@ _cogl_feature_check (const CoglWinsysVtable *winsys,
   /* First check whether the functions should be directly provided by
      GL */
   if (COGL_CHECK_GL_VERSION (gl_major, gl_minor,
-                             data->min_gl_major, data->min_gl_minor))
+                             data->min_gl_major, data->min_gl_minor) ||
+      (gles_version & data->gles_availability))
     suffix = "";
   else
     {
@@ -86,16 +88,16 @@ _cogl_feature_check (const CoglWinsysVtable *winsys,
                                    namespace, namespace_len);
               g_string_append_c (full_extension_name, '_');
               g_string_append (full_extension_name, extension);
-              if (!_cogl_check_extension (full_extension_name->str,
-                                          extensions_string))
+              if (_cogl_check_extension (full_extension_name->str,
+                                         extensions_string))
                 break;
             }
 
           g_string_free (full_extension_name, TRUE);
 
-          /* If we found all of the extensions with this namespace
-             then use it as the suffix */
-          if (*extension == '\0')
+          /* If we found an extension with this namespace then use it
+             as the suffix */
+          if (*extension)
             {
               suffix = namespace_suffix;
               break;
@@ -139,3 +141,54 @@ error:
 
   return FALSE;
 }
+
+/* Define a set of arrays containing the functions required from GL
+   for each feature */
+#define COGL_EXT_BEGIN(name,                                            \
+                       min_gl_major, min_gl_minor,                      \
+                       gles_availability,                               \
+                       namespaces, extension_names)                     \
+  static const CoglFeatureFunction cogl_ext_ ## name ## _funcs[] = {
+#define COGL_EXT_FUNCTION(ret, name, args)                          \
+  { G_STRINGIFY (name), G_STRUCT_OFFSET (CoglContext, name) },
+#define COGL_EXT_END()                      \
+  { NULL, 0 },                                  \
+  };
+#include "cogl-ext-functions.h"
+
+/* Define an array of features */
+#undef COGL_EXT_BEGIN
+#define COGL_EXT_BEGIN(name,                                            \
+                       min_gl_major, min_gl_minor,                      \
+                       gles_availability,                               \
+                       namespaces, extension_names)                     \
+  { min_gl_major, min_gl_minor, gles_availability, namespaces,          \
+      extension_names, 0, 0, 0,                                         \
+    cogl_ext_ ## name ## _funcs },
+#undef COGL_EXT_FUNCTION
+#define COGL_EXT_FUNCTION(ret, name, args)
+#undef COGL_EXT_END
+#define COGL_EXT_END()
+
+static const CoglFeatureData
+cogl_feature_ext_functions_data[] =
+  {
+#include "cogl-ext-functions.h"
+  };
+
+void
+_cogl_feature_check_ext_functions (CoglContext *context,
+                                   int gl_major,
+                                   int gl_minor,
+                                   const char *gl_extensions,
+                                   CoglExtGlesAvailability gles_version)
+{
+  int i;
+
+  for (i = 0; i < G_N_ELEMENTS (cogl_feature_ext_functions_data); i++)
+    _cogl_feature_check (_cogl_context_get_winsys (context),
+                         "GL", cogl_feature_ext_functions_data + i,
+                         gl_major, gl_minor, gles_version,
+                         gl_extensions,
+                         context);
+}
diff --git a/cogl/cogl-feature-private.h b/cogl/cogl-feature-private.h
index d81693d..b90897b 100644
--- a/cogl/cogl-feature-private.h
+++ b/cogl/cogl-feature-private.h
@@ -33,6 +33,12 @@
   ((driver_major) > (target_major) || \
    ((driver_major) == (target_major) && (driver_minor) >= (target_minor)))
 
+typedef enum
+{
+  COGL_EXT_IN_GLES = (1 << 0),
+  COGL_EXT_IN_GLES2 = (1 << 1)
+} CoglExtGlesAvailability;
+
 typedef struct _CoglFeatureFunction CoglFeatureFunction;
 
 struct _CoglFeatureFunction
@@ -50,11 +56,14 @@ struct _CoglFeatureData
   /* A minimum GL version which the functions should be defined in
      without needing an extension. Set to 255,255 if it's only
      provided in an extension */
-  guint8 min_gl_major, min_gl_minor;
+  int min_gl_major, min_gl_minor;
+  /* Flags specifying which versions of GLES the feature is available
+     in core in */
+  CoglExtGlesAvailability gles_availability;
   /* \0 separated list of namespaces to try. Eg "EXT\0ARB\0" */
   const char *namespaces;
   /* \0 separated list of required extension names without the GL_EXT
-     or GL_ARB prefix. All of the extensions must be available for the
+     or GL_ARB prefix. Any of the extensions must be available for the
      feature to be considered available. If the suffix for an
      extension is different from the namespace, you can specify it
      with a ':' after the namespace */
@@ -75,9 +84,17 @@ gboolean
 _cogl_feature_check (const CoglWinsysVtable *winsys,
                      const char *driver_prefix,
                      const CoglFeatureData *data,
-                     unsigned int gl_major,
-                     unsigned int gl_minor,
+                     int gl_major,
+                     int gl_minor,
+                     CoglExtGlesAvailability gles_version,
                      const char *extensions_string,
                      void *function_table);
 
+void
+_cogl_feature_check_ext_functions (CoglContext *context,
+                                   int gl_major,
+                                   int gl_minor,
+                                   const char *gl_extensions,
+                                   CoglExtGlesAvailability gles_version);
+
 #endif /* __COGL_FEATURE_PRIVATE_H */
diff --git a/cogl/cogl-framebuffer.c b/cogl/cogl-framebuffer.c
index f0705dd..e96f1f6 100644
--- a/cogl/cogl-framebuffer.c
+++ b/cogl/cogl-framebuffer.c
@@ -42,22 +42,22 @@
 
 #ifndef HAVE_COGL_GLES2
 
-#define glGenRenderbuffers                ctx->drv.pf_glGenRenderbuffers
-#define glDeleteRenderbuffers             ctx->drv.pf_glDeleteRenderbuffers
-#define glBindRenderbuffer                ctx->drv.pf_glBindRenderbuffer
-#define glRenderbufferStorage             ctx->drv.pf_glRenderbufferStorage
-#define glGenFramebuffers                 ctx->drv.pf_glGenFramebuffers
-#define glBindFramebuffer                 ctx->drv.pf_glBindFramebuffer
-#define glFramebufferTexture2D            ctx->drv.pf_glFramebufferTexture2D
-#define glFramebufferRenderbuffer         ctx->drv.pf_glFramebufferRenderbuffer
-#define glCheckFramebufferStatus          ctx->drv.pf_glCheckFramebufferStatus
-#define glDeleteFramebuffers              ctx->drv.pf_glDeleteFramebuffers
+#define glGenRenderbuffers                ctx->glGenRenderbuffers
+#define glDeleteRenderbuffers             ctx->glDeleteRenderbuffers
+#define glBindRenderbuffer                ctx->glBindRenderbuffer
+#define glRenderbufferStorage             ctx->glRenderbufferStorage
+#define glGenFramebuffers                 ctx->glGenFramebuffers
+#define glBindFramebuffer                 ctx->glBindFramebuffer
+#define glFramebufferTexture2D            ctx->glFramebufferTexture2D
+#define glFramebufferRenderbuffer         ctx->glFramebufferRenderbuffer
+#define glCheckFramebufferStatus          ctx->glCheckFramebufferStatus
+#define glDeleteFramebuffers              ctx->glDeleteFramebuffers
 #define glGetFramebufferAttachmentParameteriv \
-                                          ctx->drv.pf_glGetFramebufferAttachmentParameteriv
+                                          ctx->glGetFramebufferAttachmentParameteriv
 
 #endif
 
-#define glBlitFramebuffer                 ctx->drv.pf_glBlitFramebuffer
+#define glBlitFramebuffer                 ctx->glBlitFramebuffer
 
 #ifndef GL_FRAMEBUFFER
 #define GL_FRAMEBUFFER		0x8D40
diff --git a/cogl/cogl-pipeline-fragend-arbfp.c b/cogl/cogl-pipeline-fragend-arbfp.c
index 5878be4..3f4c4a3 100644
--- a/cogl/cogl-pipeline-fragend-arbfp.c
+++ b/cogl/cogl-pipeline-fragend-arbfp.c
@@ -55,12 +55,12 @@
  */
 
 #ifdef HAVE_COGL_GL
-#define glProgramString ctx->drv.pf_glProgramString
-#define glBindProgram ctx->drv.pf_glBindProgram
-#define glDeletePrograms ctx->drv.pf_glDeletePrograms
-#define glGenPrograms ctx->drv.pf_glGenPrograms
-#define glProgramLocalParameter4fv ctx->drv.pf_glProgramLocalParameter4fv
-#define glUseProgram ctx->drv.pf_glUseProgram
+#define glProgramString ctx->glProgramString
+#define glBindProgram ctx->glBindProgram
+#define glDeletePrograms ctx->glDeletePrograms
+#define glGenPrograms ctx->glGenPrograms
+#define glProgramLocalParameter4fv ctx->glProgramLocalParameter4fv
+#define glUseProgram ctx->glUseProgram
 #endif
 
 /* This might not be defined on GLES */
diff --git a/cogl/cogl-pipeline-fragend-glsl.c b/cogl/cogl-pipeline-fragend-glsl.c
index 10ac6cb..6f6fb3a 100644
--- a/cogl/cogl-pipeline-fragend-glsl.c
+++ b/cogl/cogl-pipeline-fragend-glsl.c
@@ -47,12 +47,12 @@
 
 #ifndef HAVE_COGL_GLES2
 
-#define glCreateShader       ctx->drv.pf_glCreateShader
-#define glGetShaderiv        ctx->drv.pf_glGetShaderiv
-#define glGetShaderInfoLog   ctx->drv.pf_glGetShaderInfoLog
-#define glCompileShader      ctx->drv.pf_glCompileShader
-#define glShaderSource       ctx->drv.pf_glShaderSource
-#define glDeleteShader       ctx->drv.pf_glDeleteShader
+#define glCreateShader       ctx->glCreateShader
+#define glGetShaderiv        ctx->glGetShaderiv
+#define glGetShaderInfoLog   ctx->glGetShaderInfoLog
+#define glCompileShader      ctx->glCompileShader
+#define glShaderSource       ctx->glShaderSource
+#define glDeleteShader       ctx->glDeleteShader
 
 #endif /* HAVE_COGL_GLES2 */
 
diff --git a/cogl/cogl-pipeline-opengl.c b/cogl/cogl-pipeline-opengl.c
index d91c706..51ac2f6 100644
--- a/cogl/cogl-pipeline-opengl.c
+++ b/cogl/cogl-pipeline-opengl.c
@@ -50,19 +50,17 @@
  */
 
 #ifdef HAVE_COGL_GL
-#define glActiveTexture ctx->drv.pf_glActiveTexture
-#define glClientActiveTexture ctx->drv.pf_glClientActiveTexture
-#define glBlendFuncSeparate ctx->drv.pf_glBlendFuncSeparate
-#define glBlendEquation ctx->drv.pf_glBlendEquation
-#define glBlendColor ctx->drv.pf_glBlendColor
-#define glBlendEquationSeparate ctx->drv.pf_glBlendEquationSeparate
-
-#define glProgramString ctx->drv.pf_glProgramString
-#define glBindProgram ctx->drv.pf_glBindProgram
-#define glDeletePrograms ctx->drv.pf_glDeletePrograms
-#define glGenPrograms ctx->drv.pf_glGenPrograms
-#define glProgramLocalParameter4fv ctx->drv.pf_glProgramLocalParameter4fv
-#define glUseProgram ctx->drv.pf_glUseProgram
+#define glActiveTexture ctx->glActiveTexture
+#define glClientActiveTexture ctx->glClientActiveTexture
+#define glBlendEquation ctx->glBlendEquation
+#define glBlendColor ctx->glBlendColor
+
+#define glProgramString ctx->glProgramString
+#define glBindProgram ctx->glBindProgram
+#define glDeletePrograms ctx->glDeletePrograms
+#define glGenPrograms ctx->glGenPrograms
+#define glProgramLocalParameter4fv ctx->glProgramLocalParameter4fv
+#define glUseProgram ctx->glUseProgram
 #endif
 
 /* These aren't defined in the GLES headers */
@@ -519,9 +517,9 @@ _cogl_pipeline_flush_color_blend_alpha_depth_state (
 #elif defined (HAVE_COGL_GL)
       gboolean have_blend_equation_seperate = FALSE;
       gboolean have_blend_func_separate = FALSE;
-      if (ctx->drv.pf_glBlendEquationSeparate) /* Only GL 2.0 + */
+      if (ctx->glBlendEquationSeparate) /* Only GL 2.0 + */
         have_blend_equation_seperate = TRUE;
-      if (ctx->drv.pf_glBlendFuncSeparate) /* Only GL 1.4 + */
+      if (ctx->glBlendFuncSeparate) /* Only GL 1.4 + */
         have_blend_func_separate = TRUE;
 #endif
 
@@ -546,8 +544,8 @@ _cogl_pipeline_flush_color_blend_alpha_depth_state (
 
       if (have_blend_equation_seperate &&
           blend_state->blend_equation_rgb != blend_state->blend_equation_alpha)
-        GE (glBlendEquationSeparate (blend_state->blend_equation_rgb,
-                                     blend_state->blend_equation_alpha));
+        GE (ctx->glBlendEquationSeparate (blend_state->blend_equation_rgb,
+                                          blend_state->blend_equation_alpha));
       else
         GE (glBlendEquation (blend_state->blend_equation_rgb));
 
@@ -555,10 +553,10 @@ _cogl_pipeline_flush_color_blend_alpha_depth_state (
           (blend_state->blend_src_factor_rgb != blend_state->blend_src_factor_alpha ||
            (blend_state->blend_src_factor_rgb !=
             blend_state->blend_src_factor_alpha)))
-        GE (glBlendFuncSeparate (blend_state->blend_src_factor_rgb,
-                                 blend_state->blend_dst_factor_rgb,
-                                 blend_state->blend_src_factor_alpha,
-                                 blend_state->blend_dst_factor_alpha));
+        GE (ctx->glBlendFuncSeparate (blend_state->blend_src_factor_rgb,
+                                      blend_state->blend_dst_factor_rgb,
+                                      blend_state->blend_src_factor_alpha,
+                                      blend_state->blend_dst_factor_alpha));
       else
 #endif
         GE (glBlendFunc (blend_state->blend_src_factor_rgb,
diff --git a/cogl/cogl-pipeline-progend-glsl.c b/cogl/cogl-pipeline-progend-glsl.c
index cc0f3dc..7efbe25 100644
--- a/cogl/cogl-pipeline-progend-glsl.c
+++ b/cogl/cogl-pipeline-progend-glsl.c
@@ -44,17 +44,17 @@
 
 #ifndef HAVE_COGL_GLES2
 
-#define glCreateProgram      ctx->drv.pf_glCreateProgram
-#define glAttachShader       ctx->drv.pf_glAttachShader
-#define glUseProgram         ctx->drv.pf_glUseProgram
-#define glLinkProgram        ctx->drv.pf_glLinkProgram
-#define glDeleteProgram      ctx->drv.pf_glDeleteProgram
-#define glGetProgramInfoLog  ctx->drv.pf_glGetProgramInfoLog
-#define glGetProgramiv       ctx->drv.pf_glGetProgramiv
-#define glGetUniformLocation ctx->drv.pf_glGetUniformLocation
-#define glUniform1i          ctx->drv.pf_glUniform1i
-#define glUniform1f          ctx->drv.pf_glUniform1f
-#define glUniform4fv         ctx->drv.pf_glUniform4fv
+#define glCreateProgram      ctx->glCreateProgram
+#define glAttachShader       ctx->glAttachShader
+#define glUseProgram         ctx->glUseProgram
+#define glLinkProgram        ctx->glLinkProgram
+#define glDeleteProgram      ctx->glDeleteProgram
+#define glGetProgramInfoLog  ctx->glGetProgramInfoLog
+#define glGetProgramiv       ctx->glGetProgramiv
+#define glGetUniformLocation ctx->glGetUniformLocation
+#define glUniform1i          ctx->glUniform1i
+#define glUniform1f          ctx->glUniform1f
+#define glUniform4fv         ctx->glUniform4fv
 
 #else
 
diff --git a/cogl/cogl-pipeline-vertend-glsl.c b/cogl/cogl-pipeline-vertend-glsl.c
index 84a5243..44a747b 100644
--- a/cogl/cogl-pipeline-vertend-glsl.c
+++ b/cogl/cogl-pipeline-vertend-glsl.c
@@ -43,12 +43,12 @@
 
 #ifndef HAVE_COGL_GLES2
 
-#define glCreateShader       ctx->drv.pf_glCreateShader
-#define glGetShaderiv        ctx->drv.pf_glGetShaderiv
-#define glGetShaderInfoLog   ctx->drv.pf_glGetShaderInfoLog
-#define glCompileShader      ctx->drv.pf_glCompileShader
-#define glShaderSource       ctx->drv.pf_glShaderSource
-#define glDeleteShader       ctx->drv.pf_glDeleteShader
+#define glCreateShader       ctx->glCreateShader
+#define glGetShaderiv        ctx->glGetShaderiv
+#define glGetShaderInfoLog   ctx->glGetShaderInfoLog
+#define glCompileShader      ctx->glCompileShader
+#define glShaderSource       ctx->glShaderSource
+#define glDeleteShader       ctx->glDeleteShader
 
 #endif /* HAVE_COGL_GLES2 */
 
diff --git a/cogl/cogl-program.c b/cogl/cogl-program.c
index 10d632c..24a938d 100644
--- a/cogl/cogl-program.c
+++ b/cogl/cogl-program.c
@@ -50,27 +50,27 @@ COGL_OBJECT_DEFINE_DEPRECATED_REF_COUNTING (program);
 
 #ifndef HAVE_COGL_GLES2
 
-#define glGetUniformLocation       ctx->drv.pf_glGetUniformLocation
-#define glUniform1f                ctx->drv.pf_glUniform1f
-#define glUniform2f                ctx->drv.pf_glUniform2f
-#define glUniform3f                ctx->drv.pf_glUniform3f
-#define glUniform4f                ctx->drv.pf_glUniform4f
-#define glUniform1fv               ctx->drv.pf_glUniform1fv
-#define glUniform2fv               ctx->drv.pf_glUniform2fv
-#define glUniform3fv               ctx->drv.pf_glUniform3fv
-#define glUniform4fv               ctx->drv.pf_glUniform4fv
-#define glUniform1i                ctx->drv.pf_glUniform1i
-#define glUniform2i                ctx->drv.pf_glUniform2i
-#define glUniform3i                ctx->drv.pf_glUniform3i
-#define glUniform4i                ctx->drv.pf_glUniform4i
-#define glUniform1iv               ctx->drv.pf_glUniform1iv
-#define glUniform2iv               ctx->drv.pf_glUniform2iv
-#define glUniform3iv               ctx->drv.pf_glUniform3iv
-#define glUniform4iv               ctx->drv.pf_glUniform4iv
-#define glUniformMatrix2fv         ctx->drv.pf_glUniformMatrix2fv
-#define glUniformMatrix3fv         ctx->drv.pf_glUniformMatrix3fv
-#define glUniformMatrix4fv         ctx->drv.pf_glUniformMatrix4fv
-#define glProgramLocalParameter4fv ctx->drv.pf_glProgramLocalParameter4fv
+#define glGetUniformLocation       ctx->glGetUniformLocation
+#define glUniform1f                ctx->glUniform1f
+#define glUniform2f                ctx->glUniform2f
+#define glUniform3f                ctx->glUniform3f
+#define glUniform4f                ctx->glUniform4f
+#define glUniform1fv               ctx->glUniform1fv
+#define glUniform2fv               ctx->glUniform2fv
+#define glUniform3fv               ctx->glUniform3fv
+#define glUniform4fv               ctx->glUniform4fv
+#define glUniform1i                ctx->glUniform1i
+#define glUniform2i                ctx->glUniform2i
+#define glUniform3i                ctx->glUniform3i
+#define glUniform4i                ctx->glUniform4i
+#define glUniform1iv               ctx->glUniform1iv
+#define glUniform2iv               ctx->glUniform2iv
+#define glUniform3iv               ctx->glUniform3iv
+#define glUniform4iv               ctx->glUniform4iv
+#define glUniformMatrix2fv         ctx->glUniformMatrix2fv
+#define glUniformMatrix3fv         ctx->glUniformMatrix3fv
+#define glUniformMatrix4fv         ctx->glUniformMatrix4fv
+#define glProgramLocalParameter4fv ctx->glProgramLocalParameter4fv
 
 #endif /* HAVE_COGL_GLES2 */
 
diff --git a/cogl/cogl-shader.c b/cogl/cogl-shader.c
index cb00836..7b474bf 100644
--- a/cogl/cogl-shader.c
+++ b/cogl/cogl-shader.c
@@ -37,16 +37,16 @@
 #include <string.h>
 
 #ifdef HAVE_COGL_GL
-#define glCreateShader             ctx->drv.pf_glCreateShader
-#define glGetShaderiv              ctx->drv.pf_glGetShaderiv
-#define glGetShaderInfoLog         ctx->drv.pf_glGetShaderInfoLog
-#define glCompileShader            ctx->drv.pf_glCompileShader
-#define glShaderSource             ctx->drv.pf_glShaderSource
-#define glDeleteShader             ctx->drv.pf_glDeleteShader
-#define glProgramString            ctx->drv.pf_glProgramString
-#define glBindProgram              ctx->drv.pf_glBindProgram
-#define glDeletePrograms           ctx->drv.pf_glDeletePrograms
-#define glGenPrograms              ctx->drv.pf_glGenPrograms
+#define glCreateShader             ctx->glCreateShader
+#define glGetShaderiv              ctx->glGetShaderiv
+#define glGetShaderInfoLog         ctx->glGetShaderInfoLog
+#define glCompileShader            ctx->glCompileShader
+#define glShaderSource             ctx->glShaderSource
+#define glDeleteShader             ctx->glDeleteShader
+#define glProgramString            ctx->glProgramString
+#define glBindProgram              ctx->glBindProgram
+#define glDeletePrograms           ctx->glDeletePrograms
+#define glGenPrograms              ctx->glGenPrograms
 #define GET_CONTEXT         _COGL_GET_CONTEXT
 #else
 #define GET_CONTEXT(CTXVAR,RETVAL) G_STMT_START { } G_STMT_END
diff --git a/cogl/cogl-texture-2d.c b/cogl/cogl-texture-2d.c
index 57a193a..86ccae1 100644
--- a/cogl/cogl-texture-2d.c
+++ b/cogl/cogl-texture-2d.c
@@ -531,7 +531,7 @@ _cogl_egl_texture_2d_new_from_image (CoglContext *ctx,
 
   while ((gl_error = glGetError ()) != GL_NO_ERROR)
     ;
-  ctx->drv.pf_glEGLImageTargetTexture2D (GL_TEXTURE_2D, image);
+  ctx->glEGLImageTargetTexture2D (GL_TEXTURE_2D, image);
   if (glGetError () != GL_NO_ERROR)
     {
       g_set_error (error,
diff --git a/cogl/cogl-texture-3d.c b/cogl/cogl-texture-3d.c
index 6b89887..3803c2d 100644
--- a/cogl/cogl-texture-3d.c
+++ b/cogl/cogl-texture-3d.c
@@ -49,8 +49,8 @@
 #define GL_TEXTURE_WRAP_R                       0x8072
 #endif
 
-#define glTexImage3D ctx->drv.pf_glTexImage3D
-#define glTexSubImage3D ctx->drv.pf_glTexSubImage3D
+#define glTexImage3D ctx->glTexImage3D
+#define glTexSubImage3D ctx->glTexSubImage3D
 
 static void _cogl_texture_3d_free (CoglTexture3D *tex_3d);
 
diff --git a/cogl/driver/gl/cogl-context-driver-gl.h b/cogl/driver/gl/cogl-context-driver-gl.h
index 2d8e521..48f9fc3 100644
--- a/cogl/driver/gl/cogl-context-driver-gl.h
+++ b/cogl/driver/gl/cogl-context-driver-gl.h
@@ -3,7 +3,7 @@
  *
  * An object oriented GL/GLES Abstraction/Utility Layer
  *
- * Copyright (C) 2007,2008,2009 Intel Corporation.
+ * Copyright (C) 2007,2008,2009,2011 Intel Corporation.
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -26,28 +26,10 @@
 
 #include "cogl.h"
 
-#ifndef APIENTRY
-#define APIENTRY
-#endif
-
-#define COGL_FEATURE_BEGIN(a, b, c, d, e, f, g)
-
-#define COGL_FEATURE_FUNCTION(ret, name, args) \
-  ret (APIENTRY * pf_ ## name) args;
-
-#define COGL_FEATURE_END()
-
 typedef struct _CoglContextDriver
 {
-  /* This defines a list of function pointers */
-#include "cogl-feature-functions-gl.h"
-
   GLint gl_max_program_temoraries_arb;
 } CoglContextDriver;
 
-#undef COGL_FEATURE_BEGIN
-#undef COGL_FEATURE_FUNCTION
-#undef COGL_FEATURE_END
-
 #endif /* __COGL_CONTEXT_DRIVER_H */
 
diff --git a/cogl/driver/gl/cogl-gl.c b/cogl/driver/gl/cogl-gl.c
index a0c0198..906d7da 100644
--- a/cogl/driver/gl/cogl-gl.c
+++ b/cogl/driver/gl/cogl-gl.c
@@ -117,37 +117,6 @@ _cogl_gl_check_version (GError **error)
   return TRUE;
 }
 
-/* Define a set of arrays containing the functions required from GL
-   for each feature */
-#define COGL_FEATURE_BEGIN(name, min_gl_major, min_gl_minor,            \
-                           namespaces, extension_names,                 \
-                           feature_flags, feature_flags_private)        \
-  static const CoglFeatureFunction cogl_feature_ ## name ## _funcs[] = {
-#define COGL_FEATURE_FUNCTION(ret, name, args)                          \
-  { G_STRINGIFY (name), G_STRUCT_OFFSET (CoglContext, drv.pf_ ## name) },
-#define COGL_FEATURE_END()                      \
-  { NULL, 0 },                                  \
-  };
-#include "cogl-feature-functions-gl.h"
-
-/* Define an array of features */
-#undef COGL_FEATURE_BEGIN
-#define COGL_FEATURE_BEGIN(name, min_gl_major, min_gl_minor,            \
-                           namespaces, extension_names,                 \
-                           feature_flags, feature_flags_private)        \
-  { min_gl_major, min_gl_minor, namespaces,                             \
-    extension_names, feature_flags, feature_flags_private, 0,           \
-    cogl_feature_ ## name ## _funcs },
-#undef COGL_FEATURE_FUNCTION
-#define COGL_FEATURE_FUNCTION(ret, name, args)
-#undef COGL_FEATURE_END
-#define COGL_FEATURE_END()
-
-static const CoglFeatureData cogl_feature_data[] =
-  {
-#include "cogl-feature-functions-gl.h"
-  };
-
 /* Query the GL extensions and lookup the corresponding function
  * pointers. Theoretically the list of extensions can change for
  * different GL contexts so it is the winsys backend's responsiblity
@@ -161,7 +130,6 @@ _cogl_gl_update_features (CoglContext *context)
   int max_clip_planes = 0;
   int num_stencil_bits = 0;
   int gl_major = 0, gl_minor = 0;
-  int i;
 
   COGL_NOTE (WINSYS,
              "Checking features\n"
@@ -182,6 +150,12 @@ _cogl_gl_update_features (CoglContext *context)
 
   gl_extensions = (const char *)glGetString (GL_EXTENSIONS);
 
+  _cogl_feature_check_ext_functions (context,
+                                     gl_major,
+                                     gl_minor,
+                                     gl_extensions,
+                                     0 /* gles_version */);
+
   if (COGL_CHECK_GL_VERSION (gl_major, gl_minor, 2, 0) ||
       _cogl_check_extension ("GL_ARB_texture_non_power_of_two", gl_extensions))
     {
@@ -207,16 +181,38 @@ _cogl_gl_update_features (CoglContext *context)
   if (max_clip_planes >= 4)
     flags |= COGL_FEATURE_FOUR_CLIP_PLANES;
 
-  for (i = 0; i < G_N_ELEMENTS (cogl_feature_data); i++)
-    if (_cogl_feature_check (_cogl_context_get_winsys (context),
-                             "GL", cogl_feature_data + i,
-                             gl_major, gl_minor,
-                             gl_extensions,
-                             context))
-      {
-        private_flags |= cogl_feature_data[i].feature_flags_private;
-        flags |= cogl_feature_data[i].feature_flags;
-      }
+  if (context->glGenRenderbuffers)
+    flags |= COGL_FEATURE_OFFSCREEN;
+
+  if (context->glBlitFramebuffer)
+    flags |= COGL_FEATURE_OFFSCREEN_BLIT;
+
+  if (context->glRenderbufferStorageMultisample)
+    flags |= COGL_FEATURE_OFFSCREEN_MULTISAMPLE;
+
+  if (COGL_CHECK_GL_VERSION (gl_major, gl_minor, 2, 1) ||
+      _cogl_check_extension ("GL_EXT_pixel_buffer_object", gl_extensions))
+    flags |= COGL_FEATURE_PBOS;
+
+  if (context->glGenPrograms)
+    flags |= COGL_FEATURE_SHADERS_ARBFP;
+
+  if (context->glCreateProgram)
+    flags |= COGL_FEATURE_SHADERS_GLSL;
+
+  if (context->glGenBuffers)
+    flags |= (COGL_FEATURE_VBOS |
+              COGL_FEATURE_MAP_BUFFER_FOR_READ |
+              COGL_FEATURE_MAP_BUFFER_FOR_WRITE);
+
+  if (_cogl_check_extension ("GL_ARB_texture_rectangle", gl_extensions))
+    flags |= COGL_FEATURE_TEXTURE_RECTANGLE;
+
+  if (context->glTexImage3D)
+    flags |= COGL_FEATURE_TEXTURE_3D;
+
+  if (context->glEGLImageTargetTexture2D)
+    private_flags |= COGL_PRIVATE_FEATURE_TEXTURE_2D_FROM_EGL_IMAGE;
 
   /* Cache features */
   context->private_feature_flags |= private_flags;
diff --git a/cogl/driver/gl/cogl-texture-driver-gl.c b/cogl/driver/gl/cogl-texture-driver-gl.c
index 72fd574..d5e7126 100644
--- a/cogl/driver/gl/cogl-texture-driver-gl.c
+++ b/cogl/driver/gl/cogl-texture-driver-gl.c
@@ -46,8 +46,8 @@
 #include <stdlib.h>
 #include <math.h>
 
-#define glGenerateMipmap ctx->drv.pf_glGenerateMipmap
-#define glTexImage3D ctx->drv.pf_glTexImage3D
+#define glGenerateMipmap ctx->glGenerateMipmap
+#define glTexImage3D ctx->glTexImage3D
 
 void
 _cogl_texture_driver_gen (GLenum   gl_target,
diff --git a/cogl/driver/gles/cogl-context-driver-gles.h b/cogl/driver/gles/cogl-context-driver-gles.h
index ca3b1d4..4e3be2b 100644
--- a/cogl/driver/gles/cogl-context-driver-gles.h
+++ b/cogl/driver/gles/cogl-context-driver-gles.h
@@ -3,7 +3,7 @@
  *
  * An object oriented GL/GLES Abstraction/Utility Layer
  *
- * Copyright (C) 2007,2008,2009 Intel Corporation.
+ * Copyright (C) 2007,2008,2009,2011 Intel Corporation.
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -26,27 +26,9 @@
 
 #include "cogl.h"
 
-#ifndef APIENTRY
-#define APIENTRY
-#endif
-
-#define COGL_FEATURE_BEGIN(a, b, c, d, e, f, g)
-
-#define COGL_FEATURE_FUNCTION(ret, name, args) \
-  ret (APIENTRY * pf_ ## name) args;
-
-#define COGL_FEATURE_END()
-
 typedef struct _CoglContextDriver
 {
-  /* This defines a list of function pointers */
-#include "cogl-feature-functions-gles.h"
-
 } CoglContextDriver;
 
-#undef COGL_FEATURE_BEGIN
-#undef COGL_FEATURE_FUNCTION
-#undef COGL_FEATURE_END
-
 #endif /* __COGL_CONTEXT_DRIVER_H */
 
diff --git a/cogl/driver/gles/cogl-gles.c b/cogl/driver/gles/cogl-gles.c
index 2013d3e..bf11194 100644
--- a/cogl/driver/gles/cogl-gles.c
+++ b/cogl/driver/gles/cogl-gles.c
@@ -39,37 +39,6 @@ _cogl_gl_check_version (GError **error)
   return TRUE;
 }
 
-/* Define a set of arrays containing the functions required from GL
-   for each feature */
-#define COGL_FEATURE_BEGIN(name, min_gl_major, min_gl_minor,            \
-                           namespaces, extension_names,                 \
-                           feature_flags, feature_flags_private)        \
-  static const CoglFeatureFunction cogl_feature_ ## name ## _funcs[] = {
-#define COGL_FEATURE_FUNCTION(ret, name, args)                          \
-  { G_STRINGIFY (name), G_STRUCT_OFFSET (CoglContext, drv.pf_ ## name) },
-#define COGL_FEATURE_END()                      \
-  { NULL, 0 },                                  \
-  };
-#include "cogl-feature-functions-gles.h"
-
-/* Define an array of features */
-#undef COGL_FEATURE_BEGIN
-#define COGL_FEATURE_BEGIN(name, min_gl_major, min_gl_minor,            \
-                           namespaces, extension_names,                 \
-                           feature_flags, feature_flags_private)        \
-  { min_gl_major, min_gl_minor, namespaces,                             \
-    extension_names, feature_flags, feature_flags_private, 0,           \
-    cogl_feature_ ## name ## _funcs },
-#undef COGL_FEATURE_FUNCTION
-#define COGL_FEATURE_FUNCTION(ret, name, args)
-#undef COGL_FEATURE_END
-#define COGL_FEATURE_END()
-
-static const CoglFeatureData cogl_feature_data[] =
-  {
-#include "cogl-feature-functions-gles.h"
-  };
-
 /* Query the GL extensions and lookup the corresponding function
  * pointers. Theoretically the list of extensions can change for
  * different GL contexts so it is the winsys backend's responsiblity
@@ -84,7 +53,6 @@ _cogl_gl_update_features (CoglContext *context)
   int max_clip_planes = 0;
 #endif
   int num_stencil_bits = 0;
-  int i;
 
   COGL_NOTE (WINSYS,
              "Checking features\n"
@@ -99,6 +67,16 @@ _cogl_gl_update_features (CoglContext *context)
 
   gl_extensions = (const char*) glGetString (GL_EXTENSIONS);
 
+  _cogl_feature_check_ext_functions (context,
+                                     -1 /* GL major version */,
+                                     -1 /* GL minor version */,
+                                     gl_extensions,
+#ifdef HAVE_COGL_GLES2
+                                     COGL_EXT_IN_GLES2
+#else
+                                     COGL_EXT_IN_GLES
+#endif
+                                     );
 
   GE( glGetIntegerv (GL_STENCIL_BITS, &num_stencil_bits) );
   /* We need at least three stencil bits to combine clips */
@@ -124,16 +102,32 @@ _cogl_gl_update_features (CoglContext *context)
   /* Both GLES 1.1 and GLES 2.0 support point sprites in core */
   flags |= COGL_FEATURE_POINT_SPRITE;
 
-  for (i = 0; i < G_N_ELEMENTS (cogl_feature_data); i++)
-    if (_cogl_feature_check (_cogl_context_get_winsys (context),
-                             "GL", cogl_feature_data + i,
-                             0, 0,
-                             gl_extensions,
-                             context))
-      {
-        private_flags |= cogl_feature_data[i].feature_flags_private;
-        flags |= cogl_feature_data[i].feature_flags;
-      }
+  if (context->glGenRenderbuffers)
+    flags |= COGL_FEATURE_OFFSCREEN;
+
+  if (context->glBlitFramebuffer)
+    flags |= COGL_FEATURE_OFFSCREEN_BLIT;
+
+  if (_cogl_check_extension ("GL_OES_element_index_uint", gl_extensions))
+    flags |= COGL_FEATURE_UNSIGNED_INT_INDICES;
+
+  if (_cogl_check_extension ("GL_OES_texture_npot", gl_extensions) ||
+      _cogl_check_extension ("GL_IMG_texture_npot", gl_extensions))
+    flags |= (COGL_FEATURE_TEXTURE_NPOT |
+              COGL_FEATURE_TEXTURE_NPOT_BASIC |
+              COGL_FEATURE_TEXTURE_NPOT_MIPMAP |
+              COGL_FEATURE_TEXTURE_NPOT_REPEAT);
+
+  if (context->glTexImage3D)
+    flags |= COGL_FEATURE_TEXTURE_3D;
+
+  if (context->glMapBuffer)
+    /* The GL_OES_mapbuffer extension doesn't support mapping for
+       read */
+    flags |= COGL_FEATURE_MAP_BUFFER_FOR_WRITE;
+
+  if (context->glEGLImageTargetTexture2D)
+    flags |= COGL_PRIVATE_FEATURE_TEXTURE_2D_FROM_EGL_IMAGE;
 
   /* Cache features */
   context->private_feature_flags |= private_flags;
diff --git a/cogl/driver/gles/cogl-texture-driver-gles.c b/cogl/driver/gles/cogl-texture-driver-gles.c
index bf67d83..a8fecbd 100644
--- a/cogl/driver/gles/cogl-texture-driver-gles.c
+++ b/cogl/driver/gles/cogl-texture-driver-gles.c
@@ -46,8 +46,8 @@
 #include <stdlib.h>
 #include <math.h>
 
-#define glTexImage3D ctx->drv.pf_glTexImage3D
-#define glTexSubImage3D ctx->drv.pf_glTexSubImage3D
+#define glTexImage3D ctx->glTexImage3D
+#define glTexSubImage3D ctx->glTexSubImage3D
 
 #ifndef GL_TEXTURE_3D
 #define GL_TEXTURE_3D 0x806F
diff --git a/cogl/winsys/cogl-winsys-egl.c b/cogl/winsys/cogl-winsys-egl.c
index e06c80b..5597cd1 100644
--- a/cogl/winsys/cogl-winsys-egl.c
+++ b/cogl/winsys/cogl-winsys-egl.c
@@ -197,7 +197,7 @@ typedef struct _CoglTexturePixmapEGL
 #undef COGL_WINSYS_FEATURE_BEGIN
 #define COGL_WINSYS_FEATURE_BEGIN(name, namespaces, extension_names,    \
                                   egl_private_flags)                    \
-  { 255, 255, namespaces, extension_names,                              \
+  { 255, 255, 0, namespaces, extension_names,                           \
       0, egl_private_flags,                                             \
       0,                                                                \
       cogl_egl_feature_ ## name ## _funcs },
@@ -353,7 +353,7 @@ check_egl_extensions (CoglRenderer *renderer)
   egl_renderer->private_features = 0;
   for (i = 0; i < G_N_ELEMENTS (winsys_feature_data); i++)
     if (_cogl_feature_check (winsys,
-                             "EGL", winsys_feature_data + i, 0, 0,
+                             "EGL", winsys_feature_data + i, 0, 0, 0,
                              egl_extensions,
                              egl_renderer))
       {
diff --git a/cogl/winsys/cogl-winsys-glx.c b/cogl/winsys/cogl-winsys-glx.c
index d45015f..1b41fde 100644
--- a/cogl/winsys/cogl-winsys-glx.c
+++ b/cogl/winsys/cogl-winsys-glx.c
@@ -123,7 +123,7 @@ typedef struct _CoglTexturePixmapGLX
 #define COGL_WINSYS_FEATURE_BEGIN(name, namespaces, extension_names,    \
                                   feature_flags, feature_flags_private, \
                                   winsys_feature)                       \
-  { 255, 255, namespaces, extension_names,                              \
+  { 255, 255, 0, namespaces, extension_names,                           \
       feature_flags, feature_flags_private,                             \
       winsys_feature, \
       cogl_glx_feature_ ## name ## _funcs },
@@ -346,7 +346,7 @@ update_winsys_features (CoglContext *context)
 
   for (i = 0; i < G_N_ELEMENTS (winsys_feature_data); i++)
     if (_cogl_feature_check (_cogl_context_get_winsys (context),
-                             "GLX", winsys_feature_data + i, 0, 0,
+                             "GLX", winsys_feature_data + i, 0, 0, 0,
                              glx_extensions,
                              glx_renderer))
       {
@@ -384,7 +384,7 @@ update_winsys_features (CoglContext *context)
     }
 #endif
 
-  if (glx_renderer->pf_glXCopySubBuffer || context->drv.pf_glBlitFramebuffer)
+  if (glx_renderer->pf_glXCopySubBuffer || context->glBlitFramebuffer)
     COGL_FLAGS_SET (context->winsys_features,
                     COGL_WINSYS_FEATURE_SWAP_REGION, TRUE);
 
@@ -1143,7 +1143,7 @@ _cogl_winsys_onscreen_swap_region (CoglOnscreen *onscreen,
                                              rect[0], rect[1], rect[2], rect[3]);
         }
     }
-  else if (context->drv.pf_glBlitFramebuffer)
+  else if (context->glBlitFramebuffer)
     {
       int i;
       /* XXX: checkout how this state interacts with the code to use
@@ -1154,9 +1154,9 @@ _cogl_winsys_onscreen_swap_region (CoglOnscreen *onscreen,
           int *rect = &rectangles[4 * i];
           int x2 = rect[0] + rect[2];
           int y2 = rect[1] + rect[3];
-          context->drv.pf_glBlitFramebuffer (rect[0], rect[1], x2, y2,
-                                             rect[0], rect[1], x2, y2,
-                                             GL_COLOR_BUFFER_BIT, GL_NEAREST);
+          context->glBlitFramebuffer (rect[0], rect[1], x2, y2,
+                                      rect[0], rect[1], x2, y2,
+                                      GL_COLOR_BUFFER_BIT, GL_NEAREST);
         }
       glDrawBuffer (GL_BACK);
     }
diff --git a/cogl/winsys/cogl-winsys-wgl.c b/cogl/winsys/cogl-winsys-wgl.c
index c221775..acee20d 100644
--- a/cogl/winsys/cogl-winsys-wgl.c
+++ b/cogl/winsys/cogl-winsys-wgl.c
@@ -107,7 +107,7 @@ typedef struct _CoglOnscreenWgl
 #define COGL_WINSYS_FEATURE_BEGIN(name, namespaces, extension_names,    \
                                   feature_flags, feature_flags_private, \
                                   winsys_feature)                       \
-  { 255, 255, namespaces, extension_names,                              \
+  { 255, 255, 0, namespaces, extension_names,                            \
       feature_flags, feature_flags_private,                             \
       winsys_feature,                                                   \
       cogl_wgl_feature_ ## name ## _funcs },
@@ -567,7 +567,7 @@ update_winsys_features (CoglContext *context)
 
       for (i = 0; i < G_N_ELEMENTS (winsys_feature_data); i++)
         if (_cogl_feature_check (_cogl_context_get_winsys (context),
-                                 "WGL", winsys_feature_data + i, 0, 0,
+                                 "WGL", winsys_feature_data + i, 0, 0, 0,
                                  wgl_extensions,
                                  wgl_renderer))
           {



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]