diff options
author | Yonit Halperin <yhalperi@redhat.com> | 2012-11-05 23:28:19 +0200 |
---|---|---|
committer | Yonit Halperin <yhalperi@redhat.com> | 2012-11-12 18:50:37 +0200 |
commit | 9a7a645ce201ec8bb161dc648ae7eccf9e9969f0 (patch) | |
tree | 12f6131940893ac59ba9c99ad199d969548cc82e | |
parent | 8918664cc3f63f3266490b2188ad537c282f021c (diff) | |
download | spice-9a7a645ce201ec8bb161dc648ae7eccf9e9969f0.tar.gz spice-9a7a645ce201ec8bb161dc648ae7eccf9e9969f0.tar.xz spice-9a7a645ce201ec8bb161dc648ae7eccf9e9969f0.zip |
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.
-rw-r--r-- | server/red_worker.c | 51 |
1 files changed, 16 insertions, 35 deletions
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); |