Improve cursor performance 43/274143/1
authorJunkyeong, Kim <jk0430.kim@samsung.com>
Fri, 22 Apr 2022 05:14:43 +0000 (14:14 +0900)
committerJunkyeong, Kim <jk0430.kim@samsung.com>
Fri, 22 Apr 2022 05:14:48 +0000 (14:14 +0900)
change timer interval according to the condition.
- only cursor moving -> VGA_TIME setting
- else (buffer changed) -> resolution related time setting

Change-Id: I48bf9683af647c3f650ef27b67595372d08e9623
Signed-off-by: Junkyeong, Kim <jk0430.kim@samsung.com>
src/e_mod_rdp.c

index 0663efb..ee194c5 100644 (file)
@@ -94,13 +94,13 @@ struct _E_Rdp_Output
    uint32_t prev_x;
    uint32_t prev_y;
 
-   Eina_Bool frame_changed;
    Eina_Bool cursor_changed;
    double refresh_time;
    int refresh_count;
 
    Eina_Bool mouse_moved;
    Eina_Bool buffer_changed;
+   int buffer_changed_count;
 
    Eina_Bool buffer_reuse;
    Eina_Rectangle cursor_crop_dst;
@@ -975,7 +975,7 @@ _e_rdp_pixman_output_image_get_all(E_Rdp_Output *output, Eina_List *visible_list
         _e_rdp_pixman_output_image_composite(output, hwc_window, pix_surface, info.width, info.height, e_output_w, e_output_h);
      }
 
-   if (output->refresh_count == 0)
+   if ((output->refresh_count == 0) || (output->buffer_changed_count == 0))
      _e_rdp_backup_buffer_create(output, tbm_surface, &info);
 
    if (hwc_window_cursor != NULL)
@@ -1321,6 +1321,11 @@ _e_rdp_frame_timer(void *data)
    INF("pixman refresh time: %.1f ms", (end_refresh - end_capture) * 1000);
 #endif
 
+   if (output->buffer_changed_count < 0)
+     output->buffer_changed = EINA_FALSE;
+   else
+     output->buffer_changed_count--;
+
    return ECORE_CALLBACK_RENEW;
 }
 
@@ -1336,6 +1341,21 @@ _e_rdp_free_keyfile(E_Rdp_Backend *b, rdpSettings *settings)
      }
 }
 
+static void
+_e_rdp_set_refresh_timer(E_Rdp_Output *output, double refresh_time)
+{
+   if (!output->frame_timer)
+     {
+        output->frame_timer = ecore_timer_add(refresh_time, _e_rdp_frame_timer, output);
+     }
+   else
+     {
+        if (ecore_timer_interval_get(output->frame_timer) != refresh_time)
+          ecore_timer_interval_set(output->frame_timer, refresh_time);
+     }
+   output->refresh_count = 5;
+}
+
 static Eina_Bool
 _e_rdp_cb_client_buffer_change(void *data, int type, void *event)
 {
@@ -1385,13 +1405,8 @@ _e_rdp_cb_client_buffer_change(void *data, int type, void *event)
    if (find == EINA_FALSE)
         return ECORE_CALLBACK_PASS_ON;
 
-   if (!output->frame_timer)
-     {
-        output->refresh_count = 5;
-        output->frame_timer = ecore_timer_add(output->refresh_time, _e_rdp_frame_timer, output);
-     }
-   else
-     output->refresh_count = 5;
+   _e_rdp_set_refresh_timer(output, output->refresh_time);
+   output->buffer_changed_count = 4;
    output->buffer_changed = EINA_TRUE;
 
    return ECORE_CALLBACK_PASS_ON;
@@ -1445,9 +1460,8 @@ _e_rdp_cb_client_uniconify(void *data, int type, void *event)
    if (find == EINA_FALSE)
      return ECORE_CALLBACK_PASS_ON;
 
-   if (!output->frame_timer)
-     output->frame_timer = ecore_timer_add(output->refresh_time, _e_rdp_frame_timer, output);
-   output->refresh_count = 5;
+   _e_rdp_set_refresh_timer(output, output->refresh_time);
+   output->buffer_changed_count = 4;
    output->buffer_changed = EINA_TRUE;
 
    return ECORE_CALLBACK_PASS_ON;
@@ -1470,13 +1484,10 @@ _e_rdp_cb_pointer_mouse_move(void *data, E_Pointer *ptr)
    if (b->client_count == 0)
      return;
 
-   if (!output->frame_timer)
-     {
-        output->refresh_count = 5;
-        output->frame_timer = ecore_timer_add(output->refresh_time, _e_rdp_frame_timer, output);
-     }
+   if (output->buffer_changed)
+     _e_rdp_set_refresh_timer(output, output->refresh_time);
    else
-     output->refresh_count = 5;
+     _e_rdp_set_refresh_timer(output, VGA_TIME);
    output->mouse_moved = EINA_TRUE;
 }
 
@@ -1494,9 +1505,8 @@ _e_rdp_canvas_render_post(void *data EINA_UNUSED, Evas *e EINA_UNUSED, void *eve
    if (b->client_count == 0)
      return;
 
-   if (!output->frame_timer)
-     output->frame_timer = ecore_timer_add(output->refresh_time, _e_rdp_frame_timer, output);
-   output->refresh_count = 5;
+   _e_rdp_set_refresh_timer(output, output->refresh_time);
+   output->buffer_changed_count = 4;
    output->buffer_changed = EINA_TRUE;
 }
 
@@ -1577,7 +1587,7 @@ e_rdp_peer_activate(freerdp_peer *client)
 
    if (output->w != settings->DesktopWidth || output->h != settings->DesktopHeight)
      {
-        if (b->no_clients_resize)
+        if (b->no_clients_resize || b->client_count > 0)
           {
              /* RDP peers don't dictate their resolution to e */
              if (!settings->DesktopResize)
@@ -1655,13 +1665,15 @@ e_rdp_peer_activate(freerdp_peer *client)
         output->refresh_time = _e_rdp_refresh_time_set(output->w, output->h);
         output->refresh_count = 5;
         output->frame_timer = ecore_timer_add(output->refresh_time, _e_rdp_frame_timer, output);
+        output->buffer_changed_count = 4;
         output->buffer_changed = EINA_TRUE;
 
         e_video_debug_display_primary_plane_set(EINA_TRUE);
      }
    else
      {
-        output->refresh_count = 5;
+        _e_rdp_set_refresh_timer(output, output->refresh_time);
+        output->buffer_changed_count = 4;
         output->buffer_changed = EINA_TRUE;
      }
 
@@ -1700,13 +1712,8 @@ e_rdp_input_synchronize_event(rdpInput *input, UINT32 flags)
    if (b->client_count == 0)
      return TRUE;
 
-   if (!output->frame_timer)
-     {
-        output->refresh_count = 5;
-        output->frame_timer = ecore_timer_add(output->refresh_time, _e_rdp_frame_timer, output);
-     }
-   else
-     output->refresh_count = 5;
+   _e_rdp_set_refresh_timer(output, output->refresh_time);
+   output->buffer_changed_count = 4;
    output->buffer_changed = EINA_TRUE;
 
    return TRUE;