[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL 7/8] ui/console: Pass placeholder surface to displays
From: |
Gerd Hoffmann |
Subject: |
[PULL 7/8] ui/console: Pass placeholder surface to displays |
Date: |
Thu, 4 Mar 2021 09:37:04 +0100 |
From: Akihiko Odaki <akihiko.odaki@gmail.com>
ui/console used to accept NULL as graphic console surface, but its
semantics was inconsistent among displays:
- cocoa and gtk-egl perform NULL dereference.
- egl-headless, spice and spice-egl do nothing.
- gtk releases underlying resources.
- sdl2-2d and sdl2-gl destroys the window.
- vnc shows a message, "Display output is not active."
Fortunately, only virtio-gpu and virtio-gpu-3d assign NULL so
we can study them to figure out the desired behavior. They assign
NULL *except* for the primary display when the device is realized,
reset, or its scanout is disabled. This effectively destroys
windows for the (uninitialized) secondary displays.
To implement the consistent behavior of display device
realization/reset, this change embeds it to the operation
switching the surface. When NULL was given as a new surface when
switching, ui/console will instead passes a placeholder down
to each display listeners.
sdl destroys the window for a secondary console if its surface is a
placeholder. The other displays simply shows the placeholder.
Signed-off-by: Akihiko Odaki <akihiko.odaki@gmail.com>
Message-Id: <20210225101316.83940-2-akihiko.odaki@gmail.com>
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
ui/console.c | 17 ++++++++++++++++-
ui/gtk.c | 4 ----
ui/sdl2-2d.c | 7 ++-----
ui/sdl2-gl.c | 4 ++--
ui/spice-display.c | 6 +++---
ui/vnc.c | 10 ----------
6 files changed, 23 insertions(+), 25 deletions(-)
diff --git a/ui/console.c b/ui/console.c
index 32823faf4147..171a7bf14b94 100644
--- a/ui/console.c
+++ b/ui/console.c
@@ -1675,11 +1675,26 @@ void dpy_gfx_update_full(QemuConsole *con)
void dpy_gfx_replace_surface(QemuConsole *con,
DisplaySurface *surface)
{
+ static const char placeholder_msg[] = "Display output is not active.";
DisplayState *s = con->ds;
DisplaySurface *old_surface = con->surface;
DisplayChangeListener *dcl;
+ int width;
+ int height;
- assert(old_surface != surface || surface == NULL);
+ if (!surface) {
+ if (old_surface) {
+ width = surface_width(old_surface);
+ height = surface_height(old_surface);
+ } else {
+ width = 640;
+ height = 480;
+ }
+
+ surface = qemu_create_placeholder_surface(width, height,
placeholder_msg);
+ }
+
+ assert(old_surface != surface);
con->surface = surface;
QLIST_FOREACH(dcl, &s->listeners, next) {
diff --git a/ui/gtk.c b/ui/gtk.c
index c32ee34edcaf..3edaf041defc 100644
--- a/ui/gtk.c
+++ b/ui/gtk.c
@@ -567,10 +567,6 @@ static void gd_switch(DisplayChangeListener *dcl,
}
vc->gfx.ds = surface;
- if (!surface) {
- return;
- }
-
if (surface->format == PIXMAN_x8r8g8b8) {
/*
* PIXMAN_x8r8g8b8 == CAIRO_FORMAT_RGB24
diff --git a/ui/sdl2-2d.c b/ui/sdl2-2d.c
index a2ea85127d57..bfebbdeaea8c 100644
--- a/ui/sdl2-2d.c
+++ b/ui/sdl2-2d.c
@@ -32,14 +32,11 @@ void sdl2_2d_update(DisplayChangeListener *dcl,
int x, int y, int w, int h)
{
struct sdl2_console *scon = container_of(dcl, struct sdl2_console, dcl);
- DisplaySurface *surf = qemu_console_surface(dcl->con);
+ DisplaySurface *surf = scon->surface;
SDL_Rect rect;
size_t surface_data_offset;
assert(!scon->opengl);
- if (!surf) {
- return;
- }
if (!scon->texture) {
return;
}
@@ -75,7 +72,7 @@ void sdl2_2d_switch(DisplayChangeListener *dcl,
scon->texture = NULL;
}
- if (!new_surface) {
+ if (is_placeholder(new_surface) && qemu_console_get_index(dcl->con)) {
sdl2_window_destroy(scon);
return;
}
diff --git a/ui/sdl2-gl.c b/ui/sdl2-gl.c
index fd594d746110..a21d2deed916 100644
--- a/ui/sdl2-gl.c
+++ b/ui/sdl2-gl.c
@@ -86,7 +86,7 @@ void sdl2_gl_switch(DisplayChangeListener *dcl,
scon->surface = new_surface;
- if (!new_surface) {
+ if (is_placeholder(new_surface) && qemu_console_get_index(dcl->con)) {
qemu_gl_fini_shader(scon->gls);
scon->gls = NULL;
sdl2_window_destroy(scon);
@@ -112,7 +112,7 @@ void sdl2_gl_refresh(DisplayChangeListener *dcl)
assert(scon->opengl);
graphic_hw_update(dcl->con);
- if (scon->updates && scon->surface) {
+ if (scon->updates && scon->real_window) {
scon->updates = 0;
sdl2_gl_render_surface(scon);
}
diff --git a/ui/spice-display.c b/ui/spice-display.c
index ad93b953a90c..d22781a23d06 100644
--- a/ui/spice-display.c
+++ b/ui/spice-display.c
@@ -388,7 +388,7 @@ void qemu_spice_display_switch(SimpleSpiceDisplay *ssd,
SimpleSpiceUpdate *update;
bool need_destroy;
- if (surface && ssd->surface &&
+ if (ssd->surface &&
surface_width(surface) == pixman_image_get_width(ssd->surface) &&
surface_height(surface) == pixman_image_get_height(ssd->surface) &&
surface_format(surface) == pixman_image_get_format(ssd->surface)) {
@@ -410,8 +410,8 @@ void qemu_spice_display_switch(SimpleSpiceDisplay *ssd,
/* full mode switch */
trace_qemu_spice_display_surface(ssd->qxl.id,
- surface ? surface_width(surface) : 0,
- surface ? surface_height(surface) : 0,
+ surface_width(surface),
+ surface_height(surface),
false);
memset(&ssd->dirty, 0, sizeof(ssd->dirty));
diff --git a/ui/vnc.c b/ui/vnc.c
index 4d2151272e56..310abc937812 100644
--- a/ui/vnc.c
+++ b/ui/vnc.c
@@ -790,20 +790,10 @@ static bool vnc_check_pageflip(DisplaySurface *s1,
static void vnc_dpy_switch(DisplayChangeListener *dcl,
DisplaySurface *surface)
{
- static const char placeholder_msg[] =
- "Display output is not active.";
- static DisplaySurface *placeholder;
VncDisplay *vd = container_of(dcl, VncDisplay, dcl);
bool pageflip = vnc_check_pageflip(vd->ds, surface);
VncState *vs;
- if (surface == NULL) {
- if (placeholder == NULL) {
- placeholder = qemu_create_placeholder_surface(640, 480,
placeholder_msg);
- }
- surface = placeholder;
- }
-
vnc_abort_display_jobs(vd);
vd->ds = surface;
--
2.29.2
- [PULL 0/8] Ui 20210304 patches, Gerd Hoffmann, 2021/03/04
- [PULL 1/8] ui/cocoa: Remove the uses of full screen APIs, Gerd Hoffmann, 2021/03/04
- [PULL 2/8] ui/gtk: vte: fix sending multiple characeters, Gerd Hoffmann, 2021/03/04
- [PULL 6/8] ui/console: Add placeholder flag to message surface, Gerd Hoffmann, 2021/03/04
- [PULL 3/8] ui/cocoa: Fix stride resolution of pixman image, Gerd Hoffmann, 2021/03/04
- [PULL 4/8] configure: Improve OpenGL dependency detections, Gerd Hoffmann, 2021/03/04
- [PULL 5/8] ui/cocoa: Replace fprintf with error_report, Gerd Hoffmann, 2021/03/04
- [PULL 7/8] ui/console: Pass placeholder surface to displays,
Gerd Hoffmann <=
- [PULL 8/8] virtio-gpu: Do not distinguish the primary console, Gerd Hoffmann, 2021/03/04
- Re: [PULL 0/8] Ui 20210304 patches, Peter Maydell, 2021/03/05