diff options
author | Frediano Ziglio <freddy77@gmail.com> | 2021-05-31 21:34:26 +0100 |
---|---|---|
committer | Frediano Ziglio <freddy77@gmail.com> | 2023-11-22 07:39:19 +0000 |
commit | 85793bc60420bce4b7139f88a2fe7a3df46b2c0e (patch) | |
tree | 46aa6e8dcddd2bd3f797c93d93c1867e2c423083 | |
parent | 9f5055a995eb737ed64205d569279897c5ed6473 (diff) |
Another Ring
-rw-r--r-- | server/dcc-send.cpp | 6 | ||||
-rw-r--r-- | server/display-channel-private.h | 2 | ||||
-rw-r--r-- | server/display-channel.cpp | 45 | ||||
-rw-r--r-- | server/display-channel.h | 8 |
4 files changed, 27 insertions, 34 deletions
diff --git a/server/dcc-send.cpp b/server/dcc-send.cpp index 2c40a231..069a0b04 100644 --- a/server/dcc-send.cpp +++ b/server/dcc-send.cpp @@ -627,7 +627,7 @@ static bool pipe_rendered_drawables_intersect_with_areas(DisplayChannelClient *d continue; drawable = static_cast<RedDrawablePipeItem*>(pipe_item.get())->drawable; - if (ring_item_is_linked(&drawable->list_link)) + if (DisplayDrawableRing::is_linked(drawable)) continue; // item hasn't been rendered if (drawable_intersects_with_areas(drawable, surfaces, surface_areas, num_surfaces)) { @@ -713,7 +713,7 @@ static void red_pipe_replace_rendered_drawables_with_images(DisplayChannelClient continue; auto dpi = static_cast<RedDrawablePipeItem*>(pipe_item); auto drawable = dpi->drawable; - if (ring_item_is_linked(&drawable->list_link)) + if (DisplayDrawableRing::is_linked(drawable)) continue; // item hasn't been rendered // When a drawable command, X, depends on bitmaps that were resent, @@ -748,7 +748,7 @@ static void red_add_lossless_drawable_dependencies(DisplayChannelClient *dcc, int sync_rendered = FALSE; int i; - if (!ring_item_is_linked(&item->list_link)) { + if (!DisplayDrawableRing::is_linked(item)) { /* drawable was already rendered, we may not be able to retrieve the lossless data for the lossy areas */ sync_rendered = TRUE; diff --git a/server/display-channel-private.h b/server/display-channel-private.h index e13bdf87..718d7fc0 100644 --- a/server/display-channel-private.h +++ b/server/display-channel-private.h @@ -104,7 +104,7 @@ struct DisplayChannelPrivate * surface they're associated with. This list is mainly used to flush older * drawables when we need to make room for new drawables. The ring is * maintained in order of age, the tail being the oldest drawable */ - Ring current_list; + DisplayDrawableRing current_list; uint32_t drawable_count; std::array<_Drawable, NUM_DRAWABLES> drawables; diff --git a/server/display-channel.cpp b/server/display-channel.cpp index b19709e5..6e857732 100644 --- a/server/display-channel.cpp +++ b/server/display-channel.cpp @@ -345,7 +345,7 @@ static void current_add_drawable(DisplayChannel *display, surface = drawable->surface; ring_add_after(&drawable->tree_item.base.siblings_link, pos); - ring_add(&display->priv->current_list, &drawable->list_link); + display->priv->current_list.push_front(drawable); ring_add(&surface->current_list, &drawable->surface_list_link); drawable->refs++; } @@ -358,7 +358,6 @@ static void current_remove_drawable(DisplayChannel *display, Drawable *item) video_stream_trace_add_drawable(display, item); draw_item_remove_shadow(&item->tree_item); ring_remove(&item->tree_item.base.siblings_link); - ring_remove(&item->list_link); ring_remove(&item->surface_list_link); drawable_unref(item); } @@ -1437,22 +1436,19 @@ void display_channel_free_glz_drawables(DisplayChannel *display) static bool free_one_drawable(DisplayChannel *display, int force_glz_free) { - RingItem *ring_item = ring_get_tail(&display->priv->current_list); - Drawable *drawable; - Container *container; - - if (!ring_item) { - return FALSE; + if (display->priv->current_list.empty()) { + return false; } - drawable = SPICE_CONTAINEROF(ring_item, Drawable, list_link); + auto it = display->priv->current_list.end(); + auto &drawable = *--it; if (force_glz_free) { - glz_retention_free_drawables(&drawable->glz_retention); + glz_retention_free_drawables(&drawable.glz_retention); } - drawable_draw(display, drawable); - container = drawable->tree_item.base.container; + drawable_draw(display, &drawable); + auto container = drawable.tree_item.base.container; - current_remove_drawable(display, drawable); + current_remove_drawable(display, &drawable); container_cleanup(container); return TRUE; } @@ -1482,7 +1478,7 @@ void display_channel_free_some(DisplayChannel *display) } } - while (!ring_is_empty(&display->priv->current_list) && n++ < RED_RELEASE_BUNCH_SIZE) { + while (!display->priv->current_list.empty() && n++ < RED_RELEASE_BUNCH_SIZE) { free_one_drawable(display, TRUE); } @@ -1547,7 +1543,6 @@ static Drawable *display_channel_drawable_try_new(DisplayChannel *display, drawable->display = display; drawable->refs = 1; drawable->creation_time = drawable->first_frame_time = spice_get_monotonic_time_ns(); - ring_item_init(&drawable->list_link); ring_item_init(&drawable->surface_list_link); ring_item_init(&drawable->tree_item.base.siblings_link); drawable->tree_item.base.type = TREE_ITEM_TYPE_DRAWABLE; @@ -1845,21 +1840,18 @@ void display_channel_draw_until(DisplayChannel *display, const SpiceRect *area, Drawable *last) { Drawable *surface_last = nullptr; - Ring *ring; RingItem *ring_item; - Drawable *now; spice_return_if_fail(last); - spice_return_if_fail(ring_item_is_linked(&last->list_link)); + spice_return_if_fail(DisplayDrawableRing::is_linked(last)); if (surface != last->surface) { // find the nearest older drawable from the appropriate surface - ring = &display->priv->current_list; - ring_item = &last->list_link; - while ((ring_item = ring_next(ring, ring_item))) { - now = SPICE_CONTAINEROF(ring_item, Drawable, list_link); - if (now->surface == surface) { - surface_last = now; + auto it = DisplayDrawableRing::iterator(last); + const auto end = display->priv->current_list.end(); + while (++it != end) { + if (it->surface == surface) { + surface_last = &*it; break; } } @@ -2185,7 +2177,6 @@ DisplayChannel::DisplayChannel(RedsState *reds, image_encoder_shared_init(&priv->encoder_shared_data); - ring_init(&priv->current_list); drawables_init(this); priv->image_surfaces.ops = &image_surfaces_ops; @@ -2393,11 +2384,11 @@ void display_channel_reset_image_cache(DisplayChannel *self) void display_channel_debug_oom(DisplayChannel *display, const char *msg) { - spice_debug("%s #draw=%u, #glz_draw=%u current %u pipes %u", + spice_debug("%s #draw=%u, #glz_draw=%u current %zu pipes %u", msg, display->priv->drawable_count, display->priv->encoder_shared_data.glz_drawable_count, - ring_get_length(&display->priv->current_list), + display->priv->current_list.size(), display->sum_pipes_size()); } diff --git a/server/display-channel.h b/server/display-channel.h index 7bf29850..583f585f 100644 --- a/server/display-channel.h +++ b/server/display-channel.h @@ -62,10 +62,11 @@ struct DependItem final: }; using DependItemRing = red::Ring<DependItem,0>; -struct Drawable { +struct Drawable final: + public red::RingItem<Drawable,0> +{ uint32_t refs; - RingItem surface_list_link; - RingItem list_link; + ::RingItem surface_list_link; DrawItem tree_item; GList *pipes; red::shared_ptr<RedDrawable> red_drawable; @@ -90,6 +91,7 @@ struct Drawable { uint32_t process_commands_generation; DisplayChannel *display; }; +using DisplayDrawableRing = red::Ring<Drawable,0>; red::shared_ptr<DisplayChannel> display_channel_new(RedsState *reds, QXLInstance *qxl, |