diff options
Diffstat (limited to 'ui/spice-display.c')
| -rw-r--r-- | ui/spice-display.c | 60 |
1 files changed, 41 insertions, 19 deletions
diff --git a/ui/spice-display.c b/ui/spice-display.c index 40547edb5e..a9fee87a72 100644 --- a/ui/spice-display.c +++ b/ui/spice-display.c @@ -876,19 +876,24 @@ static void spice_gl_switch(DisplayChangeListener *dcl, struct DisplaySurface *new_surface) { SimpleSpiceDisplay *ssd = container_of(dcl, SimpleSpiceDisplay, dcl); - EGLint stride, fourcc; - int fd; if (ssd->ds) { surface_gl_destroy_texture(ssd->gls, ssd->ds); } ssd->ds = new_surface; if (ssd->ds) { + uint32_t offset[DMABUF_MAX_PLANES], stride[DMABUF_MAX_PLANES]; + int fd[DMABUF_MAX_PLANES], num_planes, fourcc; + surface_gl_create_texture(ssd->gls, ssd->ds); - fd = egl_get_fd_for_texture(ssd->ds->texture, - &stride, &fourcc, - NULL); - if (fd < 0) { + if (!egl_dmabuf_export_texture(ssd->ds->texture, fd, (EGLint *)offset, + (EGLint *)stride, &fourcc, &num_planes, NULL)) { + surface_gl_destroy_texture(ssd->gls, ssd->ds); + return; + } + + if (num_planes > 1) { + fprintf(stderr, "%s: does not support multi-plane texture\n", __func__); surface_gl_destroy_texture(ssd->gls, ssd->ds); return; } @@ -899,10 +904,10 @@ static void spice_gl_switch(DisplayChangeListener *dcl, fourcc); /* note: spice server will close the fd */ - spice_qxl_gl_scanout(&ssd->qxl, fd, + spice_qxl_gl_scanout(&ssd->qxl, fd[0], surface_width(ssd->ds), surface_height(ssd->ds), - stride, fourcc, false); + stride[0], fourcc, false); ssd->have_surface = true; ssd->have_scanout = false; @@ -941,20 +946,24 @@ static void qemu_spice_gl_scanout_texture(DisplayChangeListener *dcl, void *d3d_tex2d) { SimpleSpiceDisplay *ssd = container_of(dcl, SimpleSpiceDisplay, dcl); - EGLint stride = 0, fourcc = 0; - int fd = -1; + EGLint offset[DMABUF_MAX_PLANES], stride[DMABUF_MAX_PLANES], fourcc = 0; + int fd[DMABUF_MAX_PLANES], num_planes; assert(tex_id); - fd = egl_get_fd_for_texture(tex_id, &stride, &fourcc, NULL); - if (fd < 0) { - fprintf(stderr, "%s: failed to get fd for texture\n", __func__); + if (!egl_dmabuf_export_texture(tex_id, fd, offset, stride, &fourcc, + &num_planes, NULL)) { + fprintf(stderr, "%s: failed to export dmabuf for texture\n", __func__); + return; + } + if (num_planes > 1) { + fprintf(stderr, "%s: does not support multi-plane dmabuf\n", __func__); return; } trace_qemu_spice_gl_scanout_texture(ssd->qxl.id, w, h, fourcc); /* note: spice server will close the fd */ - spice_qxl_gl_scanout(&ssd->qxl, fd, backing_width, backing_height, - stride, fourcc, y_0_top); + spice_qxl_gl_scanout(&ssd->qxl, fd[0], backing_width, backing_height, + stride[0], fourcc, y_0_top); qemu_spice_gl_monitor_config(ssd, x, y, w, h); ssd->have_surface = false; ssd->have_scanout = true; @@ -1064,15 +1073,28 @@ static void qemu_spice_gl_update(DisplayChangeListener *dcl, /* dest framebuffer */ if (ssd->blit_fb.width != width || ssd->blit_fb.height != height) { + int fds[DMABUF_MAX_PLANES], num_planes; + uint32_t offsets[DMABUF_MAX_PLANES], strides[DMABUF_MAX_PLANES]; + trace_qemu_spice_gl_render_dmabuf(ssd->qxl.id, width, height); egl_fb_destroy(&ssd->blit_fb); egl_fb_setup_new_tex(&ssd->blit_fb, width, height); - fd = egl_get_fd_for_texture(ssd->blit_fb.texture, - &stride, &fourcc, NULL); - spice_qxl_gl_scanout(&ssd->qxl, fd, width, height, - stride, fourcc, false); + if (!egl_dmabuf_export_texture(ssd->blit_fb.texture, fds, + (EGLint *)offsets, (EGLint *)strides, + &fourcc, &num_planes, NULL)) { + fprintf(stderr, + "%s: failed to export dmabuf for texture\n", __func__); + return; + } + if (num_planes > 1) { + fprintf(stderr, + "%s: does not support multi-plane dmabuf\n", __func__); + return; + } + spice_qxl_gl_scanout(&ssd->qxl, fds[0], width, height, + strides[0], fourcc, false); } } else { stride = qemu_dmabuf_get_strides(dmabuf, NULL)[0]; |