Hi On Mon, Mar 24, 2025 at 12:20 PM <yuq...@gmail.com> wrote: > > From: Qiang Yu <yuq...@gmail.com> > > Signed-off-by: Qiang Yu <yuq...@gmail.com> > --- > meson.build | 2 +- > ui/spice-display.c | 65 +++++++++++++++++++++++----------------------- > 2 files changed, 34 insertions(+), 33 deletions(-) > > diff --git a/meson.build b/meson.build > index 9d9c11731f..b87704a83b 100644 > --- a/meson.build > +++ b/meson.build > @@ -1329,7 +1329,7 @@ if get_option('spice') \ > .require(pixman.found(), > error_message: 'cannot enable SPICE if pixman is not > available') \ > .allowed() > - spice = dependency('spice-server', version: '>=0.14.0', > + spice = dependency('spice-server', version: '>=0.14.3',
I am okay with bumping dependency requirements, but the nicer alternative would be to allow the current version and check the existence of the new API/function instead. > required: get_option('spice'), > method: 'pkg-config') > endif > diff --git a/ui/spice-display.c b/ui/spice-display.c > index b7016ece6a..46b6d5dfc9 100644 > --- a/ui/spice-display.c > +++ b/ui/spice-display.c > @@ -28,6 +28,8 @@ > > #include "ui/spice-display.h" > > +#include "standard-headers/drm/drm_fourcc.h" > + > bool spice_opengl; > > int qemu_spice_rect_is_empty(const QXLRect* r) > @@ -884,16 +886,11 @@ static void spice_gl_switch(DisplayChangeListener *dcl, > if (ssd->ds) { > uint32_t offset[DMABUF_MAX_PLANES], stride[DMABUF_MAX_PLANES]; > int fd[DMABUF_MAX_PLANES], num_planes, fourcc; > + uint64_t modifier; > > surface_gl_create_texture(ssd->gls, ssd->ds); > 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__); > + (EGLint *)stride, &fourcc, > &num_planes, &modifier)) { > surface_gl_destroy_texture(ssd->gls, ssd->ds); > return; > } > @@ -904,10 +901,11 @@ static void spice_gl_switch(DisplayChangeListener *dcl, > fourcc); > > /* note: spice server will close the fd */ > - spice_qxl_gl_scanout(&ssd->qxl, fd[0], > - surface_width(ssd->ds), > - surface_height(ssd->ds), > - stride[0], fourcc, false); > + spice_qxl_gl_scanout2(&ssd->qxl, fd, > + surface_width(ssd->ds), > + surface_height(ssd->ds), > + offset, stride, num_planes, > + fourcc, modifier, false); > ssd->have_surface = true; > ssd->have_scanout = false; > > @@ -930,7 +928,8 @@ static void > qemu_spice_gl_scanout_disable(DisplayChangeListener *dcl) > SimpleSpiceDisplay *ssd = container_of(dcl, SimpleSpiceDisplay, dcl); > > trace_qemu_spice_gl_scanout_disable(ssd->qxl.id); > - spice_qxl_gl_scanout(&ssd->qxl, -1, 0, 0, 0, 0, false); > + spice_qxl_gl_scanout2(&ssd->qxl, NULL, 0, 0, NULL, NULL, 0, > DRM_FORMAT_INVALID, > + DRM_FORMAT_MOD_INVALID, false); > qemu_spice_gl_monitor_config(ssd, 0, 0, 0, 0); > ssd->have_surface = false; > ssd->have_scanout = false; > @@ -948,22 +947,21 @@ static void > qemu_spice_gl_scanout_texture(DisplayChangeListener *dcl, > SimpleSpiceDisplay *ssd = container_of(dcl, SimpleSpiceDisplay, dcl); > EGLint offset[DMABUF_MAX_PLANES], stride[DMABUF_MAX_PLANES], fourcc = 0; > int fd[DMABUF_MAX_PLANES], num_planes; > + uint64_t modifier; > > assert(tex_id); > if (!egl_dmabuf_export_texture(tex_id, fd, offset, stride, &fourcc, > - &num_planes, NULL)) { > + &num_planes, &modifier)) { > 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[0], backing_width, backing_height, > - stride[0], fourcc, y_0_top); > + spice_qxl_gl_scanout2(&ssd->qxl, fd, backing_width, backing_height, > + (uint32_t *)offset, (uint32_t *)stride, num_planes, > + fourcc, modifier, y_0_top); > qemu_spice_gl_monitor_config(ssd, x, y, w, h); > ssd->have_surface = false; > ssd->have_scanout = true; > @@ -1034,11 +1032,10 @@ static void > qemu_spice_gl_update(DisplayChangeListener *dcl, > uint32_t x, uint32_t y, uint32_t w, > uint32_t h) > { > SimpleSpiceDisplay *ssd = container_of(dcl, SimpleSpiceDisplay, dcl); > - EGLint stride = 0, fourcc = 0; > + EGLint fourcc = 0; > bool render_cursor = false; > bool y_0_top = false; /* FIXME */ > uint64_t cookie; > - int fd; > uint32_t width, height, texture; > > if (!ssd->have_scanout) { > @@ -1075,6 +1072,7 @@ static void qemu_spice_gl_update(DisplayChangeListener > *dcl, > ssd->blit_fb.height != height) { > int fds[DMABUF_MAX_PLANES], num_planes; > uint32_t offsets[DMABUF_MAX_PLANES], > strides[DMABUF_MAX_PLANES]; > + uint64_t modifier; > > trace_qemu_spice_gl_render_dmabuf(ssd->qxl.id, width, > height); > @@ -1083,27 +1081,30 @@ static void > qemu_spice_gl_update(DisplayChangeListener *dcl, > width, height); > if (!egl_dmabuf_export_texture(ssd->blit_fb.texture, fds, > (EGLint *)offsets, (EGLint > *)strides, > - &fourcc, &num_planes, NULL)) { > + &fourcc, &num_planes, > &modifier)) { > 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); > + > + spice_qxl_gl_scanout2(&ssd->qxl, fds, width, height, > offsets, strides, > + num_planes, fourcc, modifier, false); > } > } else { > - stride = qemu_dmabuf_get_stride(dmabuf)[0]; > + int fds[DMABUF_MAX_PLANES]; > + > fourcc = qemu_dmabuf_get_fourcc(dmabuf); > y_0_top = qemu_dmabuf_get_y0_top(dmabuf); > - qemu_dmabuf_dup_fd(dmabuf, &fd); > + qemu_dmabuf_dup_fd(dmabuf, fds); > > trace_qemu_spice_gl_forward_dmabuf(ssd->qxl.id, width, height); > /* note: spice server will close the fd, so hand over a dup */ > - spice_qxl_gl_scanout(&ssd->qxl, fd, width, height, > - stride, fourcc, y_0_top); > + spice_qxl_gl_scanout2(&ssd->qxl, fds, width, height, > + qemu_dmabuf_get_offset(dmabuf), > + qemu_dmabuf_get_stride(dmabuf), > + qemu_dmabuf_get_num_planes(dmabuf), > + fourcc, > + qemu_dmabuf_get_modifier(dmabuf), > + y_0_top); > } > qemu_spice_gl_monitor_config(ssd, 0, 0, width, height); > ssd->guest_dmabuf_refresh = false; > -- > 2.43.0 > > -- Marc-André Lureau