Revision 4c19ebb5 hw/qxl-render.c
b/hw/qxl-render.c | ||
---|---|---|
23 | 23 |
|
24 | 24 |
static void qxl_flip(PCIQXLDevice *qxl, QXLRect *rect) |
25 | 25 |
{ |
26 |
uint8_t *src = qxl->guest_primary.data;
|
|
27 |
uint8_t *dst = qxl->guest_primary.flipped;
|
|
26 |
uint8_t *src; |
|
27 |
uint8_t *dst = qxl->vga.ds->surface->data;
|
|
28 | 28 |
int len, i; |
29 | 29 |
|
30 |
if (qxl->guest_primary.qxl_stride > 0) { |
|
31 |
return; |
|
32 |
} |
|
33 |
if (!qxl->guest_primary.data) { |
|
34 |
dprint(qxl, 1, "%s: initializing guest_primary.data\n", __func__); |
|
35 |
qxl->guest_primary.data = memory_region_get_ram_ptr(&qxl->vga.vram); |
|
36 |
} |
|
37 |
dprint(qxl, 1, "%s: stride %d, [%d, %d, %d, %d]\n", __func__, |
|
38 |
qxl->guest_primary.qxl_stride, |
|
39 |
rect->left, rect->right, rect->top, rect->bottom); |
|
40 |
src = qxl->guest_primary.data; |
|
30 | 41 |
src += (qxl->guest_primary.surface.height - rect->top - 1) * |
31 | 42 |
qxl->guest_primary.abs_stride; |
32 | 43 |
dst += rect->top * qxl->guest_primary.abs_stride; |
... | ... | |
75 | 86 |
{ |
76 | 87 |
VGACommonState *vga = &qxl->vga; |
77 | 88 |
QXLRect dirty[32], update; |
78 |
void *ptr; |
|
79 | 89 |
int i, redraw = 0; |
80 |
|
|
81 |
if (!is_buffer_shared(vga->ds->surface)) { |
|
82 |
dprint(qxl, 1, "%s: restoring shared displaysurface\n", __func__); |
|
83 |
qxl->guest_primary.resized++; |
|
84 |
qxl->guest_primary.commands++; |
|
85 |
redraw = 1; |
|
86 |
} |
|
90 |
DisplaySurface *surface = vga->ds->surface; |
|
87 | 91 |
|
88 | 92 |
if (qxl->guest_primary.resized) { |
89 | 93 |
qxl->guest_primary.resized = 0; |
90 | 94 |
|
91 |
if (qxl->guest_primary.flipped) { |
|
92 |
g_free(qxl->guest_primary.flipped); |
|
93 |
qxl->guest_primary.flipped = NULL; |
|
94 |
} |
|
95 |
qemu_free_displaysurface(vga->ds); |
|
96 |
|
|
97 | 95 |
qxl->guest_primary.data = memory_region_get_ram_ptr(&qxl->vga.vram); |
98 |
if (qxl->guest_primary.qxl_stride < 0) { |
|
99 |
/* spice surface is upside down -> need extra buffer to flip */ |
|
100 |
qxl->guest_primary.flipped = |
|
101 |
g_malloc(qxl->guest_primary.surface.width * |
|
102 |
qxl->guest_primary.abs_stride); |
|
103 |
ptr = qxl->guest_primary.flipped; |
|
104 |
} else { |
|
105 |
ptr = qxl->guest_primary.data; |
|
106 |
} |
|
107 |
dprint(qxl, 1, "%s: %dx%d, stride %d, bpp %d, depth %d, flip %s\n", |
|
96 |
dprint(qxl, 1, "%s: %dx%d, stride %d, bpp %d, depth %d\n", |
|
108 | 97 |
__FUNCTION__, |
109 | 98 |
qxl->guest_primary.surface.width, |
110 | 99 |
qxl->guest_primary.surface.height, |
111 | 100 |
qxl->guest_primary.qxl_stride, |
112 | 101 |
qxl->guest_primary.bytes_pp, |
113 |
qxl->guest_primary.bits_pp, |
|
114 |
qxl->guest_primary.flipped ? "yes" : "no"); |
|
115 |
vga->ds->surface = |
|
102 |
qxl->guest_primary.bits_pp); |
|
103 |
} |
|
104 |
if (surface->width != qxl->guest_primary.surface.width || |
|
105 |
surface->height != qxl->guest_primary.surface.height) { |
|
106 |
dprint(qxl, 1, "%s: resizing displaysurface to guest_primary\n", |
|
107 |
__func__); |
|
108 |
if (qxl->guest_primary.qxl_stride > 0) { |
|
109 |
qemu_free_displaysurface(vga->ds); |
|
116 | 110 |
qemu_create_displaysurface_from(qxl->guest_primary.surface.width, |
117 | 111 |
qxl->guest_primary.surface.height, |
118 | 112 |
qxl->guest_primary.bits_pp, |
119 | 113 |
qxl->guest_primary.abs_stride, |
120 |
ptr); |
|
121 |
dpy_resize(vga->ds); |
|
114 |
qxl->guest_primary.data); |
|
115 |
} else { |
|
116 |
qemu_resize_displaysurface(vga->ds, |
|
117 |
qxl->guest_primary.surface.width, |
|
118 |
qxl->guest_primary.surface.height); |
|
119 |
} |
|
122 | 120 |
} |
123 |
|
|
124 | 121 |
update.left = 0; |
125 | 122 |
update.right = qxl->guest_primary.surface.width; |
126 | 123 |
update.top = 0; |
... | ... | |
136 | 133 |
memset(dirty, 0, sizeof(dirty)); |
137 | 134 |
dirty[0] = update; |
138 | 135 |
} |
139 |
|
|
140 | 136 |
for (i = 0; i < ARRAY_SIZE(dirty); i++) { |
141 | 137 |
if (qemu_spice_rect_is_empty(dirty+i)) { |
142 | 138 |
break; |
143 | 139 |
} |
144 |
if (qxl->guest_primary.flipped) { |
|
145 |
qxl_flip(qxl, dirty+i); |
|
146 |
} |
|
140 |
qxl_flip(qxl, dirty+i); |
|
147 | 141 |
dpy_update(vga->ds, |
148 | 142 |
dirty[i].left, dirty[i].top, |
149 | 143 |
dirty[i].right - dirty[i].left, |
Also available in: Unified diff