summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYonit Halperin <yhalperi@redhat.com>2012-11-05 23:28:19 +0200
committerYonit Halperin <yhalperi@redhat.com>2012-11-12 18:50:37 +0200
commit9a7a645ce201ec8bb161dc648ae7eccf9e9969f0 (patch)
tree12f6131940893ac59ba9c99ad199d969548cc82e
parent8918664cc3f63f3266490b2188ad537c282f021c (diff)
downloadspice-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.c51
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);