qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 1/3] ui/gtk: adds status bar for expressing ups and fps
@ 2021-07-26 22:25 Dongwon Kim
  2021-07-26 22:25 ` [PATCH 2/3] ui/gtk: calling gd_gl_frame_counter at every draw/swap Dongwon Kim
                   ` (3 more replies)
  0 siblings, 4 replies; 6+ messages in thread
From: Dongwon Kim @ 2021-07-26 22:25 UTC (permalink / raw)
  To: qemu-devel; +Cc: Dongwon Kim

With a display option, "show-fps=on", qemu adds a status bar and print
following performance numbers on the bar,

ups = update per seconds - the rate the guest scanout is updated.
fps = frame per seconds - the frame rate of VC's GL drawing area

One function, gd_gl_count_frame is added to count # frames
and calculate ups and fps every 100 frames or guest scanout updates.

Signed-off-by: Dongwon Kim <dongwon.kim@intel.com>
---
 include/ui/console.h |  4 +++-
 include/ui/gtk.h     |  2 ++
 qapi/ui.json         |  6 +++++-
 ui/console.c         |  6 ++++++
 ui/gtk.c             | 51 ++++++++++++++++++++++++++++++++++++++++++++
 5 files changed, 67 insertions(+), 2 deletions(-)

diff --git a/include/ui/console.h b/include/ui/console.h
index b30b63976a..3ca8d07220 100644
--- a/include/ui/console.h
+++ b/include/ui/console.h
@@ -243,7 +243,8 @@ typedef struct DisplayChangeListenerOps {
     /* required if GL */
     void (*dpy_gl_update)(DisplayChangeListener *dcl,
                           uint32_t x, uint32_t y, uint32_t w, uint32_t h);
-
+    /* optional */
+    void (*dpy_gl_count_frame)(DisplayChangeListener *dcl, bool ups);
 } DisplayChangeListenerOps;
 
 struct DisplayChangeListener {
@@ -314,6 +315,7 @@ void dpy_gl_release_dmabuf(QemuConsole *con,
                            QemuDmaBuf *dmabuf);
 void dpy_gl_update(QemuConsole *con,
                    uint32_t x, uint32_t y, uint32_t w, uint32_t h);
+void dpy_gl_count_frame(QemuConsole *con, bool ups);
 
 QEMUGLContext dpy_gl_ctx_create(QemuConsole *con,
                                 QEMUGLParams *params);
diff --git a/include/ui/gtk.h b/include/ui/gtk.h
index 9516670ebc..8d1a6c2cef 100644
--- a/include/ui/gtk.h
+++ b/include/ui/gtk.h
@@ -118,6 +118,7 @@ struct GtkDisplayState {
     GtkWidget *show_tabs_item;
     GtkWidget *untabify_item;
     GtkWidget *show_menubar_item;
+    GtkWidget *status_bar;
 
     GtkWidget *vbox;
     GtkWidget *notebook;
@@ -152,6 +153,7 @@ extern bool gtk_use_gl_area;
 /* ui/gtk.c */
 void gd_update_windowsize(VirtualConsole *vc);
 int gd_monitor_update_interval(GtkWidget *widget);
+void gd_gl_count_frame(DisplayChangeListener *dcl, bool ups);
 
 /* ui/gtk-egl.c */
 void gd_egl_init(VirtualConsole *vc);
diff --git a/qapi/ui.json b/qapi/ui.json
index 1052ca9c38..a0882d6428 100644
--- a/qapi/ui.json
+++ b/qapi/ui.json
@@ -1035,13 +1035,17 @@
 #               assuming the guest will resize the display to match
 #               the window size then.  Otherwise it defaults to "off".
 #               Since 3.1
+# @show-fps:    Enable showing Guest Scanout's update rate (UPS) and
+#               Surface render swap rate (FPS) on a status bar (default: off).
+#               Since 6.0
 #
 # Since: 2.12
 #
 ##
 { 'struct'  : 'DisplayGTK',
   'data'    : { '*grab-on-hover' : 'bool',
-                '*zoom-to-fit'   : 'bool'  } }
+                '*zoom-to-fit'   : 'bool',
+                '*show-fps'      : 'bool'  } }
 
 ##
 # @DisplayEGLHeadless:
diff --git a/ui/console.c b/ui/console.c
index 2de5f4105b..31efdb0512 100644
--- a/ui/console.c
+++ b/ui/console.c
@@ -1924,6 +1924,12 @@ void dpy_gl_update(QemuConsole *con,
     con->gl->ops->dpy_gl_update(con->gl, x, y, w, h);
 }
 
+void dpy_gl_count_frame(QemuConsole *con, bool ups)
+{
+    assert(con->gl);
+    con->gl->ops->dpy_gl_count_frame(con->gl, ups);
+}
+
 /***********************************************************/
 /* register display */
 
diff --git a/ui/gtk.c b/ui/gtk.c
index 98046f577b..091da08028 100644
--- a/ui/gtk.c
+++ b/ui/gtk.c
@@ -549,6 +549,47 @@ static void gd_switch(DisplayChangeListener *dcl,
     }
 }
 
+void gd_gl_count_frame(DisplayChangeListener *dcl, bool ups)
+{
+    VirtualConsole *vc = container_of(dcl, VirtualConsole, gfx.dcl);
+    gchar ups_fps_str[100];
+    static guint prev, curr;
+    static guint ups_cnt, fps_cnt, status_bar_id;
+    struct timeval tv;
+
+    if (!vc->s->opts->show_fps) {
+        return;
+    }
+
+    if (prev == 0) {
+        gettimeofday(&tv, NULL);
+        prev = tv.tv_sec * 1000000 + tv.tv_usec;
+    }
+
+    if (ups) {
+        ups_cnt++;
+    } else {
+        fps_cnt++;
+    }
+
+    /* update rate is calculated for every 200 frames */
+    if (ups_cnt == 200 || fps_cnt == 200) {
+        gettimeofday(&tv, NULL);
+        curr = tv.tv_sec * 1000000 + tv.tv_usec;
+        prev = curr - prev;
+        sprintf(ups_fps_str, "UPS : %0.2f u/s  FPS : %0.2f f/s",
+                ups_cnt * 1000000/(gfloat)prev, fps_cnt * 1000000/(gfloat)prev);
+
+        status_bar_id = gtk_statusbar_get_context_id(GTK_STATUSBAR(vc->s->status_bar),
+                                                     "ups_fps_info");
+        gtk_statusbar_pop(GTK_STATUSBAR(vc->s->status_bar), status_bar_id);
+        gtk_statusbar_push(GTK_STATUSBAR(vc->s->status_bar), status_bar_id, ups_fps_str);
+        prev = curr;
+        fps_cnt = 0;
+        ups_cnt = 0;
+     }
+}
+
 static const DisplayChangeListenerOps dcl_ops = {
     .dpy_name             = "gtk",
     .dpy_gfx_update       = gd_update,
@@ -594,6 +635,7 @@ static const DisplayChangeListenerOps dcl_gl_area_ops = {
     .dpy_gl_update           = gd_gl_area_scanout_flush,
     .dpy_gl_scanout_dmabuf   = gd_gl_area_scanout_dmabuf,
     .dpy_has_dmabuf          = gd_has_dmabuf,
+    .dpy_gl_count_frame      = gd_gl_count_frame,
 };
 
 #ifdef CONFIG_X11
@@ -618,6 +660,7 @@ static const DisplayChangeListenerOps dcl_egl_ops = {
     .dpy_gl_release_dmabuf   = gd_egl_release_dmabuf,
     .dpy_gl_update           = gd_egl_scanout_flush,
     .dpy_has_dmabuf          = gd_has_dmabuf,
+    .dpy_gl_count_frame      = gd_gl_count_frame,
 };
 
 #endif
@@ -2208,6 +2251,10 @@ static void gtk_display_init(DisplayState *ds, DisplayOptions *opts)
     s->notebook = gtk_notebook_new();
     s->menu_bar = gtk_menu_bar_new();
 
+    if (opts->show_fps) {
+        s->status_bar = gtk_statusbar_new();
+    }
+
     s->free_scale = FALSE;
 
     /* Mostly LC_MESSAGES only. See early_gtk_display_init() for details. For
@@ -2248,6 +2295,10 @@ static void gtk_display_init(DisplayState *ds, DisplayOptions *opts)
     gtk_box_pack_start(GTK_BOX(s->vbox), s->menu_bar, FALSE, TRUE, 0);
     gtk_box_pack_start(GTK_BOX(s->vbox), s->notebook, TRUE, TRUE, 0);
 
+    if (opts->show_fps) {
+        gtk_box_pack_start(GTK_BOX(s->vbox), s->status_bar, FALSE, TRUE, 0);
+    }
+
     gtk_container_add(GTK_CONTAINER(s->window), s->vbox);
 
     gtk_widget_show_all(s->window);
-- 
2.17.1



^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH 2/3] ui/gtk: calling gd_gl_frame_counter at every draw/swap
  2021-07-26 22:25 [PATCH 1/3] ui/gtk: adds status bar for expressing ups and fps Dongwon Kim
@ 2021-07-26 22:25 ` Dongwon Kim
  2021-07-26 22:25 ` [PATCH 3/3] virtio-gpu: call dpy_gl_frame_counter at every guest scanout flush Dongwon Kim
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 6+ messages in thread
From: Dongwon Kim @ 2021-07-26 22:25 UTC (permalink / raw)
  To: qemu-devel; +Cc: Dongwon Kim

For FPS calculation, gd_gl_frame_counter is called at every
draw(gtk-gl-area) or swap(gtk-egl) activity.

Signed-off-by: Dongwon Kim <dongwon.kim@intel.com>
---
 ui/gtk-egl.c     | 2 ++
 ui/gtk-gl-area.c | 1 +
 2 files changed, 3 insertions(+)

diff --git a/ui/gtk-egl.c b/ui/gtk-egl.c
index 2a2e6d3a17..ac56f5b9f4 100644
--- a/ui/gtk-egl.c
+++ b/ui/gtk-egl.c
@@ -89,6 +89,7 @@ void gd_egl_draw(VirtualConsole *vc)
 
         eglSwapBuffers(qemu_egl_display, vc->gfx.esurface);
 
+        gd_gl_count_frame(&vc->gfx.dcl, false);
         vc->gfx.scale_x = (double)ww / surface_width(vc->gfx.ds);
         vc->gfx.scale_y = (double)wh / surface_height(vc->gfx.ds);
     }
@@ -290,6 +291,7 @@ void gd_egl_scanout_flush(DisplayChangeListener *dcl,
     }
 
     eglSwapBuffers(qemu_egl_display, vc->gfx.esurface);
+    gd_gl_count_frame(&vc->gfx.dcl, false);
 }
 
 void gtk_egl_init(DisplayGLMode mode)
diff --git a/ui/gtk-gl-area.c b/ui/gtk-gl-area.c
index dd5783fec7..a18b6ff425 100644
--- a/ui/gtk-gl-area.c
+++ b/ui/gtk-gl-area.c
@@ -72,6 +72,7 @@ void gd_gl_area_draw(VirtualConsole *vc)
     }
 
     glFlush();
+    gd_gl_count_frame(&vc->gfx.dcl, false);
     graphic_hw_gl_flushed(vc->gfx.dcl.con);
 }
 
-- 
2.17.1



^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH 3/3] virtio-gpu: call dpy_gl_frame_counter at every guest scanout flush
  2021-07-26 22:25 [PATCH 1/3] ui/gtk: adds status bar for expressing ups and fps Dongwon Kim
  2021-07-26 22:25 ` [PATCH 2/3] ui/gtk: calling gd_gl_frame_counter at every draw/swap Dongwon Kim
@ 2021-07-26 22:25 ` Dongwon Kim
  2021-07-27  8:24 ` [PATCH 1/3] ui/gtk: adds status bar for expressing ups and fps Daniel P. Berrangé
  2021-07-29 23:47 ` Eric Blake
  3 siblings, 0 replies; 6+ messages in thread
From: Dongwon Kim @ 2021-07-26 22:25 UTC (permalink / raw)
  To: qemu-devel; +Cc: Dongwon Kim

dpy_gl_frame_counter needs to be called for guest scanout frame count
to calculate and display the performance figure - ups, the guest FB
update per seconds.

Signed-off-by: Dongwon Kim <dongwon.kim@intel.com>
---
 hw/display/virtio-gpu.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/hw/display/virtio-gpu.c b/hw/display/virtio-gpu.c
index e183f4ecda..722869864a 100644
--- a/hw/display/virtio-gpu.c
+++ b/hw/display/virtio-gpu.c
@@ -523,6 +523,7 @@ static void virtio_gpu_resource_flush(VirtIOGPU *g,
                 console_has_gl(scanout->con)) {
                 dpy_gl_update(scanout->con, 0, 0, scanout->width,
                               scanout->height);
+                dpy_gl_count_frame(scanout->con, true);
                 return;
             }
         }
@@ -566,6 +567,7 @@ static void virtio_gpu_resource_flush(VirtIOGPU *g,
                        extents->x1, extents->y1,
                        extents->x2 - extents->x1,
                        extents->y2 - extents->y1);
+        dpy_gl_count_frame(scanout->con, true);
 
         pixman_region_fini(&region);
         pixman_region_fini(&finalregion);
-- 
2.17.1



^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH 1/3] ui/gtk: adds status bar for expressing ups and fps
  2021-07-26 22:25 [PATCH 1/3] ui/gtk: adds status bar for expressing ups and fps Dongwon Kim
  2021-07-26 22:25 ` [PATCH 2/3] ui/gtk: calling gd_gl_frame_counter at every draw/swap Dongwon Kim
  2021-07-26 22:25 ` [PATCH 3/3] virtio-gpu: call dpy_gl_frame_counter at every guest scanout flush Dongwon Kim
@ 2021-07-27  8:24 ` Daniel P. Berrangé
  2021-07-27 18:46   ` Dongwon Kim
  2021-07-29 23:47 ` Eric Blake
  3 siblings, 1 reply; 6+ messages in thread
From: Daniel P. Berrangé @ 2021-07-27  8:24 UTC (permalink / raw)
  To: Dongwon Kim; +Cc: qemu-devel

On Mon, Jul 26, 2021 at 03:25:49PM -0700, Dongwon Kim wrote:
> With a display option, "show-fps=on", qemu adds a status bar and print
> following performance numbers on the bar,
> 
> ups = update per seconds - the rate the guest scanout is updated.
> fps = frame per seconds - the frame rate of VC's GL drawing area
> 
> One function, gd_gl_count_frame is added to count # frames
> and calculate ups and fps every 100 frames or guest scanout updates.

This feels like a pretty niche/novelty feature. Is this really
something we can justify adding to the UI, considering that it
means we will be maintaining this UI and supporting code long
term. 


Regards,
Daniel
-- 
|: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org         -o-            https://fstop138.berrange.com :|
|: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|



^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH 1/3] ui/gtk: adds status bar for expressing ups and fps
  2021-07-27  8:24 ` [PATCH 1/3] ui/gtk: adds status bar for expressing ups and fps Daniel P. Berrangé
@ 2021-07-27 18:46   ` Dongwon Kim
  0 siblings, 0 replies; 6+ messages in thread
From: Dongwon Kim @ 2021-07-27 18:46 UTC (permalink / raw)
  To: Daniel P. Berrangé; +Cc: qemu-devel

I found there are no such performance indicators available in Qemu/GTK.
I thought this was the gap as in many fields, users want to check fps or
ups to evaluate graphic or display performance in their use-cases.

Thanks for your feedback!. 

On Tue, Jul 27, 2021 at 09:24:44AM +0100, Daniel P. Berrangé wrote:
> On Mon, Jul 26, 2021 at 03:25:49PM -0700, Dongwon Kim wrote:
> > With a display option, "show-fps=on", qemu adds a status bar and print
> > following performance numbers on the bar,
> > 
> > ups = update per seconds - the rate the guest scanout is updated.
> > fps = frame per seconds - the frame rate of VC's GL drawing area
> > 
> > One function, gd_gl_count_frame is added to count # frames
> > and calculate ups and fps every 100 frames or guest scanout updates.
> 
> This feels like a pretty niche/novelty feature. Is this really
> something we can justify adding to the UI, considering that it
> means we will be maintaining this UI and supporting code long
> term. 
> 
> 
> Regards,
> Daniel
> -- 
> |: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
> |: https://libvirt.org         -o-            https://fstop138.berrange.com :|
> |: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|
> 


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH 1/3] ui/gtk: adds status bar for expressing ups and fps
  2021-07-26 22:25 [PATCH 1/3] ui/gtk: adds status bar for expressing ups and fps Dongwon Kim
                   ` (2 preceding siblings ...)
  2021-07-27  8:24 ` [PATCH 1/3] ui/gtk: adds status bar for expressing ups and fps Daniel P. Berrangé
@ 2021-07-29 23:47 ` Eric Blake
  3 siblings, 0 replies; 6+ messages in thread
From: Eric Blake @ 2021-07-29 23:47 UTC (permalink / raw)
  To: Dongwon Kim; +Cc: qemu-devel

On Mon, Jul 26, 2021 at 03:25:49PM -0700, Dongwon Kim wrote:

[meta-comment] When sending a patch series, remember to include a 0/3
cover letter, as it makes it easier to distinguish replies about the
series as a whole from review of the first patch.

> With a display option, "show-fps=on", qemu adds a status bar and print
> following performance numbers on the bar,
> 
> ups = update per seconds - the rate the guest scanout is updated.
> fps = frame per seconds - the frame rate of VC's GL drawing area
> 
> One function, gd_gl_count_frame is added to count # frames
> and calculate ups and fps every 100 frames or guest scanout updates.
> 
> Signed-off-by: Dongwon Kim <dongwon.kim@intel.com>
> ---
>  include/ui/console.h |  4 +++-
>  include/ui/gtk.h     |  2 ++
>  qapi/ui.json         |  6 +++++-
>  ui/console.c         |  6 ++++++
>  ui/gtk.c             | 51 ++++++++++++++++++++++++++++++++++++++++++++
>  5 files changed, 67 insertions(+), 2 deletions(-)

> +++ b/qapi/ui.json
> @@ -1035,13 +1035,17 @@
>  #               assuming the guest will resize the display to match
>  #               the window size then.  Otherwise it defaults to "off".
>  #               Since 3.1
> +# @show-fps:    Enable showing Guest Scanout's update rate (UPS) and
> +#               Surface render swap rate (FPS) on a status bar (default: off).
> +#               Since 6.0

This is too late to make the 6.1 release; at best, it should read
'since 6.2'

-- 
Eric Blake, Principal Software Engineer
Red Hat, Inc.           +1-919-301-3266
Virtualization:  qemu.org | libvirt.org



^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2021-07-29 23:48 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-07-26 22:25 [PATCH 1/3] ui/gtk: adds status bar for expressing ups and fps Dongwon Kim
2021-07-26 22:25 ` [PATCH 2/3] ui/gtk: calling gd_gl_frame_counter at every draw/swap Dongwon Kim
2021-07-26 22:25 ` [PATCH 3/3] virtio-gpu: call dpy_gl_frame_counter at every guest scanout flush Dongwon Kim
2021-07-27  8:24 ` [PATCH 1/3] ui/gtk: adds status bar for expressing ups and fps Daniel P. Berrangé
2021-07-27 18:46   ` Dongwon Kim
2021-07-29 23:47 ` Eric Blake

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).