Save texture information. Dma buffer is extracted only if needed from the texture. Signed-off-by: Frediano Ziglio <fziglio@xxxxxxxxxx> --- server/red-qxl.c | 68 +++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 63 insertions(+), 5 deletions(-) diff --git a/server/red-qxl.c b/server/red-qxl.c index 1a951f8..0022cee 100644 --- a/server/red-qxl.c +++ b/server/red-qxl.c @@ -843,11 +843,25 @@ void spice_qxl_driver_unload(QXLInstance *instance) SpiceMsgDisplayGlScanoutUnix *red_qxl_get_gl_scanout(QXLInstance *qxl) { - pthread_mutex_lock(&qxl->st->scanout_mutex); - if (qxl->st->scanout.drm_dma_buf_fd >= 0) { - return &qxl->st->scanout; + QXLState *qxl_state = qxl->st; + + pthread_mutex_lock(&qxl_state->scanout_mutex); + if (qxl_state->scanout.drm_dma_buf_fd >= 0) { + return &qxl_state->scanout; } - pthread_mutex_unlock(&qxl->st->scanout_mutex); + if (qxl_state->texture.tex_id && qxl_state->texture.egl_display) { + uint32_t stride, format; + + int fd = egl_get_fd_for_texture(qxl_state->egl_display, qxl_state->egl_context, + qxl_state->texture.tex_id, &stride, &format); + if (fd >= 0) { + qxl_state->scanout.drm_dma_buf_fd = fd; + qxl_state->scanout.stride = stride; + qxl_state->scanout.drm_fourcc_format = format; + return &qxl_state->scanout; + } + } + pthread_mutex_unlock(&qxl_state->scanout_mutex); return NULL; } @@ -915,6 +929,15 @@ void spice_qxl_gl_scanout(QXLInstance *qxl, .drm_fourcc_format = format }; + qxl_state->texture = (RedGlTexture) { + .flags = y_0_top ? SPICE_GL_SCANOUT_FLAGS_Y0TOP : 0, + .egl_display = NULL, + .egl_context = NULL, + .tex_id = 0, + .width = width, + .height = height, + }; + pthread_mutex_unlock(&qxl_state->scanout_mutex); /* FIXME: find a way to coallesce all pending SCANOUTs */ @@ -928,6 +951,41 @@ void spice_qxl_gl_scanout_texture(QXLInstance *qxl, uint32_t width, uint32_t height, int y_0_top) { + RedWorkerMessageGlScanout payload = { /* empty */ }; + spice_return_if_fail(qxl != NULL); + + QXLState *qxl_state = qxl->st; + spice_return_if_fail(qxl_state->gl_draw_async == NULL); + + pthread_mutex_lock(&qxl_state->scanout_mutex); + + if (qxl_state->scanout.drm_dma_buf_fd != -1) { + close(qxl_state->scanout.drm_dma_buf_fd); + } + + qxl_state->scanout = (SpiceMsgDisplayGlScanoutUnix) { + .flags = y_0_top ? SPICE_GL_SCANOUT_FLAGS_Y0TOP : 0, + .drm_dma_buf_fd = -1, + .width = width, + .height = height, + .stride = 0, + .drm_fourcc_format = 0 + }; + + qxl_state->texture = (RedGlTexture) { + .flags = y_0_top ? SPICE_GL_SCANOUT_FLAGS_Y0TOP : 0, + .egl_display = qxl_state->egl_display, + .egl_context = qxl_state->egl_context, + .tex_id = tex_id, + .width = width, + .height = height, + }; + + pthread_mutex_unlock(&qxl_state->scanout_mutex); + + /* FIXME: find a way to coallesce all pending SCANOUTs */ + dispatcher_send_message(qxl_state->dispatcher, + RED_WORKER_MESSAGE_GL_SCANOUT, &payload); } SPICE_GNUC_VISIBLE @@ -947,7 +1005,7 @@ void spice_qxl_gl_draw_async(QXLInstance *qxl, spice_return_if_fail(qxl != NULL); qxl_state = qxl->st; - if (qxl_state->scanout.drm_dma_buf_fd == -1) { + if (qxl_state->scanout.drm_dma_buf_fd < 0 && qxl_state->texture.tex_id == 0) { spice_warning("called spice_qxl_gl_draw_async without a buffer"); red_qxl_async_complete(qxl, async_command_alloc(qxl_state, message, cookie)); return; -- 2.7.4 _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/spice-devel