[Spice-devel] [PATCH v2 spice-gtk] Adjust to window scaling
Snir Sheriber
ssheribe at redhat.com
Mon May 27 08:02:12 UTC 2019
Hi,
On 5/23/19 2:00 PM, Victor Toso wrote:
> Hi,
>
> On Thu, May 23, 2019 at 01:01:12PM +0300, Snir Sheriber wrote:
>> 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 at redhat.com> 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.
> But it can be changed, right? In that case, d->egl.scale would
> not have the right value in spice_egl_resize_display()
Yes, if the user is changing his desktop scaling during running,
i guess this could be solved also by resetting this parameter
in the allocation / realize callback.
I'll follow this response with another version to this patch that
may be bit more reasonable
Snir
>
> Note that user tested that this patches fixes so I'd add that to
> commit log:
>
> https://gitlab.freedesktop.org/spice/spice-gtk/issues/99
>
> Cheers,
>
>> 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 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
More information about the Spice-devel
mailing list