display-channel.h contains lots of information used by different DisplayChannel components. In the past all RedWorker, CursorChannel and DisplayChannel code was in a single file. Lots of code to handle DisplayChannel is still in RedWorker and display-channel.h contains for this purpose. Moving declarations not needed by RedWorker and other external class components helps reducing dependencies between RedWorker and DisplayChannel. Signed-off-by: Frediano Ziglio <fziglio@xxxxxxxxxx> --- server/display-channel-private.h | 214 +++++++++++++++++++++++++++++++++++++++ server/display-channel.h | 214 --------------------------------------- 2 files changed, 214 insertions(+), 214 deletions(-) diff --git a/server/display-channel-private.h b/server/display-channel-private.h index da807d11..fb5d6158 100644 --- a/server/display-channel-private.h +++ b/server/display-channel-private.h @@ -20,6 +20,48 @@ #include "display-channel.h" +#define TRACE_ITEMS_SHIFT 3 +#define NUM_TRACE_ITEMS (1 << TRACE_ITEMS_SHIFT) +#define ITEMS_TRACE_MASK (NUM_TRACE_ITEMS - 1) + +typedef struct DrawContext { + SpiceCanvas *canvas; + int canvas_draws_on_surface; + int top_down; + uint32_t width; + uint32_t height; + int32_t stride; + uint32_t format; + void *line_0; +} DrawContext; + +typedef struct RedSurface { + uint32_t refs; + /* A Ring representing a hierarchical tree structure. This tree includes + * DrawItems, Containers, and Shadows. It is used to efficiently determine + * which drawables overlap, and to exclude regions of drawables that are + * obscured by other drawables */ + Ring current; + /* A ring of pending Drawables associated with this surface. This ring is + * actually used for drawing. The ring is maintained in order of age, the + * tail being the oldest drawable. */ + Ring current_list; + DrawContext context; + + Ring depend_on_me; + QRegion draw_dirty_region; + + //fix me - better handling here + QXLReleaseInfoExt create, destroy; +} RedSurface; + +typedef struct MonitorsConfig { + int refs; + int count; + int max_allowed; + QXLHead heads[0]; +} MonitorsConfig; + #define NUM_DRAWABLES 1000 typedef struct _Drawable _Drawable; struct _Drawable { @@ -83,4 +125,176 @@ struct DisplayChannelPrivate ImageEncoderSharedData encoder_shared_data; }; +#define FOREACH_DCC(_channel, _data) \ + GLIST_FOREACH((_channel ? red_channel_get_clients(RED_CHANNEL(_channel)) : NULL), \ + DisplayChannelClient, _data) + +typedef struct RedMonitorsConfigItem { + RedPipeItem pipe_item; + MonitorsConfig *monitors_config; +} RedMonitorsConfigItem; + +enum { + RED_PIPE_ITEM_TYPE_DRAW = RED_PIPE_ITEM_TYPE_COMMON_LAST, + RED_PIPE_ITEM_TYPE_IMAGE, + RED_PIPE_ITEM_TYPE_STREAM_CREATE, + RED_PIPE_ITEM_TYPE_STREAM_CLIP, + RED_PIPE_ITEM_TYPE_STREAM_DESTROY, + RED_PIPE_ITEM_TYPE_UPGRADE, + RED_PIPE_ITEM_TYPE_MIGRATE_DATA, + RED_PIPE_ITEM_TYPE_PIXMAP_SYNC, + RED_PIPE_ITEM_TYPE_PIXMAP_RESET, + RED_PIPE_ITEM_TYPE_INVAL_PALETTE_CACHE, + RED_PIPE_ITEM_TYPE_CREATE_SURFACE, + RED_PIPE_ITEM_TYPE_DESTROY_SURFACE, + RED_PIPE_ITEM_TYPE_MONITORS_CONFIG, + RED_PIPE_ITEM_TYPE_STREAM_ACTIVATE_REPORT, + RED_PIPE_ITEM_TYPE_GL_SCANOUT, + RED_PIPE_ITEM_TYPE_GL_DRAW, +}; + +void drawable_unref(Drawable *drawable); + +MonitorsConfig *monitors_config_ref(MonitorsConfig *config); +void monitors_config_unref(MonitorsConfig *config); + +void display_channel_draw_until(DisplayChannel *display, + const SpiceRect *area, + int surface_id, + Drawable *last); +GArray* display_channel_get_video_codecs(DisplayChannel *display); +int display_channel_get_stream_video(DisplayChannel *display); +void display_channel_current_flush(DisplayChannel *display, + int surface_id); +uint32_t display_channel_generate_uid(DisplayChannel *display); + +int display_channel_get_stream_id(DisplayChannel *display, Stream *stream); +Stream *display_channel_get_nth_stream(DisplayChannel *display, gint i); + +typedef struct RedSurfaceDestroyItem { + RedPipeItem pipe_item; + SpiceMsgSurfaceDestroy surface_destroy; +} RedSurfaceDestroyItem; + +typedef struct RedUpgradeItem { + RedPipeItem base; + Drawable *drawable; + SpiceClipRects *rects; +} RedUpgradeItem; + +static inline int is_equal_path(SpicePath *path1, SpicePath *path2) +{ + SpicePathSeg *seg1, *seg2; + int i, j; + + if (path1->num_segments != path2->num_segments) + return FALSE; + + for (i = 0; i < path1->num_segments; i++) { + seg1 = path1->segments[i]; + seg2 = path2->segments[i]; + + if (seg1->flags != seg2->flags || + seg1->count != seg2->count) { + return FALSE; + } + for (j = 0; j < seg1->count; j++) { + if (seg1->points[j].x != seg2->points[j].x || + seg1->points[j].y != seg2->points[j].y) { + return FALSE; + } + } + } + + return TRUE; +} + +// partial imp +static inline int is_equal_brush(SpiceBrush *b1, SpiceBrush *b2) +{ + return b1->type == b2->type && + b1->type == SPICE_BRUSH_TYPE_SOLID && + b1->u.color == b2->u.color; +} + +// partial imp +static inline int is_equal_line_attr(SpiceLineAttr *a1, SpiceLineAttr *a2) +{ + return a1->flags == a2->flags && + a1->style_nseg == a2->style_nseg && + a1->style_nseg == 0; +} + +// partial imp +static inline int is_same_geometry(Drawable *d1, Drawable *d2) +{ + if (d1->red_drawable->type != d2->red_drawable->type) { + return FALSE; + } + + switch (d1->red_drawable->type) { + case QXL_DRAW_STROKE: + return is_equal_line_attr(&d1->red_drawable->u.stroke.attr, + &d2->red_drawable->u.stroke.attr) && + is_equal_path(d1->red_drawable->u.stroke.path, + d2->red_drawable->u.stroke.path); + case QXL_DRAW_FILL: + return rect_is_equal(&d1->red_drawable->bbox, &d2->red_drawable->bbox); + default: + return FALSE; + } +} + +static inline int is_same_drawable(Drawable *d1, Drawable *d2) +{ + if (!is_same_geometry(d1, d2)) { + return FALSE; + } + + switch (d1->red_drawable->type) { + case QXL_DRAW_STROKE: + return is_equal_brush(&d1->red_drawable->u.stroke.brush, + &d2->red_drawable->u.stroke.brush); + case QXL_DRAW_FILL: + return is_equal_brush(&d1->red_drawable->u.fill.brush, + &d2->red_drawable->u.fill.brush); + default: + return FALSE; + } +} + +static inline int is_drawable_independent_from_surfaces(Drawable *drawable) +{ + int x; + + for (x = 0; x < 3; ++x) { + if (drawable->surface_deps[x] != -1) { + return FALSE; + } + } + return TRUE; +} + +static inline int has_shadow(RedDrawable *drawable) +{ + return drawable->type == QXL_COPY_BITS; +} + +static inline int is_primary_surface(DisplayChannel *display, uint32_t surface_id) +{ + if (surface_id == 0) { + return TRUE; + } + return FALSE; +} + +static inline void region_add_clip_rects(QRegion *rgn, SpiceClipRects *data) +{ + int i; + + for (i = 0; i < data->num_rects; i++) { + region_add(rgn, data->rects + i); + } +} + #endif /* DISPLAY_CHANNEL_PRIVATE_H_ */ diff --git a/server/display-channel.h b/server/display-channel.h index 75b1efea..d3fc41dd 100644 --- a/server/display-channel.h +++ b/server/display-channel.h @@ -108,96 +108,6 @@ struct Drawable { DisplayChannel *display; }; -void drawable_unref (Drawable *drawable); - -enum { - RED_PIPE_ITEM_TYPE_DRAW = RED_PIPE_ITEM_TYPE_COMMON_LAST, - RED_PIPE_ITEM_TYPE_IMAGE, - RED_PIPE_ITEM_TYPE_STREAM_CREATE, - RED_PIPE_ITEM_TYPE_STREAM_CLIP, - RED_PIPE_ITEM_TYPE_STREAM_DESTROY, - RED_PIPE_ITEM_TYPE_UPGRADE, - RED_PIPE_ITEM_TYPE_MIGRATE_DATA, - RED_PIPE_ITEM_TYPE_PIXMAP_SYNC, - RED_PIPE_ITEM_TYPE_PIXMAP_RESET, - RED_PIPE_ITEM_TYPE_INVAL_PALETTE_CACHE, - RED_PIPE_ITEM_TYPE_CREATE_SURFACE, - RED_PIPE_ITEM_TYPE_DESTROY_SURFACE, - RED_PIPE_ITEM_TYPE_MONITORS_CONFIG, - RED_PIPE_ITEM_TYPE_STREAM_ACTIVATE_REPORT, - RED_PIPE_ITEM_TYPE_GL_SCANOUT, - RED_PIPE_ITEM_TYPE_GL_DRAW, -}; - -typedef struct MonitorsConfig { - int refs; - int count; - int max_allowed; - QXLHead heads[0]; -} MonitorsConfig; - -typedef struct RedMonitorsConfigItem { - RedPipeItem pipe_item; - MonitorsConfig *monitors_config; -} RedMonitorsConfigItem; - -MonitorsConfig * monitors_config_ref (MonitorsConfig *config); -void monitors_config_unref (MonitorsConfig *config); - -#define TRACE_ITEMS_SHIFT 3 -#define NUM_TRACE_ITEMS (1 << TRACE_ITEMS_SHIFT) -#define ITEMS_TRACE_MASK (NUM_TRACE_ITEMS - 1) - -typedef struct DrawContext { - SpiceCanvas *canvas; - int canvas_draws_on_surface; - int top_down; - uint32_t width; - uint32_t height; - int32_t stride; - uint32_t format; - void *line_0; -} DrawContext; - -typedef struct RedSurface { - uint32_t refs; - /* A Ring representing a hierarchical tree structure. This tree includes - * DrawItems, Containers, and Shadows. It is used to efficiently determine - * which drawables overlap, and to exclude regions of drawables that are - * obscured by other drawables */ - Ring current; - /* A ring of pending Drawables associated with this surface. This ring is - * actually used for drawing. The ring is maintained in order of age, the - * tail being the oldest drawable. */ - Ring current_list; - DrawContext context; - - Ring depend_on_me; - QRegion draw_dirty_region; - - //fix me - better handling here - QXLReleaseInfoExt create, destroy; -} RedSurface; - -#define FOREACH_DCC(_channel, _data) \ - GLIST_FOREACH((_channel ? red_channel_get_clients(RED_CHANNEL(_channel)) : NULL), \ - DisplayChannelClient, _data) - -int display_channel_get_stream_id(DisplayChannel *display, Stream *stream); -Stream *display_channel_get_nth_stream(DisplayChannel *display, gint i); - -typedef struct RedSurfaceDestroyItem { - RedPipeItem pipe_item; - SpiceMsgSurfaceDestroy surface_destroy; -} RedSurfaceDestroyItem; - -typedef struct RedUpgradeItem { - RedPipeItem base; - Drawable *drawable; - SpiceClipRects *rects; -} RedUpgradeItem; - - DisplayChannel* display_channel_new (RedsState *reds, QXLInstance *qxl, const SpiceCoreInterfaceInternal *core, @@ -212,10 +122,6 @@ void display_channel_create_surface (DisplayCha void display_channel_draw (DisplayChannel *display, const SpiceRect *area, int surface_id); -void display_channel_draw_until (DisplayChannel *display, - const SpiceRect *area, - int surface_id, - Drawable *last); void display_channel_update (DisplayChannel *display, uint32_t surface_id, const QXLRect *area, @@ -227,15 +133,11 @@ void display_channel_set_stream_video (DisplayCha int stream_video); void display_channel_set_video_codecs (DisplayChannel *display, GArray *video_codecs); -GArray* display_channel_get_video_codecs (DisplayChannel *display); -int display_channel_get_stream_video (DisplayChannel *display); 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); -void display_channel_current_flush (DisplayChannel *display, - int 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); @@ -243,7 +145,6 @@ void display_channel_free_glz_drawables (DisplayCha void display_channel_destroy_surface_wait (DisplayChannel *display, uint32_t surface_id); void display_channel_destroy_surfaces (DisplayChannel *display); -uint32_t display_channel_generate_uid (DisplayChannel *display); void display_channel_process_draw (DisplayChannel *display, RedDrawable *red_drawable, uint32_t process_commands_generation); @@ -268,121 +169,6 @@ void display_channel_reset_image_cache(DisplayChannel *self); void display_channel_debug_oom(DisplayChannel *display, const char *msg); -static inline int is_equal_path(SpicePath *path1, SpicePath *path2) -{ - SpicePathSeg *seg1, *seg2; - int i, j; - - if (path1->num_segments != path2->num_segments) - return FALSE; - - for (i = 0; i < path1->num_segments; i++) { - seg1 = path1->segments[i]; - seg2 = path2->segments[i]; - - if (seg1->flags != seg2->flags || - seg1->count != seg2->count) { - return FALSE; - } - for (j = 0; j < seg1->count; j++) { - if (seg1->points[j].x != seg2->points[j].x || - seg1->points[j].y != seg2->points[j].y) { - return FALSE; - } - } - } - - return TRUE; -} - -// partial imp -static inline int is_equal_brush(SpiceBrush *b1, SpiceBrush *b2) -{ - return b1->type == b2->type && - b1->type == SPICE_BRUSH_TYPE_SOLID && - b1->u.color == b2->u.color; -} - -// partial imp -static inline int is_equal_line_attr(SpiceLineAttr *a1, SpiceLineAttr *a2) -{ - return a1->flags == a2->flags && - a1->style_nseg == a2->style_nseg && - a1->style_nseg == 0; -} - -// partial imp -static inline int is_same_geometry(Drawable *d1, Drawable *d2) -{ - if (d1->red_drawable->type != d2->red_drawable->type) { - return FALSE; - } - - switch (d1->red_drawable->type) { - case QXL_DRAW_STROKE: - return is_equal_line_attr(&d1->red_drawable->u.stroke.attr, - &d2->red_drawable->u.stroke.attr) && - is_equal_path(d1->red_drawable->u.stroke.path, - d2->red_drawable->u.stroke.path); - case QXL_DRAW_FILL: - return rect_is_equal(&d1->red_drawable->bbox, &d2->red_drawable->bbox); - default: - return FALSE; - } -} - -static inline int is_same_drawable(Drawable *d1, Drawable *d2) -{ - if (!is_same_geometry(d1, d2)) { - return FALSE; - } - - switch (d1->red_drawable->type) { - case QXL_DRAW_STROKE: - return is_equal_brush(&d1->red_drawable->u.stroke.brush, - &d2->red_drawable->u.stroke.brush); - case QXL_DRAW_FILL: - return is_equal_brush(&d1->red_drawable->u.fill.brush, - &d2->red_drawable->u.fill.brush); - default: - return FALSE; - } -} - -static inline int is_drawable_independent_from_surfaces(Drawable *drawable) -{ - int x; - - for (x = 0; x < 3; ++x) { - if (drawable->surface_deps[x] != -1) { - return FALSE; - } - } - return TRUE; -} - -static inline int has_shadow(RedDrawable *drawable) -{ - return drawable->type == QXL_COPY_BITS; -} - -static inline int is_primary_surface(DisplayChannel *display, uint32_t surface_id) -{ - if (surface_id == 0) { - return TRUE; - } - return FALSE; -} - -static inline void region_add_clip_rects(QRegion *rgn, SpiceClipRects *data) -{ - int i; - - for (i = 0; i < data->num_rects; i++) { - region_add(rgn, data->rects + i); - } -} - G_END_DECLS #endif /* DISPLAY_CHANNEL_H_ */ -- 2.13.5 _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/spice-devel