[gtk+/wip/otte/vulkan: 26/59] gskrenderer: Store the GL context



commit c0d903b0d3d256a9e8ea6cb3cfba072474c872d4
Author: Benjamin Otte <otte redhat com>
Date:   Wed Nov 23 06:54:03 2016 +0100

    gskrenderer: Store the GL context
    
    And use it to create the drawing context with it.
    
    Note that this doesn't yet have any effect and is all infrastructure
    preparation work.

 docs/reference/gsk/gsk4-sections.txt |    1 +
 gsk/gskglrenderer.c                  |    4 ++++
 gsk/gskrenderer.c                    |   33 ++++++++++++++++++++++++++++++++-
 gsk/gskrenderer.h                    |    2 ++
 gsk/gskrendererprivate.h             |    2 ++
 gtk/gtkwidget.c                      |   22 +++++++++++++---------
 6 files changed, 54 insertions(+), 10 deletions(-)
---
diff --git a/docs/reference/gsk/gsk4-sections.txt b/docs/reference/gsk/gsk4-sections.txt
index bc757b5..ec761a2 100644
--- a/docs/reference/gsk/gsk4-sections.txt
+++ b/docs/reference/gsk/gsk4-sections.txt
@@ -10,6 +10,7 @@ gsk_renderer_get_display
 gsk_renderer_realize
 gsk_renderer_unrealize
 gsk_renderer_create_render_node
+gsk_renderer_get_gl_context
 gsk_renderer_render
 <SUBSECTION Standard>
 GSK_IS_RENDERER
diff --git a/gsk/gskglrenderer.c b/gsk/gskglrenderer.c
index 853f690..bb1f52b 100644
--- a/gsk/gskglrenderer.c
+++ b/gsk/gskglrenderer.c
@@ -310,6 +310,8 @@ gsk_gl_renderer_realize (GskRenderer  *renderer,
   if (!gsk_gl_renderer_create_programs (self, error))
     return FALSE;
 
+  gsk_renderer_set_gl_context (renderer, self->gl_context);
+
   return TRUE;
 }
 
@@ -336,6 +338,8 @@ gsk_gl_renderer_unrealize (GskRenderer *renderer)
 
   if (self->gl_context == gdk_gl_context_get_current ())
     gdk_gl_context_clear_current ();
+
+  gsk_renderer_set_gl_context (renderer, NULL);
 }
 
 static void
diff --git a/gsk/gskrenderer.c b/gsk/gskrenderer.c
index 86e262c..173756f 100644
--- a/gsk/gskrenderer.c
+++ b/gsk/gskrenderer.c
@@ -67,6 +67,7 @@ typedef struct
   GskScalingFilter mag_filter;
 
   GdkWindow *window;
+  GdkGLContext *gl_context;
   GdkDrawingContext *drawing_context;
   GskRenderNode *root_node;
   GdkDisplay *display;
@@ -580,6 +581,8 @@ gsk_renderer_unrealize (GskRenderer *renderer)
 
   GSK_RENDERER_GET_CLASS (renderer)->unrealize (renderer);
 
+  g_warn_if_fail (priv->gl_context == NULL);
+
   priv->is_realized = FALSE;
 }
 
@@ -587,7 +590,9 @@ gsk_renderer_unrealize (GskRenderer *renderer)
  * gsk_renderer_render:
  * @renderer: a #GskRenderer
  * @root: a #GskRenderNode
- * @context: a #GdkDrawingContext
+ * @context: a #GdkDrawingContext using the context returned by
+ *     gsk_renderer_get_gl_context() or %NULL if the renderer was created
+ *     via gsk_renderer_create_fallback().
  *
  * Renders the scene graph, described by a tree of #GskRenderNode instances,
  * using the given #GdkDrawingContext.
@@ -821,6 +826,32 @@ gsk_renderer_get_cairo_context (GskRenderer *renderer)
   return priv->cairo_context;
 }
 
+void
+gsk_renderer_set_gl_context (GskRenderer  *renderer,
+                             GdkGLContext *context)
+{
+  GskRendererPrivate *priv = gsk_renderer_get_instance_private (renderer);
+
+  g_set_object (&priv->gl_context, context);
+}
+
+/**
+ * gsk_renderer_get_gl_context:
+ * @renderer: a #GskRenderer
+ *
+ * Returns the GL context used by @renderer. The only use for using this
+ * function is to pass the result to gdk_window_begin_draw_frame().
+ *
+ * Returns: The GL context to use for creating drawing contexts
+ **/
+GdkGLContext *
+gsk_renderer_get_gl_context (GskRenderer *renderer)
+{
+  GskRendererPrivate *priv = gsk_renderer_get_instance_private (renderer);
+
+  return priv->gl_context;
+}
+
 /**
  * gsk_renderer_create_fallback:
  * @renderer: a #GskRenderer
diff --git a/gsk/gskrenderer.h b/gsk/gskrenderer.h
index 722259f..507beb3 100644
--- a/gsk/gskrenderer.h
+++ b/gsk/gskrenderer.h
@@ -77,6 +77,8 @@ GskRenderer *           gsk_renderer_create_fallback            (GskRenderer
                                                                  cairo_t                 *cr);
 
 GDK_AVAILABLE_IN_3_90
+GdkGLContext *          gsk_renderer_get_gl_context             (GskRenderer             *renderer);
+GDK_AVAILABLE_IN_3_90
 void                    gsk_renderer_render                     (GskRenderer             *renderer,
                                                                  GskRenderNode           *root,
                                                                  GdkDrawingContext       *context);
diff --git a/gsk/gskrendererprivate.h b/gsk/gskrendererprivate.h
index eae8412..8671160 100644
--- a/gsk/gskrendererprivate.h
+++ b/gsk/gskrendererprivate.h
@@ -53,6 +53,8 @@ struct _GskRendererClass
 
 gboolean gsk_renderer_is_realized (GskRenderer *renderer);
 
+void                    gsk_renderer_set_gl_context             (GskRenderer    *renderer,
+                                                                 GdkGLContext   *context);
 GskRenderNode *         gsk_renderer_get_root_node              (GskRenderer    *renderer);
 GdkDrawingContext *     gsk_renderer_get_drawing_context        (GskRenderer    *renderer);
 cairo_t *               gsk_renderer_get_cairo_context          (GskRenderer    *renderer);
diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c
index 641726d..d9eab4e 100644
--- a/gtk/gtkwidget.c
+++ b/gtk/gtkwidget.c
@@ -15686,18 +15686,22 @@ gtk_widget_render (GtkWidget            *widget,
   if (renderer == NULL)
     return;
 
-  gtk_snapshot_init (&snapshot, renderer, region);
+  context = gdk_window_begin_draw_frame (window,
+                                         gsk_renderer_get_gl_context (renderer),
+                                         region);
+
+  gtk_snapshot_init (&snapshot,
+                     renderer,
+                     gdk_drawing_context_get_clip (context));
   gtk_widget_snapshot (widget, &snapshot);
   root = gtk_snapshot_finish (&snapshot);
-  if (root == NULL)
-    return;
-
-  gtk_inspector_record_render (widget, renderer, window, region, root);
-
-  context = gdk_window_begin_draw_frame (window, NULL, region);
+  if (root != NULL)
+    {
+      gtk_inspector_record_render (widget, renderer, window, region, root);
 
-  gsk_renderer_render (renderer, root, context);
-  gsk_render_node_unref (root);
+      gsk_renderer_render (renderer, root, context);
+      gsk_render_node_unref (root);
+    }
 
   gdk_window_end_draw_frame (window, context);
 }


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