[cogl] gles: Support the GL_EXT_texture_format_BGRA8888 extension
- From: Neil Roberts <nroberts src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [cogl] gles: Support the GL_EXT_texture_format_BGRA8888 extension
- Date: Fri, 23 Mar 2012 13:53:30 +0000 (UTC)
commit 21e304b3396b61fd88fe5eb3aa2438cb97896a83
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.
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]