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@xxxxxxxxxx> _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/spice-devel