[cogl/wip/rib/cogl-1.12: 3/142] gles: Support the GL_EXT_texture_format_BGRA8888 extension



commit eb3a6ce8560217644772066ea42df74cb11edcec
Author: Neil Roberts <neil linux intel com>
Date:   Wed Mar 21 16:06:59 2012 +0000

    gles: Support the GL_EXT_texture_format_BGRA8888 extension
    
    This extension allows an application to upload data in BGRA format. We
    can use this to avoid a conversion in Cogl whenever it is given BGRA
    data. This is quite useful when uploading data generated by Cairo
    because at least on little-endian architectures that ends up as BGRA.
    
    The patch just makes the pixel_format_to_gl implementation return
    GL_BGRA_EXT for the data format and internal format whenever
    COGL_PIXEL_FORMAT_BGRA_8888{,_PRE} is used.
    
    A small caveat with this patch is that once a texture is created as
    GL_BGRA, when later using glTexSubImage2D to update the texture it
    must always be given data as GL_BGRA. Currently this just works out
    because we store the internal format of a texture as a CoglPixelFormat
    and we already swizzle the data if it does not match exactly on GLES.
    However if we later switch to using a different enum for internal
    formats then we might lose the ability to store the component ordering
    so we'll have to think of another way to do this.
    
    (cherry picked from commit 21e304b3396b61fd88fe5eb3aa2438cb97896a83)

 cogl/cogl-internal.h         |    3 ++-
 cogl/cogl-texture.c          |    9 +++++++++
 cogl/driver/gles/cogl-gles.c |   21 +++++++++++++++++++--
 3 files changed, 30 insertions(+), 3 deletions(-)
---
diff --git a/cogl/cogl-internal.h b/cogl/cogl-internal.h
index 9019859..4f53cc3 100644
--- a/cogl/cogl-internal.h
+++ b/cogl/cogl-internal.h
@@ -100,7 +100,8 @@ typedef enum
   COGL_PRIVATE_FEATURE_PBOS = 1L<<5,
   COGL_PRIVATE_FEATURE_VBOS = 1L<<6,
   COGL_PRIVATE_FEATURE_EXT_PACKED_DEPTH_STENCIL = 1L<<7,
-  COGL_PRIVATE_FEATURE_OES_PACKED_DEPTH_STENCIL = 1L<<8
+  COGL_PRIVATE_FEATURE_OES_PACKED_DEPTH_STENCIL = 1L<<8,
+  COGL_PRIVATE_FEATURE_TEXTURE_FORMAT_BGRA8888 = 1L<<9
 } CoglPrivateFeatureFlags;
 
 /* Sometimes when evaluating pipelines, either during comparisons or
diff --git a/cogl/cogl-texture.c b/cogl/cogl-texture.c
index 27cbb64..ab07f91 100644
--- a/cogl/cogl-texture.c
+++ b/cogl/cogl-texture.c
@@ -166,6 +166,15 @@ _cogl_texture_determine_internal_format (CoglPixelFormat src_format,
         return src_format;
     }
   else
+    /* XXX: It might be nice to make this match the component ordering
+       of the source format when the formats are otherwise the same
+       because on GL there is no way to specify the ordering of the
+       internal format. However when using GLES with the
+       GL_EXT_texture_format_BGRA8888 the order of the internal format
+       becomes important because it must exactly match the format of
+       the uploaded data. That means that if someone creates a texture
+       with some RGBA data and then later tries to upload BGRA data we
+       do actually have to swizzle the components */
     return dst_format;
 }
 
diff --git a/cogl/driver/gles/cogl-gles.c b/cogl/driver/gles/cogl-gles.c
index d4c5968..102a19f 100644
--- a/cogl/driver/gles/cogl-gles.c
+++ b/cogl/driver/gles/cogl-gles.c
@@ -69,6 +69,22 @@ _cogl_driver_pixel_format_to_gl (CoglContext *context,
       gltype = GL_UNSIGNED_BYTE;
       break;
 
+    case COGL_PIXEL_FORMAT_BGRA_8888:
+    case COGL_PIXEL_FORMAT_BGRA_8888_PRE:
+      /* There is an extension to support this format */
+      if ((context->private_feature_flags &
+           COGL_PRIVATE_FEATURE_TEXTURE_FORMAT_BGRA8888))
+        {
+          /* For some reason the extension says you have to specify
+             BGRA for the internal format too */
+          glintformat = GL_BGRA_EXT;
+          glformat = GL_BGRA_EXT;
+          gltype = GL_UNSIGNED_BYTE;
+          required_format = format;
+          break;
+        }
+      /* flow through */
+
       /* Just one 24-bit ordering supported */
     case COGL_PIXEL_FORMAT_RGB_888:
     case COGL_PIXEL_FORMAT_BGR_888:
@@ -81,8 +97,6 @@ _cogl_driver_pixel_format_to_gl (CoglContext *context,
       /* 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:
@@ -276,6 +290,9 @@ _cogl_driver_update_features (CoglContext *context,
   if (_cogl_check_extension ("GL_OES_packed_depth_stencil", gl_extensions))
     private_flags |= COGL_PRIVATE_FEATURE_OES_PACKED_DEPTH_STENCIL;
 
+  if (_cogl_check_extension ("GL_EXT_texture_format_BGRA8888", gl_extensions))
+    private_flags |= COGL_PRIVATE_FEATURE_TEXTURE_FORMAT_BGRA8888;
+
   /* Cache features */
   context->private_feature_flags |= private_flags;
   context->feature_flags |= flags;



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