evas-gl-drm: block the pageflip for hwc at enlightenment. 08/59808/1
authorSooChan Lim <sc1.lim@samsung.com>
Thu, 18 Feb 2016 23:25:59 +0000 (08:25 +0900)
committerSooChan Lim <sc1.lim@samsung.com>
Thu, 18 Feb 2016 23:29:31 +0000 (08:29 +0900)
When the enlightenment set up the hwc(hardware compositing),
gl_drm engine does not display the ecore_evas canvas on a display.
Enlightenment will do it.

Change-Id: I562d1349d22e02b25d89c3093f89a15e86e157d3

src/modules/evas/engines/gl_drm/Evas_Engine_GL_Drm.h
src/modules/evas/engines/gl_drm/evas_engine.c
src/modules/evas/engines/gl_drm/evas_outbuf.c

index 71ab60c..4238ba3 100644 (file)
@@ -26,6 +26,12 @@ struct _Evas_Engine_Info_GL_Drm
      {
         struct gbm_device *gbm;
 
+        /* HWC: for hwc */
+        struct gbm_surface *surface;
+        Eina_Bool wait_for_showup : 1;
+        Eina_Bool outbuf_flushed : 1;
+        Eina_Bool hwc_enable : 1;
+
         unsigned int rotation, depth;
         unsigned int crtc_id, conn_id, buffer_id;
         unsigned int format, flags;
index 7981b58..30f9b5e 100644 (file)
@@ -395,6 +395,9 @@ evgl_eng_native_window_create(void *data)
         return NULL;
      }
 
+   /* HWC: set the gbm_surface to the engine info */
+   if (info->info.hwc_enable) info->info.surface =  surface;
+
    return (void *)surface;
 }
 
index 839bb9d..be2299d 100644 (file)
@@ -425,6 +425,9 @@ evas_outbuf_new(Evas_Engine_Info_GL_Drm *info, int w, int h, Render_Engine_Swap_
         return NULL;
      }
 
+   /* HWC: set the gbm_surface to the engine_info */
+   if (info->info.hwc_enable) info->info.surface =  ob->surface;
+
    return ob;
 }
 
@@ -806,29 +809,39 @@ evas_outbuf_flush(Outbuf *ob, Tilebuf_Rect *rects, Evas_Render_Mode render_mode)
    if (ob->info->callback.post_swap)
      ob->info->callback.post_swap(ob->info->callback.data, ob->evas);
 
-   if (rects)
+   /* HWC: do not display the ecore_evas at gl_drm engine
+           hwc at enlightenment will update the display device */
+   if (ob->info->info.hwc_enable)
      {
-        Tilebuf_Rect *r;
-        Eina_Rectangle *res;
-        int num, i = 0;
-
-        num = eina_inlist_count(EINA_INLIST_GET(rects));
-        res = alloca(sizeof(Eina_Rectangle) * num);
-        EINA_INLIST_FOREACH(EINA_INLIST_GET(rects), r)
-          {
-             res[i].x = r->x;
-             res[i].y = r->y;
-             res[i].w = r->w;
-             res[i].h = r->h;
-             i++;
-          }
-
-        _evas_outbuf_buffer_swap(ob, res, num);
+        /* The pair of evas_outbuf_flush and post_render has to be matched */
+        ob->info->info.outbuf_flushed = EINA_TRUE;
+        INF("HWC: evas outbuf flushed");
      }
    else
-     //Flush GL Surface data to Framebuffer
-     _evas_outbuf_buffer_swap(ob, NULL, 0);
+     {
+        if (rects)
+          {
+             Tilebuf_Rect *r;
+             Eina_Rectangle *res;
+             int num, i = 0;
 
+             num = eina_inlist_count(EINA_INLIST_GET(rects));
+             res = alloca(sizeof(Eina_Rectangle) * num);
+             EINA_INLIST_FOREACH(EINA_INLIST_GET(rects), r)
+               {
+                  res[i].x = r->x;
+                  res[i].y = r->y;
+                  res[i].w = r->w;
+                  res[i].h = r->h;
+                  i++;
+               }
+
+             _evas_outbuf_buffer_swap(ob, res, num);
+          }
+        else
+          //Flush GL Surface data to Framebuffer
+          _evas_outbuf_buffer_swap(ob, NULL, 0);
+     }
    ob->priv.frame_cnt++;
 
 end: