[Spice-devel] [spice-server 6/8] Add more red_qxl_ methods
Christophe Fergeau
cfergeau at redhat.com
Mon Mar 14 17:10:32 UTC 2016
Add red_qxl_ methods wrapping the QXLInterface vfuncs. This allows to
remove most of the qxl_get_interface() use outside of red-qxl.c
---
server/cursor-channel.c | 2 +-
server/display-channel.c | 4 +--
server/red-qxl.c | 78 +++++++++++++++++++++++++++++++++++++++++++++++-
server/red-qxl.h | 17 +++++++++++
server/red-worker.c | 31 ++++++++++---------
5 files changed, 112 insertions(+), 20 deletions(-)
diff --git a/server/cursor-channel.c b/server/cursor-channel.c
index a904cff..7d5ac6a 100644
--- a/server/cursor-channel.c
+++ b/server/cursor-channel.c
@@ -116,7 +116,7 @@ static void cursor_item_unref(CursorItem *item)
return;
cursor_cmd = item->red_cursor;
- qxl_get_interface(item->qxl)->release_resource(item->qxl, cursor_cmd->release_info_ext);
+ red_qxl_release_resource(item->qxl, cursor_cmd->release_info_ext);
red_put_cursor_cmd(cursor_cmd);
free(cursor_cmd);
diff --git a/server/display-channel.c b/server/display-channel.c
index f5f3527..3f61926 100644
--- a/server/display-channel.c
+++ b/server/display-channel.c
@@ -268,10 +268,10 @@ void display_channel_surface_unref(DisplayChannel *display, uint32_t surface_id)
surface->context.canvas->ops->destroy(surface->context.canvas);
if (surface->create.info) {
- qxl_get_interface(qxl)->release_resource(qxl, surface->create);
+ red_qxl_release_resource(qxl, surface->create);
}
if (surface->destroy.info) {
- qxl_get_interface(qxl)->release_resource(qxl, surface->destroy);
+ red_qxl_release_resource(qxl, surface->destroy);
}
region_destroy(&surface->draw_dirty_region);
diff --git a/server/red-qxl.c b/server/red-qxl.c
index 1550ec8..0f608db 100644
--- a/server/red-qxl.c
+++ b/server/red-qxl.c
@@ -664,7 +664,9 @@ void red_qxl_set_compression_level(QXLInstance *qxl, int level)
uint32_t red_qxl_get_ram_size(QXLInstance *qxl)
{
QXLDevInitInfo qxl_info;
- qxl_get_interface(qxl)->get_init_info(qxl, &qxl_info);
+
+ red_qxl_get_init_info(qxl, &qxl_info);
+
return qxl_info.qxl_ram_size;
}
@@ -1062,3 +1064,77 @@ RedsState* red_qxl_get_server(QXLState *qxl_state)
{
return qxl_state->reds;
}
+
+void red_qxl_get_init_info(QXLInstance *qxl, QXLDevInitInfo *info)
+{
+ QXLInterface *interface = qxl_get_interface(qxl);
+
+ interface->get_init_info(qxl, info);
+}
+
+int red_qxl_get_command(QXLInstance *qxl, struct QXLCommandExt *cmd)
+{
+ QXLInterface *interface = qxl_get_interface(qxl);
+
+ return interface->get_command(qxl, cmd);
+}
+
+int red_qxl_req_cmd_notification(QXLInstance *qxl)
+{
+ QXLInterface *interface = qxl_get_interface(qxl);
+
+ return interface->req_cmd_notification(qxl);
+}
+
+void red_qxl_release_resource(QXLInstance *qxl, struct QXLReleaseInfoExt release_info)
+{
+ QXLInterface *interface = qxl_get_interface(qxl);
+
+ interface->release_resource(qxl, release_info);
+}
+
+int red_qxl_get_cursor_command(QXLInstance *qxl, struct QXLCommandExt *cmd)
+{
+ QXLInterface *interface = qxl_get_interface(qxl);
+
+ return interface->get_cursor_command(qxl, cmd);
+}
+
+int red_qxl_req_cursor_notification(QXLInstance *qxl)
+{
+ QXLInterface *interface = qxl_get_interface(qxl);
+
+ return interface->req_cursor_notification(qxl);
+}
+
+void red_qxl_notify_update(QXLInstance *qxl, uint32_t update_id)
+{
+ QXLInterface *interface = qxl_get_interface(qxl);
+
+ interface->notify_update(qxl, update_id);
+}
+
+int red_qxl_flush_resources(QXLInstance *qxl)
+{
+ QXLInterface *interface = qxl_get_interface(qxl);
+
+ return interface->flush_resources(qxl);
+}
+
+void red_qxl_update_area_complete(QXLInstance *qxl, uint32_t surface_id,
+ struct QXLRect *updated_rects,
+ uint32_t num_updated_rects)
+{
+ QXLInterface *interface = qxl_get_interface(qxl);
+
+ interface->update_area_complete(qxl, surface_id, updated_rects, num_updated_rects);
+}
+
+void red_qxl_set_client_capabilities(QXLInstance *qxl,
+ uint8_t client_present,
+ uint8_t caps[SPICE_CAPABILITIES_SIZE])
+{
+ QXLInterface *interface = qxl_get_interface(qxl);
+
+ interface->set_client_capabilities(qxl, client_present, caps);
+}
diff --git a/server/red-qxl.h b/server/red-qxl.h
index 7e158c2..f58d42b 100644
--- a/server/red-qxl.h
+++ b/server/red-qxl.h
@@ -46,6 +46,23 @@ void red_qxl_put_gl_scanout(QXLInstance *qxl, SpiceMsgDisplayGlScanoutUnix *scan
void red_qxl_gl_draw_async_complete(QXLInstance *qxl);
SpiceServer* red_qxl_get_server(QXLState *qxl);
+/* Wrappers around QXLInterface vfuncs */
+void red_qxl_get_init_info(QXLInstance *qxl, QXLDevInitInfo *info);;
+int red_qxl_get_command(QXLInstance *qxl, struct QXLCommandExt *cmd);
+int red_qxl_req_cmd_notification(QXLInstance *qxl);
+void red_qxl_release_resource(QXLInstance *qxl, struct QXLReleaseInfoExt release_info);
+int red_qxl_get_cursor_command(QXLInstance *qxl, struct QXLCommandExt *cmd);
+int red_qxl_req_cursor_notification(QXLInstance *qxl);
+void red_qxl_notify_update(QXLInstance *qxl, uint32_t update_id);
+int red_qxl_flush_resources(QXLInstance *qxl);
+void red_qxl_async_complete(QXLInstance *qxl, AsyncCommand *cmd);
+void red_qxl_update_area_complete(QXLInstance *qxl, uint32_t surface_id,
+ struct QXLRect *updated_rects,
+ uint32_t num_updated_rects);
+void red_qxl_set_client_capabilities(QXLInstance *qxl,
+ uint8_t client_present,
+ uint8_t caps[SPICE_CAPABILITIES_SIZE]);
+
typedef uint32_t RedWorkerMessage;
/* Keep message order, only append new messages!
diff --git a/server/red-worker.c b/server/red-worker.c
index 2eb4fee..3a82aa4 100644
--- a/server/red-worker.c
+++ b/server/red-worker.c
@@ -128,8 +128,7 @@ void red_drawable_unref(RedDrawable *red_drawable)
if (--red_drawable->refs) {
return;
}
- qxl_get_interface(red_drawable->qxl)->release_resource(red_drawable->qxl,
- red_drawable->release_info_ext);
+ red_qxl_release_resource(red_drawable->qxl, red_drawable->release_info_ext);
red_put_drawable(red_drawable);
free(red_drawable);
}
@@ -146,12 +145,12 @@ static int red_process_cursor(RedWorker *worker, int *ring_is_empty)
*ring_is_empty = FALSE;
while (red_channel_max_pipe_size(RED_CHANNEL(worker->cursor_channel)) <= MAX_PIPE_SIZE) {
- if (!qxl_get_interface(worker->qxl)->get_cursor_command(worker->qxl, &ext_cmd)) {
+ if (!red_qxl_get_cursor_command(worker->qxl, &ext_cmd)) {
*ring_is_empty = TRUE;
if (worker->cursor_poll_tries < CMD_RING_POLL_RETRIES) {
worker->event_timeout = MIN(worker->event_timeout, CMD_RING_POLL_TIMEOUT);
} else if (worker->cursor_poll_tries == CMD_RING_POLL_RETRIES &&
- !qxl_get_interface(worker->qxl)->req_cursor_notification(worker->qxl)) {
+ !red_qxl_req_cursor_notification(worker->qxl)) {
continue;
}
worker->cursor_poll_tries++;
@@ -204,12 +203,12 @@ static int red_process_display(RedWorker *worker, int *ring_is_empty)
worker->process_display_generation++;
*ring_is_empty = FALSE;
while (red_channel_max_pipe_size(RED_CHANNEL(worker->display_channel)) <= MAX_PIPE_SIZE) {
- if (!qxl_get_interface(worker->qxl)->get_command(worker->qxl, &ext_cmd)) {
+ if (!red_qxl_get_command(worker->qxl, &ext_cmd)) {
*ring_is_empty = TRUE;
if (worker->display_poll_tries < CMD_RING_POLL_RETRIES) {
worker->event_timeout = MIN(worker->event_timeout, CMD_RING_POLL_TIMEOUT);
} else if (worker->display_poll_tries == CMD_RING_POLL_RETRIES &&
- !qxl_get_interface(worker->qxl)->req_cmd_notification(worker->qxl)) {
+ !red_qxl_req_cmd_notification(worker->qxl)) {
continue;
}
worker->display_poll_tries++;
@@ -246,9 +245,9 @@ static int red_process_display(RedWorker *worker, int *ring_is_empty)
spice_warning("Invalid surface in QXL_CMD_UPDATE");
} else {
display_channel_draw(worker->display_channel, &update.area, update.surface_id);
- qxl_get_interface(worker->qxl)->notify_update(worker->qxl, update.update_id);
+ red_qxl_notify_update(worker->qxl, update.update_id);
}
- qxl_get_interface(worker->qxl)->release_resource(worker->qxl, update.release_info_ext);
+ red_qxl_release_resource(worker->qxl, update.release_info_ext);
red_put_update_cmd(&update);
break;
}
@@ -263,7 +262,7 @@ static int red_process_display(RedWorker *worker, int *ring_is_empty)
/* alert: accessing message.data is insecure */
spice_warning("MESSAGE: %s", message.data);
#endif
- qxl_get_interface(worker->qxl)->release_resource(worker->qxl, message.release_info_ext);
+ red_qxl_release_resource(worker->qxl, message.release_info_ext);
red_put_message(&message);
break;
}
@@ -528,7 +527,7 @@ static void guest_set_client_capabilities(RedWorker *worker)
}
if ((worker->display_channel == NULL) ||
(RED_CHANNEL(worker->display_channel)->clients_num == 0)) {
- qif->set_client_capabilities(worker->qxl, FALSE, caps);
+ red_qxl_set_client_capabilities(worker->qxl, FALSE, caps);
} else {
// Take least common denominator
for (i = 0 ; i < sizeof(caps_available) / sizeof(caps_available[0]); ++i) {
@@ -541,7 +540,7 @@ static void guest_set_client_capabilities(RedWorker *worker)
CLEAR_CAP(caps, caps_available[i]);
}
}
- qif->set_client_capabilities(worker->qxl, TRUE, caps);
+ red_qxl_set_client_capabilities(worker->qxl, TRUE, caps);
}
}
@@ -587,8 +586,8 @@ static void handle_dev_update_async(void *opaque, void *payload)
msg->surface_id, &msg->qxl_area, msg->clear_dirty_region,
&qxl_dirty_rects, &num_dirty_rects);
- qxl_get_interface(worker->qxl)->update_area_complete(worker->qxl, msg->surface_id,
- qxl_dirty_rects, num_dirty_rects);
+ red_qxl_update_area_complete(worker->qxl, msg->surface_id,
+ qxl_dirty_rects, num_dirty_rects);
free(qxl_dirty_rects);
}
@@ -847,9 +846,9 @@ static void handle_dev_oom(void *opaque, void *payload)
while (red_process_display(worker, &ring_is_empty)) {
red_channel_push(display_red_channel);
}
- if (qxl_get_interface(worker->qxl)->flush_resources(worker->qxl) == 0) {
+ if (red_qxl_flush_resources(worker->qxl) == 0) {
display_channel_free_some(worker->display_channel);
- qxl_get_interface(worker->qxl)->flush_resources(worker->qxl);
+ red_qxl_flush_resources(worker->qxl);
}
spice_debug("OOM2 #draw=%u, #glz_draw=%u current %u pipes %u",
display->drawable_count,
@@ -1473,7 +1472,7 @@ RedWorker* red_worker_new(QXLInstance *qxl)
const char *record_filename;
RedsState *reds = red_qxl_get_server(qxl->st);
- qxl_get_interface(qxl)->get_init_info(qxl, &init_info);
+ red_qxl_get_init_info(qxl, &init_info);
worker = spice_new0(RedWorker, 1);
worker->core = event_loop_core;
--
2.5.0
More information about the Spice-devel
mailing list