summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenjamin Otte <otte@redhat.com>2016-11-23 06:54:03 +0100
committerBenjamin Otte <otte@redhat.com>2016-12-05 15:02:47 +0100
commite42e27304a9e2d43db1f467a3cce10ab2ef20460 (patch)
treef8706b6c4f58286c5efa100638ae3801d663233f
parent332ed7be5b9a973e58711cb63f80265ad17b95a6 (diff)
downloadgtk+-e42e27304a9e2d43db1f467a3cce10ab2ef20460.tar.gz
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.
-rw-r--r--docs/reference/gsk/gsk4-sections.txt1
-rw-r--r--gsk/gskglrenderer.c4
-rw-r--r--gsk/gskrenderer.c33
-rw-r--r--gsk/gskrenderer.h2
-rw-r--r--gsk/gskrendererprivate.h2
-rw-r--r--gtk/gtkwidget.c22
6 files changed, 54 insertions, 10 deletions
diff --git a/docs/reference/gsk/gsk4-sections.txt b/docs/reference/gsk/gsk4-sections.txt
index bc757b568e..ec761a280e 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 853f690149..bb1f52bea4 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 86e262ca3d..173756ff6d 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 722259f4b9..507beb3049 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 eae8412445..8671160992 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 641726dcb6..d9eab4ead1 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);
}