diff options
author | Marc-André Lureau <marcandre.lureau@gmail.com> | 2016-02-09 14:35:06 +0100 |
---|---|---|
committer | Pavel Grunt <pgrunt@redhat.com> | 2016-03-14 13:45:00 +0100 |
commit | 1e1ee0324c268824b68bd596fd406667a366657c (patch) | |
tree | f8d9595362b861d3ba8d91528f15524879eaa249 | |
parent | 3a5210af0cf66679c792821418419f21af8822c0 (diff) |
Handle GL_DRAW_DONE0.12
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 <marcandre.lureau@gmail.com>
[reduce critical message to a warning; do not reset gl_draw_ongoing
- Frediano Ziglio]
Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
(cherry picked from commit 87778643119aa73e6df2dd690f03eb1c39b69cd4)
-rw-r--r-- | server/red_worker.c | 28 |
1 files changed, 28 insertions, 0 deletions
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) { |