e_hwc_window: add e_hwc_window_fps_get
authorChangyeon Lee <cyeon.lee@samsung.com>
Mon, 28 Jan 2019 08:33:07 +0000 (17:33 +0900)
committerSooChan Lim <sc1.lim@samsung.com>
Fri, 12 Apr 2019 10:00:22 +0000 (19:00 +0900)
Change-Id: I76485017652d4ccfc137278aeafab5b289e4c8b5

src/bin/e_hwc_window.c
src/bin/e_hwc_window.h

index 692148b5220980d23987da0beb8127289dce546a..743e4c8d9b18f803c571ea877b1a511b71e11651 100644 (file)
@@ -532,6 +532,36 @@ _e_hwc_window_cursor_position_get(E_Pointer *ptr, int width, int height, unsigne
      }
 }
 
+static void
+_e_hwc_window_update_fps(E_Hwc_Window *hwc_window)
+{
+   if (e_comp->calc_fps)
+     {
+        double dt;
+        double tim = ecore_time_get();
+
+        dt = tim - hwc_window->fps.frametimes[0];
+        hwc_window->fps.frametimes[0] = tim;
+
+        hwc_window->fps.time += dt;
+        hwc_window->fps.cframes++;
+
+        if (hwc_window->fps.lapse == 0.0)
+          {
+             hwc_window->fps.lapse = tim;
+             hwc_window->fps.flapse = hwc_window->fps.cframes;
+          }
+        else if ((tim - hwc_window->fps.lapse) >= 0.5)
+          {
+             hwc_window->fps.fps = (hwc_window->fps.cframes - hwc_window->fps.flapse) /
+                                   (tim - hwc_window->fps.lapse);
+             hwc_window->fps.lapse = tim;
+             hwc_window->fps.flapse = hwc_window->fps.cframes;
+             hwc_window->fps.time = 0.0;
+          }
+     }
+}
+
 static void
 _e_hwc_window_free(E_Hwc_Window *hwc_window)
 {
@@ -1049,6 +1079,8 @@ e_hwc_window_commit_data_acquire(E_Hwc_Window *hwc_window)
 
         tbm_surface_internal_ref(commit_data->buffer.tsurface);
 
+        _e_hwc_window_update_fps(hwc_window);
+
         if (!e_hwc_window_is_target(hwc_window) &&
             !e_hwc_window_is_video(hwc_window))
           e_comp_wl_buffer_reference(&commit_data->buffer_ref,
@@ -1854,3 +1886,21 @@ e_hwc_window_commit_data_buffer_dump(E_Hwc_Window *hwc_window)
    tbm_surface_internal_dump_buffer(hwc_window->commit_data->buffer.tsurface,
                                     fname);
 }
+
+EINTERN Eina_Bool
+e_hwc_window_fps_get(E_Hwc_Window *hwc_window, double *fps)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(hwc_window, EINA_FALSE);
+
+   if (hwc_window->fps.old_fps == hwc_window->fps.fps)
+     return EINA_FALSE;
+
+   if (hwc_window->fps.fps > 0.0)
+     {
+        *fps = hwc_window->fps.fps;
+        hwc_window->fps.old_fps = hwc_window->fps.fps;
+        return EINA_TRUE;
+     }
+
+   return EINA_FALSE;
+}
index c66a72fe9e0aa38ce340ca72d8a7733d6928a28b..a39bc6fdb2266873c43358074779626ab0f2aa80 100644 (file)
@@ -112,6 +112,18 @@ struct _E_Hwc_Window
       int                         img_stride;
    } cursor;
 
+   struct
+   {
+      /* for fps */
+      double               fps;
+      double               old_fps;
+      double               frametimes[122];
+      double               time;
+      double               lapse;
+      int                  cframes;
+      int                  flapse;
+   } fps;
+
    int                            constraints;
 
    E_Hwc_Window_Queue            *queue;
@@ -192,6 +204,7 @@ EINTERN void                    e_hwc_window_hook_del(E_Hwc_Window_Hook *ch);
 
 EINTERN void                    e_hwc_window_trace_debug(Eina_Bool onoff);
 EINTERN void                    e_hwc_window_commit_data_buffer_dump(E_Hwc_Window *hwc_window);
+EINTERN Eina_Bool               e_hwc_window_fps_get(E_Hwc_Window *hwc_window, double *fps);
 
 #endif // E_HWC_WINDOW_H
 #endif