[Spice-devel] [PATCH] server: fix update_area
Alon Levy
alevy at redhat.com
Sun May 8 07:06:46 PDT 2011
in next revision (v6) this will be folded into the patch that introduced
the bug. update_area is a request from the guest to render everything affecting
a specific area so the guest can read the contents directly via the pci bar
surface. The operations were wrongly performed more then once. This fixes
handle_dev_update and red_update_area (which when folded will just be the
renaming of red_render_update_area).
---
server/red_worker.c | 31 ++++++++-----------------------
1 files changed, 8 insertions(+), 23 deletions(-)
diff --git a/server/red_worker.c b/server/red_worker.c
index c9d6211..74a72a9 100644
--- a/server/red_worker.c
+++ b/server/red_worker.c
@@ -970,12 +970,10 @@ typedef struct BitmapData {
static void red_draw_qxl_drawable(RedRender *render, Drawable *drawable);
static void red_current_flush(RedRender *render, int surface_id);
#ifdef DRAW_ALL
-#define red_update_area(worker, rect, surface_id)
#define red_render_update_area(render, rect, surface_id)
#define red_draw_drawable(render, item)
#else
static void red_draw_drawable(RedRender *render, Drawable *item);
-static void red_update_area(RedWorker *worker, const SpiceRect *area, int surface_id);
static void red_render_update_area(RedRender *render, const SpiceRect *area, int surface_id);
#endif
static void red_release_cursor(RedWorker *worker, CursorItem *cursor);
@@ -4378,17 +4376,6 @@ static void red_render_update_area(RedRender *render, const SpiceRect *area, int
}
#endif
-
-static void red_update_area(RedWorker *worker, const SpiceRect *area, int surface_id)
-{
- RedRender *render;
- RingItem *link;
-
- RENDER_FOREACH(link, render, worker) {
- red_render_update_area(render, area, surface_id);
- }
-}
-
#endif
static inline void free_cursor_item(RedWorker *worker, CursorItem *item);
@@ -4633,7 +4620,8 @@ static int red_process_commands(RedWorker *worker, uint32_t max_pipe_size, int *
red_get_update_cmd(&worker->mem_slots, ext_cmd.group_id,
&update, ext_cmd.cmd.data);
validate_surface(&worker->render, update.surface_id);
- red_update_area(worker, &update.area, update.surface_id);
+ red_render_update_area(&worker->render, &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 = update.release_info;
@@ -10271,8 +10259,7 @@ static inline void handle_dev_update(RedWorker *worker)
uint32_t num_dirty_rects;
uint32_t surface_id;
uint32_t clear_dirty_region;
- RingItem *link;
- RedRender *render;
+ RedRender *render = &worker->render;
receive_data(worker->channel, &surface_id, sizeof(uint32_t));
receive_data(worker->channel, &rect, sizeof(SpiceRect *));
@@ -10285,14 +10272,12 @@ static inline void handle_dev_update(RedWorker *worker)
ASSERT(worker->running);
validate_surface(&worker->render, surface_id);
- red_update_area(worker, rect, surface_id);
+ red_render_update_area(&worker->render, rect, surface_id);
- RENDER_FOREACH(link, render, worker) {
- surface = &render->surfaces[surface_id];
- region_ret_rects(&surface->draw_dirty_region, dirty_rects, num_dirty_rects);
- if (clear_dirty_region) {
- region_clear(&surface->draw_dirty_region);
- }
+ surface = &render->surfaces[surface_id];
+ region_ret_rects(&surface->draw_dirty_region, dirty_rects, num_dirty_rects);
+ if (clear_dirty_region) {
+ region_clear(&surface->draw_dirty_region);
}
message = RED_WORKER_MESSAGE_READY;
write_message(worker->channel, &message);
--
1.7.5.1
More information about the Spice-devel
mailing list