[Spice-devel] [spice-server 6/8] Add more red_qxl_ methods
Jonathon Jongsma
jjongsma at redhat.com
Thu Mar 17 18:37:57 UTC 2016
On Mon, 2016-03-14 at 18:10 +0100, Christophe Fergeau wrote:
> 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;
I like it.
Acked-by: Jonathon Jongsma <jjongsma at redhat.com>
More information about the Spice-devel
mailing list