Hi, On Mon, Jun 10, 2019 at 12:15:27PM +0000, Victor Toso wrote: > From: Snir Sheriber <ssheribe@xxxxxxxxxx> > > 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@xxxxxxxxxx> > + 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@xxxxxxxxxxxxxxxxxxxxx > https://lists.freedesktop.org/mailman/listinfo/spice-devel
Attachment:
signature.asc
Description: PGP signature
_______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/spice-devel