[Spice-devel] [spice-gtk v4] Adjust to window scaling

Snir Sheriber ssheribe at redhat.com
Mon Jun 10 13:14:50 UTC 2019


On 6/10/19 3:45 PM, Victor Toso wrote:
> 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


Will be fixed.


>
>>   #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 :)


This is indeed not necessary.

Will be removed, Thanks!


>
> 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
>>
>> _______________________________________________
>> Spice-devel mailing list
>> Spice-devel at lists.freedesktop.org
>> https://lists.freedesktop.org/mailman/listinfo/spice-devel
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/spice-devel/attachments/20190610/3822d4a3/attachment-0001.html>


More information about the Spice-devel mailing list