diff options
author | Gerd Hoffmann <kraxel@redhat.com> | 2010-06-24 16:12:17 +0200 |
---|---|---|
committer | Gerd Hoffmann <kraxel@redhat.com> | 2010-06-29 12:30:20 +0200 |
commit | 58c23b66860def72f6b5186d77b5e047964e40cb (patch) | |
tree | fdc46ea6610264bd34cafcbbef079924d94a01d9 /server | |
parent | 4fb61b9aa5c092db1f8fcbd51f7967ccfda364ac (diff) | |
download | spice-58c23b66860def72f6b5186d77b5e047964e40cb.tar.gz spice-58c23b66860def72f6b5186d77b5e047964e40cb.tar.xz spice-58c23b66860def72f6b5186d77b5e047964e40cb.zip |
qxl abi: parse QXLRect.
Diffstat (limited to 'server')
-rw-r--r-- | server/red_dispatcher.c | 18 | ||||
-rw-r--r-- | server/red_parse_qxl.c | 34 | ||||
-rw-r--r-- | server/red_parse_qxl.h | 2 | ||||
-rw-r--r-- | server/spice.h | 6 |
4 files changed, 42 insertions, 18 deletions
diff --git a/server/red_dispatcher.c b/server/red_dispatcher.c index 4368cf60..dbc82d4a 100644 --- a/server/red_dispatcher.c +++ b/server/red_dispatcher.c @@ -32,6 +32,7 @@ #include "gl_canvas.h" #include "reds.h" #include "red_dispatcher.h" +#include "red_parse_qxl.h" static int num_active_workers = 0; @@ -200,11 +201,16 @@ static void update_client_mouse_allowed() } static void qxl_worker_update_area(QXLWorker *qxl_worker, uint32_t surface_id, - SpiceRect *area, SpiceRect *dirty_rects, + QXLRect *qxl_area, QXLRect *qxl_dirty_rects, uint32_t num_dirty_rects, uint32_t clear_dirty_region) { RedDispatcher *dispatcher = (RedDispatcher *)qxl_worker; RedWorkerMessage message = RED_WORKER_MESSAGE_UPDATE; + SpiceRect *dirty_rects = spice_new0(SpiceRect, num_dirty_rects); + SpiceRect *area = spice_new0(SpiceRect, 1); + int i; + + red_get_rect_ptr(area, qxl_area); write_message(dispatcher->channel, &message); send_data(dispatcher->channel, &surface_id, sizeof(uint32_t)); @@ -214,6 +220,16 @@ static void qxl_worker_update_area(QXLWorker *qxl_worker, uint32_t surface_id, send_data(dispatcher->channel, &clear_dirty_region, sizeof(uint32_t)); read_message(dispatcher->channel, &message); ASSERT(message == RED_WORKER_MESSAGE_READY); + + for (i = 0; i < num_dirty_rects; i++) { + qxl_dirty_rects[i].top = dirty_rects[i].top; + qxl_dirty_rects[i].left = dirty_rects[i].left; + qxl_dirty_rects[i].bottom = dirty_rects[i].bottom; + qxl_dirty_rects[i].right = dirty_rects[i].right; + } + + free(dirty_rects); + free(area); } static void qxl_worker_add_memslot(QXLWorker *qxl_worker, QXLDevMemSlot *mem_slot) diff --git a/server/red_parse_qxl.c b/server/red_parse_qxl.c index b5362f44..c5a8f566 100644 --- a/server/red_parse_qxl.c +++ b/server/red_parse_qxl.c @@ -32,6 +32,14 @@ static void red_get_point16_ptr(SpicePoint16 *red, QXLPoint16 *qxl) red->y = qxl->y; } +void red_get_rect_ptr(SpiceRect *red, QXLRect *qxl) +{ + red->top = qxl->top; + red->left = qxl->left; + red->bottom = qxl->bottom; + red->right = qxl->right; +} + static void red_get_brush_ptr(RedMemSlotInfo *slots, int group_id, SpiceBrush *red, QXLBrush *qxl) { @@ -67,7 +75,7 @@ static void red_get_opaque_ptr(RedMemSlotInfo *slots, int group_id, SpiceOpaque *red, QXLOpaque *qxl) { red->src_bitmap = qxl->src_bitmap; - red->src_area = qxl->src_area; + red_get_rect_ptr(&red->src_area, &qxl->src_area); red_get_brush_ptr(slots, group_id, &red->brush, &qxl->brush); red->rop_descriptor = qxl->rop_descriptor; red->scale_mode = qxl->scale_mode; @@ -78,7 +86,7 @@ static void red_get_copy_ptr(RedMemSlotInfo *slots, int group_id, SpiceCopy *red, QXLCopy *qxl) { red->src_bitmap = qxl->src_bitmap; - red->src_area = qxl->src_area; + red_get_rect_ptr(&red->src_area, &qxl->src_area); red->rop_descriptor = qxl->rop_descriptor; red->scale_mode = qxl->scale_mode; red_get_qmask_ptr(slots, group_id, &red->mask, &qxl->mask); @@ -88,7 +96,7 @@ static void red_get_blend_ptr(RedMemSlotInfo *slots, int group_id, SpiceBlend *red, QXLBlend *qxl) { red->src_bitmap = qxl->src_bitmap; - red->src_area = qxl->src_area; + red_get_rect_ptr(&red->src_area, &qxl->src_area); red->rop_descriptor = qxl->rop_descriptor; red->scale_mode = qxl->scale_mode; red_get_qmask_ptr(slots, group_id, &red->mask, &qxl->mask); @@ -98,7 +106,7 @@ static void red_get_transparent_ptr(RedMemSlotInfo *slots, int group_id, SpiceTransparent *red, QXLTransparent *qxl) { red->src_bitmap = qxl->src_bitmap; - red->src_area = qxl->src_area; + red_get_rect_ptr(&red->src_area, &qxl->src_area); red->src_color = qxl->src_color; red->true_color = qxl->true_color; } @@ -109,7 +117,7 @@ static void red_get_alpha_blend_ptr(RedMemSlotInfo *slots, int group_id, red->alpha_flags = qxl->alpha_flags; red->alpha = qxl->alpha; red->src_bitmap = qxl->src_bitmap; - red->src_area = qxl->src_area; + red_get_rect_ptr(&red->src_area, &qxl->src_area); } static void red_get_alpha_blend_ptr_compat(RedMemSlotInfo *slots, int group_id, @@ -117,14 +125,14 @@ static void red_get_alpha_blend_ptr_compat(RedMemSlotInfo *slots, int group_id, { red->alpha = qxl->alpha; red->src_bitmap = qxl->src_bitmap; - red->src_area = qxl->src_area; + red_get_rect_ptr(&red->src_area, &qxl->src_area); } static void red_get_rop3_ptr(RedMemSlotInfo *slots, int group_id, SpiceRop3 *red, QXLRop3 *qxl) { red->src_bitmap = qxl->src_bitmap; - red->src_area = qxl->src_area; + red_get_rect_ptr(&red->src_area, &qxl->src_area); red_get_brush_ptr(slots, group_id, &red->brush, &qxl->brush); red->rop3 = qxl->rop3; red->scale_mode = qxl->scale_mode; @@ -151,7 +159,7 @@ static void red_get_text_ptr(RedMemSlotInfo *slots, int group_id, SpiceText *red, QXLText *qxl) { red->str = qxl->str; - red->back_area = qxl->back_area; + red_get_rect_ptr(&red->back_area, &qxl->back_area); red_get_brush_ptr(slots, group_id, &red->fore_brush, &qxl->fore_brush); red_get_brush_ptr(slots, group_id, &red->back_brush, &qxl->back_brush); red->fore_mode = qxl->fore_mode; @@ -192,17 +200,17 @@ void red_get_drawable(RedMemSlotInfo *slots, int group_id, qxl = (QXLDrawable *)get_virt(slots, addr, sizeof(*qxl), group_id); red->release_info = &qxl->release_info; - red->bbox = qxl->bbox; + red_get_rect_ptr(&red->bbox, &qxl->bbox); red_get_clip_ptr(slots, group_id, &red->clip, &qxl->clip); red->effect = qxl->effect; red->mm_time = qxl->mm_time; red->self_bitmap = qxl->self_bitmap; - red->self_bitmap_area = qxl->self_bitmap_area; + red_get_rect_ptr(&red->self_bitmap_area, &qxl->self_bitmap_area); red->surface_id = qxl->surface_id; for (i = 0; i < 3; i++) { red->surfaces_dest[i] = qxl->surfaces_dest[i]; - red->surfaces_rects[i] = qxl->surfaces_rects[i]; + red_get_rect_ptr(&red->surfaces_rects[i], &qxl->surfaces_rects[i]); } red->type = qxl->type; @@ -264,7 +272,7 @@ void red_get_compat_drawable(RedMemSlotInfo *slots, int group_id, qxl = (QXLCompatDrawable *)get_virt(slots, addr, sizeof(*qxl), group_id); red->release_info = &qxl->release_info; - red->bbox = qxl->bbox; + red_get_rect_ptr(&red->bbox, &qxl->bbox); red_get_clip_ptr(slots, group_id, &red->clip, &qxl->clip); red->effect = qxl->effect; red->mm_time = qxl->mm_time; @@ -333,7 +341,7 @@ void red_get_update_cmd(RedMemSlotInfo *slots, int group_id, qxl = (QXLUpdateCmd *)get_virt(slots, addr, sizeof(*qxl), group_id); red->release_info = &qxl->release_info; - red->area = qxl->area; + red_get_rect_ptr(&red->area, &qxl->area); red->update_id = qxl->update_id; red->surface_id = qxl->surface_id; } diff --git a/server/red_parse_qxl.h b/server/red_parse_qxl.h index b96a393b..aece6a9e 100644 --- a/server/red_parse_qxl.h +++ b/server/red_parse_qxl.h @@ -103,6 +103,8 @@ typedef struct SPICE_ATTR_PACKED RedCursorCmd { uint8_t *device_data; } RedCursorCmd; +void red_get_rect_ptr(SpiceRect *red, QXLRect *qxl); + void red_get_drawable(RedMemSlotInfo *slots, int group_id, RedDrawable *red, SPICE_ADDRESS addr); void red_get_compat_drawable(RedMemSlotInfo *slots, int group_id, diff --git a/server/spice.h b/server/spice.h index 6c5853dc..07bbeef9 100644 --- a/server/spice.h +++ b/server/spice.h @@ -81,7 +81,7 @@ union QXLReleaseInfo; struct QXLReleaseInfoExt; struct QXLCommand; struct QXLCommandExt; -struct SpiceRect; +struct QXLRect; struct QXLWorker { uint32_t minor_version; uint32_t major_version; @@ -90,7 +90,7 @@ struct QXLWorker { void (*start)(QXLWorker *worker); void (*stop)(QXLWorker *worker); void (*update_area)(QXLWorker *qxl_worker, uint32_t surface_id, - struct SpiceRect *area, struct SpiceRect *dirty_rects, + struct QXLRect *area, struct QXLRect *dirty_rects, uint32_t num_dirty_rects, uint32_t clear_dirty_region); void (*add_memslot)(QXLWorker *worker, QXLDevMemSlot *slot); void (*del_memslot)(QXLWorker *worker, uint32_t slot_group_id, uint32_t slot_id); @@ -158,8 +158,6 @@ struct QXLDevSurfaceCreate { uint32_t group_id; }; -struct SpiceRect; - struct QXLInterface { SpiceBaseInterface base; |