* [Qemu-devel] [PATCH 0/2] qxl: local rendering fixes.
@ 2011-10-25 12:34 Gerd Hoffmann
2011-10-25 12:34 ` [Qemu-devel] [PATCH 1/2] qxl: stride fixup Gerd Hoffmann
` (2 more replies)
0 siblings, 3 replies; 4+ messages in thread
From: Gerd Hoffmann @ 2011-10-25 12:34 UTC (permalink / raw)
To: qemu-devel; +Cc: Gerd Hoffmann
Hi,
These two patches fix up some issues we have with local rendering,
i.e. spice-server rendering the screen instead of spice-client.
Local rendering is used when qemu itself needs a fully rendered qxl
display. Happens when combining qxl with vnc or sdl, also when doing
screendumps.
With this patch series applied screen dumps of qxl devices work
correctly. Currently both the screendump itself and the SDL display
after doing a screen dump are broken.
Gerd Hoffmann (2):
qxl: stride fixup
qxl: make sure we continue to run with a shared buffer
hw/qxl-render.c | 36 ++++++++++++++++++++++++------------
hw/qxl.h | 3 ++-
2 files changed, 26 insertions(+), 13 deletions(-)
^ permalink raw reply [flat|nested] 4+ messages in thread
* [Qemu-devel] [PATCH 1/2] qxl: stride fixup
2011-10-25 12:34 [Qemu-devel] [PATCH 0/2] qxl: local rendering fixes Gerd Hoffmann
@ 2011-10-25 12:34 ` Gerd Hoffmann
2011-10-25 12:34 ` [Qemu-devel] [PATCH 2/2] qxl: make sure we continue to run with a shared buffer Gerd Hoffmann
2011-10-25 13:35 ` [Qemu-devel] [PATCH 0/2] qxl: local rendering fixes Alon Levy
2 siblings, 0 replies; 4+ messages in thread
From: Gerd Hoffmann @ 2011-10-25 12:34 UTC (permalink / raw)
To: qemu-devel; +Cc: Gerd Hoffmann
spice uses negative stride value to signal the bitmap is upside down.
The qxl renderer (used for scl, vnc and screenshots) wants a positive
value because it is easier to work with. The positive value is then
stored in the very same variable, which has the drawback that the
upside-down test works only once. Fix by using two variables.
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
hw/qxl-render.c | 23 ++++++++++++-----------
hw/qxl.h | 3 ++-
2 files changed, 14 insertions(+), 12 deletions(-)
diff --git a/hw/qxl-render.c b/hw/qxl-render.c
index c290739..a567693 100644
--- a/hw/qxl-render.c
+++ b/hw/qxl-render.c
@@ -28,16 +28,16 @@ static void qxl_flip(PCIQXLDevice *qxl, QXLRect *rect)
int len, i;
src += (qxl->guest_primary.surface.height - rect->top - 1) *
- qxl->guest_primary.stride;
- dst += rect->top * qxl->guest_primary.stride;
+ qxl->guest_primary.abs_stride;
+ dst += rect->top * qxl->guest_primary.abs_stride;
src += rect->left * qxl->guest_primary.bytes_pp;
dst += rect->left * qxl->guest_primary.bytes_pp;
len = (rect->right - rect->left) * qxl->guest_primary.bytes_pp;
for (i = rect->top; i < rect->bottom; i++) {
memcpy(dst, src, len);
- dst += qxl->guest_primary.stride;
- src -= qxl->guest_primary.stride;
+ dst += qxl->guest_primary.abs_stride;
+ src -= qxl->guest_primary.abs_stride;
}
}
@@ -45,7 +45,8 @@ void qxl_render_resize(PCIQXLDevice *qxl)
{
QXLSurfaceCreate *sc = &qxl->guest_primary.surface;
- qxl->guest_primary.stride = sc->stride;
+ qxl->guest_primary.qxl_stride = sc->stride;
+ qxl->guest_primary.abs_stride = abs(sc->stride);
qxl->guest_primary.resized++;
switch (sc->format) {
case SPICE_SURFACE_FMT_16_555:
@@ -87,11 +88,11 @@ void qxl_render_update(PCIQXLDevice *qxl)
qemu_free_displaysurface(vga->ds);
qxl->guest_primary.data = memory_region_get_ram_ptr(&qxl->vga.vram);
- if (qxl->guest_primary.stride < 0) {
+ if (qxl->guest_primary.qxl_stride < 0) {
/* spice surface is upside down -> need extra buffer to flip */
- qxl->guest_primary.stride = -qxl->guest_primary.stride;
- qxl->guest_primary.flipped = g_malloc(qxl->guest_primary.surface.width *
- qxl->guest_primary.stride);
+ qxl->guest_primary.flipped =
+ g_malloc(qxl->guest_primary.surface.width *
+ qxl->guest_primary.abs_stride);
ptr = qxl->guest_primary.flipped;
} else {
ptr = qxl->guest_primary.data;
@@ -100,7 +101,7 @@ void qxl_render_update(PCIQXLDevice *qxl)
__FUNCTION__,
qxl->guest_primary.surface.width,
qxl->guest_primary.surface.height,
- qxl->guest_primary.stride,
+ qxl->guest_primary.qxl_stride,
qxl->guest_primary.bytes_pp,
qxl->guest_primary.bits_pp,
qxl->guest_primary.flipped ? "yes" : "no");
@@ -108,7 +109,7 @@ void qxl_render_update(PCIQXLDevice *qxl)
qemu_create_displaysurface_from(qxl->guest_primary.surface.width,
qxl->guest_primary.surface.height,
qxl->guest_primary.bits_pp,
- qxl->guest_primary.stride,
+ qxl->guest_primary.abs_stride,
ptr);
dpy_resize(vga->ds);
}
diff --git a/hw/qxl.h b/hw/qxl.h
index 37b2619..766aa6d 100644
--- a/hw/qxl.h
+++ b/hw/qxl.h
@@ -48,7 +48,8 @@ typedef struct PCIQXLDevice {
QXLSurfaceCreate surface;
uint32_t commands;
uint32_t resized;
- int32_t stride;
+ int32_t qxl_stride;
+ uint32_t abs_stride;
uint32_t bits_pp;
uint32_t bytes_pp;
uint8_t *data, *flipped;
--
1.7.1
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [Qemu-devel] [PATCH 2/2] qxl: make sure we continue to run with a shared buffer
2011-10-25 12:34 [Qemu-devel] [PATCH 0/2] qxl: local rendering fixes Gerd Hoffmann
2011-10-25 12:34 ` [Qemu-devel] [PATCH 1/2] qxl: stride fixup Gerd Hoffmann
@ 2011-10-25 12:34 ` Gerd Hoffmann
2011-10-25 13:35 ` [Qemu-devel] [PATCH 0/2] qxl: local rendering fixes Alon Levy
2 siblings, 0 replies; 4+ messages in thread
From: Gerd Hoffmann @ 2011-10-25 12:34 UTC (permalink / raw)
To: qemu-devel; +Cc: Gerd Hoffmann
The qxl renderer works only with a shared displaysurface. So better
make sure we actually have one and restore it when needed.
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
hw/qxl-render.c | 13 ++++++++++++-
1 files changed, 12 insertions(+), 1 deletions(-)
diff --git a/hw/qxl-render.c b/hw/qxl-render.c
index a567693..2c51ba9 100644
--- a/hw/qxl-render.c
+++ b/hw/qxl-render.c
@@ -76,7 +76,14 @@ void qxl_render_update(PCIQXLDevice *qxl)
VGACommonState *vga = &qxl->vga;
QXLRect dirty[32], update;
void *ptr;
- int i;
+ int i, redraw = 0;
+
+ if (!is_buffer_shared(vga->ds->surface)) {
+ dprint(qxl, 1, "%s: restoring shared displaysurface\n", __func__);
+ qxl->guest_primary.resized++;
+ qxl->guest_primary.commands++;
+ redraw = 1;
+ }
if (qxl->guest_primary.resized) {
qxl->guest_primary.resized = 0;
@@ -127,6 +134,10 @@ void qxl_render_update(PCIQXLDevice *qxl)
memset(dirty, 0, sizeof(dirty));
qxl_spice_update_area(qxl, 0, &update,
dirty, ARRAY_SIZE(dirty), 1, QXL_SYNC);
+ if (redraw) {
+ memset(dirty, 0, sizeof(dirty));
+ dirty[0] = update;
+ }
for (i = 0; i < ARRAY_SIZE(dirty); i++) {
if (qemu_spice_rect_is_empty(dirty+i)) {
--
1.7.1
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [Qemu-devel] [PATCH 0/2] qxl: local rendering fixes.
2011-10-25 12:34 [Qemu-devel] [PATCH 0/2] qxl: local rendering fixes Gerd Hoffmann
2011-10-25 12:34 ` [Qemu-devel] [PATCH 1/2] qxl: stride fixup Gerd Hoffmann
2011-10-25 12:34 ` [Qemu-devel] [PATCH 2/2] qxl: make sure we continue to run with a shared buffer Gerd Hoffmann
@ 2011-10-25 13:35 ` Alon Levy
2 siblings, 0 replies; 4+ messages in thread
From: Alon Levy @ 2011-10-25 13:35 UTC (permalink / raw)
To: Gerd Hoffmann; +Cc: qemu-devel
On Tue, Oct 25, 2011 at 02:34:31PM +0200, Gerd Hoffmann wrote:
> Hi,
>
Both look good (do we ACK here?)
I'll rebase my controvertial monitor async patches on this.
> These two patches fix up some issues we have with local rendering,
> i.e. spice-server rendering the screen instead of spice-client.
> Local rendering is used when qemu itself needs a fully rendered qxl
> display. Happens when combining qxl with vnc or sdl, also when doing
> screendumps.
>
> With this patch series applied screen dumps of qxl devices work
> correctly. Currently both the screendump itself and the SDL display
> after doing a screen dump are broken.
>
> Gerd Hoffmann (2):
> qxl: stride fixup
> qxl: make sure we continue to run with a shared buffer
>
> hw/qxl-render.c | 36 ++++++++++++++++++++++++------------
> hw/qxl.h | 3 ++-
> 2 files changed, 26 insertions(+), 13 deletions(-)
>
>
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2011-10-25 13:38 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-10-25 12:34 [Qemu-devel] [PATCH 0/2] qxl: local rendering fixes Gerd Hoffmann
2011-10-25 12:34 ` [Qemu-devel] [PATCH 1/2] qxl: stride fixup Gerd Hoffmann
2011-10-25 12:34 ` [Qemu-devel] [PATCH 2/2] qxl: make sure we continue to run with a shared buffer Gerd Hoffmann
2011-10-25 13:35 ` [Qemu-devel] [PATCH 0/2] qxl: local rendering fixes Alon Levy
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).