From 9a7a645ce201ec8bb161dc648ae7eccf9e9969f0 Mon Sep 17 00:00:00 2001 From: Yonit Halperin Date: Mon, 5 Nov 2012 23:28:19 +0200 Subject: display seamless migration: no need to trace the generation of the primary surface We no longer process destroy_primary or destroy_surfaces while waiting for migration data. --- server/red_worker.c | 51 ++++++++++++++++----------------------------------- 1 file changed, 16 insertions(+), 35 deletions(-) (limited to 'server/red_worker.c') diff --git a/server/red_worker.c b/server/red_worker.c index 4636647d..8638a130 100644 --- a/server/red_worker.c +++ b/server/red_worker.c @@ -921,7 +921,6 @@ typedef struct RedWorker { RedSurface surfaces[NUM_SURFACES]; uint32_t n_surfaces; SpiceImageSurfaces image_surfaces; - uint32_t primary_surface_generation; MonitorsConfig *monitors_config; @@ -9766,23 +9765,12 @@ static uint64_t display_channel_handle_migrate_data_get_serial( return migrate_data->message_serial; } -static int display_channel_client_restore_surface(DisplayChannelClient *dcc, uint32_t surface_id) +static void display_channel_client_restore_surface(DisplayChannelClient *dcc, uint32_t surface_id) { - if (surface_id == 0) { - if (dcc->common.worker->primary_surface_generation <= 1) { - dcc->surface_client_created[surface_id] = TRUE; - return TRUE; - } else { - /* red_create_surface_item already updated the client */ - return FALSE; - } - } else { - /* we don't process commands till we receive the migration data, thus, - * we should have not created any off-screen surface */ - spice_assert(!dcc->surface_client_created[surface_id]); - dcc->surface_client_created[surface_id] = TRUE; - return TRUE; - } + /* we don't process commands till we receive the migration data, thus, + * we should have not sent any surface to the client. */ + spice_assert(!dcc->surface_client_created[surface_id]); + dcc->surface_client_created[surface_id] = TRUE; } static void display_channel_client_restore_surfaces_lossless(DisplayChannelClient *dcc, @@ -9806,21 +9794,19 @@ static void display_channel_client_restore_surfaces_lossy(DisplayChannelClient * spice_debug(NULL); for (i = 0; i < mig_surfaces->num_surfaces; i++) { uint32_t surface_id = mig_surfaces->surfaces[i].id; + SpiceMigrateDataRect *mig_lossy_rect; + SpiceRect lossy_rect; - if (display_channel_client_restore_surface(dcc, surface_id)) { - SpiceMigrateDataRect *mig_lossy_rect; - SpiceRect lossy_rect; - - spice_assert(dcc->surface_client_created[surface_id]); + display_channel_client_restore_surface(dcc, surface_id); + spice_assert(dcc->surface_client_created[surface_id]); - mig_lossy_rect = &mig_surfaces->surfaces[i].lossy_rect; - lossy_rect.left = mig_lossy_rect->left; - lossy_rect.top = mig_lossy_rect->top; - lossy_rect.right = mig_lossy_rect->right; - lossy_rect.bottom = mig_lossy_rect->bottom; - region_init(&dcc->surface_client_lossy_region[surface_id]); - region_add(&dcc->surface_client_lossy_region[surface_id], &lossy_rect); - } + mig_lossy_rect = &mig_surfaces->surfaces[i].lossy_rect; + lossy_rect.left = mig_lossy_rect->left; + lossy_rect.top = mig_lossy_rect->top; + lossy_rect.right = mig_lossy_rect->right; + lossy_rect.bottom = mig_lossy_rect->bottom; + region_init(&dcc->surface_client_lossy_region[surface_id]); + region_add(&dcc->surface_client_lossy_region[surface_id], &lossy_rect); } } static int display_channel_handle_migrate_data(RedChannelClient *rcc, uint32_t size, @@ -11041,11 +11027,6 @@ static void dev_create_primary_surface(RedWorker *worker, uint32_t surface_id, line_0 -= (int32_t)(surface.stride * (surface.height -1)); } - if (!worker->display_channel->common.during_target_migrate) { - worker->primary_surface_generation++; - } else { - worker->primary_surface_generation = 1; - } red_create_surface(worker, 0, surface.width, surface.height, surface.stride, surface.format, line_0, surface.flags & QXL_SURF_FLAG_KEEP_DATA, TRUE); set_monitors_config_to_primary(worker); -- cgit