[gtk+/wip/gl-texture] Recreate the GdkTexture every time



commit d74bc7a2b17281840de798c7b8e88f4f2a415cab
Author: Matthias Clasen <mclasen redhat com>
Date:   Wed Jan 17 09:41:16 2018 -0500

    Recreate the GdkTexture every time
    
    GdkTexture objects are immutable - the bits they refer to
    must not change. So we need to create a new one every time
    we change the content of the GL texture.

 gtk/gtkglarea.c |   17 ++++++++++-------
 1 files changed, 10 insertions(+), 7 deletions(-)
---
diff --git a/gtk/gtkglarea.c b/gtk/gtkglarea.c
index 57782a4..d086afb 100644
--- a/gtk/gtkglarea.c
+++ b/gtk/gtkglarea.c
@@ -145,7 +145,6 @@
 typedef struct {
   GdkGLContext *context;
   GError *error;
-  GdkTexture *gdk_texture;
 
   gboolean have_buffers;
 
@@ -371,10 +370,6 @@ gtk_gl_area_ensure_buffers (GtkGLArea *area)
   if (priv->texture == 0)
     {
       glGenTextures (1, &priv->texture);
-      priv->gdk_texture = gdk_texture_new_for_gl (priv->context,
-                                                  priv->texture,
-                                                  gtk_widget_get_width (widget),
-                                                  gtk_widget_get_height (widget));
     }
 
   if ((priv->has_depth_buffer || priv->has_stencil_buffer))
@@ -495,7 +490,6 @@ gtk_gl_area_delete_buffers (GtkGLArea *area)
 
   if (priv->texture != 0)
     {
-      g_clear_object (&priv->gdk_texture);
       glDeleteTextures(1, &priv->texture);
       priv->texture = 0;
     }
@@ -616,6 +610,8 @@ gtk_gl_area_snapshot (GtkWidget   *widget,
   status = glCheckFramebufferStatusEXT (GL_FRAMEBUFFER_EXT);
   if (status == GL_FRAMEBUFFER_COMPLETE_EXT)
     {
+      GdkTexture *texture;
+
       if (priv->needs_render || priv->auto_render)
         {
           if (priv->needs_resize)
@@ -629,12 +625,19 @@ gtk_gl_area_snapshot (GtkWidget   *widget,
 
       priv->needs_render = FALSE;
 
+      texture = gdk_texture_new_for_gl (priv->context,
+                                        priv->texture,
+                                        gtk_widget_get_width (widget),
+                                        gtk_widget_get_height (widget));
+
       gtk_snapshot_append_texture (snapshot,
-                                   priv->gdk_texture,
+                                   texture,
                                    &GRAPHENE_RECT_INIT (0, 0,
                                                         gtk_widget_get_width (widget),
                                                         gtk_widget_get_height (widget)),
                                    "GL Area");
+
+      g_object_unref (texture);
     }
   else
     {


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