[Spice-devel] [PATCH 16/18] worker: move drawable_draw
Frediano Ziglio
fziglio at redhat.com
Mon Nov 23 05:23:30 PST 2015
Reduced diff
--- before.c 2015-11-23 13:20:37.534895725 +0000
+++ after.c 2015-11-23 13:12:44.527503563 +0000
@@ -1034,53 +1034,53 @@
drawable->tree_item.base.type = TREE_ITEM_TYPE_DRAWABLE;
region_init(&drawable->tree_item.base.rgn);
ring_init(&drawable->pipes);
ring_init(&drawable->glz_ring);
drawable->process_commands_generation = process_commands_generation;
drawable->group_id = group_id;
return drawable;
}
-static void remove_depended_item(DependItem *item)
+static void depended_item_remove(DependItem *item)
{
- spice_assert(item->drawable);
- spice_assert(ring_item_is_linked(&item->ring_item));
+ spice_return_if_fail(item->drawable);
+ spice_return_if_fail(ring_item_is_linked(&item->ring_item));
item->drawable = NULL;
ring_remove(&item->ring_item);
}
-static void drawable_unref_surface_deps(DisplayChannel *display, Drawable *drawable)
+static void drawable_remove_dependencies(DisplayChannel *display, Drawable *drawable)
{
int x;
int surface_id;
for (x = 0; x < 3; ++x) {
surface_id = drawable->surface_deps[x];
- if (surface_id == -1) {
- continue;
+ if (surface_id != -1 && drawable->depend_items[x].drawable) {
+ depended_item_remove(&drawable->depend_items[x]);
}
- display_channel_surface_unref(display, surface_id);
}
}
-static void drawable_remove_dependencies(DisplayChannel *display, Drawable *drawable)
+static void drawable_unref_surface_deps(DisplayChannel *display, Drawable *drawable)
{
int x;
int surface_id;
for (x = 0; x < 3; ++x) {
surface_id = drawable->surface_deps[x];
- if (surface_id != -1 && drawable->depend_items[x].drawable) {
- remove_depended_item(&drawable->depend_items[x]);
+ if (surface_id == -1) {
+ continue;
}
+ display_channel_surface_unref(display, surface_id);
}
}
void display_channel_drawable_unref(DisplayChannel *display, Drawable *drawable)
{
RingItem *item, *next;
if (--drawable->refs != 0)
return;
@@ -1093,51 +1093,48 @@
region_destroy(&drawable->tree_item.base.rgn);
drawable_remove_dependencies(display, drawable);
drawable_unref_surface_deps(display, drawable);
display_channel_surface_unref(display, drawable->surface_id);
RING_FOREACH_SAFE(item, next, &drawable->glz_ring) {
SPICE_CONTAINEROF(item, RedGlzDrawable, drawable_link)->drawable = NULL;
ring_remove(item);
}
+ if (drawable->red_drawable) {
red_drawable_unref(COMMON_CHANNEL(display)->worker, drawable->red_drawable, drawable->group_id);
+ }
drawable_free(display, drawable);
display->drawable_count--;
}
-static void surface_flush(DisplayChannel *display, int surface_id, SpiceRect *rect)
-{
- red_update_area(display, rect, surface_id);
-}
-
-static void red_flush_source_surfaces(DisplayChannel *display, Drawable *drawable)
+static void drawable_deps_update(DisplayChannel *display, Drawable *drawable)
{
int x;
int surface_id;
for (x = 0; x < 3; ++x) {
surface_id = drawable->surface_deps[x];
if (surface_id != -1 && drawable->depend_items[x].drawable) {
- remove_depended_item(&drawable->depend_items[x]);
- surface_flush(display, surface_id, &drawable->red_drawable->surfaces_rects[x]);
+ depended_item_remove(&drawable->depend_items[x]);
+ red_update_area(display, &drawable->red_drawable->surfaces_rects[x], surface_id);
}
}
}
void drawable_draw(DisplayChannel *display, Drawable *drawable)
{
RedSurface *surface;
SpiceCanvas *canvas;
SpiceClip clip = drawable->red_drawable->clip;
- red_flush_source_surfaces(display, drawable);
+ drawable_deps_update(display, drawable);
surface = &display->surfaces[drawable->surface_id];
canvas = surface->context.canvas;
spice_return_if_fail(canvas);
image_cache_aging(&display->image_cache);
region_add(&surface->draw_dirty_region, &drawable->red_drawable->bbox);
switch (drawable->red_drawable->type) {
@@ -1653,20 +1650,24 @@
region_add(rgn, data->rects + i);
}
}
void current_remove_drawable(DisplayChannel *display, Drawable *item);
void red_pipes_remove_drawable(Drawable *drawable);
void current_remove(DisplayChannel *display, TreeItem *item);
void detach_streams_behind(DisplayChannel *display, QRegion *region, Drawable *drawable);
void drawable_draw(DisplayChannel *display, Drawable *item);
void current_remove_all(DisplayChannel *display, int surface_id);
+void drawables_init(DisplayChannel *display);
+void red_update_area(DisplayChannel *display, const SpiceRect *area, int surface_id);
+void red_update_area_till(DisplayChannel *display, const SpiceRect *area, int surface_id,
+ Drawable *last);
#endif /* DISPLAY_CHANNEL_H_ */
/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
/*
Copyright (C) 2009 Red Hat, Inc.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
@@ -1794,23 +1795,20 @@
} BitmapDataType;
typedef struct BitmapData {
BitmapDataType type;
uint64_t id; // surface id or cache item id
SpiceRect lossy_rect;
} BitmapData;
static inline int validate_surface(DisplayChannel *display, uint32_t surface_id);
-static void red_update_area(DisplayChannel *display, const SpiceRect *area, int surface_id);
-static void red_update_area_till(DisplayChannel *display, const SpiceRect *area, int surface_id,
- Drawable *last);
static inline void display_begin_send_message(RedChannelClient *rcc);
static void red_create_surface(DisplayChannel *display, uint32_t surface_id, uint32_t width,
uint32_t height, int32_t stride, uint32_t format,
void *line_0, int data_is_valid, int send_client);
QXLInstance* red_worker_get_qxl(RedWorker *worker)
{
spice_return_val_if_fail(worker != NULL, NULL);
return worker->qxl;
@@ -2400,21 +2398,21 @@
{
RedSurface *surface;
RingItem *ring_item;
surface = &display->surfaces[surface_id];
while ((ring_item = ring_get_tail(&surface->depend_on_me))) {
Drawable *drawable;
DependItem *depended_item = SPICE_CONTAINEROF(ring_item, DependItem, ring_item);
drawable = depended_item->drawable;
- surface_flush(display, drawable->surface_id, &drawable->red_drawable->bbox);
+ red_update_area(display, &drawable->red_drawable->bbox, drawable->surface_id);
}
return TRUE;
}
static inline void add_to_surface_dependency(DisplayChannel *display, int depend_on_surface_id,
DependItem *depend_item, Drawable *drawable)
{
RedSurface *surface;
More information about the Spice-devel
mailing list