diff options
author | Matthias Clasen <mclasen@redhat.com> | 2020-09-25 22:29:45 -0400 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2020-09-26 10:02:28 -0400 |
commit | 8bae90831a15623e3283275eb87d68898aa9b699 (patch) | |
tree | 109bd35c5b0d23e0bb30c2294ad10b1cffe04189 | |
parent | 34ec226852d8f670270ba5002e85c8791b1e6435 (diff) | |
download | gtk+-texture-upload-bgra.tar.gz |
gl: Use GL_EXT_texture_format_BGRA8888texture-upload-bgra
In the gles case, use GL_EXT_texture_format_BGRA8888
when it is available. Strictly speaking, this might
violate the spec, since we use an internal / external
format combination of GL_RGBA + GL_BGRA_EXT, but it
works on my system.
Fixes: #3192
-rw-r--r-- | gdk/gdkglcontext.c | 31 |
1 files changed, 25 insertions, 6 deletions
diff --git a/gdk/gdkglcontext.c b/gdk/gdkglcontext.c index 71a854816b..e4c3edaa0f 100644 --- a/gdk/gdkglcontext.c +++ b/gdk/gdkglcontext.c @@ -111,6 +111,7 @@ typedef struct { guint has_khr_debug : 1; guint use_khr_debug : 1; guint has_unpack_subimage : 1; + guint has_texture_format_bgra : 1; guint has_debug_output : 1; guint extensions_checked : 1; guint debug_enabled : 1; @@ -241,8 +242,23 @@ gdk_gl_context_upload_texture (GdkGLContext *context, if (priv->use_es) { - /* GLES only supports rgba, so convert if necessary */ - if (data_format != GDK_MEMORY_R8G8B8A8_PREMULTIPLIED) + /* GLES only supports rgba (and sometime bgra), + * so convert if necessary + */ + if (data_format == GDK_MEMORY_R8G8B8A8_PREMULTIPLIED) + { + bpp = 4; + gl_format = GL_RGBA; + gl_type = GL_UNSIGNED_BYTE; + } + else if (data_format == GDK_MEMORY_B8G8R8A8_PREMULTIPLIED && + priv->has_texture_format_bgra) + { + bpp = 4; + gl_format = GL_BGRA_EXT; + gl_type = GL_UNSIGNED_BYTE; + } + else { copy = g_malloc (width * height * 4); gdk_memory_convert (copy, width * 4, @@ -251,11 +267,11 @@ gdk_gl_context_upload_texture (GdkGLContext *context, width, height); stride = width * 4; data = copy; - } - bpp = 4; - gl_format = GL_RGBA; - gl_type = GL_UNSIGNED_BYTE; + bpp = 4; + gl_format = GL_RGBA; + gl_type = GL_UNSIGNED_BYTE; + } } else { @@ -1024,6 +1040,7 @@ gdk_gl_context_check_extensions (GdkGLContext *context) has_texture_rectangle = FALSE; priv->has_unpack_subimage = epoxy_has_gl_extension ("GL_EXT_unpack_subimage"); + priv->has_texture_format_bgra = epoxy_has_gl_extension ("GL_EXT_texture_format_BGRA8888"); priv->has_khr_debug = epoxy_has_gl_extension ("GL_KHR_debug"); } else @@ -1066,6 +1083,7 @@ gdk_gl_context_check_extensions (GdkGLContext *context) " - GL_ARB_texture_rectangle: %s\n" " - GL_KHR_debug: %s\n" " - GL_EXT_unpack_subimage: %s\n" + " - GL_EXT_texture_format_BGRA8888: %s\n" "* Using texture rectangle: %s", priv->use_es ? "OpenGL ES" : "OpenGL", priv->gl_version / 10, priv->gl_version % 10, @@ -1075,6 +1093,7 @@ gdk_gl_context_check_extensions (GdkGLContext *context) has_texture_rectangle ? "yes" : "no", priv->has_khr_debug ? "yes" : "no", priv->has_unpack_subimage ? "yes" : "no", + priv->has_texture_format_bgra ? "yes" : "no", priv->use_texture_rectangle ? "yes" : "no")); priv->extensions_checked = TRUE; |