[Spice-devel] [spice-gtk v4] Adjust to window scaling
Victor Toso
victortoso at redhat.com
Mon Jun 10 12:45:33 UTC 2019
Hi,
On Mon, Jun 10, 2019 at 12:15:27PM +0000, Victor Toso wrote:
> From: Snir Sheriber <ssheribe at redhat.com>
>
> 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
>
> This issue was also reported at freedesktop gitlab repo:
> https://gitlab.freedesktop.org/spice/spice-gtk/issues/99
> ---
> src/spice-widget-egl.c | 8 ++++----
> src/spice-widget.c | 31 +++++++++++++++++++++++--------
> 2 files changed, 27 insertions(+), 12 deletions(-)
>
> diff --git a/src/spice-widget-egl.c b/src/spice-widget-egl.c
> index 43fccd7..4c2a58e 100644
> --- a/src/spice-widget-egl.c
> +++ b/src/spice-widget-egl.c
> @@ -360,9 +360,9 @@ gboolean spice_egl_realize_display(SpiceDisplay *display, GdkWindow *win, GError
> DISPLAY_DEBUG(display, "egl realize");
> if (!spice_widget_init_egl_win(display, win, err))
> return FALSE;
> -
> - spice_egl_resize_display(display, gdk_window_get_width(win),
> - gdk_window_get_height(win));
> + gint scale_factor = gtk_widget_get_scale_factor(GTK_WIDGET(display));
> + spice_egl_resize_display(display, gdk_window_get_width(win) * scale_factor,
> + gdk_window_get_height(win) * scale_factor);
>
> return TRUE;
> }
> @@ -427,7 +427,7 @@ void spice_egl_unrealize_display(SpiceDisplay *display)
> }
>
> G_GNUC_INTERNAL
> -void spice_egl_resize_display(SpiceDisplay *display, int w, int h)
> +void spice_egl_resize_display(SpiceDisplay *display, int w, int h) // w and h should be adjusted to gdk scaling
Why not a comment before the function declaration?
> {
> SpiceDisplayPrivate *d = display->priv;
> int prog;
> diff --git a/src/spice-widget.c b/src/spice-widget.c
> index 1f2a154..a2651ff 100644
> --- a/src/spice-widget.c
> +++ b/src/spice-widget.c
> @@ -1382,7 +1382,8 @@ static void set_egl_enabled(SpiceDisplay *display, bool enabled)
> }
>
> if (enabled && d->egl.context_ready) {
> - spice_egl_resize_display(display, d->ww, d->wh);
> + gint scale_factor = gtk_widget_get_scale_factor(GTK_WIDGET(display));
> + spice_egl_resize_display(display, d->ww * scale_factor, d->wh * scale_factor);
> }
>
> d->egl.enabled = enabled;
> @@ -1978,11 +1979,16 @@ static void transform_input(SpiceDisplay *display,
> SpiceDisplayPrivate *d = display->priv;
> int display_x, display_y, display_w, display_h;
> double is;
> + gint scale_factor = 1;
>
> spice_display_get_scaling(display, NULL,
> &display_x, &display_y,
> &display_w, &display_h);
> -
> +#if HAVE_EGL
> + if (egl_enabled(d)) {
> + scale_factor = gtk_widget_get_scale_factor(GTK_WIDGET(display));
> + }
> +#endif
I don't think this #if HAVE_EGL is needed because that's in
egl_enabled() too, in case egl is disabled it should always
return false which I hope compiler can optimize...
> /* For input we need a different scaling factor in order to
> be able to reach the full width of a display. For instance, consider
> a display of 100 pixels showing in a window 10 pixels wide. The normal
> @@ -1998,7 +2004,7 @@ static void transform_input(SpiceDisplay *display,
> coordinates in the inverse direction (window -> display) as the fb size
> (display -> window).
> */
> - is = (double)(d->area.width-1) / (double)(display_w-1);
> + is = ((double)(d->area.width-1) / (double)(display_w-1)) * scale_factor;
>
> window_x -= display_x;
> window_y -= display_y;
> @@ -2183,8 +2189,10 @@ static void size_allocate(GtkWidget *widget, GtkAllocation *conf, gpointer data)
> d->wh = conf->height;
> recalc_geometry(widget);
> #if HAVE_EGL
> - if (egl_enabled(d))
> - spice_egl_resize_display(display, conf->width, conf->height);
> + if (egl_enabled(d)) {
> + gint scale_factor = gtk_widget_get_scale_factor(widget);
> + spice_egl_resize_display(display, conf->width * scale_factor, conf->height * scale_factor);
> + }
Indentation is wrong
> #endif
> }
>
> @@ -2942,10 +2950,16 @@ void spice_display_get_scaling(SpiceDisplay *display,
> int ww, wh;
> int x, y, w, h;
> double s;
> + gint scale_factor = 1;
>
> if (gtk_widget_get_realized (GTK_WIDGET(display))) {
> - ww = gtk_widget_get_allocated_width(GTK_WIDGET(display));
> - wh = gtk_widget_get_allocated_height(GTK_WIDGET(display));
> +#if HAVE_EGL
> + if (egl_enabled(d)) {
> + scale_factor = gtk_widget_get_scale_factor(GTK_WIDGET(display));
> + }
> +#endif
.. same here but I haven't tested this version nor checked the
assembly code so, take this as suggestion only :)
Acked-by: Victor Toso <victortoso at redhat.com>
> + ww = gtk_widget_get_allocated_width(GTK_WIDGET(display)) * scale_factor;
> + wh = gtk_widget_get_allocated_height(GTK_WIDGET(display)) * scale_factor;
> } else {
> ww = fbw;
> wh = fbh;
> @@ -3091,7 +3105,8 @@ void spice_display_widget_gl_scanout(SpiceDisplay *display)
> g_clear_error(&err);
> }
>
> - spice_egl_resize_display(display, d->ww, d->wh);
> + gint scale_factor = gtk_widget_get_scale_factor(GTK_WIDGET(display));
> + spice_egl_resize_display(display, d->ww * scale_factor, d->wh * scale_factor);
> }
> #endif
>
> --
> 2.20.1
>
> _______________________________________________
> Spice-devel mailing list
> Spice-devel at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/spice-devel
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: not available
URL: <https://lists.freedesktop.org/archives/spice-devel/attachments/20190610/0bf59b13/attachment-0001.sig>
More information about the Spice-devel
mailing list