From 100a2af54c9f862b26ea6fe8f197a827b7040c88 Mon Sep 17 00:00:00 2001 From: Boram Park Date: Mon, 8 Jun 2015 13:08:59 +0900 Subject: [PATCH] gl_drm: support evas_render_copy Change-Id: Iec1dac4cd10e9f4dbe2e2fcefd988b6019279431 --- src/modules/evas/engines/gl_drm/evas_drm.c | 6 ++-- src/modules/evas/engines/gl_drm/evas_drm_main.c | 39 +++++++++++++++++++++++++ src/modules/evas/engines/gl_drm/evas_engine.c | 15 ++++++++++ src/modules/evas/engines/gl_drm/evas_engine.h | 2 ++ 4 files changed, 59 insertions(+), 3 deletions(-) diff --git a/src/modules/evas/engines/gl_drm/evas_drm.c b/src/modules/evas/engines/gl_drm/evas_drm.c index 19d8594..3180c34 100644 --- a/src/modules/evas/engines/gl_drm/evas_drm.c +++ b/src/modules/evas/engines/gl_drm/evas_drm.c @@ -23,8 +23,8 @@ _evas_drm_crtc_buffer_get(int fd, int crtc_id) return id; } -static Ecore_Drm_Output* -_evas_drm_output_find(unsigned int crtc_id) +Ecore_Drm_Output* +evas_drm_output_find(unsigned int crtc_id) { Ecore_Drm_Device *dev; Ecore_Drm_Output *output; @@ -341,7 +341,7 @@ evas_drm_framebuffer_send(Outbuf *ob, Buffer *buffer) if (!ob->output) { - ob->output = _evas_drm_output_find(ob->priv.crtc); + ob->output = evas_drm_output_find(ob->priv.crtc); EINA_SAFETY_ON_NULL_RETURN_VAL(ob->output, EINA_FALSE); } diff --git a/src/modules/evas/engines/gl_drm/evas_drm_main.c b/src/modules/evas/engines/gl_drm/evas_drm_main.c index 0649341..fe75b6d 100644 --- a/src/modules/evas/engines/gl_drm/evas_drm_main.c +++ b/src/modules/evas/engines/gl_drm/evas_drm_main.c @@ -1,5 +1,8 @@ #include "evas_engine.h" +#include +#include + /* local variables */ static Outbuf *_evas_gl_drm_window = NULL; static EGLContext context = EGL_NO_CONTEXT; @@ -678,3 +681,39 @@ eng_outbuf_egl_display_get(Outbuf *ob) { return ob->egl_disp; } + +void +eng_outbuf_copy(Outbuf *ob, void *buffer, int stride, int width EINA_UNUSED, int height, uint format EINA_UNUSED, + int sx EINA_UNUSED, int sy EINA_UNUSED, int sw EINA_UNUSED, int sh EINA_UNUSED, + int dx EINA_UNUSED, int dy EINA_UNUSED, int dw EINA_UNUSED, int dh EINA_UNUSED) +{ + Ecore_Drm_Output *output; + uint fb_handle, fb_fmt; + int fb_w, fb_h; + void *data; + struct drm_mode_map_dumb arg = {0,}; + + output = evas_drm_output_find(ob->priv.crtc); + + /* TODO: should find the better way to find current framebuffer */ + ecore_drm_output_current_fb_info_get(output, &fb_handle, &fb_w, &fb_h, &fb_fmt); + + arg.handle = fb_handle; + if (drmIoctl(ob->priv.fd, DRM_IOCTL_MODE_MAP_DUMB, &arg)) + { + DBG("dump map failed"); + return; + } + + data = mmap(NULL, fb_w * fb_h * 4, PROT_READ|PROT_WRITE, MAP_SHARED, + ob->priv.fd, arg.offset); + if (data == MAP_FAILED) + { + DBG("mmap failed"); + return; + } + + memcpy(buffer, data, stride * height); + + munmap(data, fb_w * fb_h * 4); +} diff --git a/src/modules/evas/engines/gl_drm/evas_engine.c b/src/modules/evas/engines/gl_drm/evas_engine.c index a54b237..b5283ee 100644 --- a/src/modules/evas/engines/gl_drm/evas_engine.c +++ b/src/modules/evas/engines/gl_drm/evas_engine.c @@ -868,6 +868,20 @@ eng_output_dump(void *data) } static void +eng_output_copy(void *data, void *buffer, int stride, int width, int height, uint format, int sx, int sy, int sw, int sh, int dx, int dy, int dw, int dh) +{ + Render_Engine *re; + Outbuf *ob; + + if (!(re = (Render_Engine *)data)) return; + + ob = eng_get_ob(re); + EINA_SAFETY_ON_NULL_RETURN(ob); + + eng_outbuf_copy(ob, buffer, stride, width, height, format, sx, sy, sw, sh, dx, dy, dw, dh); +} + +static void _native_cb_bind(void *data EINA_UNUSED, void *image) { Evas_GL_Image *img; @@ -1213,6 +1227,7 @@ module_open(Evas_Module *em) ORD(output_free); ORD(output_dump); ORD(image_native_set); + ORD(output_copy); /* Mesa's EGL driver loads wayland egl by default. (called by eglGetProcaddr() ) * implicit env set (EGL_PLATFORM=drm) prevent that. */ diff --git a/src/modules/evas/engines/gl_drm/evas_engine.h b/src/modules/evas/engines/gl_drm/evas_engine.h index 2d30682..31b0c53 100644 --- a/src/modules/evas/engines/gl_drm/evas_engine.h +++ b/src/modules/evas/engines/gl_drm/evas_engine.h @@ -192,6 +192,8 @@ void evas_drm_outbuf_framebuffer_set(Outbuf *ob, Buffer *buffer); Eina_Bool evas_drm_framebuffer_send(Outbuf *ob, Buffer *buffer); void evas_drm_outbuf_event_flip(int fd, unsigned int seq, unsigned int sec, unsigned int usec, void *data); void evas_drm_outbuf_event_vblank(int fd, unsigned int seq, unsigned int sec, unsigned int usec, void *data); +Ecore_Drm_Output* evas_drm_output_find(unsigned int crtc_id); +void eng_outbuf_copy(Outbuf *ob, void *buffer, int stride, int width, int height, uint format, int sx, int sy, int sw, int sh, int dx, int dy, int dw, int dh); static inline Outbuf * eng_get_ob(Render_Engine *re) -- 2.7.4