[Cogl] [PATCH 2/4] Add a context parameter to all of the texture driver virtuals

Robert Bragg robert at sixbynine.org
Thu Mar 22 18:03:01 PDT 2012


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:

> All of the texture driver virtual functions now take an explicit
> CoglContext parameter as a step towards removing the global context.
> ---
>  cogl/cogl-atlas.c                           |    6 +-
>  cogl/cogl-framebuffer.c                     |    4 +-
>  cogl/cogl-texture-2d-sliced.c               |    6 +-
>  cogl/cogl-texture-2d.c                      |   24 ++++---
>  cogl/cogl-texture-3d.c                      |   12 ++-
>  cogl/cogl-texture-driver.h                  |  111
> +++++++++++++++------------
>  cogl/cogl-texture-rectangle.c               |   27 +++++--
>  cogl/driver/gl/cogl-texture-driver-gl.c     |   99
> +++++++++++-------------
>  cogl/driver/gles/cogl-texture-driver-gles.c |   87 ++++++++++-----------
>  9 files changed, 201 insertions(+), 175 deletions(-)
>
> diff --git a/cogl/cogl-atlas.c b/cogl/cogl-atlas.c
> index 68f48c0..014d612 100644
> --- a/cogl/cogl-atlas.c
> +++ b/cogl/cogl-atlas.c
> @@ -196,7 +196,8 @@ _cogl_atlas_get_initial_size (CoglPixelFormat format,
>   /* Some platforms might not support this large size so we'll
>      decrease the size until it can */
>   while (size > 1 &&
> -         !ctx->texture_driver->size_supported (GL_TEXTURE_2D,
> +         !ctx->texture_driver->size_supported (ctx,
> +                                               GL_TEXTURE_2D,
>                                                gl_intformat,
>                                                gl_type,
>                                                size, size))
> @@ -226,7 +227,8 @@ _cogl_atlas_create_map (CoglPixelFormat
>  format,
>
>   /* Keep trying increasingly larger atlases until we can fit all of
>      the textures */
> -  while (ctx->texture_driver->size_supported (GL_TEXTURE_2D,
> +  while (ctx->texture_driver->size_supported (ctx,
> +                                              GL_TEXTURE_2D,
>                                               gl_intformat,
>                                               gl_type,
>                                               map_width, map_height))
> diff --git a/cogl/cogl-framebuffer.c b/cogl/cogl-framebuffer.c
> index 647b61d..af95cac 100644
> --- a/cogl/cogl-framebuffer.c
> +++ b/cogl/cogl-framebuffer.c
> @@ -2062,7 +2062,7 @@ cogl_framebuffer_read_pixels_into_bitmap
> (CoglFramebuffer *framebuffer,
>       bpp = _cogl_pixel_format_get_bytes_per_pixel (read_format);
>       rowstride = cogl_bitmap_get_rowstride (tmp_bmp);
>
> -      ctx->texture_driver->prep_gl_for_pixels_download (rowstride, bpp);
> +      ctx->texture_driver->prep_gl_for_pixels_download (ctx, rowstride,
> bpp);
>
>       tmp_data = _cogl_bitmap_bind (tmp_bmp,
>                                     COGL_BUFFER_ACCESS_WRITE,
> @@ -2110,7 +2110,7 @@ cogl_framebuffer_read_pixels_into_bitmap
> (CoglFramebuffer *framebuffer,
>
>       bpp = _cogl_pixel_format_get_bytes_per_pixel (bmp_format);
>
> -      ctx->texture_driver->prep_gl_for_pixels_download (rowstride, bpp);
> +      ctx->texture_driver->prep_gl_for_pixels_download (ctx, rowstride,
> bpp);
>
>       pixels = _cogl_bitmap_bind (shared_bmp,
>                                   COGL_BUFFER_ACCESS_WRITE,
> diff --git a/cogl/cogl-texture-2d-sliced.c b/cogl/cogl-texture-2d-sliced.c
> index 7150d2b..90c9a9e 100644
> --- a/cogl/cogl-texture-2d-sliced.c
> +++ b/cogl/cogl-texture-2d-sliced.c
> @@ -651,7 +651,8 @@ _cogl_texture_2d_sliced_slices_create (CoglContext
> *ctx,
>       CoglSpan span;
>
>       /* Check if size supported else bail out */
> -      if (!ctx->texture_driver->size_supported (GL_TEXTURE_2D,
> +      if (!ctx->texture_driver->size_supported (ctx,
> +                                                GL_TEXTURE_2D,
>                                                 gl_intformat,
>                                                 gl_type,
>                                                 max_width,
> @@ -685,7 +686,8 @@ _cogl_texture_2d_sliced_slices_create (CoglContext
> *ctx,
>   else
>     {
>       /* Decrease the size of largest slice until supported by GL */
> -      while (!ctx->texture_driver->size_supported (GL_TEXTURE_2D,
> +      while (!ctx->texture_driver->size_supported (ctx,
> +                                                   GL_TEXTURE_2D,
>                                                    gl_intformat,
>                                                    gl_type,
>                                                    max_width,
> diff --git a/cogl/cogl-texture-2d.c b/cogl/cogl-texture-2d.c
> index cd0d522..a3f0426 100644
> --- a/cogl/cogl-texture-2d.c
> +++ b/cogl/cogl-texture-2d.c
> @@ -127,7 +127,8 @@ _cogl_texture_2d_can_create (unsigned int width,
>                                           &gl_type);
>
>   /* Check that the driver can create a texture with that size */
> -  if (!ctx->texture_driver->size_supported (GL_TEXTURE_2D,
> +  if (!ctx->texture_driver->size_supported (ctx,
> +                                            GL_TEXTURE_2D,
>                                             gl_intformat,
>                                             gl_type,
>                                             width,
> @@ -202,7 +203,7 @@ cogl_texture_2d_new_with_size (CoglContext *ctx,
>   tex_2d = _cogl_texture_2d_create_base (width, height, COGL_TEXTURE_NONE,
>                                          internal_format);
>
> -  ctx->texture_driver->gen (GL_TEXTURE_2D, 1, &tex_2d->gl_texture);
> +  ctx->texture_driver->gen (ctx, GL_TEXTURE_2D, 1, &tex_2d->gl_texture);
>   _cogl_bind_gl_texture_transient (GL_TEXTURE_2D,
>                                    tex_2d->gl_texture,
>                                    tex_2d->is_foreign);
> @@ -278,8 +279,9 @@ _cogl_texture_2d_new_from_bitmap (CoglBitmap      *bmp,
>       _cogl_bitmap_unmap (dst_bmp);
>     }
>
> -  ctx->texture_driver->gen (GL_TEXTURE_2D, 1, &tex_2d->gl_texture);
> -  ctx->texture_driver->upload_to_gl (GL_TEXTURE_2D,
> +  ctx->texture_driver->gen (ctx, GL_TEXTURE_2D, 1, &tex_2d->gl_texture);
> +  ctx->texture_driver->upload_to_gl (ctx,
> +                                     GL_TEXTURE_2D,
>                                      tex_2d->gl_texture,
>                                      FALSE,
>                                      dst_bmp,
> @@ -347,7 +349,7 @@ cogl_texture_2d_new_from_foreign (CoglContext *ctx,
>   GLenum         gl_int_format = 0;
>   CoglTexture2D *tex_2d;
>
> -  if (!ctx->texture_driver->allows_foreign_gl_target (GL_TEXTURE_2D))
> +  if (!ctx->texture_driver->allows_foreign_gl_target (ctx, GL_TEXTURE_2D))
>     return COGL_INVALID_HANDLE;
>
>   /* Make sure it is a valid GL texture object */
> @@ -474,7 +476,7 @@ _cogl_egl_texture_2d_new_from_image (CoglContext *ctx,
>   tex_2d = _cogl_texture_2d_create_base (width, height, COGL_TEXTURE_NONE,
>                                          format);
>
> -  ctx->texture_driver->gen (GL_TEXTURE_2D, 1, &tex_2d->gl_texture);
> +  ctx->texture_driver->gen (ctx, GL_TEXTURE_2D, 1, &tex_2d->gl_texture);
>   _cogl_bind_gl_texture_transient (GL_TEXTURE_2D,
>                                    tex_2d->gl_texture,
>                                    FALSE);
> @@ -716,7 +718,7 @@ _cogl_texture_2d_pre_paint (CoglTexture *tex,
> CoglTexturePrePaintFlags flags)
>          available we'll fallback to temporarily enabling
>          GL_GENERATE_MIPMAP and reuploading the first pixel */
>       if (cogl_has_feature (ctx, COGL_FEATURE_ID_OFFSCREEN))
> -        ctx->texture_driver->gl_generate_mipmaps (GL_TEXTURE_2D);
> +        ctx->texture_driver->gl_generate_mipmaps (ctx, GL_TEXTURE_2D);
>  #if defined(HAVE_COGL_GLES) || defined(HAVE_COGL_GL)
>       else
>         {
> @@ -784,7 +786,8 @@ _cogl_texture_2d_set_region (CoglTexture    *tex,
>     }
>
>   /* Send data to GL */
> -  ctx->texture_driver->upload_subregion_to_gl (GL_TEXTURE_2D,
> +  ctx->texture_driver->upload_subregion_to_gl (ctx,
> +                                               GL_TEXTURE_2D,
>                                                tex_2d->gl_texture,
>                                                FALSE,
>                                                src_x, src_y,
> @@ -822,12 +825,13 @@ _cogl_texture_2d_get_data (CoglTexture     *tex,
>                                           &gl_format,
>                                           &gl_type);
>
> -  ctx->texture_driver->prep_gl_for_pixels_download (rowstride, bpp);
> +  ctx->texture_driver->prep_gl_for_pixels_download (ctx, rowstride, bpp);
>
>   _cogl_bind_gl_texture_transient (GL_TEXTURE_2D,
>                                    tex_2d->gl_texture,
>                                    tex_2d->is_foreign);
> -  return ctx->texture_driver->gl_get_tex_image (GL_TEXTURE_2D,
> +  return ctx->texture_driver->gl_get_tex_image (ctx,
> +                                                GL_TEXTURE_2D,
>                                                 gl_format,
>                                                 gl_type,
>                                                 data);
> diff --git a/cogl/cogl-texture-3d.c b/cogl/cogl-texture-3d.c
> index e33c248..83ef3ad 100644
> --- a/cogl/cogl-texture-3d.c
> +++ b/cogl/cogl-texture-3d.c
> @@ -174,7 +174,8 @@ _cogl_texture_3d_can_create (CoglContext *ctx,
>                                           &gl_type);
>
>   /* Check that the driver can create a texture with that size */
> -  if (!ctx->texture_driver->size_supported_3d (GL_TEXTURE_3D,
> +  if (!ctx->texture_driver->size_supported_3d (ctx,
> +                                               GL_TEXTURE_3D,
>                                                gl_intformat,
>                                                gl_type,
>                                                width,
> @@ -224,7 +225,7 @@ cogl_texture_3d_new_with_size (CoglContext *ctx,
>                                          width, height, depth,
>                                          internal_format);
>
> -  ctx->texture_driver->gen (GL_TEXTURE_3D, 1, &tex_3d->gl_texture);
> +  ctx->texture_driver->gen (ctx, GL_TEXTURE_3D, 1, &tex_3d->gl_texture);
>   _cogl_bind_gl_texture_transient (GL_TEXTURE_3D,
>                                    tex_3d->gl_texture,
>                                    FALSE);
> @@ -296,9 +297,10 @@ _cogl_texture_3d_new_from_bitmap (CoglContext *ctx,
>       _cogl_bitmap_unmap (dst_bmp);
>     }
>
> -  ctx->texture_driver->gen (GL_TEXTURE_3D, 1, &tex_3d->gl_texture);
> +  ctx->texture_driver->gen (ctx, GL_TEXTURE_3D, 1, &tex_3d->gl_texture);
>
> -  ctx->texture_driver->upload_to_gl_3d (GL_TEXTURE_3D,
> +  ctx->texture_driver->upload_to_gl_3d (ctx,
> +                                        GL_TEXTURE_3D,
>                                         tex_3d->gl_texture,
>                                         FALSE, /* is_foreign */
>                                         height,
> @@ -510,7 +512,7 @@ _cogl_texture_3d_pre_paint (CoglTexture *tex,
> CoglTexturePrePaintFlags flags)
>          available we'll fallback to temporarily enabling
>          GL_GENERATE_MIPMAP and reuploading the first pixel */
>       if (cogl_has_feature (ctx, COGL_FEATURE_ID_OFFSCREEN))
> -        ctx->texture_driver->gl_generate_mipmaps (GL_TEXTURE_3D);
> +        ctx->texture_driver->gl_generate_mipmaps (ctx, GL_TEXTURE_3D);
>  #if defined (HAVE_COGL_GL) || defined (HAVE_COGL_GLES)
>       else if (ctx->driver != COGL_DRIVER_GLES2)
>         {
> diff --git a/cogl/cogl-texture-driver.h b/cogl/cogl-texture-driver.h
> index 07ccdf8..bd48b76 100644
> --- a/cogl/cogl-texture-driver.h
> +++ b/cogl/cogl-texture-driver.h
> @@ -34,9 +34,10 @@ struct _CoglTextureDriver
>    * the driver will not allocate room for the mipmap tree.
>    */
>   void
> -  (* gen) (GLenum   gl_target,
> -           GLsizei  n,
> -           GLuint  *textures);
> +  (* gen) (CoglContext *ctx,
> +           GLenum gl_target,
> +           GLsizei n,
> +           GLuint *textures);
>
>   /*
>    * This sets up the glPixelStore state for an upload to a destination
> with
> @@ -46,7 +47,8 @@ struct _CoglTextureDriver
>    * buffer which is why this interface is limited. The GL driver has a
> more
>    * flexible version of this function that is uses internally */
>   void
> -  (* prep_gl_for_pixels_upload) (int pixels_rowstride,
> +  (* prep_gl_for_pixels_upload) (CoglContext *ctx,
> +                                 int pixels_rowstride,
>                                  int pixels_bpp);
>
>   /*
> @@ -63,18 +65,19 @@ struct _CoglTextureDriver
>    * XXX: sorry for the ridiculous number of arguments :-(
>    */
>   void
> -  (* upload_subregion_to_gl) (GLenum       gl_target,
> -                              GLuint       gl_handle,
> -                              gboolean     is_foreign,
> -                              int          src_x,
> -                              int          src_y,
> -                              int          dst_x,
> -                              int          dst_y,
> -                              int          width,
> -                              int          height,
> -                              CoglBitmap  *source_bmp,
> -                              GLuint       source_gl_format,
> -                              GLuint       source_gl_type);
> +  (* upload_subregion_to_gl) (CoglContext *ctx,
> +                              GLenum gl_target,
> +                              GLuint gl_handle,
> +                              gboolean is_foreign,
> +                              int src_x,
> +                              int src_y,
> +                              int dst_x,
> +                              int dst_y,
> +                              int width,
> +                              int height,
> +                              CoglBitmap *source_bmp,
> +                              GLuint source_gl_format,
> +                              GLuint source_gl_type);
>
>   /*
>    * Replaces the contents of the GL texture with the entire bitmap. On
> @@ -83,13 +86,14 @@ struct _CoglTextureDriver
>    * alignment value because there is no GL_UNPACK_ROW_LENGTH
>    */
>   void
> -  (* upload_to_gl) (GLenum       gl_target,
> -                    GLuint       gl_handle,
> -                    gboolean     is_foreign,
> -                    CoglBitmap  *source_bmp,
> -                    GLint        internal_gl_format,
> -                    GLuint       source_gl_format,
> -                    GLuint       source_gl_type);
> +  (* upload_to_gl) (CoglContext *ctx,
> +                    GLenum gl_target,
> +                    GLuint gl_handle,
> +                    gboolean is_foreign,
> +                    CoglBitmap *source_bmp,
> +                    GLint internal_gl_format,
> +                    GLuint source_gl_format,
> +                    GLuint source_gl_type);
>
>   /*
>    * Replaces the contents of the GL texture with the entire bitmap. The
> @@ -99,15 +103,16 @@ struct _CoglTextureDriver
>    * height of the bitmap by the depth.
>    */
>   void
> -  (* upload_to_gl_3d) (GLenum       gl_target,
> -                       GLuint       gl_handle,
> -                       gboolean     is_foreign,
> -                       GLint        height,
> -                       GLint        depth,
> -                       CoglBitmap  *source_bmp,
> -                       GLint        internal_gl_format,
> -                       GLuint       source_gl_format,
> -                       GLuint       source_gl_type);
> +  (* upload_to_gl_3d) (CoglContext *ctx,
> +                       GLenum gl_target,
> +                       GLuint gl_handle,
> +                       gboolean is_foreign,
> +                       GLint height,
> +                       GLint depth,
> +                       CoglBitmap *source_bmp,
> +                       GLint internal_gl_format,
> +                       GLuint source_gl_format,
> +                       GLuint source_gl_type);
>
>   /*
>    * This sets up the glPixelStore state for an download to a destination
> with
> @@ -117,7 +122,8 @@ struct _CoglTextureDriver
>    * destination buffer, the GL driver has a more flexible version of
>    * this function that it uses internally. */
>   void
> -  (* prep_gl_for_pixels_download) (int pixels_rowstride,
> +  (* prep_gl_for_pixels_download) (CoglContext *ctx,
> +                                   int pixels_rowstride,
>                                    int pixels_bpp);
>
>   /*
> @@ -128,36 +134,39 @@ struct _CoglTextureDriver
>    * _cogl_texture_draw_and_read () )
>    */
>   gboolean
> -  (* gl_get_tex_image) (GLenum  gl_target,
> -                        GLenum  dest_gl_format,
> -                        GLenum  dest_gl_type,
> +  (* gl_get_tex_image) (CoglContext *ctx,
> +                        GLenum gl_target,
> +                        GLenum dest_gl_format,
> +                        GLenum dest_gl_type,
>                         guint8 *dest);
>
>   /*
>    * It may depend on the driver as to what texture sizes are supported...
>    */
>   gboolean
> -  (* size_supported) (GLenum gl_target,
> +  (* size_supported) (CoglContext *ctx,
> +                      GLenum gl_target,
>                       GLenum gl_format,
>                       GLenum gl_type,
> -                      int    width,
> -                      int    height);
> +                      int width,
> +                      int height);
>
>   gboolean
> -  (* size_supported_3d) (GLenum gl_target,
> +  (* size_supported_3d) (CoglContext *ctx,
> +                         GLenum gl_target,
>                          GLenum gl_format,
>                          GLenum gl_type,
> -                         int    width,
> -                         int    height,
> -                         int    depth);
> +                         int width,
> +                         int height,
> +                         int depth);
>
>   /*
>    * This driver abstraction is needed because GLES doesn't support setting
>    * a texture border color.
>    */
>   void
> -  (* try_setting_gl_border_color) (
> -                                   GLuint         gl_target,
> +  (* try_setting_gl_border_color) (CoglContext *ctx,
> +                                   GLuint gl_target,
>                                    const GLfloat *transparent_color);
>
>   /*
> @@ -166,7 +175,8 @@ struct _CoglTextureDriver
>    * but GLES doesn't
>    */
>   gboolean
> -  (* allows_foreign_gl_target) (GLenum gl_target);
> +  (* allows_foreign_gl_target) (CoglContext *ctx,
> +                                GLenum gl_target);
>
>   /*
>    * glGenerateMipmap semantics may need to be emulated for some
> @@ -174,7 +184,8 @@ struct _CoglTextureDriver
>    * number of known texels.
>    */
>   void
> -  (* gl_generate_mipmaps) (GLenum texture_target);
> +  (* gl_generate_mipmaps) (CoglContext *ctx,
> +                           GLenum texture_target);
>
>   /*
>    * The driver may impose constraints on what formats can be used to store
> @@ -184,9 +195,9 @@ struct _CoglTextureDriver
>    */
>   CoglPixelFormat
>   (* find_best_gl_get_data_format) (CoglContext     *context,
> -                                    CoglPixelFormat  format,
> -                                    GLenum          *closest_gl_format,
> -                                    GLenum          *closest_gl_type);
> +                                    CoglPixelFormat format,
> +                                    GLenum *closest_gl_format,
> +                                    GLenum *closest_gl_type);
>  };
>
>  #endif /* __COGL_TEXTURE_DRIVER_H */
> diff --git a/cogl/cogl-texture-rectangle.c b/cogl/cogl-texture-rectangle.c
> index a7c4ae2..e4db54d 100644
> --- a/cogl/cogl-texture-rectangle.c
> +++ b/cogl/cogl-texture-rectangle.c
> @@ -135,7 +135,8 @@ _cogl_texture_rectangle_can_create (unsigned int width,
>                                           &gl_type);
>
>   /* Check that the driver can create a texture with that size */
> -  if (!ctx->texture_driver->size_supported (GL_TEXTURE_RECTANGLE_ARB,
> +  if (!ctx->texture_driver->size_supported (ctx,
> +                                            GL_TEXTURE_RECTANGLE_ARB,
>                                             gl_intformat,
>                                             gl_type,
>                                             width,
> @@ -206,7 +207,10 @@ cogl_texture_rectangle_new_with_size (CoglContext
> *ctx,
>   tex_rect = _cogl_texture_rectangle_create_base (width, height,
>                                                   internal_format);
>
> -  ctx->texture_driver->gen (GL_TEXTURE_RECTANGLE_ARB, 1,
> &tex_rect->gl_texture);
> +  ctx->texture_driver->gen (ctx,
> +                            GL_TEXTURE_RECTANGLE_ARB,
> +                            1, /* num textures */
> +                            &tex_rect->gl_texture);
>   _cogl_bind_gl_texture_transient (GL_TEXTURE_RECTANGLE_ARB,
>                                    tex_rect->gl_texture,
>                                    tex_rect->is_foreign);
> @@ -255,8 +259,12 @@ _cogl_texture_rectangle_new_from_bitmap (CoglBitmap
>    *bmp,
>                                                   cogl_bitmap_get_height
> (bmp),
>                                                   internal_format);
>
> -  ctx->texture_driver->gen (GL_TEXTURE_RECTANGLE_ARB, 1,
> &tex_rect->gl_texture);
> -  ctx->texture_driver->upload_to_gl (GL_TEXTURE_RECTANGLE_ARB,
> +  ctx->texture_driver->gen (ctx,
> +                            GL_TEXTURE_RECTANGLE_ARB,
> +                            1, /* num textures */
> +                            &tex_rect->gl_texture);
> +  ctx->texture_driver->upload_to_gl (ctx,
> +                                     GL_TEXTURE_RECTANGLE_ARB,
>                                      tex_rect->gl_texture,
>                                      FALSE,
>                                      dst_bmp,
> @@ -288,7 +296,8 @@ _cogl_texture_rectangle_new_from_foreign (GLuint
> gl_handle,
>
>   _COGL_GET_CONTEXT (ctx, NULL);
>
> -  if (!ctx->texture_driver->allows_foreign_gl_target
> (GL_TEXTURE_RECTANGLE_ARB))
> +  if (!ctx->texture_driver->allows_foreign_gl_target (ctx,
> +
>  GL_TEXTURE_RECTANGLE_ARB))
>     return NULL;
>
>   /* Make sure it is a valid GL texture object */
> @@ -506,7 +515,8 @@ _cogl_texture_rectangle_set_region (CoglTexture
>  *tex,
>                                           &gl_type);
>
>   /* Send data to GL */
> -  ctx->texture_driver->upload_subregion_to_gl (GL_TEXTURE_RECTANGLE_ARB,
> +  ctx->texture_driver->upload_subregion_to_gl (ctx,
> +                                               GL_TEXTURE_RECTANGLE_ARB,
>                                                tex_rect->gl_texture,
>                                                FALSE,
>                                                src_x, src_y,
> @@ -542,12 +552,13 @@ _cogl_texture_rectangle_get_data (CoglTexture
> *tex,
>                                           &gl_format,
>                                           &gl_type);
>
> -  ctx->texture_driver->prep_gl_for_pixels_download (rowstride, bpp);
> +  ctx->texture_driver->prep_gl_for_pixels_download (ctx, rowstride, bpp);
>
>   _cogl_bind_gl_texture_transient (GL_TEXTURE_RECTANGLE_ARB,
>                                    tex_rect->gl_texture,
>                                    tex_rect->is_foreign);
> -  return ctx->texture_driver->gl_get_tex_image (GL_TEXTURE_RECTANGLE_ARB,
> +  return ctx->texture_driver->gl_get_tex_image (ctx,
> +                                                GL_TEXTURE_RECTANGLE_ARB,
>                                                 gl_format,
>                                                 gl_type,
>                                                 data);
> diff --git a/cogl/driver/gl/cogl-texture-driver-gl.c
> b/cogl/driver/gl/cogl-texture-driver-gl.c
> index 373fade..31f6f83 100644
> --- a/cogl/driver/gl/cogl-texture-driver-gl.c
> +++ b/cogl/driver/gl/cogl-texture-driver-gl.c
> @@ -46,14 +46,13 @@
>  #include <math.h>
>
>  static void
> -_cogl_texture_driver_gen (GLenum   gl_target,
> -                          GLsizei  n,
> -                          GLuint  *textures)
> +_cogl_texture_driver_gen (CoglContext *ctx,
> +                          GLenum gl_target,
> +                          GLsizei n,
> +                          GLuint *textures)
>  {
>   unsigned int i;
>
> -  _COGL_GET_CONTEXT (ctx, NO_RETVAL);
> -
>   GE (ctx, glGenTextures (n, textures));
>
>   for (i = 0; i < n; i++)
> @@ -86,14 +85,13 @@ _cogl_texture_driver_gen (GLenum   gl_target,
>  /* OpenGL - unlike GLES - can upload a sub region of pixel data from a
> larger
>  * source buffer */
>  static void
> -prep_gl_for_pixels_upload_full (int pixels_rowstride,
> +prep_gl_for_pixels_upload_full (CoglContext *ctx,
> +                                int pixels_rowstride,
>                                 int image_height,
>                                 int pixels_src_x,
>                                 int pixels_src_y,
>                                 int pixels_bpp)
>  {
> -  _COGL_GET_CONTEXT (ctx, NO_RETVAL);
> -
>   GE( ctx, glPixelStorei (GL_UNPACK_ROW_LENGTH,
>                           pixels_rowstride / pixels_bpp) );
>
> @@ -107,23 +105,23 @@ prep_gl_for_pixels_upload_full (int pixels_rowstride,
>  }
>
>  static void
> -_cogl_texture_driver_prep_gl_for_pixels_upload (int pixels_rowstride,
> +_cogl_texture_driver_prep_gl_for_pixels_upload (CoglContext *ctx,
> +                                                int pixels_rowstride,
>                                                 int pixels_bpp)
>  {
> -  prep_gl_for_pixels_upload_full (pixels_rowstride, 0, 0, 0, pixels_bpp);
> +  prep_gl_for_pixels_upload_full (ctx, pixels_rowstride, 0, 0, 0,
> pixels_bpp);
>  }
>
>  /* OpenGL - unlike GLES - can download pixel data into a sub region of
>  * a larger destination buffer */
>  static void
> -prep_gl_for_pixels_download_full (int pixels_rowstride,
> +prep_gl_for_pixels_download_full (CoglContext *ctx,
> +                                  int pixels_rowstride,
>                                   int image_height,
>                                   int pixels_src_x,
>                                   int pixels_src_y,
>                                   int pixels_bpp)
>  {
> -  _COGL_GET_CONTEXT (ctx, NO_RETVAL);
> -
>   GE( ctx, glPixelStorei (GL_PACK_ROW_LENGTH, pixels_rowstride /
> pixels_bpp) );
>
>   GE( ctx, glPixelStorei (GL_PACK_SKIP_PIXELS, pixels_src_x) );
> @@ -136,14 +134,16 @@ prep_gl_for_pixels_download_full (int
> pixels_rowstride,
>  }
>
>  static void
> -_cogl_texture_driver_prep_gl_for_pixels_download (int pixels_rowstride,
> +_cogl_texture_driver_prep_gl_for_pixels_download (CoglContext *ctx,
> +                                                  int pixels_rowstride,
>                                                   int pixels_bpp)
>  {
> -  prep_gl_for_pixels_download_full (pixels_rowstride, 0, 0, 0,
> pixels_bpp);
> +  prep_gl_for_pixels_download_full (ctx, pixels_rowstride, 0, 0, 0,
> pixels_bpp);
>  }
>
>  static void
> -_cogl_texture_driver_upload_subregion_to_gl (GLenum       gl_target,
> +_cogl_texture_driver_upload_subregion_to_gl (CoglContext *ctx,
> +                                             GLenum       gl_target,
>                                              GLuint       gl_handle,
>                                              gboolean     is_foreign,
>                                              int          src_x,
> @@ -160,12 +160,11 @@ _cogl_texture_driver_upload_subregion_to_gl (GLenum
>       gl_target,
>   CoglPixelFormat source_format = cogl_bitmap_get_format (source_bmp);
>   int bpp = _cogl_pixel_format_get_bytes_per_pixel (source_format);
>
> -  _COGL_GET_CONTEXT (ctx, NO_RETVAL);
> -
>   data = _cogl_bitmap_bind (source_bmp, COGL_BUFFER_ACCESS_READ, 0);
>
>   /* Setup gl alignment to match rowstride and top-left corner */
> -  prep_gl_for_pixels_upload_full (cogl_bitmap_get_rowstride (source_bmp),
> +  prep_gl_for_pixels_upload_full (ctx,
> +                                  cogl_bitmap_get_rowstride (source_bmp),
>                                   0,
>                                   src_x,
>                                   src_y,
> @@ -184,7 +183,8 @@ _cogl_texture_driver_upload_subregion_to_gl (GLenum
>     gl_target,
>  }
>
>  static void
> -_cogl_texture_driver_upload_to_gl (GLenum       gl_target,
> +_cogl_texture_driver_upload_to_gl (CoglContext *ctx,
> +                                   GLenum       gl_target,
>                                    GLuint       gl_handle,
>                                    gboolean     is_foreign,
>                                    CoglBitmap  *source_bmp,
> @@ -196,12 +196,11 @@ _cogl_texture_driver_upload_to_gl (GLenum
> gl_target,
>   CoglPixelFormat source_format = cogl_bitmap_get_format (source_bmp);
>   int bpp = _cogl_pixel_format_get_bytes_per_pixel (source_format);
>
> -  _COGL_GET_CONTEXT (ctx, NO_RETVAL);
> -
>   data = _cogl_bitmap_bind (source_bmp, COGL_BUFFER_ACCESS_READ, 0);
>
>   /* Setup gl alignment to match rowstride and top-left corner */
> -  prep_gl_for_pixels_upload_full (cogl_bitmap_get_rowstride (source_bmp),
> +  prep_gl_for_pixels_upload_full (ctx,
> +                                  cogl_bitmap_get_rowstride (source_bmp),
>                                   0, 0, 0, bpp);
>
>   _cogl_bind_gl_texture_transient (gl_target, gl_handle, is_foreign);
> @@ -219,7 +218,8 @@ _cogl_texture_driver_upload_to_gl (GLenum
> gl_target,
>  }
>
>  static void
> -_cogl_texture_driver_upload_to_gl_3d (GLenum       gl_target,
> +_cogl_texture_driver_upload_to_gl_3d (CoglContext *ctx,
> +                                      GLenum       gl_target,
>                                       GLuint       gl_handle,
>                                       gboolean     is_foreign,
>                                       GLint        height,
> @@ -233,12 +233,11 @@ _cogl_texture_driver_upload_to_gl_3d (GLenum
> gl_target,
>   CoglPixelFormat source_format = cogl_bitmap_get_format (source_bmp);
>   int bpp = _cogl_pixel_format_get_bytes_per_pixel (source_format);
>
> -  _COGL_GET_CONTEXT (ctx, NO_RETVAL);
> -
>   data = _cogl_bitmap_bind (source_bmp, COGL_BUFFER_ACCESS_READ, 0);
>
>   /* Setup gl alignment to match rowstride and top-left corner */
> -  prep_gl_for_pixels_upload_full (cogl_bitmap_get_rowstride (source_bmp),
> +  prep_gl_for_pixels_upload_full (ctx,
> +                                  cogl_bitmap_get_rowstride (source_bmp),
>                                   (cogl_bitmap_get_height (source_bmp) /
>                                    depth),
>                                   0, 0, bpp);
> @@ -260,13 +259,12 @@ _cogl_texture_driver_upload_to_gl_3d (GLenum
> gl_target,
>  }
>
>  static gboolean
> -_cogl_texture_driver_gl_get_tex_image (GLenum  gl_target,
> -                                       GLenum  dest_gl_format,
> -                                       GLenum  dest_gl_type,
> +_cogl_texture_driver_gl_get_tex_image (CoglContext *ctx,
> +                                       GLenum gl_target,
> +                                       GLenum dest_gl_format,
> +                                       GLenum dest_gl_type,
>                                        guint8 *dest)
>  {
> -  _COGL_GET_CONTEXT (ctx, FALSE);
> -
>   GE (ctx, glGetTexImage (gl_target,
>                           0, /* level */
>                           dest_gl_format,
> @@ -276,18 +274,17 @@ _cogl_texture_driver_gl_get_tex_image (GLenum
>  gl_target,
>  }
>
>  static gboolean
> -_cogl_texture_driver_size_supported_3d (GLenum gl_target,
> +_cogl_texture_driver_size_supported_3d (CoglContext *ctx,
> +                                        GLenum gl_target,
>                                         GLenum gl_format,
>                                         GLenum gl_type,
> -                                        int    width,
> -                                        int    height,
> -                                        int    depth)
> +                                        int width,
> +                                        int height,
> +                                        int depth)
>  {
>   GLenum proxy_target;
>   GLint new_width = 0;
>
> -  _COGL_GET_CONTEXT (ctx, FALSE);
> -
>   if (gl_target == GL_TEXTURE_3D)
>     proxy_target = GL_PROXY_TEXTURE_3D;
>   else
> @@ -306,17 +303,16 @@ _cogl_texture_driver_size_supported_3d (GLenum
> gl_target,
>  }
>
>  static gboolean
> -_cogl_texture_driver_size_supported (GLenum gl_target,
> +_cogl_texture_driver_size_supported (CoglContext *ctx,
> +                                     GLenum gl_target,
>                                      GLenum gl_format,
>                                      GLenum gl_type,
> -                                     int    width,
> -                                     int    height)
> +                                     int width,
> +                                     int height)
>  {
>   GLenum proxy_target;
>   GLint new_width = 0;
>
> -  _COGL_GET_CONTEXT (ctx, FALSE);
> -
>   if (gl_target == GL_TEXTURE_2D)
>     proxy_target = GL_PROXY_TEXTURE_2D;
>  #if HAVE_COGL_GL
> @@ -339,12 +335,11 @@ _cogl_texture_driver_size_supported (GLenum
> gl_target,
>  }
>
>  static void
> -_cogl_texture_driver_try_setting_gl_border_color (
> -                                              GLuint   gl_target,
> -                                              const GLfloat
> *transparent_color)
> +_cogl_texture_driver_try_setting_gl_border_color
> +                                       (CoglContext *ctx,
> +                                        GLuint gl_target,
> +                                        const GLfloat *transparent_color)
>  {
> -  _COGL_GET_CONTEXT (ctx, NO_RETVAL);
> -
>   /* Use a transparent border color so that we can leave the
>      color buffer alone when using texture co-ordinates
>      outside of the texture */
> @@ -353,7 +348,8 @@ _cogl_texture_driver_try_setting_gl_border_color (
>  }
>
>  static gboolean
> -_cogl_texture_driver_allows_foreign_gl_target (GLenum gl_target)
> +_cogl_texture_driver_allows_foreign_gl_target (CoglContext *ctx,
> +                                               GLenum gl_target)
>  {
>   /* GL_ARB_texture_rectangle textures are supported if they are
>      created from foreign because some chipsets have trouble with
> @@ -369,10 +365,9 @@ _cogl_texture_driver_allows_foreign_gl_target (GLenum
> gl_target)
>  }
>
>  static void
> -_cogl_texture_driver_gl_generate_mipmaps (GLenum gl_target)
> +_cogl_texture_driver_gl_generate_mipmaps (CoglContext *ctx,
> +                                          GLenum gl_target)
>  {
> -  _COGL_GET_CONTEXT (ctx, NO_RETVAL);
> -
>   GE( ctx, glGenerateMipmap (gl_target) );
>  }
>
> diff --git a/cogl/driver/gles/cogl-texture-driver-gles.c
> b/cogl/driver/gles/cogl-texture-driver-gles.c
> index ad1c248..f2690da 100644
> --- a/cogl/driver/gles/cogl-texture-driver-gles.c
> +++ b/cogl/driver/gles/cogl-texture-driver-gles.c
> @@ -53,14 +53,13 @@
>  #endif
>
>  static void
> -_cogl_texture_driver_gen (GLenum   gl_target,
> -                          GLsizei  n,
> -                          GLuint  *textures)
> +_cogl_texture_driver_gen (CoglContext *ctx,
> +                          GLenum gl_target,
> +                          GLsizei n,
> +                          GLuint *textures)
>  {
>   unsigned int i;
>
> -  _COGL_GET_CONTEXT (ctx, NO_RETVAL);
> -
>   GE (ctx, glGenTextures (n, textures));
>
>   for (i = 0; i < n; i++)
> @@ -84,21 +83,24 @@ _cogl_texture_driver_gen (GLenum   gl_target,
>  }
>
>  static void
> -_cogl_texture_driver_prep_gl_for_pixels_upload (int pixels_rowstride,
> +_cogl_texture_driver_prep_gl_for_pixels_upload (CoglContext *context,
> +                                                int pixels_rowstride,
>                                                 int pixels_bpp)
>  {
>   _cogl_texture_prep_gl_alignment_for_pixels_upload (pixels_rowstride);
>  }
>
>  static void
> -_cogl_texture_driver_prep_gl_for_pixels_download (int pixels_rowstride,
> +_cogl_texture_driver_prep_gl_for_pixels_download (CoglContext *ctx,
> +                                                  int pixels_rowstride,
>                                                   int pixels_bpp)
>  {
>   _cogl_texture_prep_gl_alignment_for_pixels_download (pixels_rowstride);
>  }
>
>  static CoglBitmap *
> -prepare_bitmap_alignment_for_upload (CoglBitmap *src_bmp)
> +prepare_bitmap_alignment_for_upload (CoglContext *ctx,
> +                                     CoglBitmap *src_bmp)
>  {
>   CoglPixelFormat format = cogl_bitmap_get_format (src_bmp);
>   int bpp = _cogl_pixel_format_get_bytes_per_pixel (format);
> @@ -124,7 +126,8 @@ prepare_bitmap_alignment_for_upload (CoglBitmap
> *src_bmp)
>  }
>
>  static void
> -_cogl_texture_driver_upload_subregion_to_gl (GLenum       gl_target,
> +_cogl_texture_driver_upload_subregion_to_gl (CoglContext *ctx,
> +                                             GLenum       gl_target,
>                                              GLuint       gl_handle,
>                                              gboolean     is_foreign,
>                                              int          src_x,
> @@ -143,8 +146,6 @@ _cogl_texture_driver_upload_subregion_to_gl (GLenum
>     gl_target,
>   CoglBitmap *slice_bmp;
>   int rowstride;
>
> -  _COGL_GET_CONTEXT (ctx, NO_RETVAL);
> -
>   /* If we are copying a sub region of the source bitmap then we need
>      to copy it because GLES does not support GL_UNPACK_ROW_LENGTH */
>   if (src_x != 0 || src_y != 0 ||
> @@ -162,12 +163,12 @@ _cogl_texture_driver_upload_subregion_to_gl (GLenum
>       gl_target,
>                                    width, height);
>     }
>   else
> -    slice_bmp = prepare_bitmap_alignment_for_upload (source_bmp);
> +    slice_bmp = prepare_bitmap_alignment_for_upload (ctx, source_bmp);
>
>   rowstride = cogl_bitmap_get_rowstride (slice_bmp);
>
>   /* Setup gl alignment to match rowstride and top-left corner */
> -  _cogl_texture_driver_prep_gl_for_pixels_upload (rowstride, bpp);
> +  _cogl_texture_driver_prep_gl_for_pixels_upload (ctx, rowstride, bpp);
>
>   data = _cogl_bitmap_bind (slice_bmp, COGL_BUFFER_ACCESS_READ, 0);
>
> @@ -186,7 +187,8 @@ _cogl_texture_driver_upload_subregion_to_gl (GLenum
>     gl_target,
>  }
>
>  static void
> -_cogl_texture_driver_upload_to_gl (GLenum       gl_target,
> +_cogl_texture_driver_upload_to_gl (CoglContext *ctx,
> +                                   GLenum       gl_target,
>                                    GLuint       gl_handle,
>                                    gboolean     is_foreign,
>                                    CoglBitmap  *source_bmp,
> @@ -202,13 +204,11 @@ _cogl_texture_driver_upload_to_gl (GLenum
> gl_target,
>   CoglBitmap *bmp;
>   guint8 *data;
>
> -  _COGL_GET_CONTEXT (ctx, NO_RETVAL);
> -
> -  bmp = prepare_bitmap_alignment_for_upload (source_bmp);
> +  bmp = prepare_bitmap_alignment_for_upload (ctx, source_bmp);
>   rowstride = cogl_bitmap_get_rowstride (bmp);
>
>   /* Setup gl alignment to match rowstride and top-left corner */
> -  _cogl_texture_driver_prep_gl_for_pixels_upload (rowstride, bpp);
> +  _cogl_texture_driver_prep_gl_for_pixels_upload (ctx, rowstride, bpp);
>
>   _cogl_bind_gl_texture_transient (gl_target, gl_handle, is_foreign);
>
> @@ -228,7 +228,8 @@ _cogl_texture_driver_upload_to_gl (GLenum
> gl_target,
>  }
>
>  static void
> -_cogl_texture_driver_upload_to_gl_3d (GLenum       gl_target,
> +_cogl_texture_driver_upload_to_gl_3d (CoglContext *ctx,
> +                                      GLenum       gl_target,
>                                       GLuint       gl_handle,
>                                       gboolean     is_foreign,
>                                       GLint        height,
> @@ -245,8 +246,6 @@ _cogl_texture_driver_upload_to_gl_3d (GLenum
> gl_target,
>   int bmp_height = cogl_bitmap_get_height (source_bmp);
>   guint8 *data;
>
> -  _COGL_GET_CONTEXT (ctx, NO_RETVAL);
> -
>   _cogl_bind_gl_texture_transient (gl_target, gl_handle, is_foreign);
>
>   /* If the rowstride or image height can't be specified with just
> @@ -260,7 +259,7 @@ _cogl_texture_driver_upload_to_gl_3d (GLenum
> gl_target,
>       CoglPixelFormat source_bmp_format = cogl_bitmap_get_format
> (source_bmp);
>       int i;
>
> -      _cogl_texture_driver_prep_gl_for_pixels_upload (bmp_width * bpp,
> bpp);
> +      _cogl_texture_driver_prep_gl_for_pixels_upload (ctx, bmp_width *
> bpp, bpp);
>
>       /* Initialize the texture with empty data and then upload each
>          image with a sub-region update */
> @@ -314,7 +313,7 @@ _cogl_texture_driver_upload_to_gl_3d (GLenum
> gl_target,
>     {
>       data = _cogl_bitmap_bind (source_bmp, COGL_BUFFER_ACCESS_READ, 0);
>
> -      _cogl_texture_driver_prep_gl_for_pixels_upload (rowstride, bpp);
> +      _cogl_texture_driver_prep_gl_for_pixels_upload (ctx, rowstride,
> bpp);
>
>       GE( ctx, glTexImage3D (gl_target,
>                              0, /* level */
> @@ -335,26 +334,26 @@ _cogl_texture_driver_upload_to_gl_3d (GLenum
> gl_target,
>  * fallback to a generic render + readpixels approach to downloading
>  * texture data. (See _cogl_texture_draw_and_read() ) */
>  static gboolean
> -_cogl_texture_driver_gl_get_tex_image (GLenum  gl_target,
> -                                       GLenum  dest_gl_format,
> -                                       GLenum  dest_gl_type,
> +_cogl_texture_driver_gl_get_tex_image (CoglContext *ctx,
> +                                       GLenum gl_target,
> +                                       GLenum dest_gl_format,
> +                                       GLenum dest_gl_type,
>                                        guint8 *dest)
>  {
>   return FALSE;
>  }
>
>  static gboolean
> -_cogl_texture_driver_size_supported_3d (GLenum gl_target,
> +_cogl_texture_driver_size_supported_3d (CoglContext *ctx,
> +                                        GLenum gl_target,
>                                         GLenum gl_format,
>                                         GLenum gl_type,
> -                                        int    width,
> -                                        int    height,
> -                                        int    depth)
> +                                        int width,
> +                                        int height,
> +                                        int depth)
>  {
>   GLint max_size;
>
> -  _COGL_GET_CONTEXT (ctx, FALSE);
> -
>   /* GLES doesn't support a proxy texture target so let's at least
>      check whether the size is greater than
>      GL_MAX_3D_TEXTURE_SIZE_OES */
> @@ -364,16 +363,15 @@ _cogl_texture_driver_size_supported_3d (GLenum
> gl_target,
>  }
>
>  static gboolean
> -_cogl_texture_driver_size_supported (GLenum gl_target,
> +_cogl_texture_driver_size_supported (CoglContext *ctx,
> +                                     GLenum gl_target,
>                                      GLenum gl_format,
>                                      GLenum gl_type,
> -                                     int    width,
> -                                     int    height)
> +                                     int width,
> +                                     int height)
>  {
>   GLint max_size;
>
> -  _COGL_GET_CONTEXT (ctx, FALSE);
> -
>   /* GLES doesn't support a proxy texture target so let's at least
>      check whether the size is greater than GL_MAX_TEXTURE_SIZE */
>   GE( ctx, glGetIntegerv (GL_MAX_TEXTURE_SIZE, &max_size) );
> @@ -382,15 +380,17 @@ _cogl_texture_driver_size_supported (GLenum
> gl_target,
>  }
>
>  static void
> -_cogl_texture_driver_try_setting_gl_border_color (
> -                                              GLuint   gl_target,
> -                                              const GLfloat
> *transparent_color)
> +_cogl_texture_driver_try_setting_gl_border_color
> +                                            (CoglContext *ctx,
> +                                             GLuint gl_target,
> +                                             const GLfloat
> *transparent_color)
>  {
>   /* FAIL! */
>  }
>
>  static gboolean
> -_cogl_texture_driver_allows_foreign_gl_target (GLenum gl_target)
> +_cogl_texture_driver_allows_foreign_gl_target (CoglContext *ctx,
> +                                               GLenum gl_target)
>  {
>   /* Allow 2-dimensional textures only */
>   if (gl_target != GL_TEXTURE_2D)
> @@ -399,10 +399,9 @@ _cogl_texture_driver_allows_foreign_gl_target (GLenum
> gl_target)
>  }
>
>  static void
> -_cogl_texture_driver_gl_generate_mipmaps (GLenum gl_target)
> +_cogl_texture_driver_gl_generate_mipmaps (CoglContext *ctx,
> +                                          GLenum gl_target)
>  {
> -  _COGL_GET_CONTEXT (ctx, NO_RETVAL);
> -
>   if (ctx->driver == COGL_DRIVER_GLES2)
>     GE( ctx, glGenerateMipmap (gl_target) );
>  }
> --
> 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/7278c216/attachment-0001.htm>


More information about the Cogl mailing list