diff options
-rw-r--r-- | docs/reference/gsk/gsk4-sections.txt | 1 | ||||
-rw-r--r-- | gsk/gskglrenderer.c | 4 | ||||
-rw-r--r-- | gsk/gskrenderer.c | 33 | ||||
-rw-r--r-- | gsk/gskrenderer.h | 2 | ||||
-rw-r--r-- | gsk/gskrendererprivate.h | 2 | ||||
-rw-r--r-- | 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 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); } |