derekf pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=517f929aa5b9df398359d3b4861d108795535287

commit 517f929aa5b9df398359d3b4861d108795535287
Author: Derek Foreman <[email protected]>
Date:   Tue Nov 14 16:36:02 2017 -0600

    ecore_wl2: Send a dmabuf non-immediate create at startup
    
    We use immediate mode dmabuf creation at runtime, but this can result in
    clients being killed with no option to fallback if the buffers can't be
    consumed by the compositor.
    
    This test should catch when a system can allocate a dmabuf buffer and the
    compositor claims to accept dmabuf, but the buffer can't actually be used
    for whatever reason.  We'll then use wl_shm at runtime instead of dmabuf.
---
 src/lib/ecore_wl2/ecore_wl2_buffer.c  | 47 +++++++++++++++++++++++++++++++++++
 src/lib/ecore_wl2/ecore_wl2_display.c |  1 +
 src/lib/ecore_wl2/ecore_wl2_private.h |  2 ++
 3 files changed, 50 insertions(+)

diff --git a/src/lib/ecore_wl2/ecore_wl2_buffer.c 
b/src/lib/ecore_wl2/ecore_wl2_buffer.c
index a9e911bab1..58e2d6a0c4 100644
--- a/src/lib/ecore_wl2/ecore_wl2_buffer.c
+++ b/src/lib/ecore_wl2/ecore_wl2_buffer.c
@@ -568,3 +568,50 @@ ecore_wl2_buffer_create(Ecore_Wl2_Display *ewd, int w, int 
h, Eina_Bool alpha)
 
    return out;
 }
+
+static void
+_create_succeeded(void *data EINA_UNUSED,
+                 struct zwp_linux_buffer_params_v1 *params,
+                 struct wl_buffer *new_buffer)
+{
+   wl_buffer_destroy(new_buffer);
+   zwp_linux_buffer_params_v1_destroy(params);
+}
+
+static void
+_create_failed(void *data, struct zwp_linux_buffer_params_v1 *params)
+{
+   Ecore_Wl2_Display *ewd = data;
+
+   zwp_linux_buffer_params_v1_destroy(params);
+   ewd->wl.dmabuf = NULL;
+}
+
+static const struct zwp_linux_buffer_params_v1_listener params_listener =
+{
+   _create_succeeded,
+   _create_failed
+};
+
+void
+_ecore_wl2_buffer_test(Ecore_Wl2_Display *ewd)
+{
+   struct zwp_linux_buffer_params_v1 *dp;
+   Ecore_Wl2_Buffer *buf;
+
+   if (!ecore_wl2_buffer_init(ewd, ECORE_WL2_BUFFER_DMABUF)) goto fail;
+
+   buf = _ecore_wl2_buffer_partial_create(1, 1, EINA_TRUE);
+   if (!buf) goto fail;
+
+   dp = zwp_linux_dmabuf_v1_create_params(ewd->wl.dmabuf);
+   zwp_linux_buffer_params_v1_add(dp, buf->fd, 0, 0, buf->stride, 0, 0);
+   zwp_linux_buffer_params_v1_add_listener(dp, &params_listener, buf);
+   zwp_linux_buffer_params_v1_create(dp, buf->w, buf->h,
+                                     DRM_FORMAT_ARGB8888, 0);
+   ecore_wl2_display_flush(ewd);
+
+  return;
+fail:
+  ewd->wl.dmabuf = NULL;
+}
diff --git a/src/lib/ecore_wl2/ecore_wl2_display.c 
b/src/lib/ecore_wl2/ecore_wl2_display.c
index 9d5a41a141..c703a1ace2 100644
--- a/src/lib/ecore_wl2/ecore_wl2_display.c
+++ b/src/lib/ecore_wl2/ecore_wl2_display.c
@@ -283,6 +283,7 @@ _cb_global_add(void *data, struct wl_registry *registry, 
unsigned int id, const
         ewd->wl.dmabuf =
           wl_registry_bind(registry, id, &zwp_linux_dmabuf_v1_interface, 2);
         zwp_linux_dmabuf_v1_add_listener(ewd->wl.dmabuf, &_dmabuf_listener, 
ewd);
+        _ecore_wl2_buffer_test(ewd);
         _ecore_wl2_display_sync_add(ewd);
      }
    else if (!strcmp(interface, "wl_data_device_manager"))
diff --git a/src/lib/ecore_wl2/ecore_wl2_private.h 
b/src/lib/ecore_wl2/ecore_wl2_private.h
index 75e4830a1c..783c82e1da 100644
--- a/src/lib/ecore_wl2/ecore_wl2_private.h
+++ b/src/lib/ecore_wl2/ecore_wl2_private.h
@@ -557,6 +557,8 @@ void _ecore_wl2_window_semi_free(Ecore_Wl2_Window *window);
 void _ecore_wl2_offer_unref(Ecore_Wl2_Offer *offer);
 Eina_Bool _ecore_wl2_display_sync_get(void);
 
+void _ecore_wl2_buffer_test(Ecore_Wl2_Display *ewd);
+
 EAPI void ecore_wl2_window_weight_set(Ecore_Wl2_Window *window, double w, 
double h);
 
 EAPI extern int _ecore_wl2_event_window_www;

-- 


Reply via email to