yeahuh / rpms / qemu-kvm

Forked from rpms/qemu-kvm 2 years ago
Clone

Blame SOURCES/kvm-qxl-use-guest_monitor_config-for-local-renderer.patch

ae23c9
From 53f7b5bea75509998a5280e714029d639d255e9e Mon Sep 17 00:00:00 2001
ae23c9
From: Gerd Hoffmann <kraxel@redhat.com>
ae23c9
Date: Thu, 22 Nov 2018 11:33:36 +0000
ae23c9
Subject: [PATCH 06/16] qxl: use guest_monitor_config for local renderer.
ae23c9
MIME-Version: 1.0
ae23c9
Content-Type: text/plain; charset=UTF-8
ae23c9
Content-Transfer-Encoding: 8bit
ae23c9
ae23c9
RH-Author: Gerd Hoffmann <kraxel@redhat.com>
ae23c9
Message-id: <20181122113336.2925-2-kraxel@redhat.com>
ae23c9
Patchwork-id: 83094
ae23c9
O-Subject: [RHEL8/rhel qemu-kvm PATCH 1/1] qxl: use guest_monitor_config for local renderer.
ae23c9
Bugzilla: 1610163
ae23c9
RH-Acked-by: Laurent Vivier <lvivier@redhat.com>
ae23c9
RH-Acked-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
ae23c9
RH-Acked-by: John Snow <jsnow@redhat.com>
ae23c9
ae23c9
When processing monitor config from guest store head0 width and height
ae23c9
for single-head configurations.  Use these when creating the
ae23c9
DisplaySurface in the local renderer.
ae23c9
ae23c9
This fixes a rendering issue with wayland.  Wayland rounds up the
ae23c9
framebuffer width and height to a multiple of 64, so with odd
ae23c9
resolutions (800x600 for example) the framebuffer is larger than the
ae23c9
actual screen.  The monitor config has the actual screen size though.
ae23c9
ae23c9
This fixes guest display for anything using the local renderer
ae23c9
(non-spice UI, screendump monitor command).
ae23c9
ae23c9
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
ae23c9
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
ae23c9
Message-id: 20180919103057.9666-1-kraxel@redhat.com
ae23c9
(cherry picked from commit 979f7ef8966bc4495a710ed9e4af42098f92ee79)
ae23c9
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
ae23c9
---
ae23c9
 hw/display/qxl-render.c | 18 ++++++++++--------
ae23c9
 hw/display/qxl.c        | 12 ++++++++++++
ae23c9
 hw/display/qxl.h        |  2 ++
ae23c9
 3 files changed, 24 insertions(+), 8 deletions(-)
ae23c9
ae23c9
diff --git a/hw/display/qxl-render.c b/hw/display/qxl-render.c
ae23c9
index c62b9a5..6debe8f 100644
ae23c9
--- a/hw/display/qxl-render.c
ae23c9
+++ b/hw/display/qxl-render.c
ae23c9
@@ -98,6 +98,8 @@ static void qxl_render_update_area_unlocked(PCIQXLDevice *qxl)
ae23c9
 {
ae23c9
     VGACommonState *vga = &qxl->vga;
ae23c9
     DisplaySurface *surface;
ae23c9
+    int width = qxl->guest_head0_width ?: qxl->guest_primary.surface.width;
ae23c9
+    int height = qxl->guest_head0_height ?: qxl->guest_primary.surface.height;
ae23c9
     int i;
ae23c9
 
ae23c9
     if (qxl->guest_primary.resized) {
ae23c9
@@ -111,8 +113,8 @@ static void qxl_render_update_area_unlocked(PCIQXLDevice *qxl)
ae23c9
         qxl_set_rect_to_surface(qxl, &qxl->dirty[0]);
ae23c9
         qxl->num_dirty_rects = 1;
ae23c9
         trace_qxl_render_guest_primary_resized(
ae23c9
-               qxl->guest_primary.surface.width,
ae23c9
-               qxl->guest_primary.surface.height,
ae23c9
+               width,
ae23c9
+               height,
ae23c9
                qxl->guest_primary.qxl_stride,
ae23c9
                qxl->guest_primary.bytes_pp,
ae23c9
                qxl->guest_primary.bits_pp);
ae23c9
@@ -120,15 +122,15 @@ static void qxl_render_update_area_unlocked(PCIQXLDevice *qxl)
ae23c9
             pixman_format_code_t format =
ae23c9
                 qemu_default_pixman_format(qxl->guest_primary.bits_pp, true);
ae23c9
             surface = qemu_create_displaysurface_from
ae23c9
-                (qxl->guest_primary.surface.width,
ae23c9
-                 qxl->guest_primary.surface.height,
ae23c9
+                (width,
ae23c9
+                 height,
ae23c9
                  format,
ae23c9
                  qxl->guest_primary.abs_stride,
ae23c9
                  qxl->guest_primary.data);
ae23c9
         } else {
ae23c9
             surface = qemu_create_displaysurface
ae23c9
-                (qxl->guest_primary.surface.width,
ae23c9
-                 qxl->guest_primary.surface.height);
ae23c9
+                (width,
ae23c9
+                 height);
ae23c9
         }
ae23c9
         dpy_gfx_replace_surface(vga->con, surface);
ae23c9
     }
ae23c9
@@ -144,8 +146,8 @@ static void qxl_render_update_area_unlocked(PCIQXLDevice *qxl)
ae23c9
             qxl->dirty[i].top < 0 ||
ae23c9
             qxl->dirty[i].left > qxl->dirty[i].right ||
ae23c9
             qxl->dirty[i].top > qxl->dirty[i].bottom ||
ae23c9
-            qxl->dirty[i].right > qxl->guest_primary.surface.width ||
ae23c9
-            qxl->dirty[i].bottom > qxl->guest_primary.surface.height) {
ae23c9
+            qxl->dirty[i].right > width ||
ae23c9
+            qxl->dirty[i].bottom > height) {
ae23c9
             continue;
ae23c9
         }
ae23c9
         qxl_blit(qxl, qxl->dirty+i);
ae23c9
diff --git a/hw/display/qxl.c b/hw/display/qxl.c
ae23c9
index a71714c..e36ef32 100644
ae23c9
--- a/hw/display/qxl.c
ae23c9
+++ b/hw/display/qxl.c
ae23c9
@@ -258,6 +258,8 @@ static void qxl_spice_destroy_surfaces(PCIQXLDevice *qxl, qxl_async_io async)
ae23c9
 
ae23c9
 static void qxl_spice_monitors_config_async(PCIQXLDevice *qxl, int replay)
ae23c9
 {
ae23c9
+    QXLMonitorsConfig *cfg;
ae23c9
+
ae23c9
     trace_qxl_spice_monitors_config(qxl->id);
ae23c9
     if (replay) {
ae23c9
         /*
ae23c9
@@ -285,6 +287,16 @@ static void qxl_spice_monitors_config_async(PCIQXLDevice *qxl, int replay)
ae23c9
                 (uintptr_t)qxl_cookie_new(QXL_COOKIE_TYPE_IO,
ae23c9
                                           QXL_IO_MONITORS_CONFIG_ASYNC));
ae23c9
     }
ae23c9
+
ae23c9
+    cfg = qxl_phys2virt(qxl, qxl->guest_monitors_config, MEMSLOT_GROUP_GUEST);
ae23c9
+    if (cfg->count == 1) {
ae23c9
+        qxl->guest_primary.resized = 1;
ae23c9
+        qxl->guest_head0_width  = cfg->heads[0].width;
ae23c9
+        qxl->guest_head0_height = cfg->heads[0].height;
ae23c9
+    } else {
ae23c9
+        qxl->guest_head0_width  = 0;
ae23c9
+        qxl->guest_head0_height = 0;
ae23c9
+    }
ae23c9
 }
ae23c9
 
ae23c9
 void qxl_spice_reset_image_cache(PCIQXLDevice *qxl)
ae23c9
diff --git a/hw/display/qxl.h b/hw/display/qxl.h
ae23c9
index 089696e..ffa6260 100644
ae23c9
--- a/hw/display/qxl.h
ae23c9
+++ b/hw/display/qxl.h
ae23c9
@@ -79,6 +79,8 @@ typedef struct PCIQXLDevice {
ae23c9
     QXLPHYSICAL        guest_cursor;
ae23c9
 
ae23c9
     QXLPHYSICAL        guest_monitors_config;
ae23c9
+    uint32_t           guest_head0_width;
ae23c9
+    uint32_t           guest_head0_height;
ae23c9
 
ae23c9
     QemuMutex          track_lock;
ae23c9
 
ae23c9
-- 
ae23c9
1.8.3.1
ae23c9