[mutter] cogl: Prefer swizzling to convert BGRA buffers
- From: Carlos Garnacho <carlosg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [mutter] cogl: Prefer swizzling to convert BGRA buffers
- Date: Tue, 28 Feb 2017 17:50:27 +0000 (UTC)
commit 1705a26fc708d142aebe17e76cb0b83ed00aa40c
Author: Carlos Garnacho <carlosg gnome org>
Date: Sat Feb 25 23:21:06 2017 +0100
cogl: Prefer swizzling to convert BGRA buffers
If the GL implementation/hw supports the GL_*_texture_swizzle extension,
pretend that BGRA textures shall contain RGBA data, and let the flipping
happen when the texture will be used in the rendering pipeline.
This avoids rather expensive format conversions when forcing BGRA buffers
into RGBA textures, which happens rather often with WL_SHM_FORMAT_ARGB8888
buffers (like gtk+ uses) in little-endian machines.
In intel/mesa/wayland, the performance improvement is rather noticeable,
CPU% as seen by top decreases from 45-50% to 25-30% when running
gtk+/tests/scrolling-performance with a cairo renderer.
https://bugzilla.gnome.org/show_bug.cgi?id=779234
cogl/cogl/driver/gl/gl/cogl-driver-gl.c | 10 +++++++++-
cogl/cogl/driver/gl/gl/cogl-texture-driver-gl.c | 12 ++++++++++++
2 files changed, 21 insertions(+), 1 deletions(-)
---
diff --git a/cogl/cogl/driver/gl/gl/cogl-driver-gl.c b/cogl/cogl/driver/gl/gl/cogl-driver-gl.c
index 2b9a49c..1cc63e8 100644
--- a/cogl/cogl/driver/gl/gl/cogl-driver-gl.c
+++ b/cogl/cogl/driver/gl/gl/cogl-driver-gl.c
@@ -174,7 +174,15 @@ _cogl_driver_pixel_format_to_gl (CoglContext *context,
case COGL_PIXEL_FORMAT_BGRA_8888:
case COGL_PIXEL_FORMAT_BGRA_8888_PRE:
glintformat = GL_RGBA;
- glformat = GL_BGRA;
+ /* If the driver has texture_swizzle, pretend internal
+ * and buffer format are the same here, the pixels
+ * will be flipped through this extension.
+ */
+ if (_cogl_has_private_feature
+ (context, COGL_PRIVATE_FEATURE_TEXTURE_SWIZZLE))
+ glformat = GL_RGBA;
+ else
+ glformat = GL_BGRA;
gltype = GL_UNSIGNED_BYTE;
break;
diff --git a/cogl/cogl/driver/gl/gl/cogl-texture-driver-gl.c b/cogl/cogl/driver/gl/gl/cogl-texture-driver-gl.c
index c76a0cf..d5ee4b4 100644
--- a/cogl/cogl/driver/gl/gl/cogl-texture-driver-gl.c
+++ b/cogl/cogl/driver/gl/gl/cogl-texture-driver-gl.c
@@ -114,6 +114,18 @@ _cogl_texture_driver_gen (CoglContext *ctx,
red_swizzle) );
}
+ /* If swizzle extension is available, prefer it to flip bgra buffers to rgba */
+ if ((internal_format == COGL_PIXEL_FORMAT_BGRA_8888 ||
+ internal_format == COGL_PIXEL_FORMAT_BGRA_8888_PRE) &&
+ _cogl_has_private_feature (ctx, COGL_PRIVATE_FEATURE_TEXTURE_SWIZZLE))
+ {
+ static const GLint bgra_swizzle[] = { GL_BLUE, GL_GREEN, GL_RED, GL_ALPHA };
+
+ GE( ctx, glTexParameteriv (gl_target,
+ GL_TEXTURE_SWIZZLE_RGBA,
+ bgra_swizzle) );
+ }
+
return tex;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]