On Mon, Mar 24, 2025 at 5:30 PM Marc-André Lureau
<[email protected]> wrote:
>
> Hi
>
> On Mon, Mar 24, 2025 at 12:20 PM <[email protected]> wrote:
> >
> > From: Qiang Yu <[email protected]>
> >
> > Signed-off-by: Qiang Yu <[email protected]>
> > ---
> > 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.
>
I'm not familiar with how qemu handle new API dependency, but isn't it much
convenient to just bump lib version instead of a macro all around? And I can't
see similar macro in meson.build
>
> > 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