summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCarlos Garnacho <carlosg@gnome.org>2017-02-25 22:21:06 (GMT)
committerCarlos Garnacho <carlosg@gnome.org>2017-02-28 17:48:21 (GMT)
commit1705a26fc708d142aebe17e76cb0b83ed00aa40c (patch)
treeeb75a2f39381ecd6fd8d43313963514745510052
parent95c924460a7632ef9be9a7b71e6f8256b81efe09 (diff)
downloadmutter-1705a26fc708d142aebe17e76cb0b83ed00aa40c.zip
mutter-1705a26fc708d142aebe17e76cb0b83ed00aa40c.tar.xz
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
-rw-r--r--cogl/cogl/driver/gl/gl/cogl-driver-gl.c10
-rw-r--r--cogl/cogl/driver/gl/gl/cogl-texture-driver-gl.c12
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;
}