diff options
| author | Carlos Garnacho <carlosg@gnome.org> | 2017-02-25 22:21:06 (GMT) |
|---|---|---|
| committer | Carlos Garnacho <carlosg@gnome.org> | 2017-02-28 17:48:21 (GMT) |
| commit | 1705a26fc708d142aebe17e76cb0b83ed00aa40c (patch) | |
| tree | eb75a2f39381ecd6fd8d43313963514745510052 | |
| parent | 95c924460a7632ef9be9a7b71e6f8256b81efe09 (diff) | |
| download | mutter-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.c | 10 | ||||
| -rw-r--r-- | 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; } |
