summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarc-André Lureau <marcandre.lureau@gmail.com>2016-02-09 14:35:06 +0100
committerPavel Grunt <pgrunt@redhat.com>2016-03-14 13:45:00 +0100
commit1e1ee0324c268824b68bd596fd406667a366657c (patch)
treef8d9595362b861d3ba8d91528f15524879eaa249
parent3a5210af0cf66679c792821418419f21af8822c0 (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.c28
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) {