e_info: add hwc_wins option to winfo
authorChangyeon Lee <cyeon.lee@samsung.com>
Wed, 30 Jan 2019 03:23:53 +0000 (12:23 +0900)
committerSooChan Lim <sc1.lim@samsung.com>
Fri, 12 Apr 2019 10:00:22 +0000 (19:00 +0900)
Change-Id: Iebe63457d9585b71f5d6143316117e6cdd908d4e

src/bin/e_hwc_window.c
src/bin/e_hwc_window.h
src/bin/e_hwc_window_queue.c
src/bin/e_hwc_window_queue.h
src/bin/e_hwc_windows.c
src/bin/e_hwc_windows.h
src/bin/e_info_client.c
src/bin/e_info_server.c
src/bin/e_info_shared_types.h

index 64a0133514b73dc74b983e61c87bdc673a9c2062..692148b5220980d23987da0beb8127289dce546a 100644 (file)
@@ -1652,6 +1652,44 @@ e_hwc_window_state_string_get(E_Hwc_Window_State hwc_window_state)
     }
 }
 
+EINTERN const char*
+e_hwc_window_transition_string_get(E_Hwc_Window_Transition transition)
+{
+   switch (transition)
+    {
+     case E_HWC_WINDOW_TRANSITION_NONE_TO_NONE:
+       return "NOtoNO";
+     case E_HWC_WINDOW_TRANSITION_NONE_TO_CLIENT:
+       return "NOtoCL";
+     case E_HWC_WINDOW_TRANSITION_NONE_TO_DEVICE:
+       return "NOtoDV";
+     case E_HWC_WINDOW_TRANSITION_NONE_TO_CURSOR:
+       return "NOtoCS";
+     case E_HWC_WINDOW_TRANSITION_CLIENT_TO_NONE:
+       return "CLtoNO";
+     case E_HWC_WINDOW_TRANSITION_CLIENT_TO_CLIENT:
+       return "CLtoCL";
+     case E_HWC_WINDOW_TRANSITION_CLIENT_TO_DEVICE:
+       return "CLtoDV";
+     case E_HWC_WINDOW_TRANSITION_CLIENT_TO_CURSOR:
+       return "CLtoCS";
+     case E_HWC_WINDOW_TRANSITION_DEVICE_TO_NONE:
+       return "DVtoNO";
+     case E_HWC_WINDOW_TRANSITION_DEVICE_TO_CLIENT:
+       return "DVtoCL";
+     case E_HWC_WINDOW_TRANSITION_DEVICE_TO_DEVICE:
+       return "DVtoDV";
+     case E_HWC_WINDOW_TRANSITION_CURSOR_TO_NONE:
+       return "CStoNO";
+     case E_HWC_WINDOW_TRANSITION_CURSOR_TO_CLIENT:
+       return "CStoCL";
+     case E_HWC_WINDOW_TRANSITION_CURSOR_TO_CURSOR:
+       return "CStoCS";
+     default:
+       return "UNKNOWN";
+    }
+}
+
 EINTERN const char*
 e_hwc_window_name_get(E_Hwc_Window *hwc_window)
 {
index 4b24594c97b879b6e75dd2f9033f3f75d09947b7..c66a72fe9e0aa38ce340ca72d8a7733d6928a28b 100644 (file)
@@ -177,6 +177,7 @@ EINTERN E_Hwc_Window_State      e_hwc_window_accepted_state_get(E_Hwc_Window *hw
 EINTERN Eina_Bool               e_hwc_window_device_state_available_check(E_Hwc_Window *hwc_window);
 EINTERN Eina_Bool               e_hwc_window_transition_set(E_Hwc_Window *hwc_window, E_Hwc_Window_Transition transition);
 EINTERN E_Hwc_Window_Transition e_hwc_window_transition_get(E_Hwc_Window *hwc_window);
+EINTERN const char*             e_hwc_window_transition_string_get(E_Hwc_Window_Transition transition);
 
 EINTERN Eina_Bool               e_hwc_window_constraints_update(E_Hwc_Window *hwc_window);
 EINTERN Eina_Bool               e_hwc_window_rendered_window_update(E_Hwc_Window *hwc_window);
index 45042bee0ff284055707418d0bd4c6f3a487cc23..460a16ded23689c5bacb232aebfec924b0acee42 100644 (file)
@@ -1222,3 +1222,92 @@ e_hwc_window_queue_trace_debug(Eina_Bool onoff)
    ehwq_trace = onoff;
    INF("EHWQ: hwc trace_debug is %s", onoff?"ON":"OFF");
 }
+
+static const char*
+_e_hwc_window_queue_state_string_get(E_Hwc_Window_Queue_State state)
+{
+   switch (state)
+    {
+     case E_HWC_WINDOW_QUEUE_STATE_UNSET:
+       return "UNSET"; // None
+     case E_HWC_WINDOW_QUEUE_STATE_UNSET_WAITING:
+       return "UNSET_WAITING"; // Client
+     case E_HWC_WINDOW_QUEUE_STATE_SET:
+       return "SET"; // Device
+     case E_HWC_WINDOW_QUEUE_STATE_SET_WAITING:
+       return "SET_WAITING"; // Video
+     case E_HWC_WINDOW_QUEUE_STATE_SET_PENDING:
+       return "SET_PENDING"; // Cursor
+     default:
+       return "UNKNOWN";
+    }
+}
+
+EINTERN void
+e_hwc_window_queue_debug_info_get(Eldbus_Message_Iter *iter)
+{
+   Eldbus_Message_Iter *line_array;
+   Eina_Iterator *hash_iter;
+   E_Hwc_Window *hwc_window = NULL;
+   E_Hwc_Window_Queue *queue = NULL;
+   E_Hwc_Window_Queue_Buffer *queue_buffer = NULL;
+   Eina_List *l;
+   int idx = 0;
+   int buf_idx = 0;
+   int pending_set_idx = 0;
+   char info_str[1024];
+
+   eldbus_message_iter_arguments_append(iter, "as", &line_array);
+   if (!_hwc_winq_mgr)
+     {
+        eldbus_message_iter_basic_append(line_array,
+                                         's',
+                                         "E_Hwc_Window_Queue not initialized..");
+        eldbus_message_iter_container_close(iter, line_array);
+        return;
+     }
+
+   /* PROVIDER */
+   hash_iter = eina_hash_iterator_data_new(_hwc_winq_mgr->hwc_winq_hash);
+   EINA_ITERATOR_FOREACH(hash_iter, queue)
+     {
+        if (!queue) continue;
+
+        snprintf(info_str, sizeof(info_str),
+                "[%2d] Queue(%8p) tqueue(%8p) target(%d) state(%s) user(%8p):win(0x%08zx)"
+                " unset_waiting_user(%8p):win(0x%08zx)",
+                ++idx, queue, queue->tqueue, queue->is_target,
+                _e_hwc_window_queue_state_string_get(queue->state),
+                queue->user,
+                queue->user ? e_client_util_win_get(queue->user->ec) : 0,
+                queue->user_waiting_unset,
+                queue->user_waiting_unset ? e_client_util_win_get(queue->user_waiting_unset->ec) : 0);
+        eldbus_message_iter_basic_append(line_array, 's', info_str);
+
+        pending_set_idx = 0;
+        EINA_LIST_FOREACH(queue->user_pending_set, l, hwc_window)
+          {
+             snprintf(info_str, sizeof(info_str),
+                      " └─ [%2d] pending_set user(%8p):win(0x%08zx)",
+                      ++pending_set_idx, hwc_window, e_client_util_win_get(hwc_window->ec));
+             eldbus_message_iter_basic_append(line_array, 's', info_str);
+          }
+
+        buf_idx = 0;
+        EINA_LIST_FOREACH(queue->buffers, l, queue_buffer)
+          {
+             snprintf(info_str, sizeof(info_str),
+                      " └─ [%2d] Queue_Buffer(%8p) tsurface(%8p) exported_wl_buffer(%u)"
+                      " exported(%d) usable(%d) released(%d) acquired(%d) dequeued(%d)",
+                      ++buf_idx, queue_buffer, queue_buffer->tsurface,
+                      queue_buffer->exported_wl_buffer ? wl_resource_get_id(queue_buffer->exported_wl_buffer) : 0,
+                      queue_buffer->exported, queue_buffer->usable, queue_buffer->released,
+                      queue_buffer->acquired, queue_buffer->dequeued);
+             eldbus_message_iter_basic_append(line_array, 's', info_str);
+          }
+        eldbus_message_iter_basic_append(line_array, 's', "");
+     }
+   eina_iterator_free(hash_iter);
+
+   eldbus_message_iter_container_close(iter, line_array);
+}
index 9c18becccaee03886382eb1ea8616d54ce7d2c24..22401626c0e75ffeda350aaf5c1ed4b640f2cf99 100644 (file)
@@ -66,6 +66,7 @@ EINTERN Eina_Bool                   e_hwc_window_queue_buffer_release(E_Hwc_Wind
 EINTERN Eina_List *                 e_hwc_window_queue_acquirable_buffers_get(E_Hwc_Window_Queue *queue);
 
 EINTERN void                        e_hwc_window_queue_trace_debug(Eina_Bool onoff);
+EINTERN void                        e_hwc_window_queue_debug_info_get(Eldbus_Message_Iter *iter);
 
 #endif // E_HWC_WINDOW_QUEUE_H
 #endif
index f21edb70a3fc62c3bca73b392ec11a5c889e06a3..6bec8cab0897754cf362d135e603ad7226f1137f 100644 (file)
@@ -2357,3 +2357,120 @@ e_hwc_windows_dump_stop(void)
 
    ehws_dump_enable = EINA_FALSE;
 }
+
+static void
+_e_hwc_windows_window_debug_info_get(Eldbus_Message_Iter *iter, E_Hwc_Wins_Debug_Cmd cmd)
+{
+   Eldbus_Message_Iter *line_array;
+   E_Hwc_Window *hwc_window = NULL;
+   E_Comp_Screen *e_comp_screen = NULL;
+   E_Output *output = NULL;
+   E_Hwc *hwc = NULL;
+   Eina_List *l, *l2;
+   int idx = 0;
+   char info_str[1024];
+   char fmt_str[5];
+   char flip = ' ';
+
+   e_comp_screen = e_comp->e_comp_screen;
+
+   eldbus_message_iter_arguments_append(iter, "as", &line_array);
+   if (!e_comp_screen)
+     {
+        eldbus_message_iter_basic_append(line_array,
+                                         's',
+                                         "e_comp_screen not initialized..");
+        eldbus_message_iter_container_close(iter, line_array);
+        return;
+     }
+
+   eldbus_message_iter_basic_append(line_array, 's',
+   "==========================================================================================="
+   "=============================================================");
+   eldbus_message_iter_basic_append(line_array, 's',
+   " No   Win_ID    Hwc_win    zpos  ST   AC_ST  ACTI TRANSI  tsurface  src_size        src_pos"
+   "       FMT       dst_pos        TRANSF DP_tsurface   Queue");
+   eldbus_message_iter_basic_append(line_array, 's',
+   "==========================================================================================="
+   "=============================================================");
+
+   EINA_LIST_FOREACH(e_comp_screen->outputs, l, output)
+     {
+        if (!output) continue;
+        if (!output->config.enabled) continue;
+        if (!output->tdm_hwc) continue;
+
+        hwc = output->hwc;
+        if (!output->hwc) continue;
+
+        EINA_LIST_FOREACH(hwc->hwc_windows, l2, hwc_window)
+          {
+             if (!hwc_window) continue;
+
+             if ((cmd == E_HWC_WINS_DEBUG_CMD_VIS) && (hwc_window->accepted_state == E_HWC_WINDOW_STATE_NONE))
+               continue;
+             else if ((cmd == E_HWC_WINS_DEBUG_CMD_DV) && (hwc_window->accepted_state != E_HWC_WINDOW_STATE_DEVICE))
+               continue;
+             else if ((cmd == E_HWC_WINS_DEBUG_CMD_CL) && (hwc_window->accepted_state != E_HWC_WINDOW_STATE_CLIENT))
+               continue;
+             else if ((cmd == E_HWC_WINS_DEBUG_CMD_CS) && (hwc_window->accepted_state != E_HWC_WINDOW_STATE_CURSOR))
+               continue;
+             else if ((cmd == E_HWC_WINS_DEBUG_CMD_VD) && (hwc_window->accepted_state != E_HWC_WINDOW_STATE_VIDEO))
+               continue;
+             else if ((cmd == E_HWC_WINS_DEBUG_CMD_NO) && (hwc_window->accepted_state != E_HWC_WINDOW_STATE_NONE))
+               continue;
+
+             if (hwc_window->info.src_config.format)
+               snprintf(fmt_str, sizeof(fmt_str), "%c%c%c%c", FOURCC_STR(hwc_window->info.src_config.format));
+             else
+               snprintf(fmt_str, sizeof(fmt_str), "    ");
+
+             if (hwc_window->info.transform > TDM_TRANSFORM_270)
+               flip = 'F';
+
+             snprintf(info_str, sizeof(info_str),
+                      "%3d 0x%08zx 0x%08zx %4d   %s    %s     %s   %s 0x%08zx %04dx%04d %04dx%04d+%04d+%04d"
+                      " %4s %04dx%04d+%04d+%04d  %c%3d  0x%08zx  0x%08zx",
+                      ++idx,
+                      e_client_util_win_get(hwc_window->ec),
+                      (uintptr_t)hwc_window,
+                      hwc_window->zpos,
+                      e_hwc_window_state_string_get(hwc_window->state),
+                      e_hwc_window_state_string_get(hwc_window->accepted_state),
+                      hwc_window->accepted_state ? "A" : "D",
+                      e_hwc_window_transition_string_get(hwc_window->transition),
+                      (uintptr_t)hwc_window->buffer.tsurface,
+                      hwc_window->info.src_config.size.h,
+                      hwc_window->info.src_config.size.v,
+                      hwc_window->info.src_config.pos.w,
+                      hwc_window->info.src_config.pos.h,
+                      hwc_window->info.src_config.pos.x,
+                      hwc_window->info.src_config.pos.y,
+                      fmt_str,
+                      hwc_window->info.dst_pos.w,
+                      hwc_window->info.dst_pos.h,
+                      hwc_window->info.dst_pos.x,
+                      hwc_window->info.dst_pos.y,
+                      flip,
+                      (hwc_window->info.transform < 4) ? hwc_window->info.transform * 90 : (hwc_window->info.transform - 4) * 90,
+                      (uintptr_t)hwc_window->display.buffer.tsurface,
+                      (uintptr_t)hwc_window->queue);
+             eldbus_message_iter_basic_append(line_array, 's', info_str);
+          }
+     }
+
+   eldbus_message_iter_basic_append(line_array, 's',
+   "==========================================================================================="
+   "=============================================================");
+
+   eldbus_message_iter_container_close(iter, line_array);
+}
+
+EINTERN void
+e_hwc_windows_debug_info_get(Eldbus_Message_Iter *iter, E_Hwc_Wins_Debug_Cmd cmd)
+{
+   if (cmd == E_HWC_WINS_DEBUG_CMD_QUEUE)
+     e_hwc_window_queue_debug_info_get(iter);
+   else if (cmd >= E_HWC_WINS_DEBUG_CMD_VIS && cmd <= E_HWC_WINS_DEBUG_CMD_NO)
+     _e_hwc_windows_window_debug_info_get(iter, cmd);
+}
index 9a2b5c4e296ab7fb4fddf1c8277ebbd787ced6e5..ea89d9e22e743d8e26e8c32883f7f907403ee57b 100644 (file)
@@ -3,6 +3,19 @@
 #ifndef E_HWC_WINDOWS_H
 #define E_HWC_WINDOWS_H
 
+typedef enum
+{
+   E_HWC_WINS_DEBUG_CMD_NONE,
+   E_HWC_WINS_DEBUG_CMD_VIS,
+   E_HWC_WINS_DEBUG_CMD_ALL,
+   E_HWC_WINS_DEBUG_CMD_CL,
+   E_HWC_WINS_DEBUG_CMD_DV,
+   E_HWC_WINS_DEBUG_CMD_CS,
+   E_HWC_WINS_DEBUG_CMD_VD,
+   E_HWC_WINS_DEBUG_CMD_NO,
+   E_HWC_WINS_DEBUG_CMD_QUEUE,
+} E_Hwc_Wins_Debug_Cmd;
+
 EINTERN Eina_Bool            e_hwc_windows_init(E_Hwc *hwc);
 EINTERN void                 e_hwc_windows_deinit(E_Hwc *hwc);
 EINTERN Eina_Bool            e_hwc_windows_render(E_Hwc *hwc);
@@ -19,6 +32,7 @@ EINTERN Eina_Bool            e_hwc_windows_fps_get(E_Hwc *hwc, double *fps);
 EINTERN void                 e_hwc_windows_trace_debug(Eina_Bool onoff);
 EINTERN void                 e_hwc_windows_dump_start(void);
 EINTERN void                 e_hwc_windows_dump_stop(void);
+EINTERN void                 e_hwc_windows_debug_info_get(Eldbus_Message_Iter *iter, E_Hwc_Wins_Debug_Cmd cmd);
 
 #endif
 #endif
index 09079fd2e78d6fed1ef64945005aa353d36c3bf2..a966ec8f2088c9640556ecf73bf8f43380c9b606 100644 (file)
@@ -4801,6 +4801,76 @@ _e_info_client_proc_input_region(int argc, char **argv)
    return;
 }
 
+static void
+_cb_hwc_wins_info_get(const Eldbus_Message *msg)
+{
+   const char *name = NULL, *text = NULL;
+   Eina_Bool res;
+   Eldbus_Message_Iter *lines;
+   char *result = NULL;
+
+   res = eldbus_message_error_get(msg, &name, &text);
+   if (res) goto finish;
+
+   res = eldbus_message_arguments_get(msg, "as", &lines);
+   if (!res) goto finish;
+
+   while (eldbus_message_iter_get_and_next(lines, 's', &result))
+     printf("%s\n", result);
+
+   return;
+
+finish:
+   if ((name) || (text))
+     {
+        printf("errname:%s errmsg:%s\n", name, text);
+     }
+}
+
+static void
+_e_info_client_proc_hwc_wins(int argc, char **argv)
+{
+   Eina_Bool res;
+   E_Hwc_Wins_Debug_Cmd cmd;
+
+   if (argc < 2)
+     cmd = E_HWC_WINS_DEBUG_CMD_VIS;
+   else
+     {
+        if (!argv[2])
+          cmd = E_HWC_WINS_DEBUG_CMD_VIS;
+        else if (eina_streq(argv[2], "all"))
+          cmd = E_HWC_WINS_DEBUG_CMD_ALL;
+        else if (eina_streq(argv[2], "dv"))
+          cmd = E_HWC_WINS_DEBUG_CMD_DV;
+        else if (eina_streq(argv[2], "cl"))
+          cmd = E_HWC_WINS_DEBUG_CMD_CL;
+        else if (eina_streq(argv[2], "cs"))
+          cmd = E_HWC_WINS_DEBUG_CMD_CS;
+        else if (eina_streq(argv[2], "vd"))
+          cmd = E_HWC_WINS_DEBUG_CMD_VD;
+        else if (eina_streq(argv[2], "none"))
+          cmd = E_HWC_WINS_DEBUG_CMD_NO;
+        else if (eina_streq(argv[2], "queue"))
+          cmd = E_HWC_WINS_DEBUG_CMD_QUEUE;
+        else if (eina_streq(argv[2], "help") || eina_streq(argv[2], "usage"))
+          goto usage;
+        else
+          goto usage;
+     }
+
+   res = _e_info_client_eldbus_message_with_args("hwc_wins", _cb_hwc_wins_info_get, "i", cmd);
+
+   EINA_SAFETY_ON_FALSE_RETURN(res);
+
+   return;
+
+usage:
+   printf("Usage: wininfo_info %s", USAGE_HWC_WINS);
+
+   return;
+}
+
 typedef struct _ProcInfo
 {
    const char *option;
@@ -4942,6 +5012,12 @@ static ProcInfo procs_to_printinfo[] =
       "Print input regions",
       _e_info_client_proc_input_region
    },
+   {
+      "hwc_wins",
+      NULL,
+      "Print hwc windows information",
+      _e_info_client_proc_hwc_wins
+   },
 };
 
 static ProcInfo procs_to_execute[] =
index f6c3e42c667e224b283b6a7e0cbaac7c92573ad8..5bcc8a802d3af46054b497bb631562354c3f68e4 100644 (file)
@@ -5797,6 +5797,23 @@ _e_info_server_cb_input_region(const Eldbus_Service_Interface *iface EINA_UNUSED
    return reply;
 }
 
+static Eldbus_Message *
+_e_info_server_cb_hwc_wins_info_get(const Eldbus_Service_Interface *iface EINA_UNUSED, const Eldbus_Message *msg)
+{
+   Eldbus_Message *reply = eldbus_message_method_return_new(msg);
+   E_Hwc_Wins_Debug_Cmd cmd;
+
+   if (!eldbus_message_arguments_get(msg, "i", &cmd))
+     {
+        return eldbus_message_error_new(msg, GET_CALL_MSG_ARG_ERR,
+                                        "hwc_wins: an attempt to get arguments from method call message failed");
+     }
+
+   e_hwc_windows_debug_info_get(eldbus_message_iter_get(reply), cmd);
+
+   return reply;
+}
+
 //{ "method_name", arguments_from_client, return_values_to_client, _method_cb, ELDBUS_METHOD_FLAG },
 static const Eldbus_Method methods[] = {
    { "get_window_info", NULL, ELDBUS_ARGS({"iiiiisa("VALUE_TYPE_FOR_TOPVWINS")", "array of ec"}), _e_info_server_cb_window_info_get, 0 },
@@ -5861,6 +5878,7 @@ static const Eldbus_Method methods[] = {
    { "key_repeat", ELDBUS_ARGS({"sii", "option"}), NULL, _e_info_server_cb_key_repeat, 0},
    { "dump_memchecker", NULL, NULL, _e_info_server_cb_memchecker, 0},
    { "input_region", ELDBUS_ARGS({"siiii", "options"}), ELDBUS_ARGS({"a(iiii)", "path"}), _e_info_server_cb_input_region, 0},
+   { "hwc_wins", ELDBUS_ARGS({"i", "option"}), ELDBUS_ARGS({"as", "hwc wins info"}), _e_info_server_cb_hwc_wins_info_get, 0 },
    { NULL, NULL, NULL, NULL, 0 }
 };
 
index 4b3a26c8783e10c62ea815ca37074f8fd504075a..8d70b4955986202128b5e03ffdc6498316772378 100644 (file)
@@ -237,4 +237,28 @@ typedef enum
    "\tenlightenment_info -trace serial 1\n"                          \
    "\tenlightenment_info -trace serial 0\n"
 
+/* -------------------------------------------------------------------------- */
+/* HWC WINS                                                                   */
+/* -------------------------------------------------------------------------- */
+#define USAGE_HWC_WINS                                                         \
+   "-hwc_wins (no option | all | cl | dv | cs | dv | no)\n"                    \
+   "Commands:\n"                                                               \
+   "\tno option : print visible hwc window info\n"                             \
+   "\tall       : print all hwc window info\n"                                 \
+   "\tcl        : print CLIENT accepted state hwc window info\n"               \
+   "\tdv        : print DEVICE accepted state hwc window info\n"               \
+   "\tcs        : print CURSOR accepted state hwc window info\n"               \
+   "\tvd        : print VIDEO accepted state hwc window info\n"                \
+   "\tno        : print NONE accepted state hwc window info\n"                 \
+   "\tqueue     : print hwc window queue info\n"                               \
+   "Example:\n"                                                                \
+   "\twinfo -hwc_wins\n"                                                       \
+   "\twinfo -hwc_wins all\n"                                                   \
+   "\twinfo -hwc_wins cl\n"                                                    \
+   "\twinfo -hwc_wins dv\n"                                                    \
+   "\twinfo -hwc_wins cs\n"                                                    \
+   "\twinfo -hwc_wins vd\n"                                                    \
+   "\twinfo -hwc_wins no\n  "                                                  \
+   "\twinfo -hwc_wins queue\n  "
+
 #endif /* end of _E_INFO_SHARED_TYPES_ */