Pass surface directly to display_channel_surface_unref

Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
Acked-by: Victor Toso <victortoso@redhat.com>
This commit is contained in:
Frediano Ziglio 2016-09-27 22:27:16 +01:00 committed by Frediano Ziglio
parent 977e72eb48
commit f418bbb522
3 changed files with 16 additions and 12 deletions

View File

@ -225,9 +225,8 @@ static void stop_streams(DisplayChannel *display)
memset(display->priv->items_trace, 0, sizeof(display->priv->items_trace));
}
void display_channel_surface_unref(DisplayChannel *display, uint32_t surface_id)
static void display_channel_surface_unref(DisplayChannel *display, RedSurface *surface)
{
RedSurface *surface = &display->priv->surfaces[surface_id];
DisplayChannelClient *dcc;
if (--surface->refs != 0) {
@ -235,7 +234,7 @@ void display_channel_surface_unref(DisplayChannel *display, uint32_t surface_id)
}
// only primary surface streams are supported
if (is_primary_surface(display, surface_id)) {
if (is_primary_surface(display, surface->id)) {
stop_streams(display);
}
spice_assert(surface->context.canvas);
@ -247,7 +246,7 @@ void display_channel_surface_unref(DisplayChannel *display, uint32_t surface_id)
region_destroy(&surface->draw_dirty_region);
surface->context.canvas = nullptr;
FOREACH_DCC(display, dcc) {
dcc_destroy_surface(dcc, surface_id);
dcc_destroy_surface(dcc, surface->id);
}
spice_warn_if_fail(ring_is_empty(&surface->depend_on_me));
@ -260,6 +259,11 @@ gboolean display_channel_surface_has_canvas(DisplayChannel *display,
return display->priv->surfaces[surface_id].context.canvas != nullptr;
}
void display_channel_surface_id_unref(DisplayChannel *display, uint32_t surface_id)
{
display_channel_surface_unref(display, &display->priv->surfaces[surface_id]);
}
static void streams_update_visible_region(DisplayChannel *display, Drawable *drawable)
{
Ring *ring;
@ -1601,7 +1605,7 @@ static void drawable_unref_surface_deps(DisplayChannel *display, Drawable *drawa
if (surface == nullptr) {
continue;
}
display_channel_surface_unref(display, surface->id);
display_channel_surface_unref(display, surface);
}
}
@ -1622,7 +1626,7 @@ void drawable_unref(Drawable *drawable)
drawable_remove_dependencies(drawable);
drawable_unref_surface_deps(display, drawable);
display_channel_surface_unref(display, drawable->surface->id);
display_channel_surface_unref(display, drawable->surface);
glz_retention_detach_drawables(&drawable->glz_retention);
@ -1980,13 +1984,14 @@ static void clear_surface_drawables_from_pipes(DisplayChannel *display, int surf
/* TODO: cleanup/refactor destroy functions */
static void display_channel_destroy_surface(DisplayChannel *display, uint32_t surface_id)
{
RedSurface *surface = &display->priv->surfaces[surface_id];
draw_depend_on_me(display, surface_id);
/* note that draw_depend_on_me must be called before current_remove_all.
otherwise "current" will hold items that other drawables may depend on, and then
current_remove_all will remove them from the pipe. */
current_remove_all(display, &display->priv->surfaces[surface_id]);
current_remove_all(display, surface);
clear_surface_drawables_from_pipes(display, surface_id, FALSE);
display_channel_surface_unref(display, surface_id);
display_channel_surface_unref(display, surface);
}
void display_channel_destroy_surface_wait(DisplayChannel *display, uint32_t surface_id)
@ -2016,7 +2021,7 @@ void display_channel_destroy_surfaces(DisplayChannel *display)
if (display->priv->surfaces[i].context.canvas) {
display_channel_destroy_surface_wait(display, i);
if (display->priv->surfaces[i].context.canvas) {
display_channel_surface_unref(display, i);
display_channel_surface_unref(display, &display->priv->surfaces[i]);
}
spice_assert(!display->priv->surfaces[i].context.canvas);
}

View File

@ -94,6 +94,7 @@ display_channel_new(RedsState *reds, QXLInstance *qxl,
int migrate, int stream_video,
GArray *video_codecs,
uint32_t n_surfaces);
void display_channel_surface_id_unref(DisplayChannel *display, uint32_t surface_id);
void display_channel_create_surface (DisplayChannel *display, uint32_t surface_id,
uint32_t width, uint32_t height,
int32_t stride, uint32_t format, void *line_0,
@ -115,8 +116,6 @@ void display_channel_set_video_codecs (DisplayCha
int display_channel_get_streams_timeout (DisplayChannel *display);
void display_channel_compress_stats_print (DisplayChannel *display);
void display_channel_compress_stats_reset (DisplayChannel *display);
void display_channel_surface_unref (DisplayChannel *display,
uint32_t surface_id);
bool display_channel_wait_for_migrate_data (DisplayChannel *display);
void display_channel_flush_all_surfaces (DisplayChannel *display);
void display_channel_free_glz_drawables_to_free(DisplayChannel *display);

View File

@ -448,7 +448,7 @@ static void destroy_primary_surface(RedWorker *worker, uint32_t surface_id)
flush_all_qxl_commands(worker);
display_channel_destroy_surface_wait(display, 0);
display_channel_surface_unref(display, 0);
display_channel_surface_id_unref(display, 0);
/* FIXME: accessing private data only for warning purposes...
spice_warn_if_fail(ring_is_empty(&display->streams));