e_output: separate compositor rendering and output commit 41/90641/2 accepted/tizen/common/20161004.194319
authorChangyeon Lee <cyeon.lee@samsung.com>
Fri, 30 Sep 2016 07:33:07 +0000 (16:33 +0900)
committerGwanglim Lee <gl77.lee@samsung.com>
Tue, 4 Oct 2016 10:33:40 +0000 (03:33 -0700)
e_output try to render and commit in idle callback.
e_plane_renderer use eventfd and if compositor enqueue surface,
event fd is writed for calling idle callback in acquirable cb

Change-Id: I5723cd0af8406dfb176ed4157823e5b6082b9dfe

src/bin/e_comp_screen.c
src/bin/e_output.c
src/bin/e_output.h
src/bin/e_plane.c
src/bin/e_plane.h
src/bin/e_plane_renderer.c
src/bin/e_plane_renderer.h

index 6018b6e..7ac56c5 100644 (file)
@@ -137,10 +137,11 @@ _e_comp_screen_commit_idle_cb(void *data EINA_UNUSED)
         if (!output->config.enabled) continue;
 
         if (!e_output_commit(output))
-          {
-             ERR("fail to e_comp_screen->outputs.");
-             continue;
-          }
+             ERR("fail to commit e_comp_screen->outputs.");
+
+        if (!e_output_render(output))
+             ERR("fail to render e_comp_screen->outputs.");
+
      }
 
 end:
index efeb79c..95fe171 100644 (file)
@@ -78,6 +78,8 @@ _e_output_commit_hanler(tdm_output *output, unsigned int sequence,
 
    _e_output_update_fps();
 
+   TRACE_DS_ASYNC_END((unsigned int)output, "[OUTPUT:COMMIT~HANDLER]");
+
    EINA_LIST_FOREACH_SAFE(data_list, l, ll, data)
      {
         data_list = eina_list_remove_list(data_list, l);
@@ -102,10 +104,13 @@ _e_output_commit(E_Output *output)
         data_list = eina_list_append(data_list, data);
      }
 
+   TRACE_DS_ASYNC_BEGIN((unsigned int)output->toutput, "[OUTPUT:COMMIT~HANDLER]");
+
    error = tdm_output_commit(output->toutput, 0, _e_output_commit_hanler, data_list);
    if (error != TDM_ERROR_NONE)
      {
         ERR("fail to tdm_output_commit");
+        TRACE_DS_ASYNC_END((unsigned int)output->toutput, "[OUTPUT:COMMIT~HANDLER]");
         EINA_LIST_FOREACH_SAFE(data_list, l, ll, data)
           {
              data_list = eina_list_remove_list(data_list, l);
@@ -766,6 +771,26 @@ e_output_drm_update(E_Output *eout)
 }
 
 EINTERN Eina_Bool
+e_output_render(E_Output *output)
+{
+   E_Plane *plane = NULL;
+   Eina_List *l;
+
+   EINA_SAFETY_ON_NULL_RETURN_VAL(output, EINA_FALSE);
+
+   EINA_LIST_REVERSE_FOREACH(output->planes, l, plane)
+     {
+        if (!e_plane_render(plane))
+         {
+            ERR("fail to e_plane_render.");
+            return EINA_FALSE;
+         }
+     }
+
+  return EINA_TRUE;
+}
+
+EINTERN Eina_Bool
 e_output_commit(E_Output *output)
 {
    E_Plane *plane = NULL;
index b6e9abe..db8b7d1 100644 (file)
@@ -71,6 +71,7 @@ EINTERN Eina_Bool         e_output_update(E_Output *output);
 EINTERN Eina_Bool         e_output_drm_update(E_Output *output);
 EINTERN Eina_Bool         e_output_mode_apply(E_Output *output, E_Output_Mode *mode);
 EINTERN Eina_Bool         e_output_commit(E_Output *output);
+EINTERN Eina_Bool         e_output_render(E_Output *output);
 EINTERN Eina_Bool         e_output_hwc_setup(E_Output *output);
 EINTERN E_Output_Mode   * e_output_best_mode_find(E_Output *output);
 EINTERN Eina_Bool         e_output_connected(E_Output *output);
index 192082e..5811fb4 100644 (file)
@@ -238,13 +238,23 @@ _e_plane_surface_from_client_acquire_reserved(E_Plane *plane)
    E_Plane_Renderer *renderer = plane->renderer;
    E_Plane_Renderer_Client *renderer_client = NULL;
 
-   if (plane_trace_debug)
-     ELOGF("E_PLANE", "Plane:%p Display Client", ec->pixmap, ec, plane);
-
    /* check the ec is set to the renderer */
    renderer_client = e_plane_renderer_client_get(ec);
    EINA_SAFETY_ON_NULL_RETURN_VAL(renderer_client, NULL);
 
+   if (!e_comp_object_hwc_update_exists(ec->frame)) return NULL;
+
+   e_comp_object_hwc_update_set(ec->frame, EINA_FALSE);
+
+   if (plane_trace_debug)
+     ELOGF("E_PLANE", "Plane:%p Display Client", ec->pixmap, ec, plane);
+
+   if (!e_plane_renderer_surface_queue_clear(renderer))
+     {
+        ERR("fail to e_plane_renderer_surface_queue_clear");
+        return NULL;
+     }
+
     /* acquire the surface from the client_queue */
    tsurface = e_plane_renderer_client_surface_recieve(renderer_client);
    if (!tsurface)
@@ -293,11 +303,16 @@ _e_plane_surface_from_client_acquire(E_Plane *plane)
    E_Comp_Wl_Buffer *buffer = e_pixmap_resource_get(pixmap);
    E_Comp_Wl_Data *wl_comp_data = (E_Comp_Wl_Data *)e_comp->wl_comp_data;
    tbm_surface_h tsurface = NULL;
+   E_Plane_Renderer *renderer = plane->renderer;
+
+   EINA_SAFETY_ON_NULL_RETURN_VAL(buffer, NULL);
+
+   if (!e_comp_object_hwc_update_exists(ec->frame)) return NULL;
 
    if (plane_trace_debug)
      ELOGF("E_PLANE", "Display Client Plane(%p)", pixmap, ec, plane);
 
-   EINA_SAFETY_ON_NULL_RETURN_VAL(buffer, NULL);
+   e_comp_object_hwc_update_set(ec->frame, EINA_FALSE);
 
    tsurface = wayland_tbm_server_get_surface(wl_comp_data->tbm.server, buffer->resource);
    if (!tsurface)
@@ -352,15 +367,13 @@ _e_plane_surface_from_ecore_evas_acquire(E_Plane *plane)
            WRN("fail to set the dpms on.");
      }
 
-   if (plane_trace_debug)
-      ELOGF("E_PLANE", "Display Canvas Plane(%p)", NULL, NULL, plane);
-
    /* aquire */
    tsurface = e_plane_renderer_surface_queue_acquire(plane->renderer);
-   if (!tsurface)
+
+   if (tsurface)
      {
-        ERR("tsurface is NULL");
-        return NULL;
+        if (plane_trace_debug)
+           ELOGF("E_PLANE", "Display Canvas Plane(%p)", NULL, NULL, plane);
      }
 
    return tsurface;
@@ -585,6 +598,26 @@ e_plane_hwc_setup(E_Plane *plane)
 }
 
 EINTERN Eina_Bool
+e_plane_render(E_Plane *plane)
+{
+   E_Plane_Renderer *renderer = NULL;
+
+   EINA_SAFETY_ON_NULL_RETURN_VAL(plane, EINA_FALSE);
+
+   renderer = plane->renderer;
+   if (!renderer) return EINA_TRUE;
+   if (plane->ec) return EINA_TRUE;
+
+   if (!e_plane_renderer_render(renderer, plane->is_fb))
+     {
+        ERR("fail to e_plane_renderer_render");
+        return EINA_FALSE;
+     }
+
+   return EINA_TRUE;
+}
+
+EINTERN Eina_Bool
 e_plane_fetch(E_Plane *plane)
 {
    tbm_surface_h tsurface = NULL;
@@ -607,12 +640,11 @@ e_plane_fetch(E_Plane *plane)
         return EINA_TRUE;
      }
 
+   if (plane->pending_commit_data)
+      return EINA_FALSE;
+
    if (plane->is_fb && !plane->ec)
      {
-        /* renderer */
-        if (!e_plane_renderer_render(plane->renderer, EINA_TRUE))
-          return EINA_FALSE;
-
         /* acquire the surface */
         tsurface = _e_plane_surface_from_ecore_evas_acquire(plane);
      }
@@ -620,10 +652,6 @@ e_plane_fetch(E_Plane *plane)
      {
         if (!plane->ec) return EINA_FALSE;
 
-        /* renderer */
-        if (!e_plane_renderer_render(plane->renderer, EINA_FALSE))
-          return EINA_FALSE;
-
         /* acquire the surface */
         if (plane->reserved_memory)
           tsurface = _e_plane_surface_from_client_acquire_reserved(plane);
@@ -631,6 +659,8 @@ e_plane_fetch(E_Plane *plane)
           tsurface = _e_plane_surface_from_client_acquire(plane);
      }
 
+   if (!tsurface) return EINA_FALSE;
+
    e_plane_renderer_previous_surface_set(plane->renderer, plane->tsurface);
    plane->tsurface = tsurface;
 
@@ -670,6 +700,8 @@ e_plane_unfetch(E_Plane *plane)
 
    displaying_tsurface = e_plane_renderer_displaying_surface_get(plane->renderer);
 
+   plane->tsurface = displaying_tsurface;
+
    /* set plane info and set prevous tsurface to the plane */
    if (!_e_plane_surface_set(plane, displaying_tsurface))
      {
@@ -705,7 +737,6 @@ e_plane_commit_data_aquire(E_Plane *plane)
         e_plane_renderer_pending_set(plane->renderer, EINA_TRUE);
         plane->pending_commit_data = data;
 
-        e_plane_renderer_ee_update_ban(plane->renderer, EINA_TRUE);
         return data;
      }
    else
@@ -791,9 +822,6 @@ e_plane_commit_data_release(E_Plane_Commit_Data *data)
                 e_plane_renderer_surface_queue_release(plane->renderer, displaying_tsurface);
           }
 
-        if (!plane->ec)
-          e_plane_renderer_ee_update_ban(plane->renderer, EINA_FALSE);
-
         e_comp_wl_buffer_reference(&plane->displaying_buffer_ref, NULL);
         e_plane_renderer_displaying_surface_set(renderer, tsurface);
      }
@@ -868,11 +896,13 @@ e_plane_reserved_set(E_Plane *plane, Eina_Bool set)
              if (plane->is_fb)
                {
                   e_plane_renderer_ecore_evas_use(plane->renderer);
+                  plane->ec = NULL;
                }
              else
                {
                   e_plane_renderer_del(renderer);
                   plane->renderer = NULL;
+                  plane->ec = NULL;
                }
           }
      }
@@ -948,9 +978,6 @@ e_plane_ec_set(E_Plane *plane, E_Client *ec)
         if (plane->reserved_memory)
            _e_plane_surface_send_dequeuable_surfaces(plane);
 
-        if (plane->is_fb)
-          e_plane_renderer_ee_update_ban(plane->renderer, EINA_TRUE);
-
         e_comp_object_hwc_update_set(ec->frame, EINA_TRUE);
      }
    else
@@ -970,9 +997,6 @@ e_plane_ec_set(E_Plane *plane, E_Client *ec)
                  ERR("failed to use ecore_evas plane:%p", plane);
                  return EINA_FALSE;
                }
-
-             if (plane->ec)
-                e_plane_renderer_ee_update_ban(plane->renderer, EINA_FALSE);
           }
      }
 
index ceb9614..0363839 100644 (file)
@@ -91,6 +91,7 @@ EINTERN void                 e_plane_commit_data_release(E_Plane_Commit_Data *da
 EINTERN Eina_Bool            e_plane_is_reserved(E_Plane *plane);
 EINTERN void                 e_plane_reserved_set(E_Plane *plane, Eina_Bool set);
 EINTERN void                 e_plane_hwc_trace_debug(Eina_Bool onoff);
+EINTERN Eina_Bool            e_plane_render(E_Plane *plane);
 
 E_API Eina_Bool              e_plane_type_set(E_Plane *plane, E_Plane_Type type);
 E_API E_Plane_Type           e_plane_type_get(E_Plane *plane);
index 72f9217..6768e8b 100644 (file)
@@ -7,6 +7,7 @@
 # include <tbm_surface_internal.h>
 # include <wayland-tbm-server.h>
 # include <Evas_Engine_GL_Drm.h>
+# include <sys/eventfd.h>
 
 # define E_PLANE_RENDERER_CLIENT_SURFACE_FLAGS_RESERVED 7777
 
@@ -238,6 +239,29 @@ _e_plane_renderer_surface_find_disp_surface(E_Plane_Renderer *renderer, tbm_surf
 }
 
 static void
+_e_plane_renderer_cb_acquirable(tbm_surface_queue_h surface_queue, void *data)
+{
+    E_Plane_Renderer *renderer = (E_Plane_Renderer *)data;
+    int ret;
+    uint64_t value = 1;
+
+    EINA_SAFETY_ON_NULL_RETURN(renderer);
+
+    pthread_mutex_lock(&renderer->event_lock);
+
+    if (!renderer->ee) goto end;
+    if (renderer->event_fd < 0) goto end;
+    if (!renderer->event_hdlr) goto end;
+
+    ret = write(renderer->event_fd, &value, sizeof(value));
+    if (ret == -1)
+       ERR("failed to send acquirable event:%m");
+
+end:
+    pthread_mutex_unlock(&renderer->event_lock);
+}
+
+static void
 _e_plane_renderer_exported_surface_release(E_Plane_Renderer *renderer, tbm_surface_h tsurface)
 {
    tbm_surface_h tmp_tsurface = NULL;
@@ -383,17 +407,6 @@ _e_plane_renderer_surface_exported_surface_destroy_cb(tbm_surface_h tsurface, vo
 }
 
 static void
-_e_plane_renderer_ee_post_render_cb(void *data, Evas *e EINA_UNUSED, void *event_info EINA_UNUSED)
-{
-   E_Plane_Renderer *renderer = data;
-
-   if (!renderer) return;
-
-   /* mark when the post_render is called */
-   renderer->update_ee = EINA_TRUE;
-}
-
-static void
 _e_plane_renderer_surface_release_all_disp_surfaces(E_Plane_Renderer *renderer)
 {
    Eina_List *l_s;
@@ -457,6 +470,33 @@ e_plane_renderer_shutdown(void)
   ;
 }
 
+static Eina_Bool
+_e_plane_renderer_cb_queue_acquirable_event(void *data, Ecore_Fd_Handler *fd_handler)
+{
+   E_Plane *plane = (E_Plane *)data;
+   E_Plane_Renderer *renderer = NULL;
+   char buffer[64];
+   int len;
+
+   if (!plane) return ECORE_CALLBACK_RENEW;
+
+   renderer = plane->renderer;
+
+   if (!renderer) return ECORE_CALLBACK_RENEW;
+   if (renderer->event_fd < 0) return ECORE_CALLBACK_RENEW;
+   if (plane->ec) return ECORE_CALLBACK_RENEW;
+
+   pthread_mutex_lock(&renderer->event_lock);
+
+   len = read(renderer->event_fd, buffer, sizeof(buffer));
+   if (len == -1)
+      ERR("failed to read queue acquire event fd:%m");
+
+   pthread_mutex_unlock(&renderer->event_lock);
+
+   return ECORE_CALLBACK_RENEW;
+}
+
 EINTERN E_Plane_Renderer *
 e_plane_renderer_new(E_Plane *plane)
 {
@@ -468,13 +508,16 @@ e_plane_renderer_new(E_Plane *plane)
    renderer = E_NEW(E_Plane_Renderer, 1);
    EINA_SAFETY_ON_NULL_RETURN_VAL(renderer, NULL);
    renderer->plane = plane;
+   renderer->event_fd = -1;
 
    if (plane->is_fb)
      {
         renderer->ee = e_comp->ee;
         renderer->evas = ecore_evas_get(renderer->ee);
-        evas_event_callback_add(renderer->evas, EVAS_CALLBACK_RENDER_POST, _e_plane_renderer_ee_post_render_cb, renderer);
         ecore_evas_manual_render_set(renderer->ee, 1);
+        renderer->event_fd = eventfd(0, EFD_NONBLOCK);
+        renderer->event_hdlr = ecore_main_fd_handler_add(renderer->event_fd, ECORE_FD_READ,
+                               _e_plane_renderer_cb_queue_acquirable_event, plane, NULL, NULL);
      }
 
    return renderer;
@@ -588,7 +631,22 @@ e_plane_renderer_del(E_Plane_Renderer *renderer)
    EINA_SAFETY_ON_NULL_RETURN(plane);
 
    if (renderer->ee)
-      WRN("Delete renderer for canvas");
+     {
+        WRN("Delete renderer for canvas");
+
+        pthread_mutex_lock(&renderer->event_lock);
+
+        if (renderer->event_hdlr)
+           ecore_main_fd_handler_del(renderer->event_hdlr);
+
+        if (renderer->event_fd)
+          {
+             close(renderer->event_fd);
+             renderer->event_fd = -1;
+          }
+
+        pthread_mutex_unlock(&renderer->event_lock);
+     }
 
    if (plane->reserved_memory)
      {
@@ -597,14 +655,12 @@ e_plane_renderer_del(E_Plane_Renderer *renderer)
      }
 
    free(renderer);
+   plane->renderer = NULL;
 }
 
 EINTERN Eina_Bool
 e_plane_renderer_render(E_Plane_Renderer *renderer, Eina_Bool is_fb)
 {
-   Evas_Engine_Info_GL_Drm *einfo = NULL;
-   E_Comp_Wl_Buffer *buffer = NULL;
-
    EINA_SAFETY_ON_NULL_RETURN_VAL(renderer, EINA_FALSE);
 
    if (is_fb)
@@ -614,61 +670,17 @@ e_plane_renderer_render(E_Plane_Renderer *renderer, Eina_Bool is_fb)
              if (renderer_trace_debug)
                ELOGF("E_PLANE_RENDERER", "Canvas norender is set. No Display.", NULL, NULL);
 
-             return EINA_FALSE;
+             return EINA_TRUE;
           }
 
         /* render the ecore_evas and
            update_ee is to be true at post_render_cb when the render is successful. */
-        ecore_evas_manual_render(renderer->ee);
-
-        /* check the post_render is called */
-        if (!renderer->update_ee)
-        {
-          if (renderer_trace_debug)
-             ELOGF("E_PLANE_RENDERER", "Post Render callback was not called. Nothing Display.", NULL, NULL);
-          return EINA_FALSE;
-        }
+        TRACE_DS_BEGIN("MANUAL RENDER");
 
-        /* make the update_ee to be true (reset) */
-        renderer->update_ee = EINA_FALSE;
+        if (e_plane_renderer_surface_queue_can_dequeue(renderer) || !renderer->tqueue)
+           ecore_evas_manual_render(renderer->ee);
 
-        einfo = (Evas_Engine_Info_GL_Drm *)evas_engine_info_get(e_comp->evas);
-        if (!einfo) return EINA_FALSE;
-
-        /* check outbuf flushed or not */
-        if (!einfo->info.outbuf_flushed)
-          {
-             if (renderer_trace_debug)
-                ELOGF("E_PLANE_RENDERER", "Post Render done, But No EGLSwapBuffers!. Nothing Display.", NULL, NULL);
-
-             return EINA_FALSE;
-          }
-
-        /* uncheck the outbuf_flushed flag */
-        einfo->info.outbuf_flushed = EINA_FALSE;
-     }
-   else
-     {
-        if (!renderer->ec) return EINA_FALSE;
-
-        if (!e_comp_object_hwc_update_exists(renderer->ec->frame)) return EINA_FALSE;
-
-        if (renderer->pending)
-          {
-             if (renderer_trace_debug)
-               ELOGF("E_PLANE_RENDERER", "HWC update exist but plane is pending.", NULL, NULL);
-
-             return EINA_FALSE;
-          }
-
-        e_comp_object_hwc_update_set(renderer->ec->frame, EINA_FALSE);
-
-        buffer = e_pixmap_resource_get(renderer->ec->pixmap);
-        if (!buffer)
-          {
-             ERR("buffer is null.");
-             return EINA_FALSE;
-          }
+        TRACE_DS_END();
      }
 
    return EINA_TRUE;
@@ -695,6 +707,13 @@ e_plane_renderer_activate(E_Plane_Renderer *renderer, E_Client *ec)
      {
         if (renderer->state == E_PLANE_RENDERER_STATE_NONE)
            {
+              /* check dequeuable */
+              if (!e_plane_renderer_surface_queue_can_dequeue(renderer))
+                {
+                  INF("There is any dequeuable surface.");
+                  return EINA_FALSE;
+                }
+
               wayland_tbm_server_client_queue_activate(cqueue, 0);
            }
         else if ((renderer->state == E_PLANE_RENDERER_STATE_CANDIDATE) && (renderer->ec != ec))
@@ -702,6 +721,13 @@ e_plane_renderer_activate(E_Plane_Renderer *renderer, E_Client *ec)
               /* deactive the candidate_ec */
               e_plane_renderer_deactivate(renderer);
 
+              /* check dequeuable */
+              if (!e_plane_renderer_surface_queue_can_dequeue(renderer))
+                {
+                  INF("There is any dequeuable surface.");
+                  return EINA_FALSE;
+                }
+
               /* activate the client queue */
               wayland_tbm_server_client_queue_activate(cqueue, 0);
            }
@@ -716,13 +742,6 @@ e_plane_renderer_activate(E_Plane_Renderer *renderer, E_Client *ec)
               return EINA_FALSE;
            }
 
-        /* check dequeuable */
-        if (!e_plane_renderer_surface_queue_can_dequeue(renderer))
-          {
-             INF("There is any dequeuable surface.");
-             return EINA_FALSE;
-          }
-
         /* dequeue */
         tsurface = e_plane_renderer_surface_queue_dequeue(renderer);
         if (!tsurface)
@@ -743,9 +762,6 @@ e_plane_renderer_activate(E_Plane_Renderer *renderer, E_Client *ec)
         renderer_client->state = E_PLANE_RENDERER_CLIENT_STATE_CANDIDATED;
         renderer_client->renderer = renderer;
 
-        if (!e_plane_renderer_surface_queue_can_dequeue(renderer))
-           e_plane_renderer_ee_update_ban(renderer, EINA_TRUE);
-
         INF("ec does not have the scanout surface.");
 
         return EINA_FALSE;
@@ -831,22 +847,6 @@ e_plane_renderer_state_get(E_Plane_Renderer *renderer)
 }
 
 EINTERN void
-e_plane_renderer_ee_update_ban(E_Plane_Renderer *renderer, Eina_Bool set)
-{
-   Evas_Engine_Info_GL_Drm *einfo = NULL;
-
-   EINA_SAFETY_ON_NULL_RETURN(renderer);
-
-   einfo = (Evas_Engine_Info_GL_Drm *)evas_engine_info_get(e_comp->evas);
-   EINA_SAFETY_ON_NULL_RETURN(einfo);
-
-   einfo->info.wait_for_showup = set;
-
-   if (renderer_trace_debug)
-      ELOGF("E_PLANE_RENDERER", "Ban the ee update : %s", NULL, NULL, set?"TRUE":"FALSE");
-}
-
-EINTERN void
 e_plane_renderer_update_exist_set(E_Plane_Renderer *renderer, Eina_Bool update_exist)
 {
    EINA_SAFETY_ON_NULL_RETURN(renderer);
@@ -1023,6 +1023,7 @@ EINTERN Eina_Bool
 e_plane_renderer_surface_queue_set(E_Plane_Renderer *renderer, tbm_surface_queue_h tqueue)
 {
    tbm_surface_h tsurface = NULL;
+   tbm_surface_queue_error_e tsq_err = TBM_SURFACE_QUEUE_ERROR_NONE;
 
    EINA_SAFETY_ON_NULL_RETURN_VAL(renderer, EINA_FALSE);
    EINA_SAFETY_ON_NULL_RETURN_VAL(tqueue, EINA_FALSE);
@@ -1053,6 +1054,16 @@ e_plane_renderer_surface_queue_set(E_Plane_Renderer *renderer, tbm_surface_queue
 
    _e_plane_renderer_surface_release_all_disp_surfaces(renderer);
 
+   if (renderer->ee)
+     {
+        tsq_err = tbm_surface_queue_add_acquirable_cb(renderer->tqueue, _e_plane_renderer_cb_acquirable, (void *)renderer);
+        if (tsq_err != TBM_SURFACE_QUEUE_ERROR_NONE)
+          {
+             ERR("fail to add dequeuable cb");
+             return EINA_FALSE;
+          }
+     }
+
    return EINA_TRUE;
 }
 
@@ -1084,7 +1095,7 @@ e_plane_renderer_surface_queue_acquire(E_Plane_Renderer *renderer)
    tqueue = renderer->tqueue;
    EINA_SAFETY_ON_NULL_RETURN_VAL(tqueue, NULL);
 
-   if (tbm_surface_queue_can_acquire(tqueue, 1))
+   if (tbm_surface_queue_can_acquire(tqueue, 0))
      {
         tsq_err = tbm_surface_queue_acquire(tqueue, &tsurface);
         if (tsq_err != TBM_SURFACE_QUEUE_ERROR_NONE)
@@ -1093,6 +1104,10 @@ e_plane_renderer_surface_queue_acquire(E_Plane_Renderer *renderer)
              return NULL;
           }
      }
+   else
+     {
+        return NULL;
+     }
 
    /* if not exist, add the surface to the renderer */
    if (!_e_plane_renderer_surface_find_disp_surface(renderer, tsurface))
@@ -1226,6 +1241,31 @@ e_plane_renderer_surface_queue_dequeue(E_Plane_Renderer *renderer)
    return tsurface;
 }
 
+EINTERN Eina_Bool
+e_plane_renderer_surface_queue_clear(E_Plane_Renderer *renderer)
+{
+   tbm_surface_queue_h tqueue = NULL;
+   tbm_surface_queue_error_e tsq_err = TBM_SURFACE_QUEUE_ERROR_NONE;
+   tbm_surface_h tsurface = NULL;
+
+   tqueue = renderer->tqueue;
+   EINA_SAFETY_ON_NULL_RETURN_VAL(tqueue, EINA_FALSE);
+
+   while (tbm_surface_queue_can_acquire(tqueue, 0))
+     {
+        tsq_err = tbm_surface_queue_acquire(tqueue, &tsurface);
+        if (tsq_err != TBM_SURFACE_QUEUE_ERROR_NONE)
+          {
+             ERR("Failed to acquire tbm_surface from tbm_surface_queue(%p): tsq_err = %d", tqueue, tsq_err);
+             return EINA_FALSE;
+          }
+
+        e_plane_renderer_surface_queue_release(renderer, tsurface);
+     }
+
+  return EINA_TRUE;
+}
+
 EINTERN void
 e_plane_renderer_surface_send(E_Plane_Renderer *renderer, E_Client *ec, tbm_surface_h tsurface)
 {
@@ -1260,11 +1300,6 @@ e_plane_renderer_surface_send(E_Plane_Renderer *renderer, E_Client *ec, tbm_surf
                  ec->pixmap, ec, renderer, wl_buffer, tsurface, renderer->tqueue);
      }
 
-   /* debug */
-   if (renderer_trace_debug)
-     ELOGF("E_PLANE_RENDERER", "Send    Renderer(%p)  wl_buffer(%p) tsurface(%p) tqueue(%p) wl_buffer_ref(%p)",
-           ec->pixmap, ec, renderer, _get_wl_buffer(ec), tsurface, renderer->tqueue, _get_wl_buffer_ref(ec));
-
    /* add a sent surface to the sent list in renderer if it is not in the list */
    if (!_e_plane_renderer_surface_find_sent_surface(renderer, tsurface))
      renderer->sent_surfaces = eina_list_append(renderer->sent_surfaces, tsurface);
index 09fc405..f8aad01 100644 (file)
@@ -40,6 +40,10 @@ struct _E_Plane_Renderer {
    Eina_Bool           pending;
 
    E_Plane            *plane;
+
+   Ecore_Fd_Handler   *event_hdlr;
+   int                 event_fd;
+   pthread_mutex_t     event_lock;
 };
 
 EINTERN Eina_Bool                  e_plane_renderer_init(void);
@@ -50,7 +54,6 @@ EINTERN Eina_Bool                  e_plane_renderer_render(E_Plane_Renderer *ren
 EINTERN Eina_Bool                  e_plane_renderer_activate(E_Plane_Renderer *renderer, E_Client *ec);
 EINTERN Eina_Bool                  e_plane_renderer_deactivate(E_Plane_Renderer *renderer);
 EINTERN E_Plane_Renderer_State     e_plane_renderer_state_get(E_Plane_Renderer *renderer);
-EINTERN void                       e_plane_renderer_ee_update_ban(E_Plane_Renderer *renderer, Eina_Bool set);
 EINTERN void                       e_plane_renderer_update_exist_set(E_Plane_Renderer *renderer, Eina_Bool update_exit);
 EINTERN Eina_Bool                  e_plane_renderer_update_exist_check(E_Plane_Renderer *renderer);
 EINTERN void                       e_plane_renderer_pending_set(E_Plane_Renderer *renderer, Eina_Bool pending);
@@ -74,6 +77,7 @@ EINTERN void                       e_plane_renderer_surface_queue_release(E_Plan
 EINTERN Eina_Bool                  e_plane_renderer_surface_queue_enqueue(E_Plane_Renderer *renderer, tbm_surface_h tsurface);
 EINTERN Eina_Bool                  e_plane_renderer_surface_queue_can_dequeue(E_Plane_Renderer *renderer);
 EINTERN tbm_surface_h              e_plane_renderer_surface_queue_dequeue(E_Plane_Renderer *renderer);
+EINTERN Eina_Bool                  e_plane_renderer_surface_queue_clear(E_Plane_Renderer *renderer);
 EINTERN void                       e_plane_renderer_surface_send(E_Plane_Renderer *renderer, E_Client *ec, tbm_surface_h tsurface);
 EINTERN Eina_Bool                  e_plane_renderer_ec_set(E_Plane_Renderer *renderer, E_Client *ec);
 EINTERN Eina_Bool                  e_plane_renderer_ecore_evas_use(E_Plane_Renderer *renderer);