1*4882a593SmuzhiyunFrom 805d10bef24b6cf25df9034534ddca4ee409d638 Mon Sep 17 00:00:00 2001 2*4882a593SmuzhiyunFrom: Jeffy Chen <jeffy.chen@rock-chips.com> 3*4882a593SmuzhiyunDate: Tue, 8 Jun 2021 09:09:38 +0800 4*4882a593SmuzhiyunSubject: [PATCH 23/41] waylandsink: Use create_immed to create dmabuf 5*4882a593Smuzhiyun 6*4882a593SmuzhiyunThe async creation has lots of issues when the device overloaded. 7*4882a593Smuzhiyun 8*4882a593SmuzhiyunSigned-off-by: Jeffy Chen <jeffy.chen@rock-chips.com> 9*4882a593Smuzhiyun--- 10*4882a593Smuzhiyun gst-libs/gst/wayland/gstwldisplay.c | 2 +- 11*4882a593Smuzhiyun gst-libs/gst/wayland/gstwllinuxdmabuf.c | 60 ++----------------------- 12*4882a593Smuzhiyun 2 files changed, 5 insertions(+), 57 deletions(-) 13*4882a593Smuzhiyun 14*4882a593Smuzhiyundiff --git a/gst-libs/gst/wayland/gstwldisplay.c b/gst-libs/gst/wayland/gstwldisplay.c 15*4882a593Smuzhiyunindex 1f83cb2..71a5dde 100644 16*4882a593Smuzhiyun--- a/gst-libs/gst/wayland/gstwldisplay.c 17*4882a593Smuzhiyun+++ b/gst-libs/gst/wayland/gstwldisplay.c 18*4882a593Smuzhiyun@@ -277,7 +277,7 @@ registry_handle_global (void *data, struct wl_registry *registry, 19*4882a593Smuzhiyun wl_registry_bind (registry, id, &wp_viewporter_interface, 1); 20*4882a593Smuzhiyun } else if (g_strcmp0 (interface, "zwp_linux_dmabuf_v1") == 0) { 21*4882a593Smuzhiyun priv->dmabuf = 22*4882a593Smuzhiyun- wl_registry_bind (registry, id, &zwp_linux_dmabuf_v1_interface, 1); 23*4882a593Smuzhiyun+ wl_registry_bind (registry, id, &zwp_linux_dmabuf_v1_interface, 2); 24*4882a593Smuzhiyun zwp_linux_dmabuf_v1_add_listener (priv->dmabuf, &dmabuf_listener, self); 25*4882a593Smuzhiyun } 26*4882a593Smuzhiyun } 27*4882a593Smuzhiyundiff --git a/gst-libs/gst/wayland/gstwllinuxdmabuf.c b/gst-libs/gst/wayland/gstwllinuxdmabuf.c 28*4882a593Smuzhiyunindex d6ee6ec..2d5bb6b 100644 29*4882a593Smuzhiyun--- a/gst-libs/gst/wayland/gstwllinuxdmabuf.c 30*4882a593Smuzhiyun+++ b/gst-libs/gst/wayland/gstwllinuxdmabuf.c 31*4882a593Smuzhiyun@@ -46,41 +46,9 @@ gst_wl_linux_dmabuf_init_once (void) 32*4882a593Smuzhiyun 33*4882a593Smuzhiyun typedef struct 34*4882a593Smuzhiyun { 35*4882a593Smuzhiyun- GMutex lock; 36*4882a593Smuzhiyun- GCond cond; 37*4882a593Smuzhiyun struct wl_buffer *wbuf; 38*4882a593Smuzhiyun } ConstructBufferData; 39*4882a593Smuzhiyun 40*4882a593Smuzhiyun-static void 41*4882a593Smuzhiyun-create_succeeded (void *data, struct zwp_linux_buffer_params_v1 *params, 42*4882a593Smuzhiyun- struct wl_buffer *new_buffer) 43*4882a593Smuzhiyun-{ 44*4882a593Smuzhiyun- ConstructBufferData *d = data; 45*4882a593Smuzhiyun- 46*4882a593Smuzhiyun- g_mutex_lock (&d->lock); 47*4882a593Smuzhiyun- d->wbuf = new_buffer; 48*4882a593Smuzhiyun- zwp_linux_buffer_params_v1_destroy (params); 49*4882a593Smuzhiyun- g_cond_signal (&d->cond); 50*4882a593Smuzhiyun- g_mutex_unlock (&d->lock); 51*4882a593Smuzhiyun-} 52*4882a593Smuzhiyun- 53*4882a593Smuzhiyun-static void 54*4882a593Smuzhiyun-create_failed (void *data, struct zwp_linux_buffer_params_v1 *params) 55*4882a593Smuzhiyun-{ 56*4882a593Smuzhiyun- ConstructBufferData *d = data; 57*4882a593Smuzhiyun- 58*4882a593Smuzhiyun- g_mutex_lock (&d->lock); 59*4882a593Smuzhiyun- d->wbuf = NULL; 60*4882a593Smuzhiyun- zwp_linux_buffer_params_v1_destroy (params); 61*4882a593Smuzhiyun- g_cond_signal (&d->cond); 62*4882a593Smuzhiyun- g_mutex_unlock (&d->lock); 63*4882a593Smuzhiyun-} 64*4882a593Smuzhiyun- 65*4882a593Smuzhiyun-static const struct zwp_linux_buffer_params_v1_listener params_listener = { 66*4882a593Smuzhiyun- create_succeeded, 67*4882a593Smuzhiyun- create_failed 68*4882a593Smuzhiyun-}; 69*4882a593Smuzhiyun- 70*4882a593Smuzhiyun struct wl_buffer * 71*4882a593Smuzhiyun gst_wl_linux_dmabuf_construct_wl_buffer (GstBuffer * buf, 72*4882a593Smuzhiyun GstWlDisplay * display, const GstVideoInfo * info) 73*4882a593Smuzhiyun@@ -90,7 +58,6 @@ gst_wl_linux_dmabuf_construct_wl_buffer (GstBuffer * buf, 74*4882a593Smuzhiyun guint i, width, height; 75*4882a593Smuzhiyun guint nplanes, flags = 0; 76*4882a593Smuzhiyun struct zwp_linux_buffer_params_v1 *params; 77*4882a593Smuzhiyun- gint64 timeout; 78*4882a593Smuzhiyun ConstructBufferData data; 79*4882a593Smuzhiyun 80*4882a593Smuzhiyun g_return_val_if_fail (gst_wl_display_check_format_for_dmabuf (display, 81*4882a593Smuzhiyun@@ -99,10 +66,6 @@ gst_wl_linux_dmabuf_construct_wl_buffer (GstBuffer * buf, 82*4882a593Smuzhiyun mem = gst_buffer_peek_memory (buf, 0); 83*4882a593Smuzhiyun format = gst_video_format_to_wl_dmabuf_format (GST_VIDEO_INFO_FORMAT (info)); 84*4882a593Smuzhiyun 85*4882a593Smuzhiyun- g_cond_init (&data.cond); 86*4882a593Smuzhiyun- g_mutex_init (&data.lock); 87*4882a593Smuzhiyun- g_mutex_lock (&data.lock); 88*4882a593Smuzhiyun- 89*4882a593Smuzhiyun width = GST_VIDEO_INFO_WIDTH (info); 90*4882a593Smuzhiyun height = GST_VIDEO_INFO_HEIGHT (info); 91*4882a593Smuzhiyun nplanes = GST_VIDEO_INFO_N_PLANES (info); 92*4882a593Smuzhiyun@@ -145,21 +108,10 @@ gst_wl_linux_dmabuf_construct_wl_buffer (GstBuffer * buf, 93*4882a593Smuzhiyun } 94*4882a593Smuzhiyun } 95*4882a593Smuzhiyun 96*4882a593Smuzhiyun- /* Request buffer creation */ 97*4882a593Smuzhiyun- zwp_linux_buffer_params_v1_add_listener (params, ¶ms_listener, &data); 98*4882a593Smuzhiyun- zwp_linux_buffer_params_v1_create (params, width, height, format, flags); 99*4882a593Smuzhiyun- 100*4882a593Smuzhiyun- /* Wait for the request answer */ 101*4882a593Smuzhiyun- wl_display_flush (gst_wl_display_get_display (display)); 102*4882a593Smuzhiyun- data.wbuf = (gpointer) 0x1; 103*4882a593Smuzhiyun- timeout = g_get_monotonic_time () + G_TIME_SPAN_SECOND; 104*4882a593Smuzhiyun- while (data.wbuf == (gpointer) 0x1) { 105*4882a593Smuzhiyun- if (!g_cond_wait_until (&data.cond, &data.lock, timeout)) { 106*4882a593Smuzhiyun- GST_ERROR_OBJECT (mem->allocator, "zwp_linux_buffer_params_v1 time out"); 107*4882a593Smuzhiyun- zwp_linux_buffer_params_v1_destroy (params); 108*4882a593Smuzhiyun- data.wbuf = NULL; 109*4882a593Smuzhiyun- } 110*4882a593Smuzhiyun- } 111*4882a593Smuzhiyun+ data.wbuf = 112*4882a593Smuzhiyun+ zwp_linux_buffer_params_v1_create_immed (params, width, height, format, 113*4882a593Smuzhiyun+ flags); 114*4882a593Smuzhiyun+ zwp_linux_buffer_params_v1_destroy (params); 115*4882a593Smuzhiyun 116*4882a593Smuzhiyun out: 117*4882a593Smuzhiyun if (!data.wbuf) { 118*4882a593Smuzhiyun@@ -170,9 +122,5 @@ out: 119*4882a593Smuzhiyun data.wbuf, width, height, (char *) &format, nplanes); 120*4882a593Smuzhiyun } 121*4882a593Smuzhiyun 122*4882a593Smuzhiyun- g_mutex_unlock (&data.lock); 123*4882a593Smuzhiyun- g_mutex_clear (&data.lock); 124*4882a593Smuzhiyun- g_cond_clear (&data.cond); 125*4882a593Smuzhiyun- 126*4882a593Smuzhiyun return data.wbuf; 127*4882a593Smuzhiyun } 128*4882a593Smuzhiyun-- 129*4882a593Smuzhiyun2.20.1 130*4882a593Smuzhiyun 131