mirror of
https://gitlab.uni-freiburg.de/opensourcevdi/spice
synced 2026-08-12 20:53:48 +00:00
server/red_worker: add red_channel_push
This commit is contained in:
parent
111cf51103
commit
a0a9718423
@ -969,7 +969,7 @@ typedef struct BitmapData {
|
||||
|
||||
static void red_draw_qxl_drawable(RedWorker *worker, Drawable *drawable);
|
||||
static void red_current_flush(RedWorker *worker, int surface_id);
|
||||
static void display_channel_push(RedWorker *worker);
|
||||
static void red_channel_push(RedChannel *channel);
|
||||
#ifdef DRAW_ALL
|
||||
#define red_update_area(worker, rect, surface_id)
|
||||
#define red_draw_drawable(worker, item)
|
||||
@ -4560,7 +4560,7 @@ static void red_add_surface_image(RedWorker *worker, int surface_id)
|
||||
/* not allowing lossy compression because probably, especially if it is a primary surface,
|
||||
it combines both "picture-like" areas with areas that are more "artificial"*/
|
||||
red_add_surface_area_image(worker, surface_id, &area, NULL, FALSE);
|
||||
display_channel_push(worker);
|
||||
red_channel_push(&worker->display_channel->common.base);
|
||||
}
|
||||
|
||||
typedef struct {
|
||||
@ -8260,7 +8260,7 @@ static void red_send_cursor(CursorChannel *cursor_channel, CursorItem *cursor)
|
||||
|
||||
red_channel_begin_send_message(channel);
|
||||
|
||||
red_release_cursor(cursor_channel->common.worker, cursor);
|
||||
red_release_cursor(worker, cursor);
|
||||
}
|
||||
|
||||
static void red_send_surface_create(DisplayChannel *display, SpiceMsgSurfaceCreate *surface_create)
|
||||
@ -8407,13 +8407,24 @@ static void display_channel_send_item(RedChannel *base, PipeItem *pipe_item)
|
||||
red_unref_channel((RedChannel *)display_channel);
|
||||
}
|
||||
|
||||
static void display_channel_push(RedWorker *worker)
|
||||
void red_channel_push(RedChannel *channel)
|
||||
{
|
||||
PipeItem *pipe_item;
|
||||
|
||||
while ((pipe_item = red_channel_pipe_get((RedChannel *)worker->display_channel))) {
|
||||
display_channel_send_item((RedChannel *)worker->display_channel, pipe_item);
|
||||
if (!channel->during_send) {
|
||||
channel->during_send = TRUE;
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
|
||||
if (channel->send_data.blocked) {
|
||||
red_channel_send(channel);
|
||||
}
|
||||
|
||||
while ((pipe_item = red_channel_pipe_get(channel))) {
|
||||
channel->send_item(channel, pipe_item);
|
||||
}
|
||||
channel->during_send = FALSE;
|
||||
}
|
||||
|
||||
static void cursor_channel_send_item(RedChannel *channel, PipeItem *pipe_item)
|
||||
@ -8462,19 +8473,14 @@ static void cursor_channel_send_item(RedChannel *channel, PipeItem *pipe_item)
|
||||
red_unref_channel(channel);
|
||||
}
|
||||
|
||||
static void cursor_channel_push(RedWorker *worker)
|
||||
{
|
||||
PipeItem *pipe_item;
|
||||
|
||||
while ((pipe_item = red_channel_pipe_get((RedChannel *)worker->cursor_channel))) {
|
||||
cursor_channel_send_item(&worker->cursor_channel->common.base, pipe_item);
|
||||
}
|
||||
}
|
||||
|
||||
static inline void red_push(RedWorker *worker)
|
||||
{
|
||||
cursor_channel_push(worker);
|
||||
display_channel_push(worker);
|
||||
if (worker->cursor_channel) {
|
||||
red_channel_push(&worker->cursor_channel->common.base);
|
||||
}
|
||||
if (worker->display_channel) {
|
||||
red_channel_push(&worker->display_channel->common.base);
|
||||
}
|
||||
}
|
||||
|
||||
typedef struct ShowTreeData {
|
||||
@ -8802,7 +8808,7 @@ static inline void flush_display_commands(RedWorker *worker)
|
||||
}
|
||||
|
||||
while (red_process_commands(worker, MAX_PIPE_SIZE, &ring_is_empty)) {
|
||||
display_channel_push(worker);
|
||||
red_channel_push(&worker->display_channel->common.base);
|
||||
}
|
||||
|
||||
if (ring_is_empty) {
|
||||
@ -8811,7 +8817,7 @@ static inline void flush_display_commands(RedWorker *worker)
|
||||
end_time = red_now() + DISPLAY_CLIENT_TIMEOUT * 10;
|
||||
int sleep_count = 0;
|
||||
for (;;) {
|
||||
display_channel_push(worker);
|
||||
red_channel_push(&worker->display_channel->common.base);
|
||||
if (!worker->display_channel ||
|
||||
worker->display_channel->common.base.pipe_size <= MAX_PIPE_SIZE) {
|
||||
break;
|
||||
@ -8844,7 +8850,7 @@ static inline void flush_cursor_commands(RedWorker *worker)
|
||||
}
|
||||
|
||||
while (red_process_cursor(worker, MAX_PIPE_SIZE, &ring_is_empty)) {
|
||||
cursor_channel_push(worker);
|
||||
red_channel_push(&worker->cursor_channel->common.base);
|
||||
}
|
||||
|
||||
if (ring_is_empty) {
|
||||
@ -8853,7 +8859,7 @@ static inline void flush_cursor_commands(RedWorker *worker)
|
||||
end_time = red_now() + DISPLAY_CLIENT_TIMEOUT * 10;
|
||||
int sleep_count = 0;
|
||||
for (;;) {
|
||||
cursor_channel_push(worker);
|
||||
red_channel_push(&worker->cursor_channel->common.base);
|
||||
if (!worker->cursor_channel ||
|
||||
worker->cursor_channel->common.base.pipe_size <= MAX_PIPE_SIZE) {
|
||||
break;
|
||||
@ -8889,7 +8895,7 @@ static void push_new_primary_surface(RedWorker *worker)
|
||||
if (!display_channel->common.base.migrate) {
|
||||
red_create_surface_item(worker, 0);
|
||||
}
|
||||
display_channel_push(worker);
|
||||
red_channel_push(&worker->display_channel->common.base);
|
||||
}
|
||||
}
|
||||
|
||||
@ -9939,7 +9945,7 @@ static inline void handle_dev_create_primary_surface(RedWorker *worker)
|
||||
|
||||
if (worker->display_channel) {
|
||||
red_pipe_add_verb(&worker->display_channel->common.base, SPICE_MSG_DISPLAY_MARK);
|
||||
display_channel_push(worker);
|
||||
red_channel_push(&worker->display_channel->common.base);
|
||||
}
|
||||
|
||||
if (worker->cursor_channel) {
|
||||
@ -10010,7 +10016,7 @@ static void handle_dev_input(EventListener *listener, uint32_t events)
|
||||
case RED_WORKER_MESSAGE_OOM:
|
||||
ASSERT(worker->running);
|
||||
while (red_process_commands(worker, MAX_PIPE_SIZE, &ring_is_empty)) {
|
||||
display_channel_push(worker);
|
||||
red_channel_push(&worker->display_channel->common.base);
|
||||
}
|
||||
if (worker->qxl->st->qif->flush_resources(worker->qxl) == 0) {
|
||||
red_printf("oom current %u pipe %u", worker->current_size,
|
||||
|
||||
Loading…
Reference in New Issue
Block a user