From 80bf2336c9ecd4d206a94b9062682a42c18105b7 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Sun, 8 May 2022 14:55:24 -0400 Subject: gsk: Use GL texture information Use the flags and color space information from GL textures to figure out what conversions we need to do on them. --- gsk/gl/gskgldriver.c | 29 +++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/gsk/gl/gskgldriver.c b/gsk/gl/gskgldriver.c index 51f367fb61..1795e3044f 100644 --- a/gsk/gl/gskgldriver.c +++ b/gsk/gl/gskgldriver.c @@ -42,6 +42,7 @@ #include #include #include +#include #include #include @@ -883,28 +884,40 @@ gsk_gl_driver_load_texture (GskGLDriver *self, if (gdk_gl_context_is_shared (context, texture_context)) { + GdkColorSpace *color_space; guint gl_texture_id; + GdkGLTextureFlags flags; gl_texture_id = gdk_gl_texture_get_id (gl_texture); + color_space = gdk_texture_get_color_space (texture); + flags = gdk_gl_texture_get_flags (gl_texture); /* A GL texture from the same GL context is a simple task... */ - if (gdk_color_space_is_linear (gdk_texture_get_color_space (texture))) + if (color_space == gdk_color_space_get_srgb_linear () && + flags == GDK_GL_TEXTURE_PREMULTIPLIED) { return gl_texture_id; } - else + else if (color_space == gdk_color_space_get_srgb () || + color_space == gdk_color_space_get_srgb_linear ()) { - /* The GL texture isn't linear sRGB, so we need to convert - * it before we can use it. For now, we just assume that it - * is nonlinear sRGB. Eventually, we should figure out how - * to convert from other color spaces to linear sRGB - */ + conversion = 0; + + if (color_space == gdk_color_space_get_srgb ()) + conversion |= GSK_CONVERSION_LINEARIZE; + + if ((flags & GDK_GL_TEXTURE_PREMULTIPLIED) == 0) + conversion |= GSK_CONVERSION_PREMULTIPLY; + + if ((flags & GDK_GL_TEXTURE_FLIPPED) != 0) + conversion |= GSK_CONVERSION_FLIP; + t = gsk_gl_driver_convert_texture (self, gl_texture_id, width, height, format, min_filter, mag_filter, - GSK_CONVERSION_LINEARIZE); + conversion); if (gdk_texture_set_render_data (texture, self, t, gsk_gl_texture_destroyed)) t->user = texture; -- cgit v1.2.1