gl/gbm: ensure we call the resize callback before attempting to draw
authorMatthew Waters <matthew@centricular.com>
Sun, 3 Nov 2019 13:38:18 +0000 (00:38 +1100)
committerTim-Philipp Müller <tim@centricular.com>
Tue, 5 Nov 2019 16:27:21 +0000 (16:27 +0000)
Without this, sinks will not be notified about size changes or even the
initial size and would render at 0x0.

ext/gl/gstglimagesink.c
gst-libs/gst/gl/gbm/gstglwindow_gbm_egl.c

index 15074f8..bd2bb8c 100644 (file)
@@ -2244,9 +2244,13 @@ gst_glimage_sink_on_draw (GstGLImageSink * gl_sink)
   gst_gl_context_clear_shader (gl_sink->context);
   gl->BindTexture (gl_target, 0);
 
-  if (!gst_gl_window_controls_viewport (window))
+  if (!gst_gl_window_controls_viewport (window)) {
     gl->Viewport (gl_sink->display_rect.x, gl_sink->display_rect.y,
         gl_sink->display_rect.w, gl_sink->display_rect.h);
+    GST_DEBUG_OBJECT (gl_sink, "GL output area now %u,%u %ux%u",
+        gl_sink->display_rect.x, gl_sink->display_rect.y,
+        gl_sink->display_rect.w, gl_sink->display_rect.h);
+  }
 
   sample = gst_sample_new (gl_sink->stored_buffer[0],
       gl_sink->out_caps, &GST_BASE_SINK (gl_sink)->segment, NULL);
index 6f4a844..7067b20 100644 (file)
@@ -51,7 +51,6 @@ static void gst_gl_window_gbm_egl_draw (GstGLWindow * window);
 
 static gboolean gst_gl_window_gbm_init_surface (GstGLWindowGBMEGL * window_egl);
 
-
 static void
 gst_gl_window_gbm_egl_class_init (GstGLWindowGBMEGLClass * klass)
 {
@@ -239,6 +238,13 @@ draw_cb (gpointer data)
     }
   }
 
+  if (window->queue_resize) {
+    guint width, height;
+
+    gst_gl_window_get_surface_dimensions (window, &width, &height);
+    gst_gl_window_resize (window, width, height);
+  }
+
   /* Do the actual drawing */
   if (window->draw)
     window->draw (window->draw_data);
@@ -361,8 +367,10 @@ gst_gl_window_gbm_init_surface (GstGLWindowGBMEGL * window_egl)
       GBM_BO_USE_SCANOUT | GBM_BO_USE_RENDERING);
 
   gst_gl_window_resize (window, hdisplay, vdisplay);
+  gst_gl_window_queue_resize (window);
 
-  GST_DEBUG ("Successfully created GBM surface");
+  GST_DEBUG ("Successfully created GBM surface %ix%i from info %p", hdisplay,
+      vdisplay, drm_mode_info);
 
 cleanup:
 
@@ -370,7 +378,6 @@ cleanup:
   return ret;
 }
 
-
 /* Must be called in the gl thread */
 GstGLWindowGBMEGL *
 gst_gl_window_gbm_egl_new (GstGLDisplay * display)