From 612b5416af9dfea25d0593cee242ea84ed47d244 Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Thu, 19 Oct 2023 18:53:27 +0200 Subject: [PATCH 1/2] dmabuf: Init the dmabuf subsystem before creating texture We did not do that, so when the dmabuf building looked at the list of downloaders, it was empty and the result was an error. That's not good. --- gdk/gdkdisplay.c | 14 +++++++------- gdk/gdkdisplayprivate.h | 2 ++ gdk/gdkdmabuftexture.c | 2 ++ 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/gdk/gdkdisplay.c b/gdk/gdkdisplay.c index a601bd4c37..1bfc2d2a8a 100644 --- a/gdk/gdkdisplay.c +++ b/gdk/gdkdisplay.c @@ -1866,12 +1866,12 @@ gdk_display_add_dmabuf_downloader (GdkDisplay *display, * using the relevant EGL extensions, and download it into a memory * texture, possibly doing format conversion with shaders (in GSK). */ -static void -init_dmabuf_formats (GdkDisplay *display) +void +gdk_display_init_dmabuf (GdkDisplay *self) { GdkDmabufFormatsBuilder *builder; - if (display->dmabuf_formats != NULL) + if (self->dmabuf_formats != NULL) return; builder = gdk_dmabuf_formats_builder_new (); @@ -1879,13 +1879,13 @@ init_dmabuf_formats (GdkDisplay *display) #ifdef HAVE_LINUX_DMA_BUF_H if (!GDK_DEBUG_CHECK (DMABUF_DISABLE)) { - gdk_display_prepare_gl (display, NULL); + gdk_display_prepare_gl (self, NULL); - gdk_display_add_dmabuf_downloader (display, gdk_dmabuf_get_direct_downloader (), builder); + gdk_display_add_dmabuf_downloader (self, gdk_dmabuf_get_direct_downloader (), builder); } #endif - display->dmabuf_formats = gdk_dmabuf_formats_builder_free_to_formats (builder); + self->dmabuf_formats = gdk_dmabuf_formats_builder_free_to_formats (builder); } /** @@ -1904,7 +1904,7 @@ init_dmabuf_formats (GdkDisplay *display) GdkDmabufFormats * gdk_display_get_dmabuf_formats (GdkDisplay *display) { - init_dmabuf_formats (display); + gdk_display_init_dmabuf (display); return display->dmabuf_formats; } diff --git a/gdk/gdkdisplayprivate.h b/gdk/gdkdisplayprivate.h index d581c58425..e1e871a3fb 100644 --- a/gdk/gdkdisplayprivate.h +++ b/gdk/gdkdisplayprivate.h @@ -211,6 +211,8 @@ gulong _gdk_display_get_next_serial (GdkDisplay *display void _gdk_display_pause_events (GdkDisplay *display); void _gdk_display_unpause_events (GdkDisplay *display); +void gdk_display_init_dmabuf (GdkDisplay *self); + GdkVulkanContext * gdk_display_create_vulkan_context (GdkDisplay *self, GError **error); diff --git a/gdk/gdkdmabuftexture.c b/gdk/gdkdmabuftexture.c index 82fae1cc01..74db20c36a 100644 --- a/gdk/gdkdmabuftexture.c +++ b/gdk/gdkdmabuftexture.c @@ -140,6 +140,8 @@ gdk_dmabuf_texture_new_from_builder (GdkDmabufTextureBuilder *builder, display = gdk_dmabuf_texture_builder_get_display (builder); dmabuf = gdk_dmabuf_texture_builder_get_dmabuf (builder); + gdk_display_init_dmabuf (display); + for (i = 0; display->dmabuf_downloaders[i] != NULL; i++) { if (local_error && g_error_matches (local_error, GDK_DMABUF_ERROR, GDK_DMABUF_ERROR_UNSUPPORTED_FORMAT)) From 194db51fba54cb4b71cb9af9c768493a650342ec Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Thu, 19 Oct 2023 19:09:17 +0200 Subject: [PATCH 2/2] dmabuf: Make Builder::display non-nullable We always have a display - the default display - so there's no need to accept NULL. Plus, we need a display when building the texture, so accepthing NULL wouldn't even make sense. Includes update to defaultvalue test. --- gdk/gdkdmabuftexturebuilder.c | 5 ++++- testsuite/gtk/defaultvalue.c | 4 ++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/gdk/gdkdmabuftexturebuilder.c b/gdk/gdkdmabuftexturebuilder.c index 421adc7741..1a143f5d49 100644 --- a/gdk/gdkdmabuftexturebuilder.c +++ b/gdk/gdkdmabuftexturebuilder.c @@ -365,6 +365,8 @@ static void gdk_dmabuf_texture_builder_init (GdkDmabufTextureBuilder *self) { self->premultiplied = TRUE; + self->display = gdk_display_get_default (); + for (int i = 0; i < GDK_DMABUF_MAX_PLANES; i++) self->dmabuf.planes[i].fd = -1; } @@ -391,7 +393,7 @@ gdk_dmabuf_texture_builder_new (void) * Returns the display that this texture builder is * associated with. * - * Returns: (transfer none) (nullable): the display + * Returns: (transfer none): the display * * Since: 4.14 */ @@ -421,6 +423,7 @@ gdk_dmabuf_texture_builder_set_display (GdkDmabufTextureBuilder *self, GdkDisplay *display) { g_return_if_fail (GDK_IS_DMABUF_TEXTURE_BUILDER (self)); + g_return_if_fail (GDK_IS_DISPLAY (display)); if (g_set_object (&self->display, display)) g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_DISPLAY]); diff --git a/testsuite/gtk/defaultvalue.c b/testsuite/gtk/defaultvalue.c index 16634e47e0..a40620e23f 100644 --- a/testsuite/gtk/defaultvalue.c +++ b/testsuite/gtk/defaultvalue.c @@ -182,6 +182,10 @@ test_type (gconstpointer data) strcmp (pspec->name, "storable-formats") == 0) check = FALSE; + if (g_type_is_a (type, GDK_TYPE_DMABUF_TEXTURE_BUILDER) && + strcmp (pspec->name, "display") == 0) + check = FALSE; + /* set in the constructor */ if (g_type_is_a (type, GSK_TYPE_GL_SHADER) && strcmp (pspec->name, "source") == 0)