xref: /qemu/hw/display/qxl-logger.c (revision 8efec0ef)
1fc97bb5bSPaolo Bonzini /*
2fc97bb5bSPaolo Bonzini  * qxl command logging -- for debug purposes
3fc97bb5bSPaolo Bonzini  *
4fc97bb5bSPaolo Bonzini  * Copyright (C) 2010 Red Hat, Inc.
5fc97bb5bSPaolo Bonzini  *
6fc97bb5bSPaolo Bonzini  * maintained by Gerd Hoffmann <kraxel@redhat.com>
7fc97bb5bSPaolo Bonzini  *
8fc97bb5bSPaolo Bonzini  * This program is free software; you can redistribute it and/or
9fc97bb5bSPaolo Bonzini  * modify it under the terms of the GNU General Public License as
10fc97bb5bSPaolo Bonzini  * published by the Free Software Foundation; either version 2 or
11fc97bb5bSPaolo Bonzini  * (at your option) version 3 of the License.
12fc97bb5bSPaolo Bonzini  *
13fc97bb5bSPaolo Bonzini  * This program is distributed in the hope that it will be useful,
14fc97bb5bSPaolo Bonzini  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15fc97bb5bSPaolo Bonzini  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16fc97bb5bSPaolo Bonzini  * GNU General Public License for more details.
17fc97bb5bSPaolo Bonzini  *
18fc97bb5bSPaolo Bonzini  * You should have received a copy of the GNU General Public License
19fc97bb5bSPaolo Bonzini  * along with this program; if not, see <http://www.gnu.org/licenses/>.
20fc97bb5bSPaolo Bonzini  */
21fc97bb5bSPaolo Bonzini 
2247df5154SPeter Maydell #include "qemu/osdep.h"
23fc97bb5bSPaolo Bonzini #include "qemu/timer.h"
2447b43a1fSPaolo Bonzini #include "qxl.h"
25fc97bb5bSPaolo Bonzini 
26a91e2118SFrediano Ziglio static const char *const qxl_type[] = {
27fc97bb5bSPaolo Bonzini     [ QXL_CMD_NOP ]     = "nop",
28fc97bb5bSPaolo Bonzini     [ QXL_CMD_DRAW ]    = "draw",
29fc97bb5bSPaolo Bonzini     [ QXL_CMD_UPDATE ]  = "update",
30fc97bb5bSPaolo Bonzini     [ QXL_CMD_CURSOR ]  = "cursor",
31fc97bb5bSPaolo Bonzini     [ QXL_CMD_MESSAGE ] = "message",
32fc97bb5bSPaolo Bonzini     [ QXL_CMD_SURFACE ] = "surface",
33fc97bb5bSPaolo Bonzini };
34fc97bb5bSPaolo Bonzini 
35a91e2118SFrediano Ziglio static const char *const qxl_draw_type[] = {
36fc97bb5bSPaolo Bonzini     [ QXL_DRAW_NOP         ] = "nop",
37fc97bb5bSPaolo Bonzini     [ QXL_DRAW_FILL        ] = "fill",
38fc97bb5bSPaolo Bonzini     [ QXL_DRAW_OPAQUE      ] = "opaque",
39fc97bb5bSPaolo Bonzini     [ QXL_DRAW_COPY        ] = "copy",
40fc97bb5bSPaolo Bonzini     [ QXL_COPY_BITS        ] = "copy-bits",
41fc97bb5bSPaolo Bonzini     [ QXL_DRAW_BLEND       ] = "blend",
42fc97bb5bSPaolo Bonzini     [ QXL_DRAW_BLACKNESS   ] = "blackness",
43fc97bb5bSPaolo Bonzini     [ QXL_DRAW_WHITENESS   ] = "whitemess",
44fc97bb5bSPaolo Bonzini     [ QXL_DRAW_INVERS      ] = "invers",
45fc97bb5bSPaolo Bonzini     [ QXL_DRAW_ROP3        ] = "rop3",
46fc97bb5bSPaolo Bonzini     [ QXL_DRAW_STROKE      ] = "stroke",
47fc97bb5bSPaolo Bonzini     [ QXL_DRAW_TEXT        ] = "text",
48fc97bb5bSPaolo Bonzini     [ QXL_DRAW_TRANSPARENT ] = "transparent",
49fc97bb5bSPaolo Bonzini     [ QXL_DRAW_ALPHA_BLEND ] = "alpha-blend",
50fc97bb5bSPaolo Bonzini };
51fc97bb5bSPaolo Bonzini 
52a91e2118SFrediano Ziglio static const char *const qxl_draw_effect[] = {
53fc97bb5bSPaolo Bonzini     [ QXL_EFFECT_BLEND            ] = "blend",
54fc97bb5bSPaolo Bonzini     [ QXL_EFFECT_OPAQUE           ] = "opaque",
55fc97bb5bSPaolo Bonzini     [ QXL_EFFECT_REVERT_ON_DUP    ] = "revert-on-dup",
56fc97bb5bSPaolo Bonzini     [ QXL_EFFECT_BLACKNESS_ON_DUP ] = "blackness-on-dup",
57fc97bb5bSPaolo Bonzini     [ QXL_EFFECT_WHITENESS_ON_DUP ] = "whiteness-on-dup",
58fc97bb5bSPaolo Bonzini     [ QXL_EFFECT_NOP_ON_DUP       ] = "nop-on-dup",
59fc97bb5bSPaolo Bonzini     [ QXL_EFFECT_NOP              ] = "nop",
60fc97bb5bSPaolo Bonzini     [ QXL_EFFECT_OPAQUE_BRUSH     ] = "opaque-brush",
61fc97bb5bSPaolo Bonzini };
62fc97bb5bSPaolo Bonzini 
63a91e2118SFrediano Ziglio static const char *const qxl_surface_cmd[] = {
64fc97bb5bSPaolo Bonzini    [ QXL_SURFACE_CMD_CREATE  ] = "create",
65fc97bb5bSPaolo Bonzini    [ QXL_SURFACE_CMD_DESTROY ] = "destroy",
66fc97bb5bSPaolo Bonzini };
67fc97bb5bSPaolo Bonzini 
68a91e2118SFrediano Ziglio static const char *const spice_surface_fmt[] = {
69fc97bb5bSPaolo Bonzini    [ SPICE_SURFACE_FMT_INVALID  ] = "invalid",
70fc97bb5bSPaolo Bonzini    [ SPICE_SURFACE_FMT_1_A      ] = "alpha/1",
71fc97bb5bSPaolo Bonzini    [ SPICE_SURFACE_FMT_8_A      ] = "alpha/8",
72fc97bb5bSPaolo Bonzini    [ SPICE_SURFACE_FMT_16_555   ] = "555/16",
73fc97bb5bSPaolo Bonzini    [ SPICE_SURFACE_FMT_16_565   ] = "565/16",
74fc97bb5bSPaolo Bonzini    [ SPICE_SURFACE_FMT_32_xRGB  ] = "xRGB/32",
75fc97bb5bSPaolo Bonzini    [ SPICE_SURFACE_FMT_32_ARGB  ] = "ARGB/32",
76fc97bb5bSPaolo Bonzini };
77fc97bb5bSPaolo Bonzini 
78a91e2118SFrediano Ziglio static const char *const qxl_cursor_cmd[] = {
79fc97bb5bSPaolo Bonzini    [ QXL_CURSOR_SET   ] = "set",
80fc97bb5bSPaolo Bonzini    [ QXL_CURSOR_MOVE  ] = "move",
81fc97bb5bSPaolo Bonzini    [ QXL_CURSOR_HIDE  ] = "hide",
82fc97bb5bSPaolo Bonzini    [ QXL_CURSOR_TRAIL ] = "trail",
83fc97bb5bSPaolo Bonzini };
84fc97bb5bSPaolo Bonzini 
85a91e2118SFrediano Ziglio static const char *const spice_cursor_type[] = {
86fc97bb5bSPaolo Bonzini    [ SPICE_CURSOR_TYPE_ALPHA   ] = "alpha",
87fc97bb5bSPaolo Bonzini    [ SPICE_CURSOR_TYPE_MONO    ] = "mono",
88fc97bb5bSPaolo Bonzini    [ SPICE_CURSOR_TYPE_COLOR4  ] = "color4",
89fc97bb5bSPaolo Bonzini    [ SPICE_CURSOR_TYPE_COLOR8  ] = "color8",
90fc97bb5bSPaolo Bonzini    [ SPICE_CURSOR_TYPE_COLOR16 ] = "color16",
91fc97bb5bSPaolo Bonzini    [ SPICE_CURSOR_TYPE_COLOR24 ] = "color24",
92fc97bb5bSPaolo Bonzini    [ SPICE_CURSOR_TYPE_COLOR32 ] = "color32",
93fc97bb5bSPaolo Bonzini };
94fc97bb5bSPaolo Bonzini 
qxl_v2n(const char * const n[],size_t l,int v)95a91e2118SFrediano Ziglio static const char *qxl_v2n(const char *const n[], size_t l, int v)
96fc97bb5bSPaolo Bonzini {
97fc97bb5bSPaolo Bonzini     if (v >= l || !n[v]) {
98fc97bb5bSPaolo Bonzini         return "???";
99fc97bb5bSPaolo Bonzini     }
100fc97bb5bSPaolo Bonzini     return n[v];
101fc97bb5bSPaolo Bonzini }
102fc97bb5bSPaolo Bonzini #define qxl_name(_list, _value) qxl_v2n(_list, ARRAY_SIZE(_list), _value)
103fc97bb5bSPaolo Bonzini 
qxl_log_image(PCIQXLDevice * qxl,QXLPHYSICAL addr,int group_id)104fc97bb5bSPaolo Bonzini static int qxl_log_image(PCIQXLDevice *qxl, QXLPHYSICAL addr, int group_id)
105fc97bb5bSPaolo Bonzini {
106fc97bb5bSPaolo Bonzini     QXLImage *image;
107fc97bb5bSPaolo Bonzini     QXLImageDescriptor *desc;
108fc97bb5bSPaolo Bonzini 
109*8efec0efSPhilippe Mathieu-Daudé     image = qxl_phys2virt(qxl, addr, group_id, sizeof(QXLImage));
110fc97bb5bSPaolo Bonzini     if (!image) {
111fc97bb5bSPaolo Bonzini         return 1;
112fc97bb5bSPaolo Bonzini     }
113fc97bb5bSPaolo Bonzini     desc = &image->descriptor;
114fc97bb5bSPaolo Bonzini     fprintf(stderr, " (id %" PRIx64 " type %d flags %d width %d height %d",
115fc97bb5bSPaolo Bonzini             desc->id, desc->type, desc->flags, desc->width, desc->height);
116fc97bb5bSPaolo Bonzini     switch (desc->type) {
117fc97bb5bSPaolo Bonzini     case SPICE_IMAGE_TYPE_BITMAP:
118fc97bb5bSPaolo Bonzini         fprintf(stderr, ", fmt %d flags %d x %d y %d stride %d"
119fc97bb5bSPaolo Bonzini                 " palette %" PRIx64 " data %" PRIx64,
120fc97bb5bSPaolo Bonzini                 image->bitmap.format, image->bitmap.flags,
121fc97bb5bSPaolo Bonzini                 image->bitmap.x, image->bitmap.y,
122fc97bb5bSPaolo Bonzini                 image->bitmap.stride,
123fc97bb5bSPaolo Bonzini                 image->bitmap.palette, image->bitmap.data);
124fc97bb5bSPaolo Bonzini         break;
125fc97bb5bSPaolo Bonzini     }
126fc97bb5bSPaolo Bonzini     fprintf(stderr, ")");
127fc97bb5bSPaolo Bonzini     return 0;
128fc97bb5bSPaolo Bonzini }
129fc97bb5bSPaolo Bonzini 
qxl_log_rect(QXLRect * rect)130fc97bb5bSPaolo Bonzini static void qxl_log_rect(QXLRect *rect)
131fc97bb5bSPaolo Bonzini {
132fc97bb5bSPaolo Bonzini     fprintf(stderr, " %dx%d+%d+%d",
133fc97bb5bSPaolo Bonzini             rect->right - rect->left,
134fc97bb5bSPaolo Bonzini             rect->bottom - rect->top,
135fc97bb5bSPaolo Bonzini             rect->left, rect->top);
136fc97bb5bSPaolo Bonzini }
137fc97bb5bSPaolo Bonzini 
qxl_log_cmd_draw_copy(PCIQXLDevice * qxl,QXLCopy * copy,int group_id)138fc97bb5bSPaolo Bonzini static int qxl_log_cmd_draw_copy(PCIQXLDevice *qxl, QXLCopy *copy,
139fc97bb5bSPaolo Bonzini                                  int group_id)
140fc97bb5bSPaolo Bonzini {
141fc97bb5bSPaolo Bonzini     int ret;
142fc97bb5bSPaolo Bonzini 
143fc97bb5bSPaolo Bonzini     fprintf(stderr, " src %" PRIx64,
144fc97bb5bSPaolo Bonzini             copy->src_bitmap);
145fc97bb5bSPaolo Bonzini     ret = qxl_log_image(qxl, copy->src_bitmap, group_id);
146fc97bb5bSPaolo Bonzini     if (ret != 0) {
147fc97bb5bSPaolo Bonzini         return ret;
148fc97bb5bSPaolo Bonzini     }
149fc97bb5bSPaolo Bonzini     fprintf(stderr, " area");
150fc97bb5bSPaolo Bonzini     qxl_log_rect(&copy->src_area);
151fc97bb5bSPaolo Bonzini     fprintf(stderr, " rop %d", copy->rop_descriptor);
152fc97bb5bSPaolo Bonzini     return 0;
153fc97bb5bSPaolo Bonzini }
154fc97bb5bSPaolo Bonzini 
qxl_log_cmd_draw(PCIQXLDevice * qxl,QXLDrawable * draw,int group_id)155fc97bb5bSPaolo Bonzini static int qxl_log_cmd_draw(PCIQXLDevice *qxl, QXLDrawable *draw, int group_id)
156fc97bb5bSPaolo Bonzini {
157fc97bb5bSPaolo Bonzini     fprintf(stderr, ": surface_id %d type %s effect %s",
158fc97bb5bSPaolo Bonzini             draw->surface_id,
159fc97bb5bSPaolo Bonzini             qxl_name(qxl_draw_type, draw->type),
160fc97bb5bSPaolo Bonzini             qxl_name(qxl_draw_effect, draw->effect));
161fc97bb5bSPaolo Bonzini     switch (draw->type) {
162fc97bb5bSPaolo Bonzini     case QXL_DRAW_COPY:
163fc97bb5bSPaolo Bonzini         return qxl_log_cmd_draw_copy(qxl, &draw->u.copy, group_id);
164fc97bb5bSPaolo Bonzini     }
165fc97bb5bSPaolo Bonzini     return 0;
166fc97bb5bSPaolo Bonzini }
167fc97bb5bSPaolo Bonzini 
qxl_log_cmd_draw_compat(PCIQXLDevice * qxl,QXLCompatDrawable * draw,int group_id)168fc97bb5bSPaolo Bonzini static int qxl_log_cmd_draw_compat(PCIQXLDevice *qxl, QXLCompatDrawable *draw,
169fc97bb5bSPaolo Bonzini                                    int group_id)
170fc97bb5bSPaolo Bonzini {
171fc97bb5bSPaolo Bonzini     fprintf(stderr, ": type %s effect %s",
172fc97bb5bSPaolo Bonzini             qxl_name(qxl_draw_type, draw->type),
173fc97bb5bSPaolo Bonzini             qxl_name(qxl_draw_effect, draw->effect));
174fc97bb5bSPaolo Bonzini     if (draw->bitmap_offset) {
175fc97bb5bSPaolo Bonzini         fprintf(stderr, ": bitmap %d",
176fc97bb5bSPaolo Bonzini                 draw->bitmap_offset);
177fc97bb5bSPaolo Bonzini         qxl_log_rect(&draw->bitmap_area);
178fc97bb5bSPaolo Bonzini     }
179fc97bb5bSPaolo Bonzini     switch (draw->type) {
180fc97bb5bSPaolo Bonzini     case QXL_DRAW_COPY:
181fc97bb5bSPaolo Bonzini         return qxl_log_cmd_draw_copy(qxl, &draw->u.copy, group_id);
182fc97bb5bSPaolo Bonzini     }
183fc97bb5bSPaolo Bonzini     return 0;
184fc97bb5bSPaolo Bonzini }
185fc97bb5bSPaolo Bonzini 
qxl_log_cmd_surface(PCIQXLDevice * qxl,QXLSurfaceCmd * cmd)186fc97bb5bSPaolo Bonzini static void qxl_log_cmd_surface(PCIQXLDevice *qxl, QXLSurfaceCmd *cmd)
187fc97bb5bSPaolo Bonzini {
188fc97bb5bSPaolo Bonzini     fprintf(stderr, ": %s id %d",
189fc97bb5bSPaolo Bonzini             qxl_name(qxl_surface_cmd, cmd->type),
190fc97bb5bSPaolo Bonzini             cmd->surface_id);
191fc97bb5bSPaolo Bonzini     if (cmd->type == QXL_SURFACE_CMD_CREATE) {
192ada6f6f4SAlex Chen         fprintf(stderr, " size %dx%d stride %d format %s (count %u, max %u)",
193fc97bb5bSPaolo Bonzini                 cmd->u.surface_create.width,
194fc97bb5bSPaolo Bonzini                 cmd->u.surface_create.height,
195fc97bb5bSPaolo Bonzini                 cmd->u.surface_create.stride,
196fc97bb5bSPaolo Bonzini                 qxl_name(spice_surface_fmt, cmd->u.surface_create.format),
197fc97bb5bSPaolo Bonzini                 qxl->guest_surfaces.count, qxl->guest_surfaces.max);
198fc97bb5bSPaolo Bonzini     }
199fc97bb5bSPaolo Bonzini     if (cmd->type == QXL_SURFACE_CMD_DESTROY) {
200ada6f6f4SAlex Chen         fprintf(stderr, " (count %u)", qxl->guest_surfaces.count);
201fc97bb5bSPaolo Bonzini     }
202fc97bb5bSPaolo Bonzini }
203fc97bb5bSPaolo Bonzini 
qxl_log_cmd_cursor(PCIQXLDevice * qxl,QXLCursorCmd * cmd,int group_id)204fc97bb5bSPaolo Bonzini int qxl_log_cmd_cursor(PCIQXLDevice *qxl, QXLCursorCmd *cmd, int group_id)
205fc97bb5bSPaolo Bonzini {
206fc97bb5bSPaolo Bonzini     QXLCursor *cursor;
207fc97bb5bSPaolo Bonzini 
208fc97bb5bSPaolo Bonzini     fprintf(stderr, ": %s",
209fc97bb5bSPaolo Bonzini             qxl_name(qxl_cursor_cmd, cmd->type));
210fc97bb5bSPaolo Bonzini     switch (cmd->type) {
211fc97bb5bSPaolo Bonzini     case QXL_CURSOR_SET:
212fc97bb5bSPaolo Bonzini         fprintf(stderr, " +%d+%d visible %s, shape @ 0x%" PRIx64,
213fc97bb5bSPaolo Bonzini                 cmd->u.set.position.x,
214fc97bb5bSPaolo Bonzini                 cmd->u.set.position.y,
215fc97bb5bSPaolo Bonzini                 cmd->u.set.visible ? "yes" : "no",
216fc97bb5bSPaolo Bonzini                 cmd->u.set.shape);
217*8efec0efSPhilippe Mathieu-Daudé         cursor = qxl_phys2virt(qxl, cmd->u.set.shape, group_id,
218*8efec0efSPhilippe Mathieu-Daudé                                sizeof(QXLCursor));
219fc97bb5bSPaolo Bonzini         if (!cursor) {
220fc97bb5bSPaolo Bonzini             return 1;
221fc97bb5bSPaolo Bonzini         }
222fc97bb5bSPaolo Bonzini         fprintf(stderr, " type %s size %dx%d hot-spot +%d+%d"
223fc97bb5bSPaolo Bonzini                 " unique 0x%" PRIx64 " data-size %d",
224fc97bb5bSPaolo Bonzini                 qxl_name(spice_cursor_type, cursor->header.type),
225fc97bb5bSPaolo Bonzini                 cursor->header.width, cursor->header.height,
226fc97bb5bSPaolo Bonzini                 cursor->header.hot_spot_x, cursor->header.hot_spot_y,
227fc97bb5bSPaolo Bonzini                 cursor->header.unique, cursor->data_size);
228fc97bb5bSPaolo Bonzini         break;
229fc97bb5bSPaolo Bonzini     case QXL_CURSOR_MOVE:
230fc97bb5bSPaolo Bonzini         fprintf(stderr, " +%d+%d", cmd->u.position.x, cmd->u.position.y);
231fc97bb5bSPaolo Bonzini         break;
232fc97bb5bSPaolo Bonzini     }
233fc97bb5bSPaolo Bonzini     return 0;
234fc97bb5bSPaolo Bonzini }
235fc97bb5bSPaolo Bonzini 
qxl_log_command(PCIQXLDevice * qxl,const char * ring,QXLCommandExt * ext)236fc97bb5bSPaolo Bonzini int qxl_log_command(PCIQXLDevice *qxl, const char *ring, QXLCommandExt *ext)
237fc97bb5bSPaolo Bonzini {
238fc97bb5bSPaolo Bonzini     bool compat = ext->flags & QXL_COMMAND_FLAG_COMPAT;
239fc97bb5bSPaolo Bonzini     void *data;
240*8efec0efSPhilippe Mathieu-Daudé     size_t datasz;
241fc97bb5bSPaolo Bonzini     int ret;
242fc97bb5bSPaolo Bonzini 
243fc97bb5bSPaolo Bonzini     if (!qxl->cmdlog) {
244fc97bb5bSPaolo Bonzini         return 0;
245fc97bb5bSPaolo Bonzini     }
246bc72ad67SAlex Bligh     fprintf(stderr, "%" PRId64 " qxl-%d/%s:", qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL),
247fc97bb5bSPaolo Bonzini             qxl->id, ring);
248fc97bb5bSPaolo Bonzini     fprintf(stderr, " cmd @ 0x%" PRIx64 " %s%s", ext->cmd.data,
249fc97bb5bSPaolo Bonzini             qxl_name(qxl_type, ext->cmd.type),
250fc97bb5bSPaolo Bonzini             compat ? "(compat)" : "");
251fc97bb5bSPaolo Bonzini 
25261c34fc1SPhilippe Mathieu-Daudé     switch (ext->cmd.type) {
25361c34fc1SPhilippe Mathieu-Daudé     case QXL_CMD_DRAW:
254*8efec0efSPhilippe Mathieu-Daudé         datasz = compat ? sizeof(QXLCompatDrawable) : sizeof(QXLDrawable);
25561c34fc1SPhilippe Mathieu-Daudé         break;
25661c34fc1SPhilippe Mathieu-Daudé     case QXL_CMD_SURFACE:
257*8efec0efSPhilippe Mathieu-Daudé         datasz = sizeof(QXLSurfaceCmd);
25861c34fc1SPhilippe Mathieu-Daudé         break;
25961c34fc1SPhilippe Mathieu-Daudé     case QXL_CMD_CURSOR:
260*8efec0efSPhilippe Mathieu-Daudé         datasz = sizeof(QXLCursorCmd);
26161c34fc1SPhilippe Mathieu-Daudé         break;
26261c34fc1SPhilippe Mathieu-Daudé     default:
26361c34fc1SPhilippe Mathieu-Daudé         goto out;
26461c34fc1SPhilippe Mathieu-Daudé     }
265*8efec0efSPhilippe Mathieu-Daudé     data = qxl_phys2virt(qxl, ext->cmd.data, ext->group_id, datasz);
266fc97bb5bSPaolo Bonzini     if (!data) {
267fc97bb5bSPaolo Bonzini         return 1;
268fc97bb5bSPaolo Bonzini     }
269fc97bb5bSPaolo Bonzini     switch (ext->cmd.type) {
270fc97bb5bSPaolo Bonzini     case QXL_CMD_DRAW:
271fc97bb5bSPaolo Bonzini         if (!compat) {
272fc97bb5bSPaolo Bonzini             ret = qxl_log_cmd_draw(qxl, data, ext->group_id);
273fc97bb5bSPaolo Bonzini         } else {
274fc97bb5bSPaolo Bonzini             ret = qxl_log_cmd_draw_compat(qxl, data, ext->group_id);
275fc97bb5bSPaolo Bonzini         }
276fc97bb5bSPaolo Bonzini         if (ret) {
277fc97bb5bSPaolo Bonzini             return ret;
278fc97bb5bSPaolo Bonzini         }
279fc97bb5bSPaolo Bonzini         break;
280fc97bb5bSPaolo Bonzini     case QXL_CMD_SURFACE:
281fc97bb5bSPaolo Bonzini         qxl_log_cmd_surface(qxl, data);
282fc97bb5bSPaolo Bonzini         break;
283fc97bb5bSPaolo Bonzini     case QXL_CMD_CURSOR:
284fc97bb5bSPaolo Bonzini         qxl_log_cmd_cursor(qxl, data, ext->group_id);
285fc97bb5bSPaolo Bonzini         break;
286fc97bb5bSPaolo Bonzini     }
28761c34fc1SPhilippe Mathieu-Daudé out:
288fc97bb5bSPaolo Bonzini     fprintf(stderr, "\n");
289fc97bb5bSPaolo Bonzini     return 0;
290fc97bb5bSPaolo Bonzini }
291