summaryrefslogtreecommitdiffstats
path: root/server
diff options
context:
space:
mode:
authorGerd Hoffmann <kraxel@redhat.com>2010-06-24 11:26:11 +0200
committerGerd Hoffmann <kraxel@redhat.com>2010-06-29 12:30:20 +0200
commitfada35a173996ff24aa081112d37cfa7292cabe3 (patch)
tree640b7566c59614ce65166d62a64d97cce3786743 /server
parentb081ec4b0472b697862f996759e2e406a3af38f9 (diff)
downloadspice-fada35a173996ff24aa081112d37cfa7292cabe3.tar.gz
spice-fada35a173996ff24aa081112d37cfa7292cabe3.tar.xz
spice-fada35a173996ff24aa081112d37cfa7292cabe3.zip
qxl abi: parse QXLUpdateCmd.
Diffstat (limited to 'server')
-rw-r--r--server/red_parse_qxl.c18
-rw-r--r--server/red_parse_qxl.h11
-rw-r--r--server/red_worker.c18
3 files changed, 38 insertions, 9 deletions
diff --git a/server/red_parse_qxl.c b/server/red_parse_qxl.c
index 34308c34..f7de6cfe 100644
--- a/server/red_parse_qxl.c
+++ b/server/red_parse_qxl.c
@@ -312,3 +312,21 @@ void red_put_drawable(RedDrawable *red)
{
/* nothing yet */
}
+
+void red_get_update_cmd(RedMemSlotInfo *slots, int group_id,
+ RedUpdateCmd *red, SPICE_ADDRESS addr)
+{
+ QXLUpdateCmd *qxl;
+
+ qxl = (QXLUpdateCmd *)get_virt(slots, addr, sizeof(*qxl), group_id);
+ red->release_info = &qxl->release_info;
+
+ red->area = qxl->area;
+ red->update_id = qxl->update_id;
+ red->surface_id = qxl->surface_id;
+}
+
+void red_put_update_cmd(RedUpdateCmd *red)
+{
+ /* nothing yet */
+}
diff --git a/server/red_parse_qxl.h b/server/red_parse_qxl.h
index 5737b550..bc2dd4e9 100644
--- a/server/red_parse_qxl.h
+++ b/server/red_parse_qxl.h
@@ -53,10 +53,21 @@ typedef struct SPICE_ATTR_PACKED RedDrawable {
} u;
} RedDrawable;
+typedef struct SPICE_ATTR_PACKED RedUpdateCmd {
+ QXLReleaseInfo *release_info;
+ SpiceRect area;
+ uint32_t update_id;
+ uint32_t surface_id;
+} RedUpdateCmd;
+
void red_get_drawable(RedMemSlotInfo *slots, int group_id,
RedDrawable *red, SPICE_ADDRESS addr);
void red_get_compat_drawable(RedMemSlotInfo *slots, int group_id,
RedDrawable *red, SPICE_ADDRESS addr);
void red_put_drawable(RedDrawable *red);
+void red_get_update_cmd(RedMemSlotInfo *slots, int group_id,
+ RedUpdateCmd *red, SPICE_ADDRESS addr);
+void red_put_update_cmd(RedUpdateCmd *red);
+
#endif
diff --git a/server/red_worker.c b/server/red_worker.c
index 72eba108..b90c3f98 100644
--- a/server/red_worker.c
+++ b/server/red_worker.c
@@ -5042,18 +5042,18 @@ static int red_process_commands(RedWorker *worker, uint32_t max_pipe_size)
break;
}
case QXL_CMD_UPDATE: {
- int surface_id;
+ RedUpdateCmd update;
QXLReleaseInfoExt release_info_ext;
- QXLUpdateCmd *draw_cmd = (QXLUpdateCmd *)get_virt(&worker->mem_slots, ext_cmd.cmd.data,
- sizeof(QXLUpdateCmd),
- ext_cmd.group_id);
- surface_id = draw_cmd->surface_id;
- validate_surface(worker, surface_id);
- red_update_area(worker, &draw_cmd->area, draw_cmd->surface_id);
- worker->qxl->st->qif->notify_update(worker->qxl, draw_cmd->update_id);
+
+ red_get_update_cmd(&worker->mem_slots, ext_cmd.group_id,
+ &update, ext_cmd.cmd.data);
+ validate_surface(worker, update.surface_id);
+ red_update_area(worker, &update.area, update.surface_id);
+ worker->qxl->st->qif->notify_update(worker->qxl, update.update_id);
release_info_ext.group_id = ext_cmd.group_id;
- release_info_ext.info = &draw_cmd->release_info;
+ release_info_ext.info = update.release_info;
worker->qxl->st->qif->release_resource(worker->qxl, release_info_ext);
+ red_put_update_cmd(&update);
break;
}
case QXL_CMD_MESSAGE: {