diff --git a/cogl/cogl/cogl-driver.h b/cogl/cogl/cogl-driver.h index 648228c6f..85aa0d870 100644 --- a/cogl/cogl/cogl-driver.h +++ b/cogl/cogl/cogl-driver.h @@ -55,6 +55,13 @@ struct _CoglDriverVtable GLenum *out_glintformat, GLenum *out_glformat, GLenum *out_gltype); + CoglPixelFormat + (* pixel_format_to_gl_with_target) (CoglContext *context, + CoglPixelFormat format, + CoglPixelFormat target_format, + GLenum *out_glintformat, + GLenum *out_glformat, + GLenum *out_gltype); CoglBool (* update_features) (CoglContext *context, diff --git a/cogl/cogl/driver/gl/gl/cogl-driver-gl.c b/cogl/cogl/driver/gl/gl/cogl-driver-gl.c index 1cc63e82f..178262ac0 100644 --- a/cogl/cogl/driver/gl/gl/cogl-driver-gl.c +++ b/cogl/cogl/driver/gl/gl/cogl-driver-gl.c @@ -96,11 +96,12 @@ _cogl_driver_pixel_format_from_gl_internal (CoglContext *context, } static CoglPixelFormat -_cogl_driver_pixel_format_to_gl (CoglContext *context, - CoglPixelFormat format, - GLenum *out_glintformat, - GLenum *out_glformat, - GLenum *out_gltype) +_cogl_driver_pixel_format_to_gl_with_target (CoglContext *context, + CoglPixelFormat format, + CoglPixelFormat target_format, + GLenum *out_glintformat, + GLenum *out_glformat, + GLenum *out_gltype) { CoglPixelFormat required_format; GLenum glintformat = 0; @@ -178,7 +179,8 @@ _cogl_driver_pixel_format_to_gl (CoglContext *context, * and buffer format are the same here, the pixels * will be flipped through this extension. */ - if (_cogl_has_private_feature + if (target_format == format && + _cogl_has_private_feature (context, COGL_PRIVATE_FEATURE_TEXTURE_SWIZZLE)) glformat = GL_RGBA; else @@ -297,6 +299,20 @@ _cogl_driver_pixel_format_to_gl (CoglContext *context, return required_format; } +static CoglPixelFormat +_cogl_driver_pixel_format_to_gl (CoglContext *context, + CoglPixelFormat format, + GLenum *out_glintformat, + GLenum *out_glformat, + GLenum *out_gltype) +{ + return _cogl_driver_pixel_format_to_gl_with_target (context, + format, format, + out_glintformat, + out_glformat, + out_gltype); +} + static CoglBool _cogl_get_gl_version (CoglContext *ctx, int *major_out, @@ -677,6 +693,7 @@ _cogl_driver_gl = { _cogl_driver_pixel_format_from_gl_internal, _cogl_driver_pixel_format_to_gl, + _cogl_driver_pixel_format_to_gl_with_target, _cogl_driver_update_features, _cogl_offscreen_gl_allocate, _cogl_offscreen_gl_free, diff --git a/cogl/cogl/driver/gl/gles/cogl-driver-gles.c b/cogl/cogl/driver/gl/gles/cogl-driver-gles.c index bf63fcc16..521f6ef3d 100644 --- a/cogl/cogl/driver/gl/gles/cogl-driver-gles.c +++ b/cogl/cogl/driver/gl/gles/cogl-driver-gles.c @@ -67,11 +67,12 @@ _cogl_driver_pixel_format_from_gl_internal (CoglContext *context, } static CoglPixelFormat -_cogl_driver_pixel_format_to_gl (CoglContext *context, - CoglPixelFormat format, - GLenum *out_glintformat, - GLenum *out_glformat, - GLenum *out_gltype) +_cogl_driver_pixel_format_to_gl_with_target (CoglContext *context, + CoglPixelFormat format, + CoglPixelFormat target_format, + GLenum *out_glintformat, + GLenum *out_glformat, + GLenum *out_gltype) { CoglPixelFormat required_format; GLenum glintformat; @@ -219,6 +220,20 @@ _cogl_driver_pixel_format_to_gl (CoglContext *context, return required_format; } +static CoglPixelFormat +_cogl_driver_pixel_format_to_gl (CoglContext *context, + CoglPixelFormat format, + GLenum *out_glintformat, + GLenum *out_glformat, + GLenum *out_gltype) +{ + return _cogl_driver_pixel_format_to_gl_with_target (context, + format, format, + out_glintformat, + out_glformat, + out_gltype); +} + static CoglBool _cogl_get_gl_version (CoglContext *ctx, int *major_out, @@ -457,6 +472,7 @@ _cogl_driver_gles = { _cogl_driver_pixel_format_from_gl_internal, _cogl_driver_pixel_format_to_gl, + _cogl_driver_pixel_format_to_gl_with_target, _cogl_driver_update_features, _cogl_offscreen_gl_allocate, _cogl_offscreen_gl_free, diff --git a/cogl/cogl/driver/nop/cogl-driver-nop.c b/cogl/cogl/driver/nop/cogl-driver-nop.c index d9b1d0f1f..6e04e7164 100644 --- a/cogl/cogl/driver/nop/cogl-driver-nop.c +++ b/cogl/cogl/driver/nop/cogl-driver-nop.c @@ -61,6 +61,7 @@ _cogl_driver_nop = { NULL, /* pixel_format_from_gl_internal */ NULL, /* pixel_format_to_gl */ + NULL, /* pixel_format_to_gl_with_target */ _cogl_driver_update_features, _cogl_offscreen_nop_allocate, _cogl_offscreen_nop_free,