From df09975753130f9590fc40a4b9aaa031f79fd5c6 Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Sun, 7 Jan 2024 10:00:04 +0100 Subject: [PATCH] renderer: Pass the display as part of the vfunc We allow realizing renderers without surfaces. But they still need a display, so pass it explicitly. --- gsk/broadway/gskbroadwayrenderer.c | 1 + gsk/gl/gskglrenderer.c | 12 ++------ gsk/gpu/gskgpurenderer.c | 7 +---- gsk/gskcairorenderer.c | 1 + gsk/gskrenderer.c | 48 +++++++++++++++++++++++++----- gsk/gskrendererprivate.h | 1 + 6 files changed, 47 insertions(+), 23 deletions(-) diff --git a/gsk/broadway/gskbroadwayrenderer.c b/gsk/broadway/gskbroadwayrenderer.c index c89f471b02..cd960b8dda 100644 --- a/gsk/broadway/gskbroadwayrenderer.c +++ b/gsk/broadway/gskbroadwayrenderer.c @@ -35,6 +35,7 @@ G_DEFINE_TYPE (GskBroadwayRenderer, gsk_broadway_renderer, GSK_TYPE_RENDERER) static gboolean gsk_broadway_renderer_realize (GskRenderer *renderer, + GdkDisplay *display, GdkSurface *surface, GError **error) { diff --git a/gsk/gl/gskglrenderer.c b/gsk/gl/gskglrenderer.c index 0942e2767d..51d7eb7830 100644 --- a/gsk/gl/gskglrenderer.c +++ b/gsk/gl/gskglrenderer.c @@ -162,6 +162,7 @@ gsk_gl_renderer_new (void) static gboolean gsk_gl_renderer_realize (GskRenderer *renderer, + GdkDisplay *display, GdkSurface *surface, GError **error) { @@ -169,7 +170,6 @@ gsk_gl_renderer_realize (GskRenderer *renderer, GskGLRenderer *self = (GskGLRenderer *)renderer; GdkGLContext *context = NULL; GskGLDriver *driver = NULL; - GdkDisplay *display; gboolean ret = FALSE; gboolean debug_shaders = FALSE; GdkGLAPI api; @@ -182,15 +182,9 @@ gsk_gl_renderer_realize (GskRenderer *renderer, g_assert (self->command_queue == NULL); if (surface == NULL) - { - display = gdk_display_get_default (); /* FIXME: allow different displays somehow ? */ - context = gdk_display_create_gl_context (display, error); - } + context = gdk_display_create_gl_context (display, error); else - { - display = gdk_surface_get_display (surface); - context = gdk_surface_create_gl_context (surface, error); - } + context = gdk_surface_create_gl_context (surface, error); if (!context || !gdk_gl_context_realize (context, error)) goto failure; diff --git a/gsk/gpu/gskgpurenderer.c b/gsk/gpu/gskgpurenderer.c index fb87d5359d..00d50099e7 100644 --- a/gsk/gpu/gskgpurenderer.c +++ b/gsk/gpu/gskgpurenderer.c @@ -188,18 +188,13 @@ gsk_gpu_renderer_get_frame (GskGpuRenderer *self) static gboolean gsk_gpu_renderer_realize (GskRenderer *renderer, + GdkDisplay *display, GdkSurface *surface, GError **error) { GskGpuRenderer *self = GSK_GPU_RENDERER (renderer); GskGpuRendererPrivate *priv = gsk_gpu_renderer_get_instance_private (self); GskGpuOptimizations context_optimizations; - GdkDisplay *display; - - if (surface) - display = gdk_surface_get_display (surface); - else - display = gdk_display_get_default (); priv->device = GSK_GPU_RENDERER_GET_CLASS (self)->get_device (display, error); if (priv->device == NULL) diff --git a/gsk/gskcairorenderer.c b/gsk/gskcairorenderer.c index 71725f4b2f..7ba3434ecd 100644 --- a/gsk/gskcairorenderer.c +++ b/gsk/gskcairorenderer.c @@ -50,6 +50,7 @@ G_DEFINE_TYPE (GskCairoRenderer, gsk_cairo_renderer, GSK_TYPE_RENDERER) static gboolean gsk_cairo_renderer_realize (GskRenderer *renderer, + GdkDisplay *display, GdkSurface *surface, GError **error) { diff --git a/gsk/gskrenderer.c b/gsk/gskrenderer.c index 7d9d8bdd76..0e52c67000 100644 --- a/gsk/gskrenderer.c +++ b/gsk/gskrenderer.c @@ -102,6 +102,7 @@ static GParamSpec *gsk_renderer_properties[N_PROPS]; static gboolean gsk_renderer_real_realize (GskRenderer *self, + GdkDisplay *display, GdkSurface *surface, GError **error) { @@ -255,6 +256,32 @@ gsk_renderer_is_realized (GskRenderer *renderer) return priv->is_realized; } +static gboolean +gsk_renderer_do_realize (GskRenderer *renderer, + GdkDisplay *display, + GdkSurface *surface, + GError **error) +{ + GskRendererPrivate *priv = gsk_renderer_get_instance_private (renderer); + + if (surface) + priv->surface = g_object_ref (surface); + + if (!GSK_RENDERER_GET_CLASS (renderer)->realize (renderer, display, surface, error)) + { + g_clear_object (&priv->surface); + return FALSE; + } + + priv->is_realized = TRUE; + + g_object_notify (G_OBJECT (renderer), "realized"); + if (surface) + g_object_notify (G_OBJECT (renderer), "surface"); + + return TRUE; +} + /** * gsk_renderer_realize: * @renderer: a `GskRenderer` @@ -277,21 +304,26 @@ gsk_renderer_realize (GskRenderer *renderer, GdkSurface *surface, GError **error) { - GskRendererPrivate *priv = gsk_renderer_get_instance_private (renderer); - g_return_val_if_fail (GSK_IS_RENDERER (renderer), FALSE); g_return_val_if_fail (!gsk_renderer_is_realized (renderer), FALSE); g_return_val_if_fail (surface == NULL || GDK_IS_SURFACE (surface), FALSE); g_return_val_if_fail (error == NULL || *error == NULL, FALSE); - if (surface) - priv->surface = g_object_ref (surface); - - if (!GSK_RENDERER_GET_CLASS (renderer)->realize (renderer, surface, error)) + if (surface == NULL) { - g_clear_object (&priv->surface); - return FALSE; + return gsk_renderer_do_realize (renderer, + gdk_display_get_default (), + NULL, + error); } + else + { + return gsk_renderer_do_realize (renderer, + gdk_surface_get_display (surface), + surface, + error); + } +} priv->is_realized = TRUE; diff --git a/gsk/gskrendererprivate.h b/gsk/gskrendererprivate.h index 2d020be493..cf08049818 100644 --- a/gsk/gskrendererprivate.h +++ b/gsk/gskrendererprivate.h @@ -41,6 +41,7 @@ struct _GskRendererClass gboolean supports_offload; gboolean (* realize) (GskRenderer *renderer, + GdkDisplay *display, GdkSurface *surface, GError **error); void (* unrealize) (GskRenderer *renderer);