Re: [PATCH v2 spice-gtk] Adjust to window scaling

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi,

On 5/22/19 6:02 PM, Marc-André Lureau wrote:
Hi

On Sun, Mar 17, 2019 at 4:28 PM Snir Sheriber <ssheribe@xxxxxxxxxx> wrote:
When GDK_SCALE is != 1 and egl is used, the image presented does not
fit to the window (scale of 2 is often used with hidpi monitors).
Usually this is not a problem since all components are adjusted by
gdk/gtk but with egl, pixel-based data is not being scaled. In this
case window's scale value can be used in order to determine whether
to use a pixel resource with higher resolution data.

In order to reproduce the problem set spice with virgl/Intel-vGPU
and run spice-gtk with GDK_SCALE=2
---
Changes from v1:
-commit msg
-replace var naming (ws with win_scale)


This patch is kind of RFC, it fixes the issue, but it's a bit hacky
and specific. I didn't come across other scale issues but it is likely
that more of these exist and better and generic fix is needed.

---
  src/spice-widget-egl.c  | 15 +++++++++++++--
  src/spice-widget-priv.h |  1 +
  2 files changed, 14 insertions(+), 2 deletions(-)

diff --git a/src/spice-widget-egl.c b/src/spice-widget-egl.c
index 43fccd7..600c87a 100644
--- a/src/spice-widget-egl.c
+++ b/src/spice-widget-egl.c
@@ -326,6 +326,8 @@ static gboolean spice_widget_init_egl_win(SpiceDisplay *display, GdkWindow *win,
      if (d->egl.surface)
          return TRUE;

+    d->egl.scale = gdk_window_get_scale_factor(win);
Why not use gtk_widget_get_scale_factor() directly from
spice_egl_resize_display?


There is no special objection for that, just because i adjust scaling also in spice_egl_update_display
and i assumed scaling is not being changed frequently.


Snir.

+
  #ifdef GDK_WINDOWING_X11
      if (GDK_IS_X11_WINDOW(win)) {
          native = (EGLNativeWindowType)GDK_WINDOW_XID(win);
@@ -431,15 +433,17 @@ void spice_egl_resize_display(SpiceDisplay *display, int w, int h)
  {
      SpiceDisplayPrivate *d = display->priv;
      int prog;
+    gint win_scale;

      if (!gl_make_current(display, NULL))
          return;

+    win_scale = d->egl.scale;
      glGetIntegerv(GL_CURRENT_PROGRAM, &prog);

      glUseProgram(d->egl.prog);
-    apply_ortho(d->egl.mproj, 0, w, 0, h, -1, 1);
-    glViewport(0, 0, w, h);
+    apply_ortho(d->egl.mproj, 0, w * win_scale , 0, h * win_scale, -1, 1);
+    glViewport(0, 0, w * win_scale, h * win_scale);

      if (d->ready)
          spice_egl_update_display(display);
@@ -559,6 +563,13 @@ void spice_egl_update_display(SpiceDisplay *display)

      spice_display_get_scaling(display, &s, &x, &y, &w, &h);

+    // Adjust to gdk scale
+    s *= d->egl.scale;
+    x *= d->egl.scale;
+    y *= d->egl.scale;
+    w *= d->egl.scale;
+    h *= d->egl.scale;
+
      glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
      glClear(GL_COLOR_BUFFER_BIT);

diff --git a/src/spice-widget-priv.h b/src/spice-widget-priv.h
index 65eb404..8f110ac 100644
--- a/src/spice-widget-priv.h
+++ b/src/spice-widget-priv.h
@@ -149,6 +149,7 @@ struct _SpiceDisplayPrivate {
          EGLImageKHR         image;
          gboolean            call_draw_done;
          SpiceGlScanout      scanout;
+        gint                scale;
      } egl;
  #endif // HAVE_EGL
      double scroll_delta_y;
--
2.19.1

_______________________________________________
Spice-devel mailing list
Spice-devel@xxxxxxxxxxxxxxxxxxxxx
https://lists.freedesktop.org/mailman/listinfo/spice-devel


_______________________________________________
Spice-devel mailing list
Spice-devel@xxxxxxxxxxxxxxxxxxxxx
https://lists.freedesktop.org/mailman/listinfo/spice-devel




[Index of Archives]     [Linux Virtualization]     [Linux Virtualization]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Security]     [Bugtraq]     [Linux OMAP]     [Linux MIPS]     [ECOS]     [Asterisk Internet PBX]     [Linux API]     [Monitors]