diff options
author | Boram Park <boram1288.park@samsung.com> | 2015-06-02 15:35:29 +0900 |
---|---|---|
committer | Boram Park <boram1288.park@samsung.com> | 2015-06-08 13:09:08 +0900 |
commit | 6107d86a8d98b21f53f0e9f7c9b1c5e332d01f39 (patch) | |
tree | c13c5fd1d6dd59f636bf1a479fa287a5f3132e7c | |
parent | 1998c1a7aee24a48d4e7c786ae6235d9e61c01b9 (diff) | |
download | efl-6107d86a8d98b21f53f0e9f7c9b1c5e332d01f39.tar.gz |
ecore_drm_output keeps current fb information
Change-Id: I9fe62a5eea81c457dc2411ec057a9a52de29d547
-rw-r--r-- | src/lib/ecore_drm/Ecore_Drm.h | 5 | ||||
-rw-r--r-- | src/lib/ecore_drm/ecore_drm_output.c | 34 | ||||
-rw-r--r-- | src/lib/ecore_drm/ecore_drm_private.h | 6 | ||||
-rw-r--r-- | src/modules/evas/engines/drm/evas_drm.c | 26 | ||||
-rw-r--r-- | src/modules/evas/engines/drm/evas_engine.h | 2 | ||||
-rw-r--r-- | src/modules/evas/engines/gl_drm/evas_drm.c | 32 | ||||
-rw-r--r-- | src/modules/evas/engines/gl_drm/evas_engine.h | 2 |
7 files changed, 107 insertions, 0 deletions
diff --git a/src/lib/ecore_drm/Ecore_Drm.h b/src/lib/ecore_drm/Ecore_Drm.h index 0076dd1ea3..b834b62eba 100644 --- a/src/lib/ecore_drm/Ecore_Drm.h +++ b/src/lib/ecore_drm/Ecore_Drm.h @@ -259,6 +259,11 @@ EAPI void ecore_drm_output_fb_release(Ecore_Drm_Output *output, Ecore_Drm_Fb *fb EAPI void ecore_drm_output_repaint(Ecore_Drm_Output *output); EAPI void ecore_drm_output_size_get(Ecore_Drm_Device *dev, int output, int *w, int *h); +/* This is ugly, will remove after rebaseing on 1.14 */ +EAPI unsigned int ecore_drm_output_crtc_id_get(Ecore_Drm_Output *output); +EAPI void ecore_drm_output_current_fb_info_set(Ecore_Drm_Output *output, unsigned int handle, int w, int h, unsigned int format); +EAPI void ecore_drm_output_current_fb_info_get(Ecore_Drm_Output *output, unsigned int *handle, int *w, int *h, unsigned int *format); + /** * @since 1.12 */ diff --git a/src/lib/ecore_drm/ecore_drm_output.c b/src/lib/ecore_drm/ecore_drm_output.c index 1649db80bc..03a07ae5a0 100644 --- a/src/lib/ecore_drm/ecore_drm_output.c +++ b/src/lib/ecore_drm/ecore_drm_output.c @@ -1033,3 +1033,37 @@ ecore_drm_output_make_get(Ecore_Drm_Output *output) return output->make; } + +EAPI unsigned int +ecore_drm_output_crtc_id_get(Ecore_Drm_Output *output) +{ + EINA_SAFETY_ON_NULL_RETURN_VAL(output, 0); + + return output->crtc_id; +} + +EAPI void +ecore_drm_output_current_fb_info_set(Ecore_Drm_Output *output, unsigned int handle, int w, int h, unsigned int format) +{ + EINA_SAFETY_ON_NULL_RETURN(output); + + output->curr_fb_handle = handle; + output->curr_fb_w = w; + output->curr_fb_h = h; + output->curr_fb_format = format; +} + +EAPI void +ecore_drm_output_current_fb_info_get(Ecore_Drm_Output *output, unsigned int *handle, int *w, int *h, unsigned int *format) +{ + EINA_SAFETY_ON_NULL_RETURN(output); + + if (handle) + *handle = output->curr_fb_handle; + if (w) + *w = output->curr_fb_w; + if (h) + *h = output->curr_fb_h; + if (format) + *format = output->curr_fb_format; +} diff --git a/src/lib/ecore_drm/ecore_drm_private.h b/src/lib/ecore_drm/ecore_drm_private.h index f5e3dadbfc..536f03d32e 100644 --- a/src/lib/ecore_drm/ecore_drm_private.h +++ b/src/lib/ecore_drm/ecore_drm_private.h @@ -136,6 +136,12 @@ struct _Ecore_Drm_Output Ecore_Drm_Fb *current, *next; Ecore_Drm_Fb *dumb[NUM_FRAME_BUFFERS]; Ecore_Drm_Backlight *backlight; + + /* this is ugly */ + unsigned int curr_fb_handle; + int curr_fb_w; + int curr_fb_h; + int curr_fb_format; }; struct _Ecore_Drm_Seat diff --git a/src/modules/evas/engines/drm/evas_drm.c b/src/modules/evas/engines/drm/evas_drm.c index 5d19edcf81..573bff1930 100644 --- a/src/modules/evas/engines/drm/evas_drm.c +++ b/src/modules/evas/engines/drm/evas_drm.c @@ -77,6 +77,22 @@ _evas_drm_outbuf_planes_setup(Outbuf *ob, drmModePlaneResPtr pres) return EINA_TRUE; } +static Ecore_Drm_Output* +_evas_drm_output_find(unsigned int crtc_id) +{ + Ecore_Drm_Device *dev; + Ecore_Drm_Output *output; + Eina_List *devs = ecore_drm_devices_get(); + Eina_List *l, *ll; + + EINA_LIST_FOREACH(devs, l, dev) + EINA_LIST_FOREACH(dev->outputs, ll, output) + if (ecore_drm_output_crtc_id_get(output) == crtc_id) + return output; + + return NULL; +} + Eina_Bool evas_drm_outbuf_setup(Outbuf *ob) { @@ -339,6 +355,16 @@ evas_drm_framebuffer_send(Outbuf *ob, Buffer *buffer) if (ob->vsync) { + if (!ob->output) + { + ob->output = _evas_drm_output_find(ob->priv.crtc); + EINA_SAFETY_ON_NULL_RETURN_VAL(ob->output, EINA_FALSE); + } + + ecore_drm_output_current_fb_info_set(ob->output, buffer->handle, + buffer->w, buffer->h, + DRM_FORMAT_ARGB8888); + if (drmModePageFlip(ob->priv.fd, ob->priv.crtc, buffer->fb, DRM_MODE_PAGE_FLIP_EVENT, ob) < 0) { diff --git a/src/modules/evas/engines/drm/evas_engine.h b/src/modules/evas/engines/drm/evas_engine.h index bc1e5d553c..9c36ec3ca7 100644 --- a/src/modules/evas/engines/drm/evas_engine.h +++ b/src/modules/evas/engines/drm/evas_engine.h @@ -113,6 +113,8 @@ struct _Outbuf Eina_Bool pending_flip : 1; } priv; + Ecore_Drm_Output *output; + Eina_Bool destination_alpha : 1; Eina_Bool vsync : 1; }; diff --git a/src/modules/evas/engines/gl_drm/evas_drm.c b/src/modules/evas/engines/gl_drm/evas_drm.c index b1c4446ce4..19d8594592 100644 --- a/src/modules/evas/engines/gl_drm/evas_drm.c +++ b/src/modules/evas/engines/gl_drm/evas_drm.c @@ -23,6 +23,22 @@ _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_Device *dev; + Ecore_Drm_Output *output; + Eina_List *devs = ecore_drm_devices_get(); + Eina_List *l, *ll; + + EINA_LIST_FOREACH(devs, l, dev) + EINA_LIST_FOREACH(dev->outputs, ll, output) + if (ecore_drm_output_crtc_id_get(output) == crtc_id) + return output; + + return NULL; +} + void evas_drm_outbuf_event_flip(int fd EINA_UNUSED, unsigned int seq EINA_UNUSED, unsigned int sec EINA_UNUSED, unsigned int usec EINA_UNUSED, void *data) { @@ -320,6 +336,22 @@ evas_drm_framebuffer_send(Outbuf *ob, Buffer *buffer) if (ob->vsync) { + uint32_t width, height; + uint32_t format; + + if (!ob->output) + { + ob->output = _evas_drm_output_find(ob->priv.crtc); + EINA_SAFETY_ON_NULL_RETURN_VAL(ob->output, EINA_FALSE); + } + + width = gbm_bo_get_width(buffer->bo); + height = gbm_bo_get_height(buffer->bo); + format = gbm_bo_get_format(buffer->bo); + + ecore_drm_output_current_fb_info_set(ob->output, buffer->handle, + width, height, format); + if (drmModePageFlip(ob->priv.fd, ob->priv.crtc, buffer->fb, DRM_MODE_PAGE_FLIP_EVENT, ob) < 0) { diff --git a/src/modules/evas/engines/gl_drm/evas_engine.h b/src/modules/evas/engines/gl_drm/evas_engine.h index 3970ee7d6d..2d306828bb 100644 --- a/src/modules/evas/engines/gl_drm/evas_engine.h +++ b/src/modules/evas/engines/gl_drm/evas_engine.h @@ -137,6 +137,8 @@ struct _Outbuf Eina_List *planes; Eina_Bool pending_flip : 1; } priv; + + Ecore_Drm_Output *output; }; struct _Context_3D |