[gtk/flip-glarea: 2/2] Flip glarea back
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/flip-glarea: 2/2] Flip glarea back
- Date: Mon, 28 Sep 2020 03:14:08 +0000 (UTC)
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]