|
|
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 |
|