summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFrediano Ziglio <freddy77@gmail.com>2021-05-31 21:34:26 +0100
committerFrediano Ziglio <freddy77@gmail.com>2023-11-22 07:39:19 +0000
commit85793bc60420bce4b7139f88a2fe7a3df46b2c0e (patch)
tree46aa6e8dcddd2bd3f797c93d93c1867e2c423083
parent9f5055a995eb737ed64205d569279897c5ed6473 (diff)
Another Ring
-rw-r--r--server/dcc-send.cpp6
-rw-r--r--server/display-channel-private.h2
-rw-r--r--server/display-channel.cpp45
-rw-r--r--server/display-channel.h8
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,