[Cogl] [PATCH 1/4] Add a vtable for the driver

Robert Bragg robert at sixbynine.org
Thu Mar 22 17:59:52 PDT 2012


This looks nice to me, thanks.

Reviewed-by: Robert Bragg <robert at linux.intel.com>

On Thu, Mar 22, 2012 at 5:32 PM, Neil Roberts <neil at linux.intel.com> wrote:

> Cogl already had a vtable for the texture driver. This ended up being
> used for some things that are not strictly related to texturing such
> as converting between pixel formats and GL enums. Some other functions
> that are driver dependent such as updating the features were not
> indirected through a vtable but instead switched directly by looking
> at the ctx->driver enum value. This patch normalises to the two uses
> by adding a separate vtable for driver functions not related to
> texturing and moves the pixel format conversion functions to it from
> the texture driver vtable. It also adds a context parameter to all of
> the functions in the new driver vtable so that they won't have to rely
> on the global context.
> ---
>  cogl/Makefile.am                            |    1 +
>  cogl/cogl-atlas.c                           |   18 +-
>  cogl/cogl-context-private.h                 |    4 +-
>  cogl/cogl-context.c                         |   31 ++--
>  cogl/cogl-driver.h                          |   51 ++++++
>  cogl/cogl-framebuffer.c                     |    9 +-
>  cogl/cogl-private.h                         |    8 -
>  cogl/cogl-texture-2d-sliced.c               |    9 +-
>  cogl/cogl-texture-2d.c                      |   41 +++--
>  cogl/cogl-texture-3d.c                      |   18 +-
>  cogl/cogl-texture-driver.h                  |   19 +--
>  cogl/cogl-texture-rectangle.c               |   41 +++--
>  cogl/cogl-texture.c                         |   30 ++--
>  cogl/driver/gl/cogl-gl.c                    |  240
> ++++++++++++++++++++++++---
>  cogl/driver/gl/cogl-texture-driver-gl.c     |  205 +----------------------
>  cogl/driver/gles/cogl-gles.c                |  124 ++++++++++++++-
>  cogl/driver/gles/cogl-texture-driver-gles.c |  119 +-------------
>  17 files changed, 515 insertions(+), 453 deletions(-)
>  create mode 100644 cogl/cogl-driver.h
>
> diff --git a/cogl/Makefile.am b/cogl/Makefile.am
> index 538fbf3..69cb5df 100644
> --- a/cogl/Makefile.am
> +++ b/cogl/Makefile.am
> @@ -196,6 +196,7 @@ cogl_sources_c = \
>        $(srcdir)/cogl-display.h                        \
>        $(srcdir)/cogl-display.c                        \
>        $(srcdir)/cogl-internal.h                       \
> +       $(srcdir)/cogl-driver.h                         \
>        $(srcdir)/cogl.c                                \
>        $(srcdir)/cogl-object-private.h                 \
>        $(srcdir)/cogl-object.h                         \
> diff --git a/cogl/cogl-atlas.c b/cogl/cogl-atlas.c
> index bfa76dc..68f48c0 100644
> --- a/cogl/cogl-atlas.c
> +++ b/cogl/cogl-atlas.c
> @@ -177,10 +177,11 @@ _cogl_atlas_get_initial_size (CoglPixelFormat format,
>
>   _COGL_GET_CONTEXT (ctx, NO_RETVAL);
>
> -  ctx->texture_driver->pixel_format_to_gl (format,
> -                                           &gl_intformat,
> -                                           NULL, /* gl_format */
> -                                           &gl_type);
> +  ctx->driver_vtable->pixel_format_to_gl (ctx,
> +                                          format,
> +                                          &gl_intformat,
> +                                          NULL, /* gl_format */
> +                                          &gl_type);
>
>   /* At least on Intel hardware, the texture size will be rounded up
>      to at least 1MB so we might as well try to aim for that as an
> @@ -217,10 +218,11 @@ _cogl_atlas_create_map (CoglPixelFormat
>  format,
>
>   _COGL_GET_CONTEXT (ctx, NULL);
>
> -  ctx->texture_driver->pixel_format_to_gl (format,
> -                                           &gl_intformat,
> -                                           NULL, /* gl_format */
> -                                           &gl_type);
> +  ctx->driver_vtable->pixel_format_to_gl (ctx,
> +                                          format,
> +                                          &gl_intformat,
> +                                          NULL, /* gl_format */
> +                                          &gl_type);
>
>   /* Keep trying increasingly larger atlases until we can fit all of
>      the textures */
> diff --git a/cogl/cogl-context-private.h b/cogl/cogl-context-private.h
> index 6d92faf..a79672f 100644
> --- a/cogl/cogl-context-private.h
> +++ b/cogl/cogl-context-private.h
> @@ -41,6 +41,7 @@
>  #include "cogl-buffer-private.h"
>  #include "cogl-bitmask.h"
>  #include "cogl-atlas.h"
> +#include "cogl-driver.h"
>  #include "cogl-texture-driver.h"
>  #include "cogl-pipeline-cache.h"
>  #include "cogl-texture-2d.h"
> @@ -62,7 +63,8 @@ struct _CoglContext
>
>   CoglDriver driver;
>
> -  /* vtable for the texture driver functions */
> +  /* vtables for the driver functions */
> +  const CoglDriverVtable *driver_vtable;
>   const CoglTextureDriver *texture_driver;
>
>   /* Features cache */
> diff --git a/cogl/cogl-context.c b/cogl/cogl-context.c
> index 8b1ea2b..8ed3103 100644
> --- a/cogl/cogl-context.c
> +++ b/cogl/cogl-context.c
> @@ -61,9 +61,11 @@
>
>  #ifdef HAVE_COGL_GL
>  extern const CoglTextureDriver _cogl_texture_driver_gl;
> +extern const CoglDriverVtable _cogl_driver_gl;
>  #endif
>  #if defined (HAVE_COGL_GLES) || defined (HAVE_COGL_GLES2)
>  extern const CoglTextureDriver _cogl_texture_driver_gles;
> +extern const CoglDriverVtable _cogl_driver_gles;
>  #endif
>
>  static void _cogl_context_free (CoglContext *context);
> @@ -203,18 +205,11 @@ cogl_context_new (CoglDisplay *display,
>      lot throughout Cogl */
>   context->driver = display->renderer->driver;
>
> -  winsys = _cogl_context_get_winsys (context);
> -  if (!winsys->context_init (context, error))
> -    {
> -      cogl_object_unref (display);
> -      g_free (context);
> -      return NULL;
> -    }
> -
>   switch (context->driver)
>     {
>  #ifdef HAVE_COGL_GL
>     case COGL_DRIVER_GL:
> +      context->driver_vtable = &_cogl_driver_gl;
>       context->texture_driver = &_cogl_texture_driver_gl;
>       break;
>  #endif
> @@ -222,6 +217,7 @@ cogl_context_new (CoglDisplay *display,
>  #if defined (HAVE_COGL_GLES) || defined (HAVE_COGL_GLES2)
>     case COGL_DRIVER_GLES1:
>     case COGL_DRIVER_GLES2:
> +      context->driver_vtable = &_cogl_driver_gles;
>       context->texture_driver = &_cogl_texture_driver_gles;
>       break;
>  #endif
> @@ -230,6 +226,14 @@ cogl_context_new (CoglDisplay *display,
>       g_assert_not_reached ();
>     }
>
> +  winsys = _cogl_context_get_winsys (context);
> +  if (!winsys->context_init (context, error))
> +    {
> +      cogl_object_unref (display);
> +      g_free (context);
> +      return NULL;
> +    }
> +
>   context->attribute_name_states_hash =
>     g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
>   context->attribute_name_index_map = NULL;
> @@ -578,16 +582,7 @@ gboolean
>  _cogl_context_update_features (CoglContext *context,
>                                GError **error)
>  {
> -#ifdef HAVE_COGL_GL
> -  if (context->driver == COGL_DRIVER_GL)
> -    return _cogl_gl_update_features (context, error);
> -#endif
> -
> -#if defined(HAVE_COGL_GLES) || defined(HAVE_COGL_GLES2)
> -  return _cogl_gles_update_features (context, error);
> -#endif
> -
> -  g_assert_not_reached ();
> +  return context->driver_vtable->update_features (context, error);
>  }
>
>  void
> diff --git a/cogl/cogl-driver.h b/cogl/cogl-driver.h
> new file mode 100644
> index 0000000..b68e37a
> --- /dev/null
> +++ b/cogl/cogl-driver.h
> @@ -0,0 +1,51 @@
> +/*
> + * Cogl
> + *
> + * An object oriented GL/GLES Abstraction/Utility Layer
> + *
> + * Copyright (C) 2012 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/>.
> + *
> + *
> + */
> +
> +#ifndef __COGL_DRIVER_H
> +#define __COGL_DRIVER_H
> +
> +#include "cogl-context.h"
> +
> +typedef struct _CoglDriverVtable CoglDriverVtable;
> +
> +struct _CoglDriverVtable
> +{
> +  gboolean
> +  (* pixel_format_from_gl_internal) (CoglContext *context,
> +                                     GLenum gl_int_format,
> +                                     CoglPixelFormat *out_format);
> +
> +  CoglPixelFormat
> +  (* pixel_format_to_gl) (CoglContext *context,
> +                          CoglPixelFormat format,
> +                          GLenum *out_glintformat,
> +                          GLenum *out_glformat,
> +                          GLenum *out_gltype);
> +
> +  gboolean
> +  (* update_features) (CoglContext *context,
> +                       GError **error);
> +};
> +
> +#endif /* __COGL_DRIVER_H */
> +
> diff --git a/cogl/cogl-framebuffer.c b/cogl/cogl-framebuffer.c
> index 74d595f..647b61d 100644
> --- a/cogl/cogl-framebuffer.c
> +++ b/cogl/cogl-framebuffer.c
> @@ -2005,10 +2005,11 @@ cogl_framebuffer_read_pixels_into_bitmap
> (CoglFramebuffer *framebuffer,
>
>   format = cogl_bitmap_get_format (bitmap);
>
> -  required_format = ctx->texture_driver->pixel_format_to_gl (format,
> -
> &gl_intformat,
> -                                                             &gl_format,
> -                                                             &gl_type);
> +  required_format = ctx->driver_vtable->pixel_format_to_gl (ctx,
> +                                                            format,
> +                                                            &gl_intformat,
> +                                                            &gl_format,
> +                                                            &gl_type);
>
>   /* NB: All offscreen rendering is done upside down so there is no need
>    * to flip in this case... */
> diff --git a/cogl/cogl-private.h b/cogl/cogl-private.h
> index 6130c11..0985ec8 100644
> --- a/cogl/cogl-private.h
> +++ b/cogl/cogl-private.h
> @@ -31,14 +31,6 @@
>  G_BEGIN_DECLS
>
>  gboolean
> -_cogl_gl_update_features (CoglContext *context,
> -                          GError **error);
> -
> -gboolean
> -_cogl_gles_update_features (CoglContext *context,
> -                            GError **error);
> -
> -gboolean
>  _cogl_check_extension (const char *name, const char *ext);
>
>  void
> diff --git a/cogl/cogl-texture-2d-sliced.c b/cogl/cogl-texture-2d-sliced.c
> index 836caaf..7150d2b 100644
> --- a/cogl/cogl-texture-2d-sliced.c
> +++ b/cogl/cogl-texture-2d-sliced.c
> @@ -639,10 +639,11 @@ _cogl_texture_2d_sliced_slices_create (CoglContext
> *ctx,
>       slices_for_size = _cogl_pot_slices_for_size;
>     }
>
> -  ctx->texture_driver->pixel_format_to_gl (format,
> -                                           &gl_intformat,
> -                                           NULL,
> -                                           &gl_type);
> +  ctx->driver_vtable->pixel_format_to_gl (ctx,
> +                                          format,
> +                                          &gl_intformat,
> +                                          NULL,
> +                                          &gl_type);
>
>   /* Negative number means no slicing forced by the user */
>   if (tex_2ds->max_waste <= -1)
> diff --git a/cogl/cogl-texture-2d.c b/cogl/cogl-texture-2d.c
> index dad1eac..cd0d522 100644
> --- a/cogl/cogl-texture-2d.c
> +++ b/cogl/cogl-texture-2d.c
> @@ -120,10 +120,11 @@ _cogl_texture_2d_can_create (unsigned int width,
>        !_cogl_util_is_pot (height)))
>     return FALSE;
>
> -  ctx->texture_driver->pixel_format_to_gl (internal_format,
> -                                           &gl_intformat,
> -                                           NULL,
> -                                           &gl_type);
> +  ctx->driver_vtable->pixel_format_to_gl (ctx,
> +                                          internal_format,
> +                                          &gl_intformat,
> +                                          NULL,
> +                                          &gl_type);
>
>   /* Check that the driver can create a texture with that size */
>   if (!ctx->texture_driver->size_supported (GL_TEXTURE_2D,
> @@ -192,10 +193,11 @@ cogl_texture_2d_new_with_size (CoglContext *ctx,
>       return NULL;
>     }
>
> -  internal_format = ctx->texture_driver->pixel_format_to_gl
> (internal_format,
> -
> &gl_intformat,
> -                                                             &gl_format,
> -                                                             &gl_type);
> +  internal_format = ctx->driver_vtable->pixel_format_to_gl (ctx,
> +
>  internal_format,
> +                                                            &gl_intformat,
> +                                                            &gl_format,
> +                                                            &gl_type);
>
>   tex_2d = _cogl_texture_2d_create_base (width, height, COGL_TEXTURE_NONE,
>                                          internal_format);
> @@ -382,8 +384,9 @@ cogl_texture_2d_new_from_foreign (CoglContext *ctx,
>
>       /* If we can query GL for the actual pixel format then we'll ignore
>          the passed in format and use that. */
> -      if (!ctx->texture_driver->pixel_format_from_gl_internal
> (gl_int_format,
> -                                                               &format))
> +      if (!ctx->driver_vtable->pixel_format_from_gl_internal (ctx,
> +
>  gl_int_format,
> +                                                              &format))
>         return COGL_INVALID_HANDLE;
>     }
>   else
> @@ -391,10 +394,11 @@ cogl_texture_2d_new_from_foreign (CoglContext *ctx,
>     {
>       /* Otherwise we'll assume we can derive the GL format from the
>          passed in format */
> -      ctx->texture_driver->pixel_format_to_gl (format,
> -                                               &gl_int_format,
> -                                               NULL,
> -                                               NULL);
> +      ctx->driver_vtable->pixel_format_to_gl (ctx,
> +                                              format,
> +                                              &gl_int_format,
> +                                              NULL,
> +                                              NULL);
>     }
>
>   /* Note: We always trust the given width and height without querying
> @@ -812,10 +816,11 @@ _cogl_texture_2d_get_data (CoglTexture     *tex,
>
>   bpp = _cogl_pixel_format_get_bytes_per_pixel (format);
>
> -  ctx->texture_driver->pixel_format_to_gl (format,
> -                                           NULL, /* internal format */
> -                                           &gl_format,
> -                                           &gl_type);
> +  ctx->driver_vtable->pixel_format_to_gl (ctx,
> +                                          format,
> +                                          NULL, /* internal format */
> +                                          &gl_format,
> +                                          &gl_type);
>
>   ctx->texture_driver->prep_gl_for_pixels_download (rowstride, bpp);
>
> diff --git a/cogl/cogl-texture-3d.c b/cogl/cogl-texture-3d.c
> index 8662d5a..e33c248 100644
> --- a/cogl/cogl-texture-3d.c
> +++ b/cogl/cogl-texture-3d.c
> @@ -167,10 +167,11 @@ _cogl_texture_3d_can_create (CoglContext *ctx,
>       return FALSE;
>     }
>
> -  ctx->texture_driver->pixel_format_to_gl (internal_format,
> -                                           &gl_intformat,
> -                                           NULL,
> -                                           &gl_type);
> +  ctx->driver_vtable->pixel_format_to_gl (ctx,
> +                                          internal_format,
> +                                          &gl_intformat,
> +                                          NULL,
> +                                          &gl_type);
>
>   /* Check that the driver can create a texture with that size */
>   if (!ctx->texture_driver->size_supported_3d (GL_TEXTURE_3D,
> @@ -213,10 +214,11 @@ cogl_texture_3d_new_with_size (CoglContext *ctx,
>                                     error))
>     return NULL;
>
> -  internal_format = ctx->texture_driver->pixel_format_to_gl
> (internal_format,
> -
> &gl_intformat,
> -                                                             &gl_format,
> -                                                             &gl_type);
> +  internal_format = ctx->driver_vtable->pixel_format_to_gl (ctx,
> +
>  internal_format,
> +                                                            &gl_intformat,
> +                                                            &gl_format,
> +                                                            &gl_type);
>
>   tex_3d = _cogl_texture_3d_create_base (ctx,
>                                          width, height, depth,
> diff --git a/cogl/cogl-texture-driver.h b/cogl/cogl-texture-driver.h
> index 6cbc3af..07ccdf8 100644
> --- a/cogl/cogl-texture-driver.h
> +++ b/cogl/cogl-texture-driver.h
> @@ -161,22 +161,6 @@ struct _CoglTextureDriver
>                                    const GLfloat *transparent_color);
>
>   /*
> -   * XXX: this should live in cogl/{gl,gles}/cogl.c
> -   */
> -  gboolean
> -  (* pixel_format_from_gl_internal) (GLenum            gl_int_format,
> -                                     CoglPixelFormat  *out_format);
> -
> -  /*
> -   * XXX: this should live in cogl/{gl,gles}/cogl.c
> -   */
> -  CoglPixelFormat
> -  (* pixel_format_to_gl) (CoglPixelFormat  format,
> -                          GLenum          *out_glintformat,
> -                          GLenum          *out_glformat,
> -                          GLenum          *out_gltype);
> -
> -  /*
>    * It may depend on the driver as to what texture targets may be used
> when
>    * creating a foreign texture. E.g. OpenGL supports ARB_texture_rectangle
>    * but GLES doesn't
> @@ -199,7 +183,8 @@ struct _CoglTextureDriver
>    * destination has another format.
>    */
>   CoglPixelFormat
> -  (* find_best_gl_get_data_format) (CoglPixelFormat  format,
> +  (* find_best_gl_get_data_format) (CoglContext     *context,
> +                                    CoglPixelFormat  format,
>                                     GLenum          *closest_gl_format,
>                                     GLenum          *closest_gl_type);
>  };
> diff --git a/cogl/cogl-texture-rectangle.c b/cogl/cogl-texture-rectangle.c
> index b906f58..a7c4ae2 100644
> --- a/cogl/cogl-texture-rectangle.c
> +++ b/cogl/cogl-texture-rectangle.c
> @@ -128,10 +128,11 @@ _cogl_texture_rectangle_can_create (unsigned int
> width,
>       return FALSE;
>     }
>
> -  ctx->texture_driver->pixel_format_to_gl (internal_format,
> -                                           &gl_intformat,
> -                                           NULL,
> -                                           &gl_type);
> +  ctx->driver_vtable->pixel_format_to_gl (ctx,
> +                                          internal_format,
> +                                          &gl_intformat,
> +                                          NULL,
> +                                          &gl_type);
>
>   /* Check that the driver can create a texture with that size */
>   if (!ctx->texture_driver->size_supported (GL_TEXTURE_RECTANGLE_ARB,
> @@ -196,10 +197,11 @@ cogl_texture_rectangle_new_with_size (CoglContext
> *ctx,
>                                            internal_format, error))
>     return NULL;
>
> -  internal_format = ctx->texture_driver->pixel_format_to_gl
> (internal_format,
> -
> &gl_intformat,
> -                                                             &gl_format,
> -                                                             &gl_type);
> +  internal_format = ctx->driver_vtable->pixel_format_to_gl (ctx,
> +
>  internal_format,
> +                                                            &gl_intformat,
> +                                                            &gl_format,
> +                                                            &gl_type);
>
>   tex_rect = _cogl_texture_rectangle_create_base (width, height,
>                                                   internal_format);
> @@ -320,8 +322,9 @@ _cogl_texture_rectangle_new_from_foreign (GLuint
> gl_handle,
>
>       /* If we can query GL for the actual pixel format then we'll ignore
>          the passed in format and use that. */
> -      if (!ctx->texture_driver->pixel_format_from_gl_internal
> (gl_int_format,
> -                                                               &format))
> +      if (!ctx->driver_vtable->pixel_format_from_gl_internal (ctx,
> +
>  gl_int_format,
> +                                                              &format))
>         return NULL;
>     }
>   else
> @@ -329,10 +332,11 @@ _cogl_texture_rectangle_new_from_foreign (GLuint
> gl_handle,
>     {
>       /* Otherwise we'll assume we can derive the GL format from the
>          passed in format */
> -      ctx->texture_driver->pixel_format_to_gl (format,
> -                                               &gl_int_format,
> -                                               NULL,
> -                                               NULL);
> +      ctx->driver_vtable->pixel_format_to_gl (ctx,
> +                                              format,
> +                                              &gl_int_format,
> +                                              NULL,
> +                                              NULL);
>     }
>
>   /* Note: We always trust the given width and height without querying
> @@ -532,10 +536,11 @@ _cogl_texture_rectangle_get_data (CoglTexture
> *tex,
>
>   bpp = _cogl_pixel_format_get_bytes_per_pixel (format);
>
> -  ctx->texture_driver->pixel_format_to_gl (format,
> -                                           NULL, /* internal format */
> -                                           &gl_format,
> -                                           &gl_type);
> +  ctx->driver_vtable->pixel_format_to_gl (ctx,
> +                                          format,
> +                                          NULL, /* internal format */
> +                                          &gl_format,
> +                                          &gl_type);
>
>   ctx->texture_driver->prep_gl_for_pixels_download (rowstride, bpp);
>
> diff --git a/cogl/cogl-texture.c b/cogl/cogl-texture.c
> index 6b08ec5..27cbb64 100644
> --- a/cogl/cogl-texture.c
> +++ b/cogl/cogl-texture.c
> @@ -212,24 +212,27 @@ _cogl_texture_prepare_for_upload (CoglBitmap
>  *src_bmp,
>       /* Use the source format from the src bitmap type and the internal
>          format from the dst format type so that GL can do the
>          conversion */
> -      ctx->texture_driver->pixel_format_to_gl (src_format,
> -                                               NULL, /* internal format */
> -                                               out_glformat,
> -                                               out_gltype);
> -      ctx->texture_driver->pixel_format_to_gl (dst_format,
> -                                               out_glintformat,
> -                                               NULL,
> -                                               NULL);
> +      ctx->driver_vtable->pixel_format_to_gl (ctx,
> +                                              src_format,
> +                                              NULL, /* internal format */
> +                                              out_glformat,
> +                                              out_gltype);
> +      ctx->driver_vtable->pixel_format_to_gl (ctx,
> +                                              dst_format,
> +                                              out_glintformat,
> +                                              NULL,
> +                                              NULL);
>
>     }
>   else
>     {
>       CoglPixelFormat closest_format;
>
> -      closest_format = ctx->texture_driver->pixel_format_to_gl
> (dst_format,
> -
>  out_glintformat,
> -
>  out_glformat,
> -
>  out_gltype);
> +      closest_format = ctx->driver_vtable->pixel_format_to_gl (ctx,
> +                                                               dst_format,
> +
> out_glintformat,
> +
> out_glformat,
> +
> out_gltype);
>
>       if (closest_format != src_format)
>         dst_bmp = _cogl_bitmap_convert (src_bmp, closest_format);
> @@ -1148,7 +1151,8 @@ cogl_texture_get_data (CoglTexture     *texture,
>     return byte_size;
>
>   closest_format =
> -    ctx->texture_driver->find_best_gl_get_data_format (format,
> +    ctx->texture_driver->find_best_gl_get_data_format (ctx,
> +                                                       format,
>                                                        &closest_gl_format,
>                                                        &closest_gl_type);
>
> diff --git a/cogl/driver/gl/cogl-gl.c b/cogl/driver/gl/cogl-gl.c
> index b35ddbe..6d39033 100644
> --- a/cogl/driver/gl/cogl-gl.c
> +++ b/cogl/driver/gl/cogl-gl.c
> @@ -34,13 +34,199 @@
>  #include "cogl-renderer-private.h"
>
>  static gboolean
> -_cogl_get_gl_version (int *major_out, int *minor_out)
> +_cogl_driver_pixel_format_from_gl_internal (CoglContext *context,
> +                                            GLenum gl_int_format,
> +                                            CoglPixelFormat *out_format)
> +{
> +  /* It doesn't really matter we convert to exact same
> +     format (some have no cogl match anyway) since format
> +     is re-matched against cogl when getting or setting
> +     texture image data.
> +  */
> +
> +  switch (gl_int_format)
> +    {
> +    case GL_ALPHA: case GL_ALPHA4: case GL_ALPHA8:
> +    case GL_ALPHA12: case GL_ALPHA16:
> +
> +      *out_format = COGL_PIXEL_FORMAT_A_8;
> +      return TRUE;
> +
> +    case GL_LUMINANCE: case GL_LUMINANCE4: case GL_LUMINANCE8:
> +    case GL_LUMINANCE12: case GL_LUMINANCE16:
> +
> +      *out_format = COGL_PIXEL_FORMAT_G_8;
> +      return TRUE;
> +
> +    case GL_RGB: case GL_RGB4: case GL_RGB5: case GL_RGB8:
> +    case GL_RGB10: case GL_RGB12: case GL_RGB16: case GL_R3_G3_B2:
> +
> +      *out_format = COGL_PIXEL_FORMAT_RGB_888;
> +      return TRUE;
> +
> +    case GL_RGBA: case GL_RGBA2: case GL_RGBA4: case GL_RGB5_A1:
> +    case GL_RGBA8: case GL_RGB10_A2: case GL_RGBA12: case GL_RGBA16:
> +
> +      *out_format = COGL_PIXEL_FORMAT_RGBA_8888;
> +      return TRUE;
> +    }
> +
> +  return FALSE;
> +}
> +
> +static CoglPixelFormat
> +_cogl_driver_pixel_format_to_gl (CoglContext *context,
> +                                 CoglPixelFormat  format,
> +                                 GLenum *out_glintformat,
> +                                 GLenum *out_glformat,
> +                                 GLenum *out_gltype)
> +{
> +  CoglPixelFormat required_format;
> +  GLenum glintformat;
> +  GLenum glformat = 0;
> +  GLenum gltype;
> +
> +  required_format = format;
> +
> +  /* Find GL equivalents */
> +  switch (format)
> +    {
> +    case COGL_PIXEL_FORMAT_A_8:
> +      glintformat = GL_ALPHA;
> +      glformat = GL_ALPHA;
> +      gltype = GL_UNSIGNED_BYTE;
> +      break;
> +    case COGL_PIXEL_FORMAT_G_8:
> +      glintformat = GL_LUMINANCE;
> +      glformat = GL_LUMINANCE;
> +      gltype = GL_UNSIGNED_BYTE;
> +      break;
> +
> +    case COGL_PIXEL_FORMAT_RGB_888:
> +      glintformat = GL_RGB;
> +      glformat = GL_RGB;
> +      gltype = GL_UNSIGNED_BYTE;
> +      break;
> +    case COGL_PIXEL_FORMAT_BGR_888:
> +      glintformat = GL_RGB;
> +      glformat = GL_BGR;
> +      gltype = GL_UNSIGNED_BYTE;
> +      break;
> +    case COGL_PIXEL_FORMAT_RGBA_8888:
> +    case COGL_PIXEL_FORMAT_RGBA_8888_PRE:
> +      glintformat = GL_RGBA;
> +      glformat = GL_RGBA;
> +      gltype = GL_UNSIGNED_BYTE;
> +      break;
> +    case COGL_PIXEL_FORMAT_BGRA_8888:
> +    case COGL_PIXEL_FORMAT_BGRA_8888_PRE:
> +      glintformat = GL_RGBA;
> +      glformat = GL_BGRA;
> +      gltype = GL_UNSIGNED_BYTE;
> +      break;
> +
> +      /* The following two types of channel ordering
> +       * have no GL equivalent unless defined using
> +       * system word byte ordering */
> +    case COGL_PIXEL_FORMAT_ARGB_8888:
> +    case COGL_PIXEL_FORMAT_ARGB_8888_PRE:
> +      glintformat = GL_RGBA;
> +      glformat = GL_BGRA;
> +#if G_BYTE_ORDER == G_LITTLE_ENDIAN
> +      gltype = GL_UNSIGNED_INT_8_8_8_8;
> +#else
> +      gltype = GL_UNSIGNED_INT_8_8_8_8_REV;
> +#endif
> +      break;
> +
> +    case COGL_PIXEL_FORMAT_ABGR_8888:
> +    case COGL_PIXEL_FORMAT_ABGR_8888_PRE:
> +      glintformat = GL_RGBA;
> +      glformat = GL_RGBA;
> +#if G_BYTE_ORDER == G_LITTLE_ENDIAN
> +      gltype = GL_UNSIGNED_INT_8_8_8_8;
> +#else
> +      gltype = GL_UNSIGNED_INT_8_8_8_8_REV;
> +#endif
> +      break;
> +
> +    case COGL_PIXEL_FORMAT_RGBA_1010102:
> +    case COGL_PIXEL_FORMAT_RGBA_1010102_PRE:
> +      glintformat = GL_RGBA;
> +      glformat = GL_RGBA;
> +      gltype = GL_UNSIGNED_INT_10_10_10_2;
> +      break;
> +
> +    case COGL_PIXEL_FORMAT_BGRA_1010102:
> +    case COGL_PIXEL_FORMAT_BGRA_1010102_PRE:
> +      glintformat = GL_RGBA;
> +      glformat = GL_BGRA;
> +      gltype = GL_UNSIGNED_INT_10_10_10_2;
> +      break;
> +
> +    case COGL_PIXEL_FORMAT_ABGR_2101010:
> +    case COGL_PIXEL_FORMAT_ABGR_2101010_PRE:
> +      glintformat = GL_RGBA;
> +      glformat = GL_RGBA;
> +      gltype = GL_UNSIGNED_INT_2_10_10_10_REV;
> +      break;
> +
> +    case COGL_PIXEL_FORMAT_ARGB_2101010:
> +    case COGL_PIXEL_FORMAT_ARGB_2101010_PRE:
> +      glintformat = GL_RGBA;
> +      glformat = GL_BGRA;
> +      gltype = GL_UNSIGNED_INT_2_10_10_10_REV;
> +      break;
> +
> +      /* The following three types of channel ordering
> +       * are always defined using system word byte
> +       * ordering (even according to GLES spec) */
> +    case COGL_PIXEL_FORMAT_RGB_565:
> +      glintformat = GL_RGB;
> +      glformat = GL_RGB;
> +      gltype = GL_UNSIGNED_SHORT_5_6_5;
> +      break;
> +    case COGL_PIXEL_FORMAT_RGBA_4444:
> +    case COGL_PIXEL_FORMAT_RGBA_4444_PRE:
> +      glintformat = GL_RGBA;
> +      glformat = GL_RGBA;
> +      gltype = GL_UNSIGNED_SHORT_4_4_4_4;
> +      break;
> +    case COGL_PIXEL_FORMAT_RGBA_5551:
> +    case COGL_PIXEL_FORMAT_RGBA_5551_PRE:
> +      glintformat = GL_RGBA;
> +      glformat = GL_RGBA;
> +      gltype = GL_UNSIGNED_SHORT_5_5_5_1;
> +      break;
> +
> +    case COGL_PIXEL_FORMAT_ANY:
> +    case COGL_PIXEL_FORMAT_YUV:
> +      g_assert_not_reached ();
> +      break;
> +    }
> +
> +  /* All of the pixel formats are handled above so if this hits then
> +     we've been given an invalid pixel format */
> +  g_assert (glformat != 0);
> +
> +  if (out_glintformat != NULL)
> +    *out_glintformat = glintformat;
> +  if (out_glformat != NULL)
> +    *out_glformat = glformat;
> +  if (out_gltype != NULL)
> +    *out_gltype = gltype;
> +
> +  return required_format;
> +}
> +
> +static gboolean
> +_cogl_get_gl_version (CoglContext *ctx,
> +                      int *major_out,
> +                      int *minor_out)
>  {
>   const char *version_string, *major_end, *minor_end;
>   int major = 0, minor = 0;
>
> -  _COGL_GET_CONTEXT (ctx, FALSE);
> -
>   /* Get the OpenGL version number */
>   if ((version_string = (const char *) ctx->glGetString (GL_VERSION)) ==
> NULL)
>     return FALSE;
> @@ -77,7 +263,7 @@ check_gl_version (CoglContext *ctx,
>   int major, minor;
>   const char *gl_extensions;
>
> -  if (!_cogl_get_gl_version (&major, &minor))
> +  if (!_cogl_get_gl_version (ctx, &major, &minor))
>     {
>       g_set_error (error,
>                    COGL_DRIVER_ERROR,
> @@ -119,9 +305,9 @@ check_gl_version (CoglContext *ctx,
>   return TRUE;
>  }
>
> -gboolean
> -_cogl_gl_update_features (CoglContext *context,
> -                          GError **error)
> +static gboolean
> +_cogl_driver_update_features (CoglContext *ctx,
> +                              GError **error)
>  {
>   CoglPrivateFeatureFlags private_flags = 0;
>   CoglFeatureFlags flags = 0;
> @@ -130,16 +316,14 @@ _cogl_gl_update_features (CoglContext *context,
>   int num_stencil_bits = 0;
>   int gl_major = 0, gl_minor = 0;
>
> -  _COGL_GET_CONTEXT (ctx, FALSE);
> -
>   /* We have to special case getting the pointer to the glGetString
>      function because we need to use it to determine what functions we
>      can expect */
> -  context->glGetString =
> -    (void *) _cogl_renderer_get_proc_address (context->display->renderer,
> +  ctx->glGetString =
> +    (void *) _cogl_renderer_get_proc_address (ctx->display->renderer,
>                                               "glGetString");
>
> -  if (!check_gl_version (context, error))
> +  if (!check_gl_version (ctx, error))
>     return FALSE;
>
>   COGL_NOTE (WINSYS,
> @@ -153,7 +337,7 @@ _cogl_gl_update_features (CoglContext *context,
>              ctx->glGetString (GL_VERSION),
>              ctx->glGetString (GL_EXTENSIONS));
>
> -  _cogl_get_gl_version (&gl_major, &gl_minor);
> +  _cogl_get_gl_version (ctx, &gl_major, &gl_minor);
>
>   flags = (COGL_FEATURE_TEXTURE_READ_PIXELS
>            | COGL_FEATURE_UNSIGNED_INT_INDICES
> @@ -167,7 +351,7 @@ _cogl_gl_update_features (CoglContext *context,
>
>   gl_extensions = (const char *)ctx->glGetString (GL_EXTENSIONS);
>
> -  _cogl_feature_check_ext_functions (context,
> +  _cogl_feature_check_ext_functions (ctx,
>                                      gl_major,
>                                      gl_minor,
>                                      gl_extensions);
> @@ -200,16 +384,16 @@ _cogl_gl_update_features (CoglContext *context,
>   if (max_clip_planes >= 4)
>     private_flags |= COGL_PRIVATE_FEATURE_FOUR_CLIP_PLANES;
>
> -  if (context->glGenRenderbuffers)
> +  if (ctx->glGenRenderbuffers)
>     {
>       flags |= COGL_FEATURE_OFFSCREEN;
>       COGL_FLAGS_SET (ctx->features, COGL_FEATURE_ID_OFFSCREEN, TRUE);
>     }
>
> -  if (context->glBlitFramebuffer)
> +  if (ctx->glBlitFramebuffer)
>     private_flags |= COGL_PRIVATE_FEATURE_OFFSCREEN_BLIT;
>
> -  if (context->glRenderbufferStorageMultisampleIMG)
> +  if (ctx->glRenderbufferStorageMultisampleIMG)
>     {
>       flags |= COGL_FEATURE_OFFSCREEN_MULTISAMPLE;
>       COGL_FLAGS_SET (ctx->features,
> @@ -227,19 +411,19 @@ _cogl_gl_update_features (CoglContext *context,
>       COGL_FLAGS_SET (ctx->features, COGL_FEATURE_ID_POINT_SPRITE, TRUE);
>     }
>
> -  if (context->glGenPrograms)
> +  if (ctx->glGenPrograms)
>     {
>       flags |= COGL_FEATURE_SHADERS_ARBFP;
>       COGL_FLAGS_SET (ctx->features, COGL_FEATURE_ID_ARBFP, TRUE);
>     }
>
> -  if (context->glCreateProgram)
> +  if (ctx->glCreateProgram)
>     {
>       flags |= COGL_FEATURE_SHADERS_GLSL;
>       COGL_FLAGS_SET (ctx->features, COGL_FEATURE_ID_GLSL, TRUE);
>     }
>
> -  if (context->glGenBuffers)
> +  if (ctx->glGenBuffers)
>     {
>       private_flags |= COGL_PRIVATE_FEATURE_VBOS;
>       flags |= (COGL_FEATURE_MAP_BUFFER_FOR_READ |
> @@ -257,21 +441,29 @@ _cogl_gl_update_features (CoglContext *context,
>                       COGL_FEATURE_ID_TEXTURE_RECTANGLE, TRUE);
>     }
>
> -  if (context->glTexImage3D)
> +  if (ctx->glTexImage3D)
>     {
>       flags |= COGL_FEATURE_TEXTURE_3D;
>       COGL_FLAGS_SET (ctx->features, COGL_FEATURE_ID_TEXTURE_3D, TRUE);
>     }
>
> -  if (context->glEGLImageTargetTexture2D)
> +  if (ctx->glEGLImageTargetTexture2D)
>     private_flags |= COGL_PRIVATE_FEATURE_TEXTURE_2D_FROM_EGL_IMAGE;
>
>   if (_cogl_check_extension ("GL_EXT_packed_depth_stencil", gl_extensions))
>     private_flags |= COGL_PRIVATE_FEATURE_EXT_PACKED_DEPTH_STENCIL;
>
>   /* Cache features */
> -  context->private_feature_flags |= private_flags;
> -  context->feature_flags |= flags;
> +  ctx->private_feature_flags |= private_flags;
> +  ctx->feature_flags |= flags;
>
>   return TRUE;
>  }
> +
> +const CoglDriverVtable
> +_cogl_driver_gl =
> +  {
> +    _cogl_driver_pixel_format_from_gl_internal,
> +    _cogl_driver_pixel_format_to_gl,
> +    _cogl_driver_update_features
> +  };
> diff --git a/cogl/driver/gl/cogl-texture-driver-gl.c
> b/cogl/driver/gl/cogl-texture-driver-gl.c
> index 83d47ae..373fade 100644
> --- a/cogl/driver/gl/cogl-texture-driver-gl.c
> +++ b/cogl/driver/gl/cogl-texture-driver-gl.c
> @@ -353,190 +353,6 @@ _cogl_texture_driver_try_setting_gl_border_color (
>  }
>
>  static gboolean
> -_cogl_texture_driver_pixel_format_from_gl_internal (GLenum gl_int_format,
> -                                                    CoglPixelFormat
>  *out_format)
> -{
> -  /* It doesn't really matter we convert to exact same
> -     format (some have no cogl match anyway) since format
> -     is re-matched against cogl when getting or setting
> -     texture image data.
> -  */
> -
> -  switch (gl_int_format)
> -    {
> -    case GL_ALPHA: case GL_ALPHA4: case GL_ALPHA8:
> -    case GL_ALPHA12: case GL_ALPHA16:
> -
> -      *out_format = COGL_PIXEL_FORMAT_A_8;
> -      return TRUE;
> -
> -    case GL_LUMINANCE: case GL_LUMINANCE4: case GL_LUMINANCE8:
> -    case GL_LUMINANCE12: case GL_LUMINANCE16:
> -
> -      *out_format = COGL_PIXEL_FORMAT_G_8;
> -      return TRUE;
> -
> -    case GL_RGB: case GL_RGB4: case GL_RGB5: case GL_RGB8:
> -    case GL_RGB10: case GL_RGB12: case GL_RGB16: case GL_R3_G3_B2:
> -
> -      *out_format = COGL_PIXEL_FORMAT_RGB_888;
> -      return TRUE;
> -
> -    case GL_RGBA: case GL_RGBA2: case GL_RGBA4: case GL_RGB5_A1:
> -    case GL_RGBA8: case GL_RGB10_A2: case GL_RGBA12: case GL_RGBA16:
> -
> -      *out_format = COGL_PIXEL_FORMAT_RGBA_8888;
> -      return TRUE;
> -    }
> -
> -  return FALSE;
> -}
> -
> -static CoglPixelFormat
> -_cogl_texture_driver_pixel_format_to_gl (CoglPixelFormat  format,
> -                                         GLenum          *out_glintformat,
> -                                         GLenum          *out_glformat,
> -                                         GLenum          *out_gltype)
> -{
> -  CoglPixelFormat required_format;
> -  GLenum glintformat;
> -  GLenum glformat = 0;
> -  GLenum gltype;
> -
> -  required_format = format;
> -
> -  /* Find GL equivalents */
> -  switch (format)
> -    {
> -    case COGL_PIXEL_FORMAT_A_8:
> -      glintformat = GL_ALPHA;
> -      glformat = GL_ALPHA;
> -      gltype = GL_UNSIGNED_BYTE;
> -      break;
> -    case COGL_PIXEL_FORMAT_G_8:
> -      glintformat = GL_LUMINANCE;
> -      glformat = GL_LUMINANCE;
> -      gltype = GL_UNSIGNED_BYTE;
> -      break;
> -
> -    case COGL_PIXEL_FORMAT_RGB_888:
> -      glintformat = GL_RGB;
> -      glformat = GL_RGB;
> -      gltype = GL_UNSIGNED_BYTE;
> -      break;
> -    case COGL_PIXEL_FORMAT_BGR_888:
> -      glintformat = GL_RGB;
> -      glformat = GL_BGR;
> -      gltype = GL_UNSIGNED_BYTE;
> -      break;
> -    case COGL_PIXEL_FORMAT_RGBA_8888:
> -    case COGL_PIXEL_FORMAT_RGBA_8888_PRE:
> -      glintformat = GL_RGBA;
> -      glformat = GL_RGBA;
> -      gltype = GL_UNSIGNED_BYTE;
> -      break;
> -    case COGL_PIXEL_FORMAT_BGRA_8888:
> -    case COGL_PIXEL_FORMAT_BGRA_8888_PRE:
> -      glintformat = GL_RGBA;
> -      glformat = GL_BGRA;
> -      gltype = GL_UNSIGNED_BYTE;
> -      break;
> -
> -      /* The following two types of channel ordering
> -       * have no GL equivalent unless defined using
> -       * system word byte ordering */
> -    case COGL_PIXEL_FORMAT_ARGB_8888:
> -    case COGL_PIXEL_FORMAT_ARGB_8888_PRE:
> -      glintformat = GL_RGBA;
> -      glformat = GL_BGRA;
> -#if G_BYTE_ORDER == G_LITTLE_ENDIAN
> -      gltype = GL_UNSIGNED_INT_8_8_8_8;
> -#else
> -      gltype = GL_UNSIGNED_INT_8_8_8_8_REV;
> -#endif
> -      break;
> -
> -    case COGL_PIXEL_FORMAT_ABGR_8888:
> -    case COGL_PIXEL_FORMAT_ABGR_8888_PRE:
> -      glintformat = GL_RGBA;
> -      glformat = GL_RGBA;
> -#if G_BYTE_ORDER == G_LITTLE_ENDIAN
> -      gltype = GL_UNSIGNED_INT_8_8_8_8;
> -#else
> -      gltype = GL_UNSIGNED_INT_8_8_8_8_REV;
> -#endif
> -      break;
> -
> -    case COGL_PIXEL_FORMAT_RGBA_1010102:
> -    case COGL_PIXEL_FORMAT_RGBA_1010102_PRE:
> -      glintformat = GL_RGBA;
> -      glformat = GL_RGBA;
> -      gltype = GL_UNSIGNED_INT_10_10_10_2;
> -      break;
> -
> -    case COGL_PIXEL_FORMAT_BGRA_1010102:
> -    case COGL_PIXEL_FORMAT_BGRA_1010102_PRE:
> -      glintformat = GL_RGBA;
> -      glformat = GL_BGRA;
> -      gltype = GL_UNSIGNED_INT_10_10_10_2;
> -      break;
> -
> -    case COGL_PIXEL_FORMAT_ABGR_2101010:
> -    case COGL_PIXEL_FORMAT_ABGR_2101010_PRE:
> -      glintformat = GL_RGBA;
> -      glformat = GL_RGBA;
> -      gltype = GL_UNSIGNED_INT_2_10_10_10_REV;
> -      break;
> -
> -    case COGL_PIXEL_FORMAT_ARGB_2101010:
> -    case COGL_PIXEL_FORMAT_ARGB_2101010_PRE:
> -      glintformat = GL_RGBA;
> -      glformat = GL_BGRA;
> -      gltype = GL_UNSIGNED_INT_2_10_10_10_REV;
> -      break;
> -
> -      /* The following three types of channel ordering
> -       * are always defined using system word byte
> -       * ordering (even according to GLES spec) */
> -    case COGL_PIXEL_FORMAT_RGB_565:
> -      glintformat = GL_RGB;
> -      glformat = GL_RGB;
> -      gltype = GL_UNSIGNED_SHORT_5_6_5;
> -      break;
> -    case COGL_PIXEL_FORMAT_RGBA_4444:
> -    case COGL_PIXEL_FORMAT_RGBA_4444_PRE:
> -      glintformat = GL_RGBA;
> -      glformat = GL_RGBA;
> -      gltype = GL_UNSIGNED_SHORT_4_4_4_4;
> -      break;
> -    case COGL_PIXEL_FORMAT_RGBA_5551:
> -    case COGL_PIXEL_FORMAT_RGBA_5551_PRE:
> -      glintformat = GL_RGBA;
> -      glformat = GL_RGBA;
> -      gltype = GL_UNSIGNED_SHORT_5_5_5_1;
> -      break;
> -
> -    case COGL_PIXEL_FORMAT_ANY:
> -    case COGL_PIXEL_FORMAT_YUV:
> -      g_assert_not_reached ();
> -      break;
> -    }
> -
> -  /* All of the pixel formats are handled above so if this hits then
> -     we've been given an invalid pixel format */
> -  g_assert (glformat != 0);
> -
> -  if (out_glintformat != NULL)
> -    *out_glintformat = glintformat;
> -  if (out_glformat != NULL)
> -    *out_glformat = glformat;
> -  if (out_gltype != NULL)
> -    *out_gltype = gltype;
> -
> -  return required_format;
> -}
> -
> -static gboolean
>  _cogl_texture_driver_allows_foreign_gl_target (GLenum gl_target)
>  {
>   /* GL_ARB_texture_rectangle textures are supported if they are
> @@ -561,16 +377,17 @@ _cogl_texture_driver_gl_generate_mipmaps (GLenum
> gl_target)
>  }
>
>  static CoglPixelFormat
> -_cogl_texture_driver_find_best_gl_get_data_format (
> -                                             CoglPixelFormat  format,
> -                                             GLenum
>  *closest_gl_format,
> -                                             GLenum
>  *closest_gl_type)
> +_cogl_texture_driver_find_best_gl_get_data_format
> +                                            (CoglContext *context,
> +                                             CoglPixelFormat format,
> +                                             GLenum *closest_gl_format,
> +                                             GLenum *closest_gl_type)
>  {
> -  /* Find closest format that's supported by GL */
> -  return _cogl_texture_driver_pixel_format_to_gl (format,
> -                                                  NULL, /* don't need */
> -                                                  closest_gl_format,
> -                                                  closest_gl_type);
> +  return context->driver_vtable->pixel_format_to_gl (context,
> +                                                     format,
> +                                                     NULL, /* don't need
> */
> +                                                     closest_gl_format,
> +                                                     closest_gl_type);
>  }
>
>  const CoglTextureDriver
> @@ -586,8 +403,6 @@ _cogl_texture_driver_gl =
>     _cogl_texture_driver_size_supported,
>     _cogl_texture_driver_size_supported_3d,
>     _cogl_texture_driver_try_setting_gl_border_color,
> -    _cogl_texture_driver_pixel_format_from_gl_internal,
> -    _cogl_texture_driver_pixel_format_to_gl,
>     _cogl_texture_driver_allows_foreign_gl_target,
>     _cogl_texture_driver_gl_generate_mipmaps,
>     _cogl_texture_driver_find_best_gl_get_data_format
> diff --git a/cogl/driver/gles/cogl-gles.c b/cogl/driver/gles/cogl-gles.c
> index 8087ae0..d4c5968 100644
> --- a/cogl/driver/gles/cogl-gles.c
> +++ b/cogl/driver/gles/cogl-gles.c
> @@ -33,9 +33,119 @@
>  #include "cogl-renderer-private.h"
>  #include "cogl-private.h"
>
> -gboolean
> -_cogl_gles_update_features (CoglContext *context,
> -                            GError **error)
> +static gboolean
> +_cogl_driver_pixel_format_from_gl_internal (CoglContext *context,
> +                                            GLenum gl_int_format,
> +                                            CoglPixelFormat *out_format)
> +{
> +  return TRUE;
> +}
> +
> +static CoglPixelFormat
> +_cogl_driver_pixel_format_to_gl (CoglContext *context,
> +                                 CoglPixelFormat  format,
> +                                 GLenum *out_glintformat,
> +                                 GLenum *out_glformat,
> +                                 GLenum *out_gltype)
> +{
> +  CoglPixelFormat required_format;
> +  GLenum glintformat;
> +  GLenum glformat = 0;
> +  GLenum gltype;
> +
> +  required_format = format;
> +
> +  /* Find GL equivalents */
> +  switch (format)
> +    {
> +    case COGL_PIXEL_FORMAT_A_8:
> +      glintformat = GL_ALPHA;
> +      glformat = GL_ALPHA;
> +      gltype = GL_UNSIGNED_BYTE;
> +      break;
> +    case COGL_PIXEL_FORMAT_G_8:
> +      glintformat = GL_LUMINANCE;
> +      glformat = GL_LUMINANCE;
> +      gltype = GL_UNSIGNED_BYTE;
> +      break;
> +
> +      /* Just one 24-bit ordering supported */
> +    case COGL_PIXEL_FORMAT_RGB_888:
> +    case COGL_PIXEL_FORMAT_BGR_888:
> +      glintformat = GL_RGB;
> +      glformat = GL_RGB;
> +      gltype = GL_UNSIGNED_BYTE;
> +      required_format = COGL_PIXEL_FORMAT_RGB_888;
> +      break;
> +
> +      /* Just one 32-bit ordering supported */
> +    case COGL_PIXEL_FORMAT_RGBA_8888:
> +    case COGL_PIXEL_FORMAT_RGBA_8888_PRE:
> +    case COGL_PIXEL_FORMAT_BGRA_8888:
> +    case COGL_PIXEL_FORMAT_BGRA_8888_PRE:
> +    case COGL_PIXEL_FORMAT_ARGB_8888:
> +    case COGL_PIXEL_FORMAT_ARGB_8888_PRE:
> +    case COGL_PIXEL_FORMAT_ABGR_8888:
> +    case COGL_PIXEL_FORMAT_ABGR_8888_PRE:
> +    case COGL_PIXEL_FORMAT_RGBA_1010102:
> +    case COGL_PIXEL_FORMAT_RGBA_1010102_PRE:
> +    case COGL_PIXEL_FORMAT_BGRA_1010102:
> +    case COGL_PIXEL_FORMAT_BGRA_1010102_PRE:
> +    case COGL_PIXEL_FORMAT_ABGR_2101010:
> +    case COGL_PIXEL_FORMAT_ABGR_2101010_PRE:
> +    case COGL_PIXEL_FORMAT_ARGB_2101010:
> +    case COGL_PIXEL_FORMAT_ARGB_2101010_PRE:
> +      glintformat = GL_RGBA;
> +      glformat = GL_RGBA;
> +      gltype = GL_UNSIGNED_BYTE;
> +      required_format = COGL_PIXEL_FORMAT_RGBA_8888;
> +      required_format |= (format & COGL_PREMULT_BIT);
> +      break;
> +
> +      /* The following three types of channel ordering
> +       * are always defined using system word byte
> +       * ordering (even according to GLES spec) */
> +    case COGL_PIXEL_FORMAT_RGB_565:
> +      glintformat = GL_RGB;
> +      glformat = GL_RGB;
> +      gltype = GL_UNSIGNED_SHORT_5_6_5;
> +      break;
> +    case COGL_PIXEL_FORMAT_RGBA_4444:
> +    case COGL_PIXEL_FORMAT_RGBA_4444_PRE:
> +      glintformat = GL_RGBA;
> +      glformat = GL_RGBA;
> +      gltype = GL_UNSIGNED_SHORT_4_4_4_4;
> +      break;
> +    case COGL_PIXEL_FORMAT_RGBA_5551:
> +    case COGL_PIXEL_FORMAT_RGBA_5551_PRE:
> +      glintformat = GL_RGBA;
> +      glformat = GL_RGBA;
> +      gltype = GL_UNSIGNED_SHORT_5_5_5_1;
> +      break;
> +
> +    case COGL_PIXEL_FORMAT_ANY:
> +    case COGL_PIXEL_FORMAT_YUV:
> +      g_assert_not_reached ();
> +      break;
> +    }
> +
> +  /* All of the pixel formats are handled above so if this hits then
> +     we've been given an invalid pixel format */
> +  g_assert (glformat != 0);
> +
> +  if (out_glintformat != NULL)
> +    *out_glintformat = glintformat;
> +  if (out_glformat != NULL)
> +    *out_glformat = glformat;
> +  if (out_gltype != NULL)
> +    *out_gltype = gltype;
> +
> +  return required_format;
> +}
> +
> +static gboolean
> +_cogl_driver_update_features (CoglContext *context,
> +                              GError **error)
>  {
>   CoglPrivateFeatureFlags private_flags = 0;
>   CoglFeatureFlags flags = 0;
> @@ -172,3 +282,11 @@ _cogl_gles_update_features (CoglContext *context,
>
>   return TRUE;
>  }
> +
> +const CoglDriverVtable
> +_cogl_driver_gles =
> +  {
> +    _cogl_driver_pixel_format_from_gl_internal,
> +    _cogl_driver_pixel_format_to_gl,
> +    _cogl_driver_update_features
> +  };
> diff --git a/cogl/driver/gles/cogl-texture-driver-gles.c
> b/cogl/driver/gles/cogl-texture-driver-gles.c
> index 2bc596b..ad1c248 100644
> --- a/cogl/driver/gles/cogl-texture-driver-gles.c
> +++ b/cogl/driver/gles/cogl-texture-driver-gles.c
> @@ -390,114 +390,6 @@ _cogl_texture_driver_try_setting_gl_border_color (
>  }
>
>  static gboolean
> -_cogl_texture_driver_pixel_format_from_gl_internal (GLenum gl_int_format,
> -                                                    CoglPixelFormat
> *out_format)
> -{
> -  return TRUE;
> -}
> -
> -static CoglPixelFormat
> -_cogl_texture_driver_pixel_format_to_gl (CoglPixelFormat  format,
> -                                         GLenum          *out_glintformat,
> -                                         GLenum          *out_glformat,
> -                                         GLenum          *out_gltype)
> -{
> -  CoglPixelFormat required_format;
> -  GLenum glintformat;
> -  GLenum glformat = 0;
> -  GLenum gltype;
> -
> -  required_format = format;
> -
> -  /* Find GL equivalents */
> -  switch (format)
> -    {
> -    case COGL_PIXEL_FORMAT_A_8:
> -      glintformat = GL_ALPHA;
> -      glformat = GL_ALPHA;
> -      gltype = GL_UNSIGNED_BYTE;
> -      break;
> -    case COGL_PIXEL_FORMAT_G_8:
> -      glintformat = GL_LUMINANCE;
> -      glformat = GL_LUMINANCE;
> -      gltype = GL_UNSIGNED_BYTE;
> -      break;
> -
> -      /* Just one 24-bit ordering supported */
> -    case COGL_PIXEL_FORMAT_RGB_888:
> -    case COGL_PIXEL_FORMAT_BGR_888:
> -      glintformat = GL_RGB;
> -      glformat = GL_RGB;
> -      gltype = GL_UNSIGNED_BYTE;
> -      required_format = COGL_PIXEL_FORMAT_RGB_888;
> -      break;
> -
> -      /* Just one 32-bit ordering supported */
> -    case COGL_PIXEL_FORMAT_RGBA_8888:
> -    case COGL_PIXEL_FORMAT_RGBA_8888_PRE:
> -    case COGL_PIXEL_FORMAT_BGRA_8888:
> -    case COGL_PIXEL_FORMAT_BGRA_8888_PRE:
> -    case COGL_PIXEL_FORMAT_ARGB_8888:
> -    case COGL_PIXEL_FORMAT_ARGB_8888_PRE:
> -    case COGL_PIXEL_FORMAT_ABGR_8888:
> -    case COGL_PIXEL_FORMAT_ABGR_8888_PRE:
> -    case COGL_PIXEL_FORMAT_RGBA_1010102:
> -    case COGL_PIXEL_FORMAT_RGBA_1010102_PRE:
> -    case COGL_PIXEL_FORMAT_BGRA_1010102:
> -    case COGL_PIXEL_FORMAT_BGRA_1010102_PRE:
> -    case COGL_PIXEL_FORMAT_ABGR_2101010:
> -    case COGL_PIXEL_FORMAT_ABGR_2101010_PRE:
> -    case COGL_PIXEL_FORMAT_ARGB_2101010:
> -    case COGL_PIXEL_FORMAT_ARGB_2101010_PRE:
> -      glintformat = GL_RGBA;
> -      glformat = GL_RGBA;
> -      gltype = GL_UNSIGNED_BYTE;
> -      required_format = COGL_PIXEL_FORMAT_RGBA_8888;
> -      required_format |= (format & COGL_PREMULT_BIT);
> -      break;
> -
> -      /* The following three types of channel ordering
> -       * are always defined using system word byte
> -       * ordering (even according to GLES spec) */
> -    case COGL_PIXEL_FORMAT_RGB_565:
> -      glintformat = GL_RGB;
> -      glformat = GL_RGB;
> -      gltype = GL_UNSIGNED_SHORT_5_6_5;
> -      break;
> -    case COGL_PIXEL_FORMAT_RGBA_4444:
> -    case COGL_PIXEL_FORMAT_RGBA_4444_PRE:
> -      glintformat = GL_RGBA;
> -      glformat = GL_RGBA;
> -      gltype = GL_UNSIGNED_SHORT_4_4_4_4;
> -      break;
> -    case COGL_PIXEL_FORMAT_RGBA_5551:
> -    case COGL_PIXEL_FORMAT_RGBA_5551_PRE:
> -      glintformat = GL_RGBA;
> -      glformat = GL_RGBA;
> -      gltype = GL_UNSIGNED_SHORT_5_5_5_1;
> -      break;
> -
> -    case COGL_PIXEL_FORMAT_ANY:
> -    case COGL_PIXEL_FORMAT_YUV:
> -      g_assert_not_reached ();
> -      break;
> -    }
> -
> -  /* All of the pixel formats are handled above so if this hits then
> -     we've been given an invalid pixel format */
> -  g_assert (glformat != 0);
> -
> -  if (out_glintformat != NULL)
> -    *out_glintformat = glintformat;
> -  if (out_glformat != NULL)
> -    *out_glformat = glformat;
> -  if (out_gltype != NULL)
> -    *out_gltype = gltype;
> -
> -  return required_format;
> -}
> -
> -static gboolean
>  _cogl_texture_driver_allows_foreign_gl_target (GLenum gl_target)
>  {
>   /* Allow 2-dimensional textures only */
> @@ -516,10 +408,11 @@ _cogl_texture_driver_gl_generate_mipmaps (GLenum
> gl_target)
>  }
>
>  static CoglPixelFormat
> -_cogl_texture_driver_find_best_gl_get_data_format (
> -                                             CoglPixelFormat  format,
> -                                             GLenum
>  *closest_gl_format,
> -                                             GLenum
>  *closest_gl_type)
> +_cogl_texture_driver_find_best_gl_get_data_format
> +                                            (CoglContext *context,
> +                                             CoglPixelFormat format,
> +                                             GLenum *closest_gl_format,
> +                                             GLenum *closest_gl_type)
>  {
>   /* Find closest format that's supported by GL
>      (Can't use _cogl_pixel_format_to_gl since available formats
> @@ -542,8 +435,6 @@ _cogl_texture_driver_gles =
>     _cogl_texture_driver_size_supported,
>     _cogl_texture_driver_size_supported_3d,
>     _cogl_texture_driver_try_setting_gl_border_color,
> -    _cogl_texture_driver_pixel_format_from_gl_internal,
> -    _cogl_texture_driver_pixel_format_to_gl,
>     _cogl_texture_driver_allows_foreign_gl_target,
>     _cogl_texture_driver_gl_generate_mipmaps,
>     _cogl_texture_driver_find_best_gl_get_data_format
> --
> 1.7.3.16.g9464b
>
> _______________________________________________
> Cogl mailing list
> Cogl at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/cogl
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/cogl/attachments/20120323/3c979a3d/attachment-0001.htm>


More information about the Cogl mailing list