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