From 2a9056b49e5fbc971b74081118e4e0c5eaeddd23 Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Fri, 19 Jul 2024 21:33:53 +0200 Subject: [PATCH 1/2] ngl: Fix crash at startup Commit 15804906701194bb70371722c561bc2a9aac8b26 included a reordering of acquiring the frame before making the context current. Sometimes (like at startup) new frames need to be created. Setting up a new frame assumed the GL context was current. Change it so that we delay the one GL setup we do in frames until later. --- gsk/gpu/gskglframe.c | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/gsk/gpu/gskglframe.c b/gsk/gpu/gskglframe.c index eb4d2ca386..c69cbee08f 100644 --- a/gsk/gpu/gskglframe.c +++ b/gsk/gpu/gskglframe.c @@ -54,14 +54,6 @@ gsk_gl_frame_wait (GskGpuFrame *frame) glClientWaitSync (self->sync, 0, G_MAXINT64); } -static void -gsk_gl_frame_setup (GskGpuFrame *frame) -{ - GskGLFrame *self = GSK_GL_FRAME (frame); - - glGenBuffers (1, &self->globals_buffer_id); -} - static void gsk_gl_frame_cleanup (GskGpuFrame *frame) { @@ -207,7 +199,8 @@ gsk_gl_frame_finalize (GObject *object) GskGLFrame *self = GSK_GL_FRAME (object); g_hash_table_unref (self->vaos); - glDeleteBuffers (1, &self->globals_buffer_id); + if (self->globals_buffer_id != 0) + glDeleteBuffers (1, &self->globals_buffer_id); G_OBJECT_CLASS (gsk_gl_frame_parent_class)->finalize (object); } @@ -220,7 +213,6 @@ gsk_gl_frame_class_init (GskGLFrameClass *klass) gpu_frame_class->is_busy = gsk_gl_frame_is_busy; gpu_frame_class->wait = gsk_gl_frame_wait; - gpu_frame_class->setup = gsk_gl_frame_setup; gpu_frame_class->cleanup = gsk_gl_frame_cleanup; gpu_frame_class->upload_texture = gsk_gl_frame_upload_texture; gpu_frame_class->create_descriptors = gsk_gl_frame_create_descriptors; @@ -276,6 +268,9 @@ gsk_gl_frame_use_program (GskGLFrame *self, void gsk_gl_frame_bind_globals (GskGLFrame *self) { + if (self->globals_buffer_id == 0) + glGenBuffers (1, &self->globals_buffer_id); + glBindBufferBase (GL_UNIFORM_BUFFER, 0, self->globals_buffer_id); } From 25268c2086c426215ac6c76aa1431e4f2fda0722 Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Thu, 18 Jul 2024 13:31:10 +0200 Subject: [PATCH 2/2] gstsink: Don't use g_autoptr --- modules/media/gtkgstsink.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/media/gtkgstsink.c b/modules/media/gtkgstsink.c index 37f2139b16..b654a90b83 100644 --- a/modules/media/gtkgstsink.c +++ b/modules/media/gtkgstsink.c @@ -379,7 +379,7 @@ gtk_gst_sink_texture_from_buffer (GtkGstSink *self, #ifdef HAVE_GSTREAMER_DRM if (gst_is_dmabuf_memory (gst_buffer_peek_memory (buffer, 0))) { - g_autoptr (GdkDmabufTextureBuilder) builder = NULL; + GdkDmabufTextureBuilder *builder = NULL; const GstVideoMeta *vmeta = gst_buffer_get_video_meta (buffer); GError *error = NULL; int i; @@ -427,6 +427,7 @@ gtk_gst_sink_texture_from_buffer (GtkGstSink *self, (GDestroyNotify) gst_buffer_unref, gst_buffer_ref (buffer), &error); + g_object_unref (builder); if (!texture) GST_ERROR_OBJECT (self, "Failed to create dmabuf texture: %s", error->message);