derekf pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=9fdcf7d0eb8cec792a84ac0f0aac9c2ea5389293
commit 9fdcf7d0eb8cec792a84ac0f0aac9c2ea5389293 Author: Derek Foreman <[email protected]> Date: Mon Nov 13 16:26:09 2017 -0600 wayland_shm/ecore_wl2: Move buffer allocation into ecore_wl2 This moves all the platform specific buffer allocation into ecore_wl2 instead of the engine. Note that this makes an internal struct available in the header. This will be removed shortly. --- src/Makefile_Ecore_Wl2.am | 14 +- src/Makefile_Evas.am | 14 +- src/lib/ecore_wl2/Ecore_Wl2.h | 40 ++ .../ecore_wl2/ecore_wl2_buffer.c} | 259 +--------- src/modules/evas/engines/wayland_shm/evas_dmabuf.c | 569 --------------------- src/modules/evas/engines/wayland_shm/evas_engine.h | 8 - 6 files changed, 67 insertions(+), 837 deletions(-) diff --git a/src/Makefile_Ecore_Wl2.am b/src/Makefile_Ecore_Wl2.am index c2baa29a15..3abab865af 100644 --- a/src/Makefile_Ecore_Wl2.am +++ b/src/Makefile_Ecore_Wl2.am @@ -15,7 +15,17 @@ lib/ecore_wl2/ecore_wl2_input.c \ lib/ecore_wl2/ecore_wl2_output.c \ lib/ecore_wl2/ecore_wl2_display.c \ lib/ecore_wl2/ecore_wl2.c \ -lib/ecore_wl2/ecore_wl2_private.h +lib/ecore_wl2/ecore_wl2_private.h \ +lib/ecore_wl2/ecore_wl2_buffer.c \ +static_libs/libdrm/drm_fourcc.h \ +static_libs/libdrm/drm.h \ +static_libs/libdrm/drm_mode.h \ +static_libs/libdrm/exynos_drm.h \ +static_libs/libdrm/exynos_drmif.h \ +static_libs/libdrm/i915_drm.h \ +static_libs/libdrm/intel_bufmgr.h \ +static_libs/libdrm/LICENSE + nodist_lib_ecore_wl2_libecore_wl2_la_SOURCES = \ lib/ecore_wl2/efl-aux-hints-protocol.c \ @@ -35,7 +45,7 @@ lib/ecore_wl2/text-input-unstable-v1-protocol.c \ lib/ecore_wl2/efl-hints-client-protocol.h \ lib/ecore_wl2/efl-hints-protocol.c -lib_ecore_wl2_libecore_wl2_la_CPPFLAGS = -I$(top_builddir)/src/lib/efl @ECORE_WL2_CFLAGS@ +lib_ecore_wl2_libecore_wl2_la_CPPFLAGS = -I$(top_builddir)/src/lib/efl @ECORE_WL2_CFLAGS@ -I$(top_srcdir)/src/static_libs/libdrm lib_ecore_wl2_libecore_wl2_la_LIBADD = @ECORE_WL2_LIBS@ lib_ecore_wl2_libecore_wl2_la_DEPENDENCIES = @ECORE_WL2_INTERNAL_LIBS@ lib_ecore_wl2_libecore_wl2_la_LDFLAGS = @EFL_LTLIBRARY_FLAGS@ diff --git a/src/Makefile_Evas.am b/src/Makefile_Evas.am index 408c0c7583..48e6440e78 100644 --- a/src/Makefile_Evas.am +++ b/src/Makefile_Evas.am @@ -1321,15 +1321,7 @@ modules/evas/engines/wayland_common/Evas_Engine_Wayland.h \ modules/evas/engines/wayland_shm/evas_engine.c \ modules/evas/engines/wayland_shm/evas_engine.h \ modules/evas/engines/wayland_shm/evas_dmabuf.c \ -modules/evas/engines/wayland_shm/evas_outbuf.c \ -static_libs/libdrm/drm_fourcc.h \ -static_libs/libdrm/drm.h \ -static_libs/libdrm/drm_mode.h \ -static_libs/libdrm/exynos_drm.h \ -static_libs/libdrm/exynos_drmif.h \ -static_libs/libdrm/i915_drm.h \ -static_libs/libdrm/intel_bufmgr.h \ -static_libs/libdrm/LICENSE +modules/evas/engines/wayland_shm/evas_outbuf.c NODIST_WAYLAND_SHM_SOURCES = \ lib/ecore_wl2/linux-dmabuf-unstable-v1-protocol.c @@ -1337,8 +1329,7 @@ lib/ecore_wl2/linux-dmabuf-unstable-v1-protocol.c if EVAS_STATIC_BUILD_WAYLAND_SHM nodist_lib_evas_libevas_la_SOURCES = $(NODIST_WAYLAND_SHM_SOURCES) lib_evas_libevas_la_SOURCES += $(WAYLAND_SHM_SOURCES) -lib_evas_libevas_la_CPPFLAGS += @evas_engine_wayland_shm_cflags@ \ --I$(top_srcdir)/src/static_libs/libdrm +lib_evas_libevas_la_CPPFLAGS += @evas_engine_wayland_shm_cflags@ lib_evas_libevas_la_LIBADD += @evas_engine_wayland_shm_libs@ else enginewaylandshmpkgdir = $(libdir)/evas/modules/engines/wayland_shm/$(MODULE_ARCH) @@ -1356,7 +1347,6 @@ modules_evas_engines_wayland_shm_module_la_CPPFLAGS = -I$(top_builddir)/src/lib/ -I$(top_srcdir)/src/lib/evas/cserve2 \ -I$(top_srcdir)/src/lib/ecore_wl2 \ -I$(top_builddir)/src/lib/ecore_wl2 \ --I$(top_srcdir)/src/static_libs/libdrm \ -I$(top_srcdir)/src/modules/evas/engines/wayland_common \ @EVAS_CFLAGS@ \ @ECORE_WL2_CFLAGS@ \ diff --git a/src/lib/ecore_wl2/Ecore_Wl2.h b/src/lib/ecore_wl2/Ecore_Wl2.h index a9a3da232d..f4c1c8122a 100644 --- a/src/lib/ecore_wl2/Ecore_Wl2.h +++ b/src/lib/ecore_wl2/Ecore_Wl2.h @@ -359,6 +359,36 @@ typedef struct Ecore_Wl2_Event_Aux_Message Ecore_Wl2_Display *display; } Ecore_Wl2_Event_Aux_Message; +/* THIS WILL BE PRIVATE SHORTLY, DO NOT USE */ +typedef struct _Buffer_Handle Buffer_Handle; +typedef struct _Ecore_Wl2_Buffer Ecore_Wl2_Buffer; +struct _Ecore_Wl2_Buffer +{ + struct wl_buffer *wl_buffer; + int size; + int w, h; + int age; + unsigned long stride; + Buffer_Handle *bh; + int fd; + void *mapping; + + int index; + Eina_Bool locked : 1; + Eina_Bool busy : 1; + Eina_Bool used : 1; + Eina_Bool orphaned : 1; + Eina_Bool alpha : 1; +}; + +typedef enum _Ecore_Wl2_Buffer_Type Ecore_Wl2_Buffer_Type; +enum _Ecore_Wl2_Buffer_Type +{ + ECORE_WL2_BUFFER_NONE = 0, + ECORE_WL2_BUFFER_SHM = 1, + ECORE_WL2_BUFFER_DMABUF = 2 +}; + typedef void (*Ecore_Wl2_Bind_Cb)(struct wl_client *client, void *data, uint32_t version, uint32_t id); typedef void (*Ecore_Wl2_Unbind_Cb)(struct wl_resource *resource); typedef void (*Ecore_Wl2_Frame_Cb)(Ecore_Wl2_Window *win, uint32_t timestamp, void *data); @@ -1976,6 +2006,16 @@ EAPI void ecore_wl2_window_update_begin(Ecore_Wl2_Window *window); EAPI void ecore_wl2_window_damage(Ecore_Wl2_Window *window, Eina_Rectangle *rects, unsigned int count); +EAPI Eina_Bool ecore_wl2_buffer_init(Ecore_Wl2_Buffer_Type types); +EAPI Ecore_Wl2_Buffer *ecore_wl2_buffer_create(Ecore_Wl2_Display *ewd, int w, int h, Eina_Bool alpha); +EAPI void ecore_wl2_buffer_destroy(Ecore_Wl2_Buffer *b); +EAPI struct wl_buffer *ecore_wl2_buffer_wl_buffer_get(Ecore_Wl2_Display *ewd, Ecore_Wl2_Buffer *buf); +EAPI void *ecore_wl2_buffer_map(Ecore_Wl2_Buffer *buf); +EAPI void ecore_wl2_buffer_unmap(Ecore_Wl2_Buffer *buf); +EAPI void ecore_wl2_buffer_discard(Ecore_Wl2_Buffer *buf); +EAPI void ecore_wl2_buffer_unlock(Ecore_Wl2_Buffer *b); +EAPI void ecore_wl2_buffer_destroy(Ecore_Wl2_Buffer *b); + # endif # undef EAPI diff --git a/src/modules/evas/engines/wayland_shm/evas_dmabuf.c b/src/lib/ecore_wl2/ecore_wl2_buffer.c similarity index 70% copy from src/modules/evas/engines/wayland_shm/evas_dmabuf.c copy to src/lib/ecore_wl2/ecore_wl2_buffer.c index 68d5b11d41..32e779ed00 100644 --- a/src/modules/evas/engines/wayland_shm/evas_dmabuf.c +++ b/src/lib/ecore_wl2/ecore_wl2_buffer.c @@ -1,6 +1,8 @@ -#include "evas_common_private.h" -#include "evas_private.h" -#include "evas_engine.h" +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#include "ecore_wl2_private.h" #include <sys/types.h> #include <sys/stat.h> @@ -47,41 +49,6 @@ struct _Buffer_Manager static Buffer_Manager *buffer_manager = NULL; -struct _Ecore_Wl2_Buffer -{ - struct wl_buffer *wl_buffer; - int size; - int w, h; - int age; - unsigned long stride; - Buffer_Handle *bh; - int fd; - void *mapping; - - int index; - Eina_Bool locked : 1; - Eina_Bool busy : 1; - Eina_Bool used : 1; - Eina_Bool orphaned : 1; - Eina_Bool alpha : 1; -}; - -struct _Dmabuf_Surface -{ - Surface *surface; - - Ecore_Wl2_Buffer *current; - Ecore_Wl2_Buffer **buffer; - int nbuf; - - Eina_Bool alpha : 1; -}; - -static void _internal_evas_dmabuf_surface_destroy(Dmabuf_Surface *surface); -static void _evas_dmabuf_surface_destroy(Surface *s); -static Ecore_Wl2_Buffer *ecore_wl2_buffer_create(Ecore_Wl2_Display *ewd, int w, int h, Eina_Bool alpha); -static void ecore_wl2_buffer_destroy(Ecore_Wl2_Buffer *b); - static drm_intel_bufmgr *(*sym_drm_intel_bufmgr_gem_init)(int fd, int batch_size) = NULL; static int (*sym_drm_intel_bo_unmap)(drm_intel_bo *bo) = NULL; static int (*sym_drm_intel_bo_map)(drm_intel_bo *bo) = NULL; @@ -430,7 +397,7 @@ _wl_shm_buffer_manager_setup(int fd EINA_UNUSED) return EINA_TRUE; } -static Eina_Bool +EAPI Eina_Bool ecore_wl2_buffer_init(Ecore_Wl2_Buffer_Type types) { int fd; @@ -509,13 +476,13 @@ _buffer_manager_alloc(const char *name, int w, int h, unsigned long *stride, int return out; } -static struct wl_buffer * +EAPI struct wl_buffer * ecore_wl2_buffer_wl_buffer_get(Ecore_Wl2_Display *ewd, Ecore_Wl2_Buffer *buf) { return buffer_manager->to_buffer(ewd, buf); } -static void * +EAPI void * ecore_wl2_buffer_map(Ecore_Wl2_Buffer *buf) { void *out; @@ -526,21 +493,21 @@ ecore_wl2_buffer_map(Ecore_Wl2_Buffer *buf) return out; } -static void +EAPI void ecore_wl2_buffer_unmap(Ecore_Wl2_Buffer *buf) { buffer_manager->unmap(buf); _buffer_manager_deref(); } -static void +EAPI void ecore_wl2_buffer_discard(Ecore_Wl2_Buffer *buf) { buffer_manager->discard(buf); _buffer_manager_deref(); } -static void +EAPI void ecore_wl2_buffer_unlock(Ecore_Wl2_Buffer *b) { ecore_wl2_buffer_unmap(b); @@ -548,7 +515,7 @@ ecore_wl2_buffer_unlock(Ecore_Wl2_Buffer *b) b->locked = EINA_FALSE; } -static void +EAPI void ecore_wl2_buffer_destroy(Ecore_Wl2_Buffer *b) { if (!b) return; @@ -566,131 +533,7 @@ ecore_wl2_buffer_destroy(Ecore_Wl2_Buffer *b) free(b); } -static void -_evas_dmabuf_surface_reconfigure(Surface *s, int w, int h, uint32_t flags EINA_UNUSED, Eina_Bool force) -{ - Ecore_Wl2_Buffer *buf; - Dmabuf_Surface *surface; - int i; - - if ((!w) || (!h)) return; - surface = s->surf.dmabuf; - for (i = 0; i < surface->nbuf; i++) - { - if (surface->buffer[i]) - { - Ecore_Wl2_Buffer *b = surface->buffer[i]; - int stride = b->stride; - - /* If stride is a little bigger than width we still fit */ - if (!force && (w >= b->w) && (w <= stride / 4) && (h == b->h)) - { - b->w = w; - continue; - } - - ecore_wl2_buffer_destroy(b); - } - buf = ecore_wl2_buffer_create(s->ob->ewd, w, h, surface->alpha); - if (!buf) return; - surface->buffer[i] = buf; - } -} - -static void * -_evas_dmabuf_surface_data_get(Surface *s, int *w, int *h) -{ - Dmabuf_Surface *surface; - Ecore_Wl2_Buffer *b; - void *ptr; - - surface = s->surf.dmabuf; - b = surface->current; - if (!b) return NULL; - - /* We return stride/bpp because it may not match the allocated - * width. evas will figure out the clipping - */ - if (w) *w = b->stride / 4; - if (h) *h = b->h; - if (b->locked) return b->mapping; - - ptr = ecore_wl2_buffer_map(b); - if (!ptr) - return NULL; - - b->mapping = ptr; - b->locked = EINA_TRUE; - return b->mapping; -} - -static Ecore_Wl2_Buffer * -_evas_dmabuf_surface_wait(Dmabuf_Surface *s) -{ - int i = 0, best = -1, best_age = -1; - - for (i = 0; i < s->nbuf; i++) - { - if (s->buffer[i]->locked || s->buffer[i]->busy) continue; - if (s->buffer[i]->age > best_age) - { - best = i; - best_age = s->buffer[i]->age; - } - } - - if (best >= 0) return s->buffer[best]; - return NULL; -} - -static int -_evas_dmabuf_surface_assign(Surface *s) -{ - Dmabuf_Surface *surface; - int i; - - surface = s->surf.dmabuf; - surface->current = _evas_dmabuf_surface_wait(surface); - if (!surface->current) - { - WRN("No free DMAbuf buffers, dropping a frame"); - for (i = 0; i < surface->nbuf; i++) - surface->buffer[i]->age = 0; - return 0; - } - for (i = 0; i < surface->nbuf; i++) - if (surface->buffer[i]->used) surface->buffer[i]->age++; - - return surface->current->age; -} - -static void -_evas_dmabuf_surface_post(Surface *s, Eina_Rectangle *rects, unsigned int count) -{ - Dmabuf_Surface *surface; - Ecore_Wl2_Buffer *b; - Ecore_Wl2_Window *win; - - surface = s->surf.dmabuf; - b = surface->current; - if (!b) return; - - ecore_wl2_buffer_unlock(b); - - surface->current = NULL; - b->busy = EINA_TRUE; - b->used = EINA_TRUE; - b->age = 0; - - win = s->info->info.wl2_win; - - ecore_wl2_window_buffer_attach(win, b->wl_buffer, 0, 0, EINA_FALSE); - ecore_wl2_window_damage(win, rects, count); - - ecore_wl2_window_commit(win, EINA_TRUE); -} - -static Ecore_Wl2_Buffer * +EAPI Ecore_Wl2_Buffer * ecore_wl2_buffer_create(Ecore_Wl2_Display *ewd, int w, int h, Eina_Bool alpha) { Ecore_Wl2_Buffer *out; @@ -714,79 +557,3 @@ ecore_wl2_buffer_create(Ecore_Wl2_Display *ewd, int w, int h, Eina_Bool alpha) return out; } - -static void -_internal_evas_dmabuf_surface_destroy(Dmabuf_Surface *surface) -{ - int i; - - for (i = 0; i < surface->nbuf; i++) - ecore_wl2_buffer_destroy(surface->buffer[i]); - - free(surface->buffer); - surface->buffer = NULL; - surface->nbuf = 0; - free(surface); -} - -static void -_evas_dmabuf_surface_destroy(Surface *s) -{ - if (!s) return; - - _internal_evas_dmabuf_surface_destroy(s->surf.dmabuf); -} - -Eina_Bool -_evas_dmabuf_surface_create(Surface *s, int w, int h, int num_buff) -{ - Ecore_Wl2_Buffer_Type types = 0; - Dmabuf_Surface *surf = NULL; - int i = 0; - - if (ecore_wl2_display_shm_get(s->info->info.wl2_display)) - types |= ECORE_WL2_BUFFER_SHM; - if (ecore_wl2_display_dmabuf_get(s->info->info.wl2_display)) - types |= ECORE_WL2_BUFFER_DMABUF; - - if (!(s->surf.dmabuf = calloc(1, sizeof(Dmabuf_Surface)))) return EINA_FALSE; - surf = s->surf.dmabuf; - - surf->surface = s; - surf->alpha = s->info->info.destination_alpha; - - /* create surface buffers */ - surf->nbuf = num_buff; - surf->buffer = calloc(surf->nbuf, sizeof(Ecore_Wl2_Buffer *)); - if (!surf->buffer) goto err; - - if (!ecore_wl2_buffer_init(types)) goto err; - - if (w && h) - { - for (i = 0; i < num_buff; i++) - { - surf->buffer[i] = ecore_wl2_buffer_create(s->ob->ewd, - w, h, surf->alpha); - if (!surf->buffer[i]) - { - DBG("Could not create buffers"); - /* _init() handled surface cleanup when it failed */ - return EINA_FALSE; - } - } - } - - s->funcs.destroy = _evas_dmabuf_surface_destroy; - s->funcs.reconfigure = _evas_dmabuf_surface_reconfigure; - s->funcs.data_get = _evas_dmabuf_surface_data_get; - s->funcs.assign = _evas_dmabuf_surface_assign; - s->funcs.post = _evas_dmabuf_surface_post; - - return EINA_TRUE; - -err: - free(surf->buffer); - free(surf); - return EINA_FALSE; -} diff --git a/src/modules/evas/engines/wayland_shm/evas_dmabuf.c b/src/modules/evas/engines/wayland_shm/evas_dmabuf.c index 68d5b11d41..b54424b3d6 100644 --- a/src/modules/evas/engines/wayland_shm/evas_dmabuf.c +++ b/src/modules/evas/engines/wayland_shm/evas_dmabuf.c @@ -4,68 +4,10 @@ #include <sys/types.h> #include <sys/stat.h> -#include <fcntl.h> -#include <dlfcn.h> -#include <drm_fourcc.h> -#include <intel_bufmgr.h> -#include <i915_drm.h> - -#include <exynos_drm.h> -#include <exynos_drmif.h> -#include <sys/mman.h> #include "linux-dmabuf-unstable-v1-client-protocol.h" -#define SYM(lib, xx) \ - do { \ - sym_## xx = dlsym(lib, #xx); \ - if (!(sym_ ## xx)) { \ - fail = EINA_TRUE; \ - } \ - } while (0) - -static int drm_fd = -1; - typedef struct _Dmabuf_Surface Dmabuf_Surface; - -typedef struct _Ecore_Wl2_Buffer Ecore_Wl2_Buffer; -typedef struct _Buffer_Handle Buffer_Handle; -typedef struct _Buffer_Manager Buffer_Manager; -struct _Buffer_Manager -{ - Buffer_Handle *(*alloc)(Buffer_Manager *self, const char *name, int w, int h, unsigned long *stride, int32_t *fd); - struct wl_buffer *(*to_buffer)(Ecore_Wl2_Display *ewd, Ecore_Wl2_Buffer *db); - void *(*map)(Ecore_Wl2_Buffer *buf); - void (*unmap)(Ecore_Wl2_Buffer *buf); - void (*discard)(Ecore_Wl2_Buffer *buf); - void (*manager_destroy)(void); - void *priv; - void *dl_handle; - int refcount; - Eina_Bool destroyed; -}; - -static Buffer_Manager *buffer_manager = NULL; - -struct _Ecore_Wl2_Buffer -{ - struct wl_buffer *wl_buffer; - int size; - int w, h; - int age; - unsigned long stride; - Buffer_Handle *bh; - int fd; - void *mapping; - - int index; - Eina_Bool locked : 1; - Eina_Bool busy : 1; - Eina_Bool used : 1; - Eina_Bool orphaned : 1; - Eina_Bool alpha : 1; -}; - struct _Dmabuf_Surface { Surface *surface; @@ -79,492 +21,6 @@ struct _Dmabuf_Surface static void _internal_evas_dmabuf_surface_destroy(Dmabuf_Surface *surface); static void _evas_dmabuf_surface_destroy(Surface *s); -static Ecore_Wl2_Buffer *ecore_wl2_buffer_create(Ecore_Wl2_Display *ewd, int w, int h, Eina_Bool alpha); -static void ecore_wl2_buffer_destroy(Ecore_Wl2_Buffer *b); - -static drm_intel_bufmgr *(*sym_drm_intel_bufmgr_gem_init)(int fd, int batch_size) = NULL; -static int (*sym_drm_intel_bo_unmap)(drm_intel_bo *bo) = NULL; -static int (*sym_drm_intel_bo_map)(drm_intel_bo *bo) = NULL; -static drm_intel_bo *(*sym_drm_intel_bo_alloc_tiled)(drm_intel_bufmgr *mgr, const char *name, int x, int y, int cpp, uint32_t *tile, unsigned long *pitch, unsigned long flags) = NULL; -static void (*sym_drm_intel_bo_unreference)(drm_intel_bo *bo) = NULL; -static int (*sym_drmPrimeHandleToFD)(int fd, uint32_t handle, uint32_t flags, int *prime_fd) = NULL; -static void (*sym_drm_intel_bufmgr_destroy)(drm_intel_bufmgr *) = NULL; - -static struct exynos_device *(*sym_exynos_device_create)(int fd) = NULL; -static struct exynos_bo *(*sym_exynos_bo_create)(struct exynos_device *dev, size_t size, uint32_t flags) = NULL; -static void *(*sym_exynos_bo_map)(struct exynos_bo *bo) = NULL; -static void (*sym_exynos_bo_destroy)(struct exynos_bo *bo) = NULL; -static void (*sym_exynos_device_destroy)(struct exynos_device *) = NULL; - -static void -buffer_release(void *data, struct wl_buffer *buffer EINA_UNUSED) -{ - Ecore_Wl2_Buffer *b = data; - - b->busy = EINA_FALSE; - if (b->orphaned) ecore_wl2_buffer_destroy(b); -} - -static const struct wl_buffer_listener buffer_listener = -{ - buffer_release -}; - -static struct wl_buffer * -_evas_dmabuf_wl_buffer_from_dmabuf(Ecore_Wl2_Display *ewd, Ecore_Wl2_Buffer *db) -{ - struct wl_buffer *buf; - struct zwp_linux_dmabuf_v1 *dmabuf; - struct zwp_linux_buffer_params_v1 *dp; - uint32_t flags = 0; - uint32_t format; - - if (db->alpha) - format = DRM_FORMAT_ARGB8888; - else - format = DRM_FORMAT_XRGB8888; - - dmabuf = ecore_wl2_display_dmabuf_get(ewd); - dp = zwp_linux_dmabuf_v1_create_params(dmabuf); - zwp_linux_buffer_params_v1_add(dp, db->fd, 0, 0, db->stride, 0, 0); - buf = zwp_linux_buffer_params_v1_create_immed(dp, db->w, db->h, - format, flags); - wl_buffer_add_listener(buf, &buffer_listener, db); - zwp_linux_buffer_params_v1_destroy(dp); - - return buf; -} - -static Buffer_Handle * -_intel_alloc(Buffer_Manager *self, const char *name, int w, int h, unsigned long *stride, int32_t *fd) -{ - uint32_t tile = I915_TILING_NONE; - drm_intel_bo *out; - - out = sym_drm_intel_bo_alloc_tiled(self->priv, name, w, h, 4, &tile, - stride, 0); - - if (!out) return NULL; - - if (tile != I915_TILING_NONE) goto err; - /* First try to allocate an mmapable buffer with O_RDWR, - * if that fails retry unmappable - if the compositor is - * using GL it won't need to mmap the buffer and this can - * work - otherwise it'll reject this buffer and we'll - * have to fall back to shm rendering. - */ - if (sym_drmPrimeHandleToFD(drm_fd, out->handle, - DRM_CLOEXEC | O_RDWR, fd) != 0) - if (sym_drmPrimeHandleToFD(drm_fd, out->handle, - DRM_CLOEXEC, fd) != 0) goto err; - - return (Buffer_Handle *)out; - -err: - sym_drm_intel_bo_unreference(out); - return NULL; -} - -static void * -_intel_map(Ecore_Wl2_Buffer *buf) -{ - drm_intel_bo *bo; - - bo = (drm_intel_bo *)buf->bh; - if (sym_drm_intel_bo_map(bo) != 0) return NULL; - return bo->virtual; -} - -static void -_intel_unmap(Ecore_Wl2_Buffer *buf) -{ - drm_intel_bo *bo; - - bo = (drm_intel_bo *)buf->bh; - sym_drm_intel_bo_unmap(bo); -} - -static void -_intel_discard(Ecore_Wl2_Buffer *buf) -{ - drm_intel_bo *bo; - - bo = (drm_intel_bo *)buf->bh; - sym_drm_intel_bo_unreference(bo); -} - -static void -_intel_manager_destroy() -{ - sym_drm_intel_bufmgr_destroy(buffer_manager->priv); -} - -static Eina_Bool -_intel_buffer_manager_setup(int fd) -{ - Eina_Bool fail = EINA_FALSE; - void *drm_intel_lib; - - drm_intel_lib = dlopen("libdrm_intel.so", RTLD_LAZY | RTLD_GLOBAL); - if (!drm_intel_lib) return EINA_FALSE; - - SYM(drm_intel_lib, drm_intel_bufmgr_gem_init); - SYM(drm_intel_lib, drm_intel_bo_unmap); - SYM(drm_intel_lib, drm_intel_bo_map); - SYM(drm_intel_lib, drm_intel_bo_alloc_tiled); - SYM(drm_intel_lib, drm_intel_bo_unreference); - SYM(drm_intel_lib, drm_intel_bufmgr_destroy); - SYM(drm_intel_lib, drmPrimeHandleToFD); - - if (fail) goto err; - - buffer_manager->priv = sym_drm_intel_bufmgr_gem_init(fd, 32); - if (!buffer_manager->priv) goto err; - - buffer_manager->alloc = _intel_alloc; - buffer_manager->to_buffer = _evas_dmabuf_wl_buffer_from_dmabuf; - buffer_manager->map = _intel_map; - buffer_manager->unmap = _intel_unmap; - buffer_manager->discard = _intel_discard; - buffer_manager->manager_destroy = _intel_manager_destroy; - buffer_manager->dl_handle = drm_intel_lib; - - return EINA_TRUE; - -err: - dlclose(drm_intel_lib); - return EINA_FALSE; -} - -static Buffer_Handle * -_exynos_alloc(Buffer_Manager *self, const char *name EINA_UNUSED, int w, int h, unsigned long *stride, int32_t *fd) -{ - size_t size = w * h * 4; - struct exynos_bo *out; - - *stride = w * 4; - out = sym_exynos_bo_create(self->priv, size, 0); - if (!out) return NULL; - /* First try to allocate an mmapable buffer with O_RDWR, - * if that fails retry unmappable - if the compositor is - * using GL it won't need to mmap the buffer and this can - * work - otherwise it'll reject this buffer and we'll - * have to fall back to shm rendering. - */ - if (sym_drmPrimeHandleToFD(drm_fd, out->handle, - DRM_CLOEXEC | O_RDWR, fd) != 0) - if (sym_drmPrimeHandleToFD(drm_fd, out->handle, - DRM_CLOEXEC, fd) != 0) goto err; - - return (Buffer_Handle *)out; - -err: - sym_exynos_bo_destroy(out); - return NULL; -} - -static void * -_exynos_map(Ecore_Wl2_Buffer *buf) -{ - struct exynos_bo *bo; - void *ptr; - - bo = (struct exynos_bo *)buf->bh; - ptr = mmap(0, bo->size, PROT_READ | PROT_WRITE, MAP_SHARED, buf->fd, 0); - if (ptr == MAP_FAILED) return NULL; - return ptr; -} - -static void -_exynos_unmap(Ecore_Wl2_Buffer *buf) -{ - struct exynos_bo *bo; - - bo = (struct exynos_bo *)buf->bh; - munmap(buf->mapping, bo->size); -} - -static void -_exynos_discard(Ecore_Wl2_Buffer *buf) -{ - struct exynos_bo *bo; - - bo = (struct exynos_bo *)buf->bh; - sym_exynos_bo_destroy(bo); -} - -static void -_exynos_manager_destroy() -{ - sym_exynos_device_destroy(buffer_manager->priv); -} - -static Eina_Bool -_exynos_buffer_manager_setup(int fd) -{ - Eina_Bool fail = EINA_FALSE; - void *drm_exynos_lib; - struct exynos_bo *bo; - - drm_exynos_lib = dlopen("libdrm_exynos.so", RTLD_LAZY | RTLD_GLOBAL); - if (!drm_exynos_lib) return EINA_FALSE; - - SYM(drm_exynos_lib, exynos_device_create); - SYM(drm_exynos_lib, exynos_bo_create); - SYM(drm_exynos_lib, exynos_bo_map); - SYM(drm_exynos_lib, exynos_bo_destroy); - SYM(drm_exynos_lib, exynos_device_destroy); - SYM(drm_exynos_lib, drmPrimeHandleToFD); - - if (fail) goto err; - - buffer_manager->priv = sym_exynos_device_create(fd); - if (!buffer_manager->priv) goto err; - - /* _device_create succeeds on any arch, test harder */ - bo = sym_exynos_bo_create(buffer_manager->priv, 32, 0); - if (!bo) goto err; - - sym_exynos_bo_destroy(bo); - - buffer_manager->alloc = _exynos_alloc; - buffer_manager->to_buffer = _evas_dmabuf_wl_buffer_from_dmabuf; - buffer_manager->map = _exynos_map; - buffer_manager->unmap = _exynos_unmap; - buffer_manager->discard = _exynos_discard; - buffer_manager->manager_destroy = _exynos_manager_destroy; - buffer_manager->dl_handle = drm_exynos_lib; - return EINA_TRUE; - -err: - dlclose(drm_exynos_lib); - return EINA_FALSE; -} - -static Buffer_Handle * -_wl_shm_alloc(Buffer_Manager *self EINA_UNUSED, const char *name EINA_UNUSED, int w, int h, unsigned long *stride, int32_t *fd) -{ - Efl_Vpath_File *file_obj; - Eina_Tmpstr *fullname; - size_t size = w * h * 4; - void *out = NULL; - - file_obj = efl_vpath_manager_fetch(EFL_VPATH_MANAGER_CLASS, - "(:run:)/evas-wayland_shm-XXXXXX"); - *fd = eina_file_mkstemp(efl_vpath_file_result_get(file_obj), &fullname); - efl_del(file_obj); - if (*fd < 0) return NULL; - - unlink(fullname); - eina_tmpstr_del(fullname); - - *stride = w * 4; - if (ftruncate(*fd, size) < 0) goto err; - - out = mmap(NULL, size, (PROT_READ | PROT_WRITE), MAP_SHARED, *fd, 0); - if (out == MAP_FAILED) goto err; - - return out; - -err: - close(*fd); - return NULL; -} - -static void * -_wl_shm_map(Ecore_Wl2_Buffer *buf) -{ - return buf->bh; -} - -static void -_wl_shm_unmap(Ecore_Wl2_Buffer *buf EINA_UNUSED) -{ - /* wl_shm is mapped for its lifetime */ -} - -static void -_wl_shm_discard(Ecore_Wl2_Buffer *buf) -{ - munmap(buf->bh, buf->size); -} - -static void -_wl_shm_manager_destroy() -{ - /* Nop. */ -} - -static struct wl_buffer * -_wl_shm_to_buffer(Ecore_Wl2_Display *ewd, Ecore_Wl2_Buffer *db) -{ - struct wl_buffer *buf; - struct wl_shm_pool *pool; - struct wl_shm *shm; - uint32_t format; - - if (db->alpha) - format = WL_SHM_FORMAT_ARGB8888; - else - format = WL_SHM_FORMAT_XRGB8888; - - shm = ecore_wl2_display_shm_get(ewd); - pool = wl_shm_create_pool(shm, db->fd, db->size); - buf = wl_shm_pool_create_buffer(pool, 0, db->w, db->h, db->stride, format); - wl_shm_pool_destroy(pool); - close(db->fd); - db->fd = -1; - wl_buffer_add_listener(buf, &buffer_listener, db); - return buf; -} - -static Eina_Bool -_wl_shm_buffer_manager_setup(int fd EINA_UNUSED) -{ - buffer_manager->alloc = _wl_shm_alloc; - buffer_manager->to_buffer = _wl_shm_to_buffer; - buffer_manager->map = _wl_shm_map; - buffer_manager->unmap = _wl_shm_unmap; - buffer_manager->discard = _wl_shm_discard; - buffer_manager->manager_destroy = _wl_shm_manager_destroy; - return EINA_TRUE; -} - -static Eina_Bool -ecore_wl2_buffer_init(Ecore_Wl2_Buffer_Type types) -{ - int fd; - Eina_Bool dmabuf = types & ECORE_WL2_BUFFER_DMABUF; - Eina_Bool shm = types & ECORE_WL2_BUFFER_SHM; - Eina_Bool success = EINA_FALSE; - - if (buffer_manager) - { - buffer_manager->refcount++; - return EINA_TRUE; - } - - buffer_manager = calloc(1, sizeof(Buffer_Manager)); - if (!buffer_manager) goto err_alloc; - - fd = open("/dev/dri/renderD128", O_RDWR | O_CLOEXEC); - if (fd < 0) goto err_drm; - - if (!getenv("EVAS_WAYLAND_SHM_DISABLE_DMABUF")) - { - success = dmabuf && _intel_buffer_manager_setup(fd); - if (!success) success = dmabuf && _exynos_buffer_manager_setup(fd); - } - if (!success) success = shm && _wl_shm_buffer_manager_setup(fd); - if (!success) goto err_bm; - - drm_fd = fd; - buffer_manager->refcount = 1; - return EINA_TRUE; - -err_bm: - close(fd); -err_drm: - free(buffer_manager); -err_alloc: - return EINA_FALSE; -} - -static void -_buffer_manager_ref(void) -{ - buffer_manager->refcount++; -} - -static void -_buffer_manager_deref(void) -{ - buffer_manager->refcount--; - if (buffer_manager->refcount || !buffer_manager->destroyed) return; - - if (buffer_manager->manager_destroy) buffer_manager->manager_destroy(); - free(buffer_manager); - buffer_manager = NULL; - close(drm_fd); -} - -/* Currently no callers, but that will change... -static void -_buffer_manager_destroy(void) -{ - if (buffer_manager->destroyed) return; - buffer_manager->destroyed = EINA_TRUE; - _buffer_manager_deref(); -} -*/ - -static Buffer_Handle * -_buffer_manager_alloc(const char *name, int w, int h, unsigned long *stride, int32_t *fd) -{ - Buffer_Handle *out; - - _buffer_manager_ref(); - out = buffer_manager->alloc(buffer_manager, name, w, h, stride, fd); - if (!out) _buffer_manager_deref(); - return out; -} - -static struct wl_buffer * -ecore_wl2_buffer_wl_buffer_get(Ecore_Wl2_Display *ewd, Ecore_Wl2_Buffer *buf) -{ - return buffer_manager->to_buffer(ewd, buf); -} - -static void * -ecore_wl2_buffer_map(Ecore_Wl2_Buffer *buf) -{ - void *out; - - _buffer_manager_ref(); - out = buffer_manager->map(buf); - if (!out) _buffer_manager_deref(); - return out; -} - -static void -ecore_wl2_buffer_unmap(Ecore_Wl2_Buffer *buf) -{ - buffer_manager->unmap(buf); - _buffer_manager_deref(); -} - -static void -ecore_wl2_buffer_discard(Ecore_Wl2_Buffer *buf) -{ - buffer_manager->discard(buf); - _buffer_manager_deref(); -} - -static void -ecore_wl2_buffer_unlock(Ecore_Wl2_Buffer *b) -{ - ecore_wl2_buffer_unmap(b); - b->mapping = NULL; - b->locked = EINA_FALSE; -} - -static void -ecore_wl2_buffer_destroy(Ecore_Wl2_Buffer *b) -{ - if (!b) return; - - if (b->locked || b->busy) - { - b->orphaned = EINA_TRUE; - return; - } - if (b->fd != -1) close(b->fd); - if (b->mapping) ecore_wl2_buffer_unmap(b); - ecore_wl2_buffer_discard(b); - if (b->wl_buffer) wl_buffer_destroy(b->wl_buffer); - b->wl_buffer = NULL; - free(b); -} static void _evas_dmabuf_surface_reconfigure(Surface *s, int w, int h, uint32_t flags EINA_UNUSED, Eina_Bool force) @@ -690,31 +146,6 @@ _evas_dmabuf_surface_post(Surface *s, Eina_Rectangle *rects, unsigned int count) ecore_wl2_window_commit(win, EINA_TRUE); } -static Ecore_Wl2_Buffer * -ecore_wl2_buffer_create(Ecore_Wl2_Display *ewd, int w, int h, Eina_Bool alpha) -{ - Ecore_Wl2_Buffer *out; - - out = calloc(1, sizeof(Ecore_Wl2_Buffer)); - if (!out) return NULL; - - out->fd = -1; - out->alpha = alpha; - out->bh = _buffer_manager_alloc("name", w, h, &out->stride, &out->fd); - if (!out->bh) - { - free(out); - return NULL; - } - out->w = w; - out->h = h; - out->size = out->stride * h; - - out->wl_buffer = ecore_wl2_buffer_wl_buffer_get(ewd, out); - - return out; -} - static void _internal_evas_dmabuf_surface_destroy(Dmabuf_Surface *surface) { diff --git a/src/modules/evas/engines/wayland_shm/evas_engine.h b/src/modules/evas/engines/wayland_shm/evas_engine.h index 338b9ba2df..726f424102 100644 --- a/src/modules/evas/engines/wayland_shm/evas_engine.h +++ b/src/modules/evas/engines/wayland_shm/evas_engine.h @@ -75,14 +75,6 @@ extern int _evas_engine_way_shm_log_dom; typedef struct _Shm_Surface Shm_Surface; typedef struct _Dmabuf_Surface Dmabuf_Surface; -typedef enum _Ecore_Wl2_Buffer_Type Ecore_Wl2_Buffer_Type; -enum _Ecore_Wl2_Buffer_Type -{ - ECORE_WL2_BUFFER_NONE = 0, - ECORE_WL2_BUFFER_SHM = 1, - ECORE_WL2_BUFFER_DMABUF = 2 -}; - typedef struct _Surface Surface; struct _Surface { --
