{"id":2226233,"url":"http://patchwork.ozlabs.org/api/patches/2226233/?format=json","web_url":"http://patchwork.ozlabs.org/project/qemu-devel/patch/20260422104042.3936506-18-marcandre.lureau@redhat.com/","project":{"id":14,"url":"http://patchwork.ozlabs.org/api/projects/14/?format=json","name":"QEMU Development","link_name":"qemu-devel","list_id":"qemu-devel.nongnu.org","list_email":"qemu-devel@nongnu.org","web_url":"","scm_url":"","webscm_url":"","list_archive_url":"","list_archive_url_format":"","commit_url_format":""},"msgid":"<20260422104042.3936506-18-marcandre.lureau@redhat.com>","list_archive_url":null,"date":"2026-04-22T10:40:18","name":"[PULL,17/40] ui/console-vc: set vt100 associated pixman image","commit_ref":null,"pull_url":null,"state":"new","archived":false,"hash":"5e8b5e7d02569735b5fab3521b578e248338e301","submitter":{"id":66774,"url":"http://patchwork.ozlabs.org/api/people/66774/?format=json","name":"Marc-André Lureau","email":"marcandre.lureau@redhat.com"},"delegate":null,"mbox":"http://patchwork.ozlabs.org/project/qemu-devel/patch/20260422104042.3936506-18-marcandre.lureau@redhat.com/mbox/","series":[{"id":500973,"url":"http://patchwork.ozlabs.org/api/series/500973/?format=json","web_url":"http://patchwork.ozlabs.org/project/qemu-devel/list/?series=500973","date":"2026-04-22T10:40:02","name":"[PULL,01/40] ui/input-linux: close evdev fd when qemu_set_blocking fails","version":1,"mbox":"http://patchwork.ozlabs.org/series/500973/mbox/"}],"comments":"http://patchwork.ozlabs.org/api/patches/2226233/comments/","check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/2226233/checks/","tags":{},"related":[],"headers":{"Return-Path":"<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>","X-Original-To":"incoming@patchwork.ozlabs.org","Delivered-To":"patchwork-incoming@legolas.ozlabs.org","Authentication-Results":["legolas.ozlabs.org;\n\tdkim=pass (1024-bit key;\n unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256\n header.s=mimecast20190719 header.b=bgSHfYas;\n\tdkim-atps=neutral","legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=nongnu.org\n (client-ip=209.51.188.17; helo=lists1p.gnu.org;\n envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org;\n receiver=patchwork.ozlabs.org)"],"Received":["from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17])\n\t(using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits))\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4g0wpQ4XsPz1yCv\n\tfor <incoming@patchwork.ozlabs.org>; Wed, 22 Apr 2026 20:44:46 +1000 (AEST)","from localhost ([::1] helo=lists1p.gnu.org)\n\tby lists1p.gnu.org with esmtp (Exim 4.90_1)\n\t(envelope-from <qemu-devel-bounces@nongnu.org>)\n\tid 1wFV2X-0006wy-Hc; Wed, 22 Apr 2026 06:42:41 -0400","from eggs.gnu.org ([2001:470:142:3::10])\n by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)\n (Exim 4.90_1) (envelope-from <marcandre.lureau@redhat.com>)\n id 1wFV2U-0006i2-C3\n for qemu-devel@nongnu.org; Wed, 22 Apr 2026 06:42:38 -0400","from us-smtp-delivery-124.mimecast.com ([170.10.129.124])\n by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)\n (Exim 4.90_1) (envelope-from <marcandre.lureau@redhat.com>)\n id 1wFV2S-0002jh-ID\n for qemu-devel@nongnu.org; Wed, 22 Apr 2026 06:42:38 -0400","from mx-prod-mc-03.mail-002.prod.us-west-2.aws.redhat.com\n (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by\n relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3,\n cipher=TLS_AES_256_GCM_SHA384) id us-mta-195-ZhJbDx47O6aFmOY0iplPVQ-1; Wed,\n 22 Apr 2026 06:42:34 -0400","from mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com\n (mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.4])\n (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest\n SHA256)\n (No client certificate requested)\n by mx-prod-mc-03.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS\n id 7A1AE1955F0E; Wed, 22 Apr 2026 10:42:33 +0000 (UTC)","from localhost (unknown [10.44.22.21])\n by mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP\n id 8B1A63000C15; Wed, 22 Apr 2026 10:42:32 +0000 (UTC)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n s=mimecast20190719; t=1776854555;\n h=from:from:reply-to:subject:subject:date:date:message-id:message-id:\n to:to:cc:cc:mime-version:mime-version:content-type:content-type:\n content-transfer-encoding:content-transfer-encoding:\n in-reply-to:in-reply-to:references:references;\n bh=Wu7QU8wJd5/GjX/3CNoBTbJbFIFHD2dzq5oUY7oRwPU=;\n b=bgSHfYasPf2te4kFnvvFnj+olMUzn4JAjTCUZeBQ+0JvyUD7qlvaoKdN/p20essZwp0or4\n tBb7dezLjzpj91QJiZu1EVV56Pv3phAmIB90FNu36HCtDkwQL3KDaHhbhXcnU53Rj5LHZb\n +9nvjq0Xm6Y0Fwp/8zigW6oe9GXg174=","X-MC-Unique":"ZhJbDx47O6aFmOY0iplPVQ-1","X-Mimecast-MFC-AGG-ID":"ZhJbDx47O6aFmOY0iplPVQ_1776854553","From":"marcandre.lureau@redhat.com","To":"qemu-devel@nongnu.org","Cc":"peter.maydell@linaro.org,\n =?utf-8?q?Marc-Andr=C3=A9_Lureau?= <marcandre.lureau@redhat.com>","Subject":"[PULL 17/40] ui/console-vc: set vt100 associated pixman image","Date":"Wed, 22 Apr 2026 14:40:18 +0400","Message-ID":"<20260422104042.3936506-18-marcandre.lureau@redhat.com>","In-Reply-To":"<20260422104042.3936506-1-marcandre.lureau@redhat.com>","References":"<20260422104042.3936506-1-marcandre.lureau@redhat.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=UTF-8","Content-Transfer-Encoding":"8bit","X-Scanned-By":"MIMEDefang 3.4.1 on 10.30.177.4","Received-SPF":"pass client-ip=170.10.129.124;\n envelope-from=marcandre.lureau@redhat.com;\n helo=us-smtp-delivery-124.mimecast.com","X-Spam_score_int":"-20","X-Spam_score":"-2.1","X-Spam_bar":"--","X-Spam_report":"(-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001,\n DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1,\n RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001,\n SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no","X-Spam_action":"no action","X-BeenThere":"qemu-devel@nongnu.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"qemu development <qemu-devel.nongnu.org>","List-Unsubscribe":"<https://lists.nongnu.org/mailman/options/qemu-devel>,\n <mailto:qemu-devel-request@nongnu.org?subject=unsubscribe>","List-Archive":"<https://lists.nongnu.org/archive/html/qemu-devel>","List-Post":"<mailto:qemu-devel@nongnu.org>","List-Help":"<mailto:qemu-devel-request@nongnu.org?subject=help>","List-Subscribe":"<https://lists.nongnu.org/mailman/listinfo/qemu-devel>,\n <mailto:qemu-devel-request@nongnu.org?subject=subscribe>","Errors-To":"qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org","Sender":"qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org"},"content":"From: Marc-André Lureau <marcandre.lureau@redhat.com>\n\nStart removing dependency on DisplaySurface for vt100 handling.\n\nNote that before, the rendering is done on the current DisplaySurface.\nIt's not obvious the QemuTextConsole associated surface isn't changed\nover time, in particular if it was doing resize. But\nqemu_console_resize() is only implemented for QemuGraphicConsole.\n\nReviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>\nSigned-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>\n---\n ui/console-vc.c | 54 +++++++++++++++++++++++--------------------------\n 1 file changed, 25 insertions(+), 29 deletions(-)","diff":"diff --git a/ui/console-vc.c b/ui/console-vc.c\nindex 6cdb5893d32..272240712ad 100644\n--- a/ui/console-vc.c\n+++ b/ui/console-vc.c\n@@ -48,6 +48,8 @@ enum TTYState {\n };\n \n typedef struct QemuVT100 {\n+    pixman_image_t *image;\n+\n     int width;\n     int height;\n     int total_height;\n@@ -133,28 +135,22 @@ qemu_text_console_get_label(const QemuConsole *c)\n     return tc->chr ? g_strdup(tc->chr->label) : NULL;\n }\n \n-static void qemu_console_fill_rect(QemuConsole *con, int posx, int posy,\n-                                   int width, int height, pixman_color_t color)\n+static void image_fill_rect(pixman_image_t *image, int posx, int posy,\n+                            int width, int height, pixman_color_t color)\n {\n-    DisplaySurface *surface = qemu_console_surface(con);\n     pixman_rectangle16_t rect = {\n         .x = posx, .y = posy, .width = width, .height = height\n     };\n \n-    assert(surface);\n-    pixman_image_fill_rectangles(PIXMAN_OP_SRC, surface->image,\n-                                 &color, 1, &rect);\n+    pixman_image_fill_rectangles(PIXMAN_OP_SRC, image, &color, 1, &rect);\n }\n \n /* copy from (xs, ys) to (xd, yd) a rectangle of size (w, h) */\n-static void qemu_console_bitblt(QemuConsole *con,\n-                                int xs, int ys, int xd, int yd, int w, int h)\n+static void image_bitblt(pixman_image_t *image,\n+                         int xs, int ys, int xd, int yd, int w, int h)\n {\n-    DisplaySurface *surface = qemu_console_surface(con);\n-\n-    assert(surface);\n     pixman_image_composite(PIXMAN_OP_SRC,\n-                           surface->image, NULL, surface->image,\n+                           image, NULL, image,\n                            xs, ys, 0, 0, xd, yd, w, h);\n }\n \n@@ -162,10 +158,10 @@ static void vga_putcharxy(QemuConsole *s, int x, int y, int ch,\n                           TextAttributes *t_attrib)\n {\n     static pixman_image_t *glyphs[256];\n-    DisplaySurface *surface = qemu_console_surface(s);\n+    pixman_image_t *image = QEMU_TEXT_CONSOLE(s)->vt.image;\n     pixman_color_t fgcol, bgcol;\n \n-    assert(surface);\n+    assert(image);\n     if (t_attrib->invers) {\n         bgcol = color_table_rgb[t_attrib->bold][t_attrib->fgcol];\n         fgcol = color_table_rgb[t_attrib->bold][t_attrib->bgcol];\n@@ -177,7 +173,7 @@ static void vga_putcharxy(QemuConsole *s, int x, int y, int ch,\n     if (!glyphs[ch]) {\n         glyphs[ch] = qemu_pixman_glyph_from_vgafont(FONT_HEIGHT, vgafont16, ch);\n     }\n-    qemu_pixman_glyph_render(glyphs[ch], surface->image,\n+    qemu_pixman_glyph_render(glyphs[ch], image,\n                              &fgcol, &bgcol, x, y, FONT_WIDTH, FONT_HEIGHT);\n }\n \n@@ -230,20 +226,20 @@ static void console_show_cursor(QemuTextConsole *s, int show)\n \n static void console_refresh(QemuTextConsole *s)\n {\n-    DisplaySurface *surface = qemu_console_surface(QEMU_CONSOLE(s));\n     QemuVT100 *vt = &s->vt;\n     TextCell *c;\n     int x, y, y1;\n+    int w = pixman_image_get_width(vt->image);\n+    int h = pixman_image_get_height(vt->image);\n \n-    assert(surface);\n     vt->text_x[0] = 0;\n     vt->text_y[0] = 0;\n     vt->text_x[1] = vt->width - 1;\n     vt->text_y[1] = vt->height - 1;\n     vt->cursor_invalidate = 1;\n \n-    qemu_console_fill_rect(QEMU_CONSOLE(s), 0, 0, surface_width(surface), surface_height(surface),\n-                           color_table_rgb[0][QEMU_COLOR_BLACK]);\n+    image_fill_rect(vt->image, 0, 0, w, h,\n+                    color_table_rgb[0][QEMU_COLOR_BLACK]);\n     y1 = vt->y_displayed;\n     for (y = 0; y < vt->height; y++) {\n         c = vt->cells + y1 * vt->width;\n@@ -257,8 +253,7 @@ static void console_refresh(QemuTextConsole *s)\n         }\n     }\n     console_show_cursor(s, 1);\n-    dpy_gfx_update(QEMU_CONSOLE(s), 0, 0,\n-                   surface_width(surface), surface_height(surface));\n+    dpy_gfx_update(QEMU_CONSOLE(s), 0, 0, w, h);\n }\n \n static void console_scroll(QemuTextConsole *s, int ydelta)\n@@ -398,8 +393,9 @@ static void text_console_resize(QemuTextConsole *t)\n \n     assert(s->scanout.kind == SCANOUT_SURFACE);\n \n-    w = surface_width(s->surface) / FONT_WIDTH;\n-    h = surface_height(s->surface) / FONT_HEIGHT;\n+    t->vt.image = s->surface->image;\n+    w = pixman_image_get_width(t->vt.image) / FONT_WIDTH;\n+    h = pixman_image_get_height(t->vt.image) / FONT_HEIGHT;\n     if (w == t->vt.width && h == t->vt.height) {\n         return;\n     }\n@@ -461,12 +457,12 @@ static void vc_put_lf(VCChardev *vc)\n             vt->text_x[1] = vt->width - 1;\n             vt->text_y[1] = vt->height - 1;\n \n-            qemu_console_bitblt(QEMU_CONSOLE(s), 0, FONT_HEIGHT, 0, 0,\n-                                vt->width * FONT_WIDTH,\n-                                (vt->height - 1) * FONT_HEIGHT);\n-            qemu_console_fill_rect(QEMU_CONSOLE(s), 0, (vt->height - 1) * FONT_HEIGHT,\n-                                   vt->width * FONT_WIDTH, FONT_HEIGHT,\n-                                   color_table_rgb[0][TEXT_ATTRIBUTES_DEFAULT.bgcol]);\n+            image_bitblt(vt->image, 0, FONT_HEIGHT, 0, 0,\n+                         vt->width * FONT_WIDTH,\n+                         (vt->height - 1) * FONT_HEIGHT);\n+            image_fill_rect(vt->image, 0, (vt->height - 1) * FONT_HEIGHT,\n+                            vt->width * FONT_WIDTH, FONT_HEIGHT,\n+                            color_table_rgb[0][TEXT_ATTRIBUTES_DEFAULT.bgcol]);\n             vt->update_x0 = 0;\n             vt->update_y0 = 0;\n             vt->update_x1 = vt->width * FONT_WIDTH;\n","prefixes":["PULL","17/40"]}