summaryrefslogtreecommitdiffstats
path: root/server/red_dispatcher.c
diff options
context:
space:
mode:
authorIzik Eidus <ieidus@redhat.com>2010-01-28 04:44:43 +0200
committerIzik Eidus <ieidus@redhat.com>2010-01-28 04:46:29 +0200
commit2ba69f9f8819daaa3d166c4c1c7e03b121b88a95 (patch)
treeaf28f5f7a71af15769c6447ccf4b6e10e8d60644 /server/red_dispatcher.c
parent766c74f63cb005ba614c11a59b5da844f01cb335 (diff)
downloadspice-2ba69f9f8819daaa3d166c4c1c7e03b121b88a95.tar.gz
spice-2ba69f9f8819daaa3d166c4c1c7e03b121b88a95.tar.xz
spice-2ba69f9f8819daaa3d166c4c1c7e03b121b88a95.zip
libspice: add surface 0 support
This include alot of infestracture for off screens. Signed-off-by: Izik Eidus <ieidus@redhat.com>
Diffstat (limited to 'server/red_dispatcher.c')
-rw-r--r--server/red_dispatcher.c111
1 files changed, 81 insertions, 30 deletions
diff --git a/server/red_dispatcher.c b/server/red_dispatcher.c
index 439d5342..e35aba35 100644
--- a/server/red_dispatcher.c
+++ b/server/red_dispatcher.c
@@ -44,7 +44,7 @@ struct RedDispatcher {
int channel;
pthread_t worker_thread;
uint32_t pending;
- int active;
+ int primary_active;
int x_res;
int y_res;
int use_hardware_cursor;
@@ -179,7 +179,7 @@ static void update_client_mouse_allowed()
allow_now = TRUE;
RedDispatcher *now = dispatchers;
while (now && allow_now) {
- if (now->active) {
+ if (now->primary_active) {
allow_now = now->use_hardware_cursor;
if (num_active_workers == 1) {
if (allow_now) {
@@ -199,72 +199,114 @@ static void update_client_mouse_allowed()
}
}
-static void qxl_worker_attach(QXLWorker *qxl_worker)
+static void qxl_worker_update_area(QXLWorker *qxl_worker)
{
RedDispatcher *dispatcher = (RedDispatcher *)qxl_worker;
- RedWorkeMessage message = RED_WORKER_MESSAGE_ATTACH;
- QXLDevInfo info;
+ RedWorkeMessage message = RED_WORKER_MESSAGE_UPDATE;
- dispatcher->qxl_interface->get_info(dispatcher->qxl_interface, &info);
- dispatcher->x_res = info.x_res;
- dispatcher->y_res = info.y_res;
- dispatcher->use_hardware_cursor = info.use_hardware_cursor;
- dispatcher->active = TRUE;
+ write_message(dispatcher->channel, &message);
+ read_message(dispatcher->channel, &message);
+ ASSERT(message == RED_WORKER_MESSAGE_READY);
+}
+
+static void qxl_worker_add_memslot(QXLWorker *qxl_worker, QXLDevMemSlot *mem_slot)
+{
+ RedDispatcher *dispatcher = (RedDispatcher *)qxl_worker;
+ RedWorkeMessage message = RED_WORKER_MESSAGE_ADD_MEMSLOT;
write_message(dispatcher->channel, &message);
- send_data(dispatcher->channel, &info, sizeof(QXLDevInfo));
+ send_data(dispatcher->channel, mem_slot, sizeof(QXLDevMemSlot));
read_message(dispatcher->channel, &message);
ASSERT(message == RED_WORKER_MESSAGE_READY);
+}
- num_active_workers++;
- update_client_mouse_allowed();
+static void qxl_worker_del_memslot(QXLWorker *qxl_worker, uint32_t slot_group_id, uint32_t slot_id)
+{
+ RedDispatcher *dispatcher = (RedDispatcher *)qxl_worker;
+ RedWorkeMessage message = RED_WORKER_MESSAGE_DEL_MEMSLOT;
+
+ write_message(dispatcher->channel, &message);
+ send_data(dispatcher->channel, &slot_group_id, sizeof(uint32_t));
+ send_data(dispatcher->channel, &slot_id, sizeof(uint32_t));
}
-static void qxl_worker_detach(QXLWorker *qxl_worker)
+static void qxl_worker_destroy_surfaces(QXLWorker *qxl_worker)
{
RedDispatcher *dispatcher = (RedDispatcher *)qxl_worker;
- RedWorkeMessage message = RED_WORKER_MESSAGE_DETACH;
+ RedWorkeMessage message = RED_WORKER_MESSAGE_DESTROY_SURFACES;
write_message(dispatcher->channel, &message);
read_message(dispatcher->channel, &message);
ASSERT(message == RED_WORKER_MESSAGE_READY);
+}
+
+static void qxl_worker_destroy_primary(QXLWorker *qxl_worker, uint32_t surface_id)
+{
+ RedDispatcher *dispatcher = (RedDispatcher *)qxl_worker;
+ RedWorkeMessage message = RED_WORKER_MESSAGE_DESTROY_PRIMARY_SURFACE;
+
+ write_message(dispatcher->channel, &message);
+ send_data(dispatcher->channel, &surface_id, sizeof(uint32_t));
+ read_message(dispatcher->channel, &message);
+ ASSERT(message == RED_WORKER_MESSAGE_READY);
dispatcher->x_res = 0;
dispatcher->y_res = 0;
dispatcher->use_hardware_cursor = FALSE;
- dispatcher->active = FALSE;
- num_active_workers--;
+ dispatcher->primary_active = FALSE;
+
update_client_mouse_allowed();
}
-static void qxl_worker_update_area(QXLWorker *qxl_worker)
+static void qxl_worker_create_primary(QXLWorker *qxl_worker, uint32_t surface_id,
+ QXLDevSurfaceCreate *surface)
{
RedDispatcher *dispatcher = (RedDispatcher *)qxl_worker;
- RedWorkeMessage message = RED_WORKER_MESSAGE_UPDATE;
+ RedWorkeMessage message = RED_WORKER_MESSAGE_CREATE_PRIMARY_SURFACE;
+
+ dispatcher->x_res = surface->width;
+ dispatcher->y_res = surface->height;
+ dispatcher->use_hardware_cursor = surface->mouse_mode;
+ dispatcher->primary_active = TRUE;
write_message(dispatcher->channel, &message);
+ send_data(dispatcher->channel, &surface_id, sizeof(uint32_t));
+ send_data(dispatcher->channel, surface, sizeof(QXLDevSurfaceCreate));
read_message(dispatcher->channel, &message);
ASSERT(message == RED_WORKER_MESSAGE_READY);
+
+ update_client_mouse_allowed();
}
-static void qxl_worker_add_memslot(QXLWorker *qxl_worker, QXLDevMemSlot *mem_slot)
+static void qxl_worker_reset_image_cache(QXLWorker *qxl_worker)
{
RedDispatcher *dispatcher = (RedDispatcher *)qxl_worker;
- RedWorkeMessage message = RED_WORKER_MESSAGE_ADD_MEMSLOT;
+ RedWorkeMessage message = RED_WORKER_MESSAGE_RESET_IMAGE_CACHE;
write_message(dispatcher->channel, &message);
- send_data(dispatcher->channel, mem_slot, sizeof(QXLDevMemSlot));
read_message(dispatcher->channel, &message);
ASSERT(message == RED_WORKER_MESSAGE_READY);
}
-static void qxl_worker_del_memslot(QXLWorker *qxl_worker, uint32_t slot_id)
+static void qxl_worker_reset_cursor(QXLWorker *qxl_worker)
{
RedDispatcher *dispatcher = (RedDispatcher *)qxl_worker;
- RedWorkeMessage message = RED_WORKER_MESSAGE_DEL_MEMSLOT;
+ RedWorkeMessage message = RED_WORKER_MESSAGE_RESET_CURSOR;
write_message(dispatcher->channel, &message);
- send_data(dispatcher->channel, &slot_id, sizeof(uint32_t));
+ read_message(dispatcher->channel, &message);
+ ASSERT(message == RED_WORKER_MESSAGE_READY);
+}
+
+static void qxl_worker_destroy_surface_wait(QXLWorker *qxl_worker, uint32_t surface_id)
+{
+ RedDispatcher *dispatcher = (RedDispatcher *)qxl_worker;
+ RedWorkeMessage message = RED_WORKER_MESSAGE_DESTROY_SURFACE_WAIT;
+
+ write_message(dispatcher->channel, &message);
+ send_data(dispatcher->channel, &surface_id, sizeof(uint32_t));
+ read_message(dispatcher->channel, &message);
+ ASSERT(message == RED_WORKER_MESSAGE_READY);
}
static void qxl_worker_reset_memslots(QXLWorker *qxl_worker)
@@ -404,12 +446,12 @@ int red_dispatcher_count()
uint32_t red_dispatcher_qxl_ram_size()
{
- QXLDevInfo qxl_info;
+ QXLDevInitInfo qxl_info;
if (!dispatchers) {
return 0;
}
- dispatchers->qxl_interface->get_info(dispatchers->qxl_interface, &qxl_info);
- return qxl_info.ram_size;
+ dispatchers->qxl_interface->get_init_info(dispatchers->qxl_interface, &qxl_info);
+ return qxl_info.qxl_ram_size;
}
RedDispatcher *red_dispatcher_init(QXLInterface *qxl_interface)
@@ -457,8 +499,6 @@ RedDispatcher *red_dispatcher_init(QXLInterface *qxl_interface)
dispatcher->base.major_version = VD_INTERFACE_QXL_MAJOR;
dispatcher->base.major_version = VD_INTERFACE_QXL_MINOR;
- dispatcher->base.attach = qxl_worker_attach;
- dispatcher->base.detach = qxl_worker_detach;
dispatcher->base.wakeup = qxl_worker_wakeup;
dispatcher->base.oom = qxl_worker_oom;
dispatcher->base.save = qxl_worker_save;
@@ -469,12 +509,23 @@ RedDispatcher *red_dispatcher_init(QXLInterface *qxl_interface)
dispatcher->base.add_memslot = qxl_worker_add_memslot;
dispatcher->base.del_memslot = qxl_worker_del_memslot;
dispatcher->base.reset_memslots = qxl_worker_reset_memslots;
+ dispatcher->base.destroy_surfaces = qxl_worker_destroy_surfaces;
+ dispatcher->base.create_primary_surface = qxl_worker_create_primary;
+ dispatcher->base.destroy_primary_surface = qxl_worker_destroy_primary;
+
+ dispatcher->base.reset_image_cache = qxl_worker_reset_image_cache;
+ dispatcher->base.reset_cursor = qxl_worker_reset_cursor;
+ dispatcher->base.destroy_surface_wait = qxl_worker_destroy_surface_wait;
qxl_interface->get_init_info(qxl_interface, &init_info);
init_data.memslot_id_bits = init_info.memslot_id_bits;
init_data.memslot_gen_bits = init_info.memslot_gen_bits;
init_data.num_memslots = init_info.num_memslots;
+ init_data.num_memslots_groups = init_info.num_memslots_groups;
+ init_data.internal_groupslot_id = init_info.internal_groupslot_id;
+
+ num_active_workers = 1;
sigfillset(&thread_sig_mask);
sigdelset(&thread_sig_mask, SIGILL);