summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDerek Foreman <derekf@osg.samsung.com>2017-07-28 09:40:40 -0500
committerDerek Foreman <derekf@osg.samsung.com>2017-07-28 10:41:11 -0500
commit8e500c683549e8d3afe78657c4582560a5c75eba (patch)
tree50980e4ca653cd4b9b868eaaa2928cf33baa0721
parent2efa25511f04dc2cb278471aa041e0e24ffa13f0 (diff)
downloadefl-8e500c683549e8d3afe78657c4582560a5c75eba.tar.gz
ecore_drm2: Allow picking a sequence number for blanktime_get
This lets us do a blocking wait for a vsync. Something we should try to do as infrequently as possible, but in some cases we need it one time at startup to catch graphics driver bugs.
-rw-r--r--src/lib/ecore_drm2/Ecore_Drm2.h9
-rw-r--r--src/lib/ecore_drm2/ecore_drm2_outputs.c3
-rw-r--r--src/modules/ecore_evas/engines/drm/ecore_evas_drm.c2
3 files changed, 10 insertions, 4 deletions
diff --git a/src/lib/ecore_drm2/Ecore_Drm2.h b/src/lib/ecore_drm2/Ecore_Drm2.h
index 4be533bc66..450f1faa0c 100644
--- a/src/lib/ecore_drm2/Ecore_Drm2.h
+++ b/src/lib/ecore_drm2/Ecore_Drm2.h
@@ -1079,15 +1079,20 @@ EAPI void ecore_drm2_fb_status_handler_set(Ecore_Drm2_Fb *fb, Ecore_Drm2_Fb_Stat
/**
* Get the time of the last vblank
*
- * Query the display hardware for the time of the last vblank.
+ * Query the display hardware for the time of a vblank, potentially blocking.
+ *
+ * If sequence is 0 the time of the last vblank will be immediately returned,
+ * if it's above zero that number of vblanks will pass before the function
+ * returns.
*
* @param output
+ * @param sequence
* @param sec
* @param usec
*
* @since 1.20
*/
-EAPI Eina_Bool ecore_drm2_output_blanktime_get(Ecore_Drm2_Output *output, long *sec, long *usec);
+EAPI Eina_Bool ecore_drm2_output_blanktime_get(Ecore_Drm2_Output *output, int sequence, long *sec, long *usec);
# endif
diff --git a/src/lib/ecore_drm2/ecore_drm2_outputs.c b/src/lib/ecore_drm2/ecore_drm2_outputs.c
index d2b3acb54b..fba4be0c8d 100644
--- a/src/lib/ecore_drm2/ecore_drm2_outputs.c
+++ b/src/lib/ecore_drm2/ecore_drm2_outputs.c
@@ -1584,7 +1584,7 @@ ecore_drm2_output_subpixel_get(const Ecore_Drm2_Output *output)
}
EAPI Eina_Bool
-ecore_drm2_output_blanktime_get(Ecore_Drm2_Output *output, long *sec, long *usec)
+ecore_drm2_output_blanktime_get(Ecore_Drm2_Output *output, int sequence, long *sec, long *usec)
{
drmVBlank v;
int ret;
@@ -1595,6 +1595,7 @@ ecore_drm2_output_blanktime_get(Ecore_Drm2_Output *output, long *sec, long *usec
memset(&v, 0, sizeof(v));
v.request.type = DRM_VBLANK_RELATIVE;
+ v.request.sequence = sequence;
ret = sym_drmWaitVBlank(output->fd, &v);
if (ret) return EINA_FALSE;
if (v.reply.tval_sec < 0) return EINA_FALSE;
diff --git a/src/modules/ecore_evas/engines/drm/ecore_evas_drm.c b/src/modules/ecore_evas/engines/drm/ecore_evas_drm.c
index dd46ce00d0..302048c3b9 100644
--- a/src/modules/ecore_evas/engines/drm/ecore_evas_drm.c
+++ b/src/modules/ecore_evas/engines/drm/ecore_evas_drm.c
@@ -680,7 +680,7 @@ _drm_last_tick_get(Ecore_Evas *ee)
long sec, usec;
edata = ee->engine.data;
- if (!ecore_drm2_output_blanktime_get(edata->output, &sec, &usec))
+ if (!ecore_drm2_output_blanktime_get(edata->output, 0, &sec, &usec))
return -1.0;
return sec + usec / 1000000.0;