qxl abi: parse QXLUpdateCmd.

This commit is contained in:
Gerd Hoffmann 2010-06-24 11:26:11 +02:00
parent b081ec4b04
commit fada35a173
3 changed files with 38 additions and 9 deletions

View File

@ -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 */
}

View File

@ -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

View File

@ -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: {