[Spice-devel] [PATCH 14/18] worker: move display_channel_create_surface
Frediano Ziglio
fziglio at redhat.com
Tue Nov 24 03:13:18 PST 2015
From: Marc-André Lureau <marcandre.lureau at gmail.com>
---
server/display-channel.c | 92 ++++++++++++++++++++++++++++++++++
server/display-channel.h | 4 ++
server/red_worker.c | 125 +++--------------------------------------------
3 files changed, 103 insertions(+), 118 deletions(-)
diff --git a/server/display-channel.c b/server/display-channel.c
index ec076ce..051d597 100644
--- a/server/display-channel.c
+++ b/server/display-channel.c
@@ -1470,6 +1470,98 @@ void display_channel_destroy_surfaces(DisplayChannel *display)
display_channel_free_glz_drawables(display);
}
+static void send_create_surface(DisplayChannel *display, int surface_id, int image_ready)
+{
+ DisplayChannelClient *dcc;
+ RingItem *item, *next;
+
+ FOREACH_DCC(display, item, next, dcc) {
+ dcc_create_surface(dcc, surface_id);
+ if (image_ready)
+ dcc_push_surface_image(dcc, surface_id);
+ }
+}
+
+static SpiceCanvas*
+create_canvas_for_surface(DisplayChannel *display, RedSurface *surface,
+ uint32_t renderer, uint32_t width, uint32_t height,
+ int32_t stride, uint32_t format, void *line_0)
+{
+ SpiceCanvas *canvas;
+
+ switch (renderer) {
+ case RED_RENDERER_SW:
+ canvas = canvas_create_for_data(width, height, format,
+ line_0, stride,
+ &display->image_cache.base,
+ &display->image_surfaces, NULL, NULL, NULL);
+ surface->context.top_down = TRUE;
+ surface->context.canvas_draws_on_surface = TRUE;
+ return canvas;
+ default:
+ spice_warn_if_reached();
+ };
+
+ return NULL;
+}
+
+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, int data_is_valid, int send_client)
+{
+ RedSurface *surface = &display->surfaces[surface_id];
+ uint32_t i;
+
+ spice_warn_if(surface->context.canvas);
+
+ surface->context.canvas_draws_on_surface = FALSE;
+ surface->context.width = width;
+ surface->context.height = height;
+ surface->context.format = format;
+ surface->context.stride = stride;
+ surface->context.line_0 = line_0;
+ if (!data_is_valid) {
+ char *data = line_0;
+ if (stride < 0) {
+ data -= abs(stride) * (height - 1);
+ }
+ memset(data, 0, height*abs(stride));
+ }
+ surface->create.info = NULL;
+ surface->destroy.info = NULL;
+ ring_init(&surface->current);
+ ring_init(&surface->current_list);
+ ring_init(&surface->depend_on_me);
+ region_init(&surface->draw_dirty_region);
+ surface->refs = 1;
+ if (display->renderer != RED_RENDERER_INVALID) {
+ surface->context.canvas = create_canvas_for_surface(display, surface, display->renderer,
+ width, height, stride,
+ surface->context.format, line_0);
+ if (!surface->context.canvas) {
+ spice_critical("drawing canvas creating failed - can`t create same type canvas");
+ }
+
+ if (send_client)
+ send_create_surface(display, surface_id, data_is_valid);
+ return;
+ }
+
+ for (i = 0; i < display->num_renderers; i++) {
+ surface->context.canvas = create_canvas_for_surface(display, surface, display->renderers[i],
+ width, height, stride,
+ surface->context.format, line_0);
+ if (surface->context.canvas) { //no need canvas check
+ display->renderer = display->renderers[i];
+ if (send_client)
+ send_create_surface(display, surface_id, data_is_valid);
+ return;
+ }
+ }
+
+ spice_critical("unable to create drawing canvas");
+}
+
static void on_disconnect(RedChannelClient *rcc)
{
DisplayChannel *display;
diff --git a/server/display-channel.h b/server/display-channel.h
index 34caafe..750362b 100644
--- a/server/display-channel.h
+++ b/server/display-channel.h
@@ -255,6 +255,10 @@ DisplayChannel* display_channel_new (RedWorker
int migrate,
int stream_video,
uint32_t n_surfaces);
+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,
+ int data_is_valid, int send_client);
void display_channel_draw (DisplayChannel *display,
const SpiceRect *area,
int surface_id);
diff --git a/server/red_worker.c b/server/red_worker.c
index 7af9c9b..470f813 100644
--- a/server/red_worker.c
+++ b/server/red_worker.c
@@ -134,9 +134,6 @@ typedef struct BitmapData {
} BitmapData;
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)
{
@@ -740,11 +737,11 @@ static inline void red_process_surface(RedWorker *worker, RedSurfaceCmd *surface
if (stride < 0) {
data -= (int32_t)(stride * (height - 1));
}
- red_create_surface(worker->display_channel, surface_id, surface->u.surface_create.width,
- height, stride, surface->u.surface_create.format, data,
- reloaded_surface,
- // reloaded surfaces will be sent on demand
- !reloaded_surface);
+ display_channel_create_surface(worker->display_channel, surface_id, surface->u.surface_create.width,
+ height, stride, surface->u.surface_create.format, data,
+ reloaded_surface,
+ // reloaded surfaces will be sent on demand
+ !reloaded_surface);
set_surface_release_info(&red_surface->create, surface->release_info, group_id);
break;
}
@@ -3415,114 +3412,6 @@ static void red_migrate_display(DisplayChannel *display, RedChannelClient *rcc)
}
}
-static inline void *create_canvas_for_surface(DisplayChannel *display, RedSurface *surface,
- uint32_t renderer, uint32_t width, uint32_t height,
- int32_t stride, uint32_t format, void *line_0)
-{
- SpiceCanvas *canvas;
-
- switch (renderer) {
- case RED_RENDERER_SW:
- canvas = canvas_create_for_data(width, height, format,
- line_0, stride,
- &display->image_cache.base,
- &display->image_surfaces, NULL, NULL, NULL);
- surface->context.top_down = TRUE;
- surface->context.canvas_draws_on_surface = TRUE;
- return canvas;
- default:
- spice_error("invalid renderer type");
- };
-
- return NULL;
-}
-
-static void red_worker_create_surface_item(DisplayChannel *display, int surface_id)
-{
- DisplayChannelClient *dcc;
- RingItem *item, *next;
-
- FOREACH_DCC(display, item, next, dcc) {
- dcc_create_surface(dcc, surface_id);
- }
-}
-
-
-static void red_worker_push_surface_image(DisplayChannel *display, int surface_id)
-{
- DisplayChannelClient *dcc;
- RingItem *item, *next;
-
- FOREACH_DCC(display, item, next, dcc) {
- dcc_push_surface_image(dcc, surface_id);
- }
-}
-
-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)
-{
- RedSurface *surface = &display->surfaces[surface_id];
- uint32_t i;
-
- spice_warn_if(surface->context.canvas);
-
- surface->context.canvas_draws_on_surface = FALSE;
- surface->context.width = width;
- surface->context.height = height;
- surface->context.format = format;
- surface->context.stride = stride;
- surface->context.line_0 = line_0;
- if (!data_is_valid) {
- char *data = line_0;
- if (stride < 0) {
- data -= abs(stride) * (height - 1);
- }
- memset(data, 0, height*abs(stride));
- }
- surface->create.info = NULL;
- surface->destroy.info = NULL;
- ring_init(&surface->current);
- ring_init(&surface->current_list);
- ring_init(&surface->depend_on_me);
- region_init(&surface->draw_dirty_region);
- surface->refs = 1;
- if (display->renderer != RED_RENDERER_INVALID) {
- surface->context.canvas = create_canvas_for_surface(display, surface, display->renderer,
- width, height, stride,
- surface->context.format, line_0);
- if (!surface->context.canvas) {
- spice_critical("drawing canvas creating failed - can`t create same type canvas");
- }
-
- if (send_client) {
- red_worker_create_surface_item(display, surface_id);
- if (data_is_valid) {
- red_worker_push_surface_image(display, surface_id);
- }
- }
- return;
- }
-
- for (i = 0; i < display->num_renderers; i++) {
- surface->context.canvas = create_canvas_for_surface(display, surface, display->renderers[i],
- width, height, stride,
- surface->context.format, line_0);
- if (surface->context.canvas) { //no need canvas check
- display->renderer = display->renderers[i];
- if (send_client) {
- red_worker_create_surface_item(display, surface_id);
- if (data_is_valid) {
- red_worker_push_surface_image(display, surface_id);
- }
- }
- return;
- }
- }
-
- spice_critical("unable to create drawing canvas");
-}
-
static inline void flush_display_commands(RedWorker *worker)
{
RedChannel *display_red_channel = RED_CHANNEL(worker->display_channel);
@@ -4081,8 +3970,8 @@ static void dev_create_primary_surface(RedWorker *worker, uint32_t surface_id,
line_0 -= (int32_t)(surface.stride * (surface.height -1));
}
- red_create_surface(display, 0, surface.width, surface.height, surface.stride, surface.format,
- line_0, surface.flags & QXL_SURF_FLAG_KEEP_DATA, TRUE);
+ display_channel_create_surface(display, 0, surface.width, surface.height, surface.stride, surface.format,
+ line_0, surface.flags & QXL_SURF_FLAG_KEEP_DATA, TRUE);
set_monitors_config_to_primary(display);
if (display_is_connected(worker) && !worker->display_channel->common.during_target_migrate) {
--
2.4.3
More information about the Spice-devel
mailing list