This async is triggered by the encoder indicating that the encoding process is completed. Cc: Gerd Hoffmann <kraxel@xxxxxxxxxx> Cc: Marc-André Lureau <marcandre.lureau@xxxxxxxxxx> Cc: Dongwon Kim <dongwon.kim@xxxxxxxxx> Signed-off-by: Vivek Kasireddy <vivek.kasireddy@xxxxxxxxx> --- server/display-channel.cpp | 9 +++++++++ server/display-channel.h | 2 ++ server/red-qxl.cpp | 26 ++++++++++++++++++++++++++ server/red-qxl.h | 1 + server/spice-qxl.h | 2 ++ server/spice-server.syms | 1 + 6 files changed, 41 insertions(+) diff --git a/server/display-channel.cpp b/server/display-channel.cpp index 4bd0cf41..81df5420 100644 --- a/server/display-channel.cpp +++ b/server/display-channel.cpp @@ -2334,6 +2334,15 @@ void display_channel_gl_draw_done(DisplayChannel *display) set_gl_draw_async_count(display, display->priv->gl_draw_async_count - 1); } +void display_channel_encode_done(DisplayChannel *display, + RedDrawable *red_drawable) +{ + if (red_drawable->dmabuf_fd > 0) { + red_qxl_dmabuf_encode_async_complete(display->priv->qxl); + red_drawable->dmabuf_fd = 0; + } +} + int display_channel_get_video_stream_id(DisplayChannel *display, VideoStream *stream) { return static_cast<int>(stream - display->priv->streams_buf.data()); diff --git a/server/display-channel.h b/server/display-channel.h index c54df25c..0a1e520c 100644 --- a/server/display-channel.h +++ b/server/display-channel.h @@ -127,6 +127,8 @@ void display_channel_gl_scanout (DisplayCha void display_channel_gl_draw (DisplayChannel *display, SpiceMsgDisplayGlDraw *draw); void display_channel_gl_draw_done (DisplayChannel *display); +void display_channel_encode_done (DisplayChannel *display, + RedDrawable *drawable); void display_channel_process_draw(DisplayChannel *display, red::shared_ptr<RedDrawable> &&red_drawable, diff --git a/server/red-qxl.cpp b/server/red-qxl.cpp index 48c293ae..42a4029b 100644 --- a/server/red-qxl.cpp +++ b/server/red-qxl.cpp @@ -493,6 +493,32 @@ void red_qxl_gl_draw_async_complete(QXLInstance *qxl) red_qxl_async_complete(qxl, cookie); } +SPICE_GNUC_VISIBLE +void spice_qxl_dmabuf_encode_async(QXLInstance *qxl, + int fd, uint64_t cookie) +{ + QXLState *qxl_state; + + spice_return_if_fail(qxl != nullptr); + qxl_state = qxl->st; + + qxl_state->scanout.drm_dma_buf_fd = fd; + qxl_state->gl_draw_cookie = cookie; +} + +void red_qxl_dmabuf_encode_async_complete(QXLInstance *qxl) +{ + QXLState *qxl_state = qxl->st; + uint64_t cookie = qxl->st->gl_draw_cookie; + + if (cookie == GL_DRAW_COOKIE_INVALID) { + return; + } + qxl_state->scanout.drm_dma_buf_fd = 0; + qxl->st->gl_draw_cookie = GL_DRAW_COOKIE_INVALID; + red_qxl_async_complete(qxl, cookie); +} + SPICE_GNUC_VISIBLE void spice_qxl_set_device_info(QXLInstance *instance, const char *device_address, diff --git a/server/red-qxl.h b/server/red-qxl.h index 2084acb1..e8e7c373 100644 --- a/server/red-qxl.h +++ b/server/red-qxl.h @@ -40,6 +40,7 @@ bool red_qxl_get_allow_client_mouse(QXLInstance *qxl, int *x_res, int *y_res, in SpiceMsgDisplayGlScanoutUnix *red_qxl_get_gl_scanout(QXLInstance *qxl); void red_qxl_put_gl_scanout(QXLInstance *qxl, SpiceMsgDisplayGlScanoutUnix *scanout); void red_qxl_gl_draw_async_complete(QXLInstance *qxl); +void red_qxl_dmabuf_encode_async_complete(QXLInstance *qxl); int red_qxl_check_qxl_version(QXLInstance *qxl, int major, int minor); SpiceServer* red_qxl_get_server(QXLState *qxl); uint32_t red_qxl_marshall_device_display_info(const QXLInstance *qxl, SpiceMarshaller *m); diff --git a/server/spice-qxl.h b/server/spice-qxl.h index bf17476b..ca9816ec 100644 --- a/server/spice-qxl.h +++ b/server/spice-qxl.h @@ -92,6 +92,8 @@ void spice_qxl_gl_draw_async(QXLInstance *qxl, uint32_t x, uint32_t y, uint32_t w, uint32_t h, uint64_t cookie); +void spice_qxl_dmabuf_encode_async(QXLInstance *qxl, + int fd, uint64_t cookie); /* since spice 0.14.2 */ diff --git a/server/spice-server.syms b/server/spice-server.syms index 8da46c20..9748cc24 100644 --- a/server/spice-server.syms +++ b/server/spice-server.syms @@ -182,4 +182,5 @@ SPICE_SERVER_0.14.3 { global: spice_server_get_video_codecs; spice_server_free_video_codecs; + spice_qxl_dmabuf_encode_async; } SPICE_SERVER_0.14.2; -- 2.37.2