From 1e1ee0324c268824b68bd596fd406667a366657c Mon Sep 17 00:00:00 2001 From: Marc-André Lureau Date: Tue, 9 Feb 2016 14:35:06 +0100 Subject: Handle GL_DRAW_DONE MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When a client is done with drawing and sends SPICE_MSGC_DISPLAY_GL_DRAW_DONE, or when it ends, update the number of async counts. Signed-off-by: Marc-André Lureau [reduce critical message to a warning; do not reset gl_draw_ongoing - Frediano Ziglio] Signed-off-by: Frediano Ziglio (cherry picked from commit 87778643119aa73e6df2dd690f03eb1c39b69cd4) --- server/red_worker.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/server/red_worker.c b/server/red_worker.c index cb924c17..ff49a542 100644 --- a/server/red_worker.c +++ b/server/red_worker.c @@ -1102,6 +1102,7 @@ static void display_channel_client_release_item_before_push(DisplayChannelClient PipeItem *item); static void display_channel_client_release_item_after_push(DisplayChannelClient *dcc, PipeItem *item); +static void display_channel_gl_draw_done(DisplayChannel *display); static void cursor_channel_client_release_item_before_push(CursorChannelClient *ccc, PipeItem *item); static void cursor_channel_client_release_item_after_push(CursorChannelClient *ccc, @@ -9505,6 +9506,10 @@ static void display_channel_client_on_disconnect(RedChannelClient *rcc) free(dcc->send_data.free_list.res); red_display_destroy_streams_agents(dcc); + if (dcc->gl_draw_ongoing) { + display_channel_gl_draw_done(display_channel); + } + // this was the last channel client if (!red_channel_is_connected(rcc->channel)) { red_display_destroy_compress_bufs(display_channel); @@ -10382,6 +10387,22 @@ static int display_channel_handle_preferred_compression(DisplayChannelClient *dc return TRUE; } +static int dcc_handle_gl_draw_done(DisplayChannelClient *dcc) +{ + DisplayChannel *display = DCC_TO_DC(dcc); + + if (G_UNLIKELY(!dcc->gl_draw_ongoing)) { + g_warning("unexpected DRAW_DONE received\n"); + /* close client connection */ + return FALSE; + } + + dcc->gl_draw_ongoing = FALSE; + display_channel_gl_draw_done(display); + + return TRUE; +} + static int display_channel_handle_message(RedChannelClient *rcc, uint32_t size, uint16_t type, void *message) { @@ -10401,6 +10422,8 @@ static int display_channel_handle_message(RedChannelClient *rcc, uint32_t size, case SPICE_MSGC_DISPLAY_PREFERRED_COMPRESSION: return display_channel_handle_preferred_compression(dcc, (SpiceMsgcDisplayPreferredCompression *)message); + case SPICE_MSGC_DISPLAY_GL_DRAW_DONE: + return dcc_handle_gl_draw_done(dcc); default: return red_channel_client_handle_message(rcc, size, type, message); @@ -10968,6 +10991,11 @@ static void display_channel_gl_draw(DisplayChannel *display, SpiceMsgDisplayGlDr set_gl_draw_async_count(display, num); } +static void display_channel_gl_draw_done(DisplayChannel *display) +{ + set_gl_draw_async_count(display, display->gl_draw_async_count - 1); +} + static void cursor_channel_client_on_disconnect(RedChannelClient *rcc) { if (!rcc) { -- cgit v1.2.3