mirror of
https://gitlab.uni-freiburg.de/opensourcevdi/spice-gtk
synced 2026-02-04 13:01:52 +00:00
egl: fix delayed widget realize
When the display is not yet realized, spice_display_widget_gl_scanout() will fail because the egl context is not ready. The display is never marked ready because the egl.image (and egl.scanout) is not set, and some clients, such as virt-viewer will not realize the widget until the display is ready. Deal with gl scanout updates when the widget is not yet realized, and mark the display as ready when egl is enabled (when last display draw signal is from gl). Signed-off-by: Marc-André Lureau <marcandre.lureau@gmail.com> Acked-by: Pavel Grunt <pgrunt@redhat.com>
This commit is contained in:
parent
4e08108d0a
commit
69383107ea
@ -238,7 +238,7 @@ static void update_ready(SpiceDisplay *display)
|
||||
|
||||
if (d->monitor_ready) {
|
||||
#ifndef G_OS_WIN32
|
||||
ready = d->egl.enabled ? d->egl.image != NULL : d->mark != 0;
|
||||
ready = d->egl.enabled || d->mark != 0;
|
||||
#else
|
||||
ready = d->mark != 0;
|
||||
#endif
|
||||
@ -2296,9 +2296,12 @@ static void update_area(SpiceDisplay *display,
|
||||
|
||||
#ifndef G_OS_WIN32
|
||||
if (d->egl.enabled) {
|
||||
const SpiceGlScanout *so =
|
||||
spice_display_get_gl_scanout(SPICE_DISPLAY_CHANNEL(d->display));
|
||||
g_return_if_fail(so != NULL);
|
||||
primary = (GdkRectangle) {
|
||||
.width = d->egl.scanout.width,
|
||||
.height = d->egl.scanout.height
|
||||
.width = so->width,
|
||||
.height = so->height
|
||||
};
|
||||
} else
|
||||
#endif
|
||||
@ -2611,21 +2614,22 @@ G_GNUC_INTERNAL
|
||||
void spice_display_widget_gl_scanout(SpiceDisplay *display)
|
||||
{
|
||||
SpiceDisplayPrivate *d = display->priv;
|
||||
const SpiceGlScanout *scanout;
|
||||
GError *err = NULL;
|
||||
|
||||
SPICE_DEBUG("%s: got scanout", __FUNCTION__);
|
||||
set_egl_enabled(display, true);
|
||||
|
||||
g_return_if_fail(d->egl.context_ready);
|
||||
if (d->egl.context_ready) {
|
||||
const SpiceGlScanout *scanout;
|
||||
GError *err = NULL;
|
||||
|
||||
scanout = spice_display_get_gl_scanout(SPICE_DISPLAY_CHANNEL(d->display));
|
||||
/* should only be called when the display has a scanout */
|
||||
g_return_if_fail(scanout != NULL);
|
||||
scanout = spice_display_get_gl_scanout(SPICE_DISPLAY_CHANNEL(d->display));
|
||||
/* should only be called when the display has a scanout */
|
||||
g_return_if_fail(scanout != NULL);
|
||||
|
||||
if (!spice_egl_update_scanout(display, scanout, &err)) {
|
||||
g_critical("update scanout failed: %s", err->message);
|
||||
g_clear_error(&err);
|
||||
if (!spice_egl_update_scanout(display, scanout, &err)) {
|
||||
g_critical("update scanout failed: %s", err->message);
|
||||
g_clear_error(&err);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user