[gtk/flip-glarea: 2/2] Flip glarea back




commit 24f8f64154d818566cda6ce18efe8824b9e9cc2e
Author: Matthias Clasen <mclasen redhat com>
Date:   Sun Sep 27 12:33:13 2020 -0400

    Flip glarea back
    
    Textures that are backed by an fbo need to be read
    out upside down. OpenGL, you are amazing.

 gdk/gdkgltexture.c     |  8 ++++++++
 gdk/gdkgltexture.h     |  3 +++
 gsk/gl/gskglrenderer.c | 20 ++++++++++++++++----
 gtk/gtkglarea.c        |  4 ++++
 4 files changed, 31 insertions(+), 4 deletions(-)
---
diff --git a/gdk/gdkgltexture.c b/gdk/gdkgltexture.c
index 5688513528..1c1e69a9a5 100644
--- a/gdk/gdkgltexture.c
+++ b/gdk/gdkgltexture.c
@@ -30,6 +30,7 @@ struct _GdkGLTexture {
 
   GdkGLContext *context;
   guint id;
+  gboolean is_fbo;
 
   cairo_surface_t *saved;
 
@@ -196,6 +197,7 @@ gdk_gl_texture_release (GdkGLTexture *self)
 GdkTexture *
 gdk_gl_texture_new (GdkGLContext   *context,
                     guint           id,
+                    gboolean        is_fbo,
                     int             width,
                     int             height,
                     GDestroyNotify  destroy,
@@ -215,9 +217,15 @@ gdk_gl_texture_new (GdkGLContext   *context,
 
   self->context = g_object_ref (context);
   self->id = id;
+  self->is_fbo = is_fbo;
   self->destroy = destroy;
   self->data = data;
 
   return GDK_TEXTURE (self);
 }
 
+gboolean
+gdk_gl_texture_is_fbo (GdkGLTexture *texture)
+{
+  return texture->is_fbo;
+}
diff --git a/gdk/gdkgltexture.h b/gdk/gdkgltexture.h
index 54e4fee7e7..80a03e8b8a 100644
--- a/gdk/gdkgltexture.h
+++ b/gdk/gdkgltexture.h
@@ -44,6 +44,7 @@ GType                   gdk_gl_texture_get_type                (void) G_GNUC_CON
 GDK_AVAILABLE_IN_ALL
 GdkTexture *            gdk_gl_texture_new                     (GdkGLContext    *context,
                                                                 guint            id,
+                                                                gboolean         is_fbo,
                                                                 int              width,
                                                                 int              height,
                                                                 GDestroyNotify   destroy,
@@ -52,6 +53,8 @@ GdkTexture *            gdk_gl_texture_new                     (GdkGLContext
 GDK_AVAILABLE_IN_ALL
 void                    gdk_gl_texture_release                 (GdkGLTexture    *self);
 
+GDK_AVAILABLE_IN_ALL
+gboolean                gdk_gl_texture_is_fbo                  (GdkGLTexture    *self);
 
 G_END_DECLS
 
diff --git a/gsk/gl/gskglrenderer.c b/gsk/gl/gskglrenderer.c
index 1181ca0609..ef1b0dc972 100644
--- a/gsk/gl/gskglrenderer.c
+++ b/gsk/gl/gskglrenderer.c
@@ -943,10 +943,21 @@ upload_texture (GskGLRenderer *self,
                                                  GL_LINEAR,
                                                  GL_LINEAR);
 
-      out_region->x  = 0;
-      out_region->y  = 0;
-      out_region->x2 = 1;
-      out_region->y2 = 1;
+      if (GDK_IS_GL_TEXTURE (texture) &&
+          gdk_gl_texture_is_fbo (GDK_GL_TEXTURE (texture)))
+        {
+          out_region->x  = 0;
+          out_region->y  = 1;
+          out_region->x2 = 1;
+          out_region->y2 = 0;
+        }
+      else
+        {
+          out_region->x  = 0;
+          out_region->y  = 0;
+          out_region->x2 = 1;
+          out_region->y2 = 1;
+        }
     }
 }
 
@@ -4032,6 +4043,7 @@ gsk_gl_renderer_render_texture (GskRenderer           *renderer,
 
   texture = gdk_gl_texture_new (self->gl_context,
                                 texture_id,
+                                TRUE,
                                 width, height,
                                 NULL, NULL);
 
diff --git a/gtk/gtkglarea.c b/gtk/gtkglarea.c
index 4cb815e1d9..fcff175e52 100644
--- a/gtk/gtkglarea.c
+++ b/gtk/gtkglarea.c
@@ -740,10 +740,14 @@ gtk_gl_area_snapshot (GtkWidget   *widget,
 
       texture->holder = gdk_gl_texture_new (priv->context,
                                             texture->id,
+                                            TRUE,
                                             texture->width,
                                             texture->height,
                                             release_texture, texture);
 
+      /* Our texture is backed by an FBO, and those are drawn upside-down,
+       * compared to screen buffer. Yay, OpenGL
+       */
       gtk_snapshot_append_texture (snapshot,
                                    texture->holder,
                                    &GRAPHENE_RECT_INIT (0, 0,


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]