e_info: change the fps from output fps to layer fps 98/143898/3
authorSooChan Lim <sc1.lim@samsung.com>
Sun, 13 Aug 2017 03:53:11 +0000 (12:53 +0900)
committerSooChan Lim <sc1.lim@samsung.com>
Mon, 14 Aug 2017 00:34:27 +0000 (09:34 +0900)
The fps has to be updates per layers(planes), not per output.

Change-Id: Ifa412282435374da8342675c2885c2a957298e02

src/bin/e_info_client.c
src/bin/e_info_server.c

index b022501..c325f3d 100644 (file)
@@ -27,6 +27,9 @@ typedef struct _E_Info_Client
 
    /* pending_commit */
    Eina_List         *pending_commit_list;
+
+   /* layer fps */
+   Eina_List         *layer_fps_list;
 } E_Info_Client;
 
 typedef struct _E_Win_Info
@@ -68,11 +71,19 @@ typedef struct _E_Pending_Commit_Info
    unsigned int tsurface;
 } E_Pending_Commit_Info;
 
+typedef struct _E_Layer_Fps_Info
+{
+   const char *output;
+   int zpos;
+   double fps;
+} E_Layer_Fps_Info;
+
 #define VALUE_TYPE_FOR_TOPVWINS "uuisiiiiibbiibbbiius"
 #define VALUE_TYPE_REQUEST_RESLIST "ui"
 #define VALUE_TYPE_REPLY_RESLIST "ssi"
 #define VALUE_TYPE_FOR_INPUTDEV "ssi"
 #define VALUE_TYPE_FOR_PENDING_COMMIT "uiuu"
+#define VALUE_TYPE_FOR_LAYER_FPS "sid"
 #define VALUE_TYPE_REQUEST_FOR_KILL "uts"
 #define VALUE_TYPE_REPLY_KILL "s"
 #define VALUE_TYPE_REQUEST_FOR_WININFO "t"
@@ -1956,40 +1967,6 @@ arg_err:
 
 }
 
-static void
-_cb_fps_info_get(const Eldbus_Message *msg)
-{
-   const char *name = NULL, *text = NULL;
-   Eina_Bool res;
-   const char *fps;
-
-   res = eldbus_message_error_get(msg, &name, &text);
-   EINA_SAFETY_ON_TRUE_GOTO(res, finish);
-
-   res = eldbus_message_arguments_get(msg, "s", &fps);
-   EINA_SAFETY_ON_FALSE_GOTO(res, finish);
-   if (strcmp(fps, "no_update"))
-        printf("%s\n", fps);
-
-finish:
-   if ((name) || (text ))
-     {
-        printf("errname:%s errmsg:%s\n", name, text);
-     }
-}
-
-static void
-_e_info_client_proc_fps_info(int argc, char **argv)
-{
-   do
-     {
-        if (!_e_info_client_eldbus_message("get_fps_info", _cb_fps_info_get))
-          return;
-        usleep(500000);
-     }
-   while (1);
-}
-
 static Eina_Bool
 _opt_parse(char *opt, char *delims, int *vals, int n_vals)
 {
@@ -2898,6 +2875,133 @@ _e_info_client_proc_show_pending_commit(int argc, char **argv)
 
    E_FREE_LIST(e_info_client.pending_commit_list, _e_pending_commit_info_free);
 }
+
+static E_Layer_Fps_Info *
+_e_player_fps_info_new(const char *output, int zpos, double fps)
+{
+   E_Layer_Fps_Info *layer_fps = NULL;
+
+   layer_fps = E_NEW(E_Layer_Fps_Info, 1);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(layer_fps, NULL);
+
+   layer_fps->output = output;
+   layer_fps->zpos = zpos;
+   layer_fps->fps = fps;
+
+   return layer_fps;
+}
+
+static void
+_e_layer_fps_info_free(E_Layer_Fps_Info *layer_fps)
+{
+   E_FREE(layer_fps);
+}
+
+static void
+_cb_layer_fps_info_get(const Eldbus_Message *msg)
+{
+   const char *name = NULL, *text = NULL;
+   Eldbus_Message_Iter *array, *eldbus_msg;
+   Eina_Bool res;
+
+   res = eldbus_message_error_get(msg, &name, &text);
+   EINA_SAFETY_ON_TRUE_GOTO(res, finish);
+
+   res = eldbus_message_arguments_get(msg, "a("VALUE_TYPE_FOR_LAYER_FPS")", &array);
+   EINA_SAFETY_ON_FALSE_GOTO(res, finish);
+
+   while (eldbus_message_iter_get_and_next(array, 'r', &eldbus_msg))
+     {
+        E_Layer_Fps_Info *layer_fps = NULL;
+        const char *output;
+        int zpos;
+        double fps;
+        res = eldbus_message_iter_arguments_get(eldbus_msg,
+                                                VALUE_TYPE_FOR_LAYER_FPS,
+                                                &output,
+                                                &zpos,
+                                                &fps);
+        if (!res)
+          {
+             printf("Failed to get player_fps info\n");
+             continue;
+          }
+
+        layer_fps = _e_player_fps_info_new(output, zpos, fps);
+        if (!layer_fps) continue;
+
+        e_info_client.layer_fps_list = eina_list_append(e_info_client.layer_fps_list, layer_fps);
+     }
+
+finish:
+   if ((name) || (text))
+     {
+        printf("errname:%s errmsg:%s\n", name, text);
+     }
+}
+
+static void
+_e_info_client_proc_fps_layer_info(int argc, char **argv)
+{
+   do
+     {
+        Eina_List *l;
+        E_Layer_Fps_Info *layer_fps;
+
+        if (!_e_info_client_eldbus_message("get_layer_fps_info", _cb_layer_fps_info_get))
+          return;
+
+        if (!e_info_client.layer_fps_list)
+          goto fps_layer_done;
+
+        EINA_LIST_FOREACH(e_info_client.layer_fps_list, l, layer_fps)
+          {
+             printf("%3s-ZPos@%d...%3.1f\n",
+                    layer_fps->output,
+                    layer_fps->zpos,
+                    layer_fps->fps);
+          }
+
+        E_FREE_LIST(e_info_client.layer_fps_list, _e_layer_fps_info_free);
+fps_layer_done:
+        usleep(500000);
+     }
+   while (1);
+}
+#else
+static void
+_cb_fps_info_get(const Eldbus_Message *msg)
+{
+   const char *name = NULL, *text = NULL;
+   Eina_Bool res;
+   const char *fps;
+
+   res = eldbus_message_error_get(msg, &name, &text);
+   EINA_SAFETY_ON_TRUE_GOTO(res, finish);
+
+   res = eldbus_message_arguments_get(msg, "s", &fps);
+   EINA_SAFETY_ON_FALSE_GOTO(res, finish);
+   if (strcmp(fps, "no_update"))
+        printf("%s\n", fps);
+
+finish:
+   if ((name) || (text ))
+     {
+        printf("errname:%s errmsg:%s\n", name, text);
+     }
+}
+
+static void
+_e_info_client_proc_fps_info(int argc, char **argv)
+{
+   do
+     {
+        if (!_e_info_client_eldbus_message("get_fps_info", _cb_fps_info_get))
+          return;
+        usleep(500000);
+     }
+   while (1);
+}
 #endif
 
 static void
@@ -4099,11 +4203,6 @@ static struct
       _e_info_client_proc_input_device_info
    },
    {
-      "fps", NULL,
-      "Print FPS in every sec",
-      _e_info_client_proc_fps_info
-   },
-   {
       "punch", "[on/off] [<X>x<H>+<X>+<Y>] [<a>,<r>,<g>,<b>]",
       "HWC should be disabled first with \"-hwc\" option. Punch a UI framebuffer [on/off].",
       _e_info_client_proc_punch
@@ -4159,6 +4258,17 @@ static struct
       "show state of pending commit",
       _e_info_client_proc_show_pending_commit
    },
+   {
+      "fps", NULL,
+      "Print FPS in every sec per layer",
+      _e_info_client_proc_fps_layer_info
+   },
+#else
+   {
+      "fps", NULL,
+      "Print FPS in every sec",
+      _e_info_client_proc_fps_info
+   },
 #endif
    {
       "keymap", NULL,
index bd200e8..493426c 100644 (file)
@@ -73,6 +73,7 @@ static Eina_List *module_hook = NULL;
 #define VALUE_TYPE_REPLY_RESLIST "ssi"
 #define VALUE_TYPE_FOR_INPUTDEV "ssi"
 #define VALUE_TYPE_FOR_PENDING_COMMIT "uiuu"
+#define VALUE_TYPE_FOR_LAYER_FPS "sid"
 #define VALUE_TYPE_REQUEST_FOR_KILL "uts"
 #define VALUE_TYPE_REPLY_KILL "s"
 #define VALUE_TYPE_REQUEST_FOR_WININFO "t"
@@ -2985,37 +2986,6 @@ _e_info_server_cb_keygrab_status_get(const Eldbus_Service_Interface *iface EINA_
 }
 
 static Eldbus_Message *
-_e_info_server_cb_fps_info_get(const Eldbus_Service_Interface *iface EINA_UNUSED, const Eldbus_Message *msg)
-{
-   static double old_fps = 0;
-
-   Eldbus_Message *reply = eldbus_message_method_return_new(msg);
-   char buf[128] = {};
-
-   if (!e_comp->calc_fps)
-     {
-        e_comp->calc_fps = 1;
-     }
-
-   if (old_fps == e_comp->fps)
-     {
-        snprintf(buf, sizeof(buf), "no_update");
-     }
-   else if (e_comp->fps > 0.0)
-     {
-        snprintf(buf, sizeof(buf), "... FPS %3.1f", e_comp->fps);
-        old_fps = e_comp->fps;
-     }
-   else
-     {
-        snprintf(buf, sizeof(buf), "... FPS N/A");
-     }
-
-   eldbus_message_arguments_append(reply, "s", buf);
-   return reply;
-}
-
-static Eldbus_Message *
 _e_info_server_cb_punch(const Eldbus_Service_Interface *iface EINA_UNUSED, const Eldbus_Message *msg)
 {
    Eldbus_Message *reply = eldbus_message_method_return_new(msg);
@@ -3940,6 +3910,97 @@ e_info_server_cb_show_pending_commit(const Eldbus_Service_Interface *iface EINA_
 
    return reply;
 }
+
+static void
+_msg_layer_fps_append(Eldbus_Message_Iter *iter)
+{
+   Eina_List *output_l, *plane_l;
+   Eldbus_Message_Iter *array_of_layer_fps;
+   E_Comp_Screen *e_comp_screen = NULL;
+   E_Output *output = NULL;
+   E_Plane *plane = NULL;
+   double fps = 0.0;
+   char output_name[30];
+   int size = 0;
+
+   eldbus_message_iter_arguments_append(iter, "a("VALUE_TYPE_FOR_LAYER_FPS")", &array_of_layer_fps);
+
+   e_comp_screen = e_comp->e_comp_screen;
+
+   EINA_LIST_FOREACH(e_comp_screen->outputs, output_l, output)
+     {
+        if (!output) continue;
+
+        strncpy(output_name, output->id, sizeof(char)*30);
+
+        EINA_LIST_FOREACH(output->planes, plane_l, plane)
+          {
+             if (!plane) continue;
+             if (!e_plane_fps_get(plane, &fps)) continue;
+
+             Eldbus_Message_Iter* struct_of_layer_fps;
+
+             eldbus_message_iter_arguments_append(array_of_layer_fps, "("VALUE_TYPE_FOR_LAYER_FPS")", &struct_of_layer_fps);
+
+             eldbus_message_iter_arguments_append
+               (struct_of_layer_fps, VALUE_TYPE_FOR_LAYER_FPS,
+                 output_name,
+                 plane->zpos,
+                 plane->fps);
+
+            eldbus_message_iter_container_close(array_of_layer_fps, struct_of_layer_fps);
+          }
+        memset(output_name, 0x0, sizeof(char)*30);
+     }
+
+   eldbus_message_iter_container_close(iter, array_of_layer_fps);
+}
+
+static Eldbus_Message *
+_e_info_server_cb_layer_fps_info_get(const Eldbus_Service_Interface *iface EINA_UNUSED, const Eldbus_Message *msg)
+{
+   Eldbus_Message *reply = eldbus_message_method_return_new(msg);
+
+   if (!e_comp->calc_fps)
+     {
+        e_comp->calc_fps = 1;
+     }
+
+   _msg_layer_fps_append(eldbus_message_iter_get(reply));
+
+   return reply;
+}
+#else
+static Eldbus_Message *
+_e_info_server_cb_fps_info_get(const Eldbus_Service_Interface *iface EINA_UNUSED, const Eldbus_Message *msg)
+{
+   static double old_fps = 0;
+
+   Eldbus_Message *reply = eldbus_message_method_return_new(msg);
+   char buf[128] = {};
+
+   if (!e_comp->calc_fps)
+     {
+        e_comp->calc_fps = 1;
+     }
+
+   if (old_fps == e_comp->fps)
+     {
+        snprintf(buf, sizeof(buf), "no_update");
+     }
+   else if (e_comp->fps > 0.0)
+     {
+        snprintf(buf, sizeof(buf), "... FPS %3.1f", e_comp->fps);
+        old_fps = e_comp->fps;
+     }
+   else
+     {
+        snprintf(buf, sizeof(buf), "... FPS N/A");
+     }
+
+   eldbus_message_arguments_append(reply, "s", buf);
+   return reply;
+}
 #endif
 
 static Eldbus_Message *
@@ -4948,7 +5009,6 @@ static const Eldbus_Method methods[] = {
    { "get_input_devices", NULL, ELDBUS_ARGS({"a("VALUE_TYPE_FOR_INPUTDEV")", "array of input"}), _e_info_server_cb_input_device_info_get, 0},
    { "protocol_trace", ELDBUS_ARGS({"s", "protocol_trace"}), NULL, _e_info_server_cb_protocol_trace, 0},
    { "protocol_rule", ELDBUS_ARGS({"sss", "protocol_rule"}), ELDBUS_ARGS({"s", "rule request"}), _e_info_server_cb_protocol_rule, 0},
-   { "get_fps_info", NULL, ELDBUS_ARGS({"s", "fps request"}), _e_info_server_cb_fps_info_get, 0},
    { "punch", ELDBUS_ARGS({"iiiiiiiii", "punch_geometry"}), NULL, _e_info_server_cb_punch, 0},
    { "transform_message", ELDBUS_ARGS({"siiiiiiii", "transform_message"}), NULL, e_info_server_cb_transform_message, 0},
    { "dump_buffers", ELDBUS_ARGS({"iisd", "start"}), NULL, _e_info_server_cb_buffer_dump, 0 },
@@ -4960,6 +5020,9 @@ static const Eldbus_Method methods[] = {
    { "hwc", ELDBUS_ARGS({"i", "hwc"}), NULL, e_info_server_cb_hwc, 0},
    { "show_plane_state", NULL, NULL, e_info_server_cb_show_plane_state, 0},
    { "show_pending_commit", NULL, ELDBUS_ARGS({"a("VALUE_TYPE_FOR_PENDING_COMMIT")", "array of pending commit"}), e_info_server_cb_show_pending_commit, 0},
+   { "get_layer_fps_info", NULL, ELDBUS_ARGS({"a("VALUE_TYPE_FOR_LAYER_FPS")", "array of pending commit"}), _e_info_server_cb_layer_fps_info_get, 0},
+#else
+   { "get_fps_info", NULL, ELDBUS_ARGS({"s", "fps request"}), _e_info_server_cb_fps_info_get, 0},
 #endif
    { "get_keymap", NULL, ELDBUS_ARGS({"hi", "keymap fd"}), _e_info_server_cb_keymap_info_get, 0},
    { "effect_control", ELDBUS_ARGS({"i", "effect_control"}), NULL, e_info_server_cb_effect_control, 0},