diff mbox series

[2/6] Revert "console: save current scanout details"

Message ID 20220213024222.3548-3-akihiko.odaki@gmail.com
State New
Headers show
Series ui/dbus: Share one listener for a console | expand

Commit Message

Akihiko Odaki Feb. 13, 2022, 2:42 a.m. UTC
This reverts commit ebced091854517f063c46ce8e522ebc45e9bccdf.

This fixes the compatibility between egl-headless and displays
using console_select, most importantly vnc.

Signed-off-by: Akihiko Odaki <akihiko.odaki@gmail.com>
---
 include/ui/console.h |  27 -------
 ui/console.c         | 165 ++++++++++++++-----------------------------
 2 files changed, 54 insertions(+), 138 deletions(-)
diff mbox series

Patch

diff --git a/include/ui/console.h b/include/ui/console.h
index f590819880b..eefd7e4dc1f 100644
--- a/include/ui/console.h
+++ b/include/ui/console.h
@@ -108,17 +108,6 @@  struct QemuConsoleClass {
 #define QEMU_ALLOCATED_FLAG     0x01
 #define QEMU_PLACEHOLDER_FLAG   0x02
 
-typedef struct ScanoutTexture {
-    uint32_t backing_id;
-    bool backing_y_0_top;
-    uint32_t backing_width;
-    uint32_t backing_height;
-    uint32_t x;
-    uint32_t y;
-    uint32_t width;
-    uint32_t height;
-} ScanoutTexture;
-
 typedef struct DisplaySurface {
     pixman_format_code_t format;
     pixman_image_t *image;
@@ -189,22 +178,6 @@  typedef struct QemuDmaBuf {
     bool      draw_submitted;
 } QemuDmaBuf;
 
-enum display_scanout {
-    SCANOUT_NONE,
-    SCANOUT_SURFACE,
-    SCANOUT_TEXTURE,
-    SCANOUT_DMABUF,
-};
-
-typedef struct DisplayScanout {
-    enum display_scanout kind;
-    union {
-        /* DisplaySurface *surface; is kept in QemuConsole */
-        ScanoutTexture texture;
-        QemuDmaBuf *dmabuf;
-    };
-} DisplayScanout;
-
 typedef struct DisplayState DisplayState;
 typedef struct DisplayGLCtx DisplayGLCtx;
 
diff --git a/ui/console.c b/ui/console.c
index 40eebb6d2cc..78583df9203 100644
--- a/ui/console.c
+++ b/ui/console.c
@@ -77,7 +77,6 @@  struct QemuConsole {
     console_type_t console_type;
     DisplayState *ds;
     DisplaySurface *surface;
-    DisplayScanout scanout;
     int dcls;
     DisplayGLCtx *gl;
     int gl_block;
@@ -147,7 +146,6 @@  static void dpy_refresh(DisplayState *s);
 static DisplayState *get_alloc_displaystate(void);
 static void text_console_update_cursor_timer(void);
 static void text_console_update_cursor(void *opaque);
-static bool displaychangelistener_has_dmabuf(DisplayChangeListener *dcl);
 
 static void gui_update(void *opaque)
 {
@@ -483,8 +481,6 @@  static void text_console_resize(QemuConsole *s)
     TextCell *cells, *c, *c1;
     int w1, x, y, last_width;
 
-    assert(s->scanout.kind == SCANOUT_SURFACE);
-
     last_width = s->width;
     s->width = surface_width(s->surface) / FONT_WIDTH;
     s->height = surface_height(s->surface) / FONT_HEIGHT;
@@ -1056,48 +1052,6 @@  static void console_putchar(QemuConsole *s, int ch)
     }
 }
 
-static void displaychangelistener_display_console(DisplayChangeListener *dcl,
-                                                  QemuConsole *con)
-{
-    static const char nodev[] =
-        "This VM has no graphic display device.";
-    static DisplaySurface *dummy;
-
-    if (!con) {
-        if (!dcl->ops->dpy_gfx_switch) {
-            return;
-        }
-        if (!dummy) {
-            dummy = qemu_create_placeholder_surface(640, 480, nodev);
-        }
-        dcl->ops->dpy_gfx_switch(dcl, dummy);
-        return;
-    }
-
-    if (con->scanout.kind == SCANOUT_DMABUF &&
-        displaychangelistener_has_dmabuf(dcl)) {
-        dcl->ops->dpy_gl_scanout_dmabuf(dcl, con->scanout.dmabuf);
-    } else if (con->scanout.kind == SCANOUT_TEXTURE &&
-               dcl->ops->dpy_gl_scanout_texture) {
-        dcl->ops->dpy_gl_scanout_texture(dcl,
-                                         con->scanout.texture.backing_id,
-                                         con->scanout.texture.backing_y_0_top,
-                                         con->scanout.texture.backing_width,
-                                         con->scanout.texture.backing_height,
-                                         con->scanout.texture.x,
-                                         con->scanout.texture.y,
-                                         con->scanout.texture.width,
-                                         con->scanout.texture.height);
-    } else if (con->scanout.kind == SCANOUT_SURFACE &&
-               dcl->ops->dpy_gfx_switch) {
-        dcl->ops->dpy_gfx_switch(dcl, con->surface);
-    }
-
-    dcl->ops->dpy_gfx_update(dcl, 0, 0,
-                             qemu_console_get_width(con, 0),
-                             qemu_console_get_height(con, 0));
-}
-
 void console_select(unsigned int index)
 {
     DisplayChangeListener *dcl;
@@ -1114,7 +1068,13 @@  void console_select(unsigned int index)
                 if (dcl->con != NULL) {
                     continue;
                 }
-                displaychangelistener_display_console(dcl, s);
+                if (dcl->ops->dpy_gfx_switch) {
+                    dcl->ops->dpy_gfx_switch(dcl, s->surface);
+                }
+            }
+            if (s->surface) {
+                dpy_gfx_update(s, 0, 0, surface_width(s->surface),
+                               surface_height(s->surface));
             }
         }
         if (ds->have_text) {
@@ -1520,6 +1480,9 @@  static bool dpy_gl_compatible_with(QemuConsole *con, DisplayChangeListener *dcl)
 
 void register_displaychangelistener(DisplayChangeListener *dcl)
 {
+    static const char nodev[] =
+        "This VM has no graphic display device.";
+    static DisplaySurface *dummy;
     QemuConsole *con;
 
     assert(!dcl->ds);
@@ -1544,7 +1507,16 @@  void register_displaychangelistener(DisplayChangeListener *dcl)
     } else {
         con = active_console;
     }
-    displaychangelistener_display_console(dcl, con);
+    if (dcl->ops->dpy_gfx_switch) {
+        if (con) {
+            dcl->ops->dpy_gfx_switch(dcl, con->surface);
+        } else {
+            if (!dummy) {
+                dummy = qemu_create_placeholder_surface(640, 480, nodev);
+            }
+            dcl->ops->dpy_gfx_switch(dcl, dummy);
+        }
+    }
     text_console_update_cursor(NULL);
 }
 
@@ -1625,9 +1597,13 @@  void dpy_gfx_update(QemuConsole *con, int x, int y, int w, int h)
 {
     DisplayState *s = con->ds;
     DisplayChangeListener *dcl;
-    int width = qemu_console_get_width(con, x + w);
-    int height = qemu_console_get_height(con, y + h);
+    int width = w;
+    int height = h;
 
+    if (con->surface) {
+        width = surface_width(con->surface);
+        height = surface_height(con->surface);
+    }
     x = MAX(x, 0);
     y = MAX(y, 0);
     x = MIN(x, width);
@@ -1650,10 +1626,12 @@  void dpy_gfx_update(QemuConsole *con, int x, int y, int w, int h)
 
 void dpy_gfx_update_full(QemuConsole *con)
 {
-    int w = qemu_console_get_width(con, 0);
-    int h = qemu_console_get_height(con, 0);
-
-    dpy_gfx_update(con, 0, 0, w, h);
+    if (!con->surface) {
+        return;
+    }
+    dpy_gfx_update(con, 0, 0,
+                   surface_width(con->surface),
+                   surface_height(con->surface));
 }
 
 void dpy_gfx_replace_surface(QemuConsole *con,
@@ -1680,7 +1658,6 @@  void dpy_gfx_replace_surface(QemuConsole *con,
 
     assert(old_surface != surface);
 
-    con->scanout.kind = SCANOUT_SURFACE;
     con->surface = surface;
     QLIST_FOREACH(dcl, &s->listeners, next) {
         if (con != (dcl->con ? dcl->con : active_console)) {
@@ -1856,9 +1833,6 @@  void dpy_gl_scanout_disable(QemuConsole *con)
     DisplayState *s = con->ds;
     DisplayChangeListener *dcl;
 
-    if (con->scanout.kind != SCANOUT_SURFACE) {
-        con->scanout.kind = SCANOUT_NONE;
-    }
     QLIST_FOREACH(dcl, &s->listeners, next) {
         dcl->ops->dpy_gl_scanout_disable(dcl);
     }
@@ -1875,11 +1849,6 @@  void dpy_gl_scanout_texture(QemuConsole *con,
     DisplayState *s = con->ds;
     DisplayChangeListener *dcl;
 
-    con->scanout.kind = SCANOUT_TEXTURE;
-    con->scanout.texture = (ScanoutTexture) {
-        backing_id, backing_y_0_top, backing_width, backing_height,
-        x, y, width, height
-    };
     QLIST_FOREACH(dcl, &s->listeners, next) {
         dcl->ops->dpy_gl_scanout_texture(dcl, backing_id,
                                          backing_y_0_top,
@@ -1894,8 +1863,6 @@  void dpy_gl_scanout_dmabuf(QemuConsole *con,
     DisplayState *s = con->ds;
     DisplayChangeListener *dcl;
 
-    con->scanout.kind = SCANOUT_DMABUF;
-    con->scanout.dmabuf = dmabuf;
     QLIST_FOREACH(dcl, &s->listeners, next) {
         dcl->ops->dpy_gl_scanout_dmabuf(dcl, dmabuf);
     }
@@ -2022,8 +1989,10 @@  QemuConsole *graphic_console_init(DeviceState *dev, uint32_t head,
     s = qemu_console_lookup_unused();
     if (s) {
         trace_console_gfx_reuse(s->index);
-        width = qemu_console_get_width(s, 0);
-        height = qemu_console_get_height(s, 0);
+        if (s->surface) {
+            width = surface_width(s->surface);
+            height = surface_height(s->surface);
+        }
     } else {
         trace_console_gfx_new();
         s = new_console(ds, GRAPHIC_CONSOLE, head);
@@ -2052,8 +2021,13 @@  void graphic_console_close(QemuConsole *con)
     static const char unplugged[] =
         "Guest display has been unplugged";
     DisplaySurface *surface;
-    int width = qemu_console_get_width(con, 640);
-    int height = qemu_console_get_height(con, 480);
+    int width = 640;
+    int height = 480;
+
+    if (con->surface) {
+        width = surface_width(con->surface);
+        height = surface_height(con->surface);
+    }
 
     trace_console_gfx_close(con->index);
     object_property_set_link(OBJECT(con), "device", NULL, &error_abort);
@@ -2205,19 +2179,7 @@  int qemu_console_get_width(QemuConsole *con, int fallback)
     if (con == NULL) {
         con = active_console;
     }
-    if (con == NULL) {
-        return fallback;
-    }
-    switch (con->scanout.kind) {
-    case SCANOUT_DMABUF:
-        return con->scanout.dmabuf->width;
-    case SCANOUT_TEXTURE:
-        return con->scanout.texture.width;
-    case SCANOUT_SURFACE:
-        return surface_width(con->surface);
-    default:
-        return fallback;
-    }
+    return con ? surface_width(con->surface) : fallback;
 }
 
 int qemu_console_get_height(QemuConsole *con, int fallback)
@@ -2225,19 +2187,7 @@  int qemu_console_get_height(QemuConsole *con, int fallback)
     if (con == NULL) {
         con = active_console;
     }
-    if (con == NULL) {
-        return fallback;
-    }
-    switch (con->scanout.kind) {
-    case SCANOUT_DMABUF:
-        return con->scanout.dmabuf->height;
-    case SCANOUT_TEXTURE:
-        return con->scanout.texture.height;
-    case SCANOUT_SURFACE:
-        return surface_height(con->surface);
-    default:
-        return fallback;
-    }
+    return con ? surface_height(con->surface) : fallback;
 }
 
 static void vc_chr_accept_input(Chardev *chr)
@@ -2303,13 +2253,12 @@  static void text_console_do_init(Chardev *chr, DisplayState *ds)
     s->total_height = DEFAULT_BACKSCROLL;
     s->x = 0;
     s->y = 0;
-    if (s->scanout.kind != SCANOUT_SURFACE) {
-        if (active_console && active_console->scanout.kind == SCANOUT_SURFACE) {
-            g_width = qemu_console_get_width(active_console, g_width);
-            g_height = qemu_console_get_height(active_console, g_height);
+    if (!s->surface) {
+        if (active_console && active_console->surface) {
+            g_width = surface_width(active_console->surface);
+            g_height = surface_height(active_console->surface);
         }
         s->surface = qemu_create_displaysurface(g_width, g_height);
-        s->scanout.kind = SCANOUT_SURFACE;
     }
 
     s->hw_ops = &text_console_ops;
@@ -2368,7 +2317,6 @@  static void vc_chr_open(Chardev *chr,
         s = new_console(NULL, TEXT_CONSOLE, 0);
     } else {
         s = new_console(NULL, TEXT_CONSOLE_FIXED_SIZE, 0);
-        s->scanout.kind = SCANOUT_SURFACE;
         s->surface = qemu_create_displaysurface(width, height);
     }
 
@@ -2392,13 +2340,13 @@  static void vc_chr_open(Chardev *chr,
 
 void qemu_console_resize(QemuConsole *s, int width, int height)
 {
-    DisplaySurface *surface = qemu_console_surface(s);
+    DisplaySurface *surface;
 
     assert(s->console_type == GRAPHIC_CONSOLE);
 
-    if (surface && (surface->flags & QEMU_ALLOCATED_FLAG) &&
-        pixman_image_get_width(surface->image) == width &&
-        pixman_image_get_height(surface->image) == height) {
+    if (s->surface && (s->surface->flags & QEMU_ALLOCATED_FLAG) &&
+        pixman_image_get_width(s->surface->image) == width &&
+        pixman_image_get_height(s->surface->image) == height) {
         return;
     }
 
@@ -2408,12 +2356,7 @@  void qemu_console_resize(QemuConsole *s, int width, int height)
 
 DisplaySurface *qemu_console_surface(QemuConsole *console)
 {
-    switch (console->scanout.kind) {
-    case SCANOUT_SURFACE:
-        return console->surface;
-    default:
-        return NULL;
-    }
+    return console->surface;
 }
 
 PixelFormat qemu_default_pixelformat(int bpp)