diff options
author | Matthias Clasen <mclasen@redhat.com> | 2020-09-27 12:33:13 -0400 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2020-09-27 23:12:02 -0400 |
commit | 24f8f64154d818566cda6ce18efe8824b9e9cc2e (patch) | |
tree | 3d369962d2a047fbeab54ee15c3724b7ec3829dd | |
parent | 15b635d7bd9ca9c9b319119cbe0cdea4d0cdb8fe (diff) | |
download | gtk+-flip-glarea.tar.gz |
Flip glarea backflip-glarea
Textures that are backed by an fbo need to be read
out upside down. OpenGL, you are amazing.
-rw-r--r-- | gdk/gdkgltexture.c | 8 | ||||
-rw-r--r-- | gdk/gdkgltexture.h | 3 | ||||
-rw-r--r-- | gsk/gl/gskglrenderer.c | 20 | ||||
-rw-r--r-- | 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, |