summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBoram Park <boram1288.park@samsung.com>2015-06-02 15:35:29 +0900
committerBoram Park <boram1288.park@samsung.com>2015-06-08 13:09:08 +0900
commit6107d86a8d98b21f53f0e9f7c9b1c5e332d01f39 (patch)
treec13c5fd1d6dd59f636bf1a479fa287a5f3132e7c
parent1998c1a7aee24a48d4e7c786ae6235d9e61c01b9 (diff)
downloadefl-6107d86a8d98b21f53f0e9f7c9b1c5e332d01f39.tar.gz
ecore_drm_output keeps current fb information
Change-Id: I9fe62a5eea81c457dc2411ec057a9a52de29d547
-rw-r--r--src/lib/ecore_drm/Ecore_Drm.h5
-rw-r--r--src/lib/ecore_drm/ecore_drm_output.c34
-rw-r--r--src/lib/ecore_drm/ecore_drm_private.h6
-rw-r--r--src/modules/evas/engines/drm/evas_drm.c26
-rw-r--r--src/modules/evas/engines/drm/evas_engine.h2
-rw-r--r--src/modules/evas/engines/gl_drm/evas_drm.c32
-rw-r--r--src/modules/evas/engines/gl_drm/evas_engine.h2
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