ecore_evas_drm: Let ecore_drm2 track pending page flips
authorDerek Foreman <derekf@osg.samsung.com>
Fri, 11 Aug 2017 19:51:30 +0000 (14:51 -0500)
committerDerek Foreman <derekf@osg.samsung.com>
Fri, 11 Aug 2017 22:11:12 +0000 (17:11 -0500)
Since the engines can call the flip functions, we need to protect the
ticker from missing those flips.  Thus, we let ecore_drm2, which obviously
sees all flips, track them.

src/modules/ecore_evas/engines/drm/ecore_evas_drm.c

index f2da72f..80d7807 100644 (file)
@@ -59,7 +59,6 @@ typedef struct _Ecore_Evas_Engine_Drm_Data
    Ecore_Drm2_Device *dev;
    Ecore_Drm2_Output *output;
    Evas_Device *seat;
-   Eina_Bool pending : 1;
    Eina_Bool ticking : 1;
    Eina_Bool once : 1;
 } Ecore_Evas_Engine_Drm_Data;
@@ -608,8 +607,6 @@ _cb_pageflip(int fd EINA_UNUSED, unsigned int frame EINA_UNUSED, unsigned int se
 
    ret = ecore_drm2_fb_flip_complete(edata->output);
 
-   edata->pending = EINA_FALSE;
-
    if (edata->ticking)
      {
         double t = (double)sec + ((double)usec / 1000000);
@@ -618,10 +615,7 @@ _cb_pageflip(int fd EINA_UNUSED, unsigned int frame EINA_UNUSED, unsigned int se
         ecore_evas_animator_tick(ee, NULL, t - edata->offset);
      }
    else if (ret)
-     {
-        edata->pending = EINA_TRUE;
-        ecore_drm2_fb_flip(NULL, edata->output);
-     }
+     ecore_drm2_fb_flip(NULL, edata->output);
 }
 
 static void
@@ -632,11 +626,8 @@ _drm_evas_changed(Ecore_Evas *ee, Eina_Bool changed)
    if (changed) return;
 
    edata = ee->engine.data;
-   if (edata->ticking && !edata->pending)
-     {
-        edata->pending = EINA_TRUE;
-        ecore_drm2_fb_flip(NULL, edata->output);
-     }
+   if (edata->ticking && !ecore_drm2_output_pending_get(edata->output))
+     ecore_drm2_fb_flip(NULL, edata->output);
 }
 
 static void
@@ -679,11 +670,8 @@ _drm_animator_register(Ecore_Evas *ee)
           }
      }
 
-   if (!edata->pending && !ee->in_async_render)
-     {
-        edata->pending = EINA_TRUE;
-        ecore_drm2_fb_flip(NULL, edata->output);
-     }
+   if (!ecore_drm2_output_pending_get(edata->output) && !ee->in_async_render)
+     ecore_drm2_fb_flip(NULL, edata->output);
 }
 
 static void