From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:33659) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bnMll-0000m6-46 for qemu-devel@nongnu.org; Fri, 23 Sep 2016 05:27:47 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1bnMlg-0006LX-Q7 for qemu-devel@nongnu.org; Fri, 23 Sep 2016 05:27:44 -0400 Received: from mail-lf0-f67.google.com ([209.85.215.67]:35144) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bnMlg-0006LN-DL for qemu-devel@nongnu.org; Fri, 23 Sep 2016 05:27:40 -0400 Received: by mail-lf0-f67.google.com with SMTP id s64so5359405lfs.2 for ; Fri, 23 Sep 2016 02:27:40 -0700 (PDT) MIME-Version: 1.0 References: <1474617028-3979-1-git-send-email-kraxel@redhat.com> <1474617028-3979-3-git-send-email-kraxel@redhat.com> In-Reply-To: <1474617028-3979-3-git-send-email-kraxel@redhat.com> From: =?UTF-8?B?TWFyYy1BbmRyw6kgTHVyZWF1?= Date: Fri, 23 Sep 2016 09:26:28 +0000 Message-ID: Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Subject: Re: [Qemu-devel] [PATCH 2/2] spice/gl: render DisplaySurface via opengl List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Gerd Hoffmann , qemu-devel@nongnu.org Hi On Fri, Sep 23, 2016 at 1:09 PM Gerd Hoffmann wrote: > This switches over spice (in opengl mode) to render DisplaySurface > updates into a opengl texture, using the helper functions in > ui/console-gl.c. With this patch applied spice (with gl=3Don) will > stop using qxl rendering ops, it will use dma-buf passing all the > time, i.e. for bios/bootloader (before virtio-gpu driver is loaded) > too. > > This should improve performance even using spice (with gl=3Don) with > non-accelerated stdvga because we stop squeezing all display updates > through a unix/tcp socket and basically using a shared memory transport > instead. > > Signed-off-by: Gerd Hoffmann > I have been using it for a while too, Reviewed-by: Marc-Andr=C3=A9 Lureau --- > include/ui/spice-display.h | 5 ++- > ui/spice-display.c | 92 > ++++++++++++++++++++++++++++++++++++++++++---- > 2 files changed, 88 insertions(+), 9 deletions(-) > > diff --git a/include/ui/spice-display.h b/include/ui/spice-display.h > index 42e0fdf..184d4c3 100644 > --- a/include/ui/spice-display.h > +++ b/include/ui/spice-display.h > @@ -119,7 +119,10 @@ struct SimpleSpiceDisplay { > /* opengl rendering */ > QEMUBH *gl_unblock_bh; > QEMUTimer *gl_unblock_timer; > - int dmabuf_fd; > + ConsoleGLState *gls; > + int gl_updates; > + bool have_scanout; > + bool have_surface; > #endif > }; > > diff --git a/ui/spice-display.c b/ui/spice-display.c > index 99132b6..5e6f78a 100644 > --- a/ui/spice-display.c > +++ b/ui/spice-display.c > @@ -850,6 +850,74 @@ static void qemu_spice_gl_block_timer(void *opaque) > fprintf(stderr, "WARNING: spice: no gl-draw-done within one > second\n"); > } > > +static void spice_gl_refresh(DisplayChangeListener *dcl) > +{ > + SimpleSpiceDisplay *ssd =3D container_of(dcl, SimpleSpiceDisplay, dc= l); > + uint64_t cookie; > + > + if (!ssd->ds || qemu_console_is_gl_blocked(ssd->dcl.con)) { > + return; > + } > + > + graphic_hw_update(dcl->con); > + if (ssd->gl_updates && ssd->have_surface) { > + qemu_spice_gl_block(ssd, true); > + cookie =3D (uintptr_t)qxl_cookie_new(QXL_COOKIE_TYPE_GL_DRAW_DON= E, > 0); > + spice_qxl_gl_draw_async(&ssd->qxl, 0, 0, > + surface_width(ssd->ds), > + surface_height(ssd->ds), > + cookie); > + ssd->gl_updates =3D 0; > + } > +} > + > +static void spice_gl_update(DisplayChangeListener *dcl, > + int x, int y, int w, int h) > +{ > + SimpleSpiceDisplay *ssd =3D container_of(dcl, SimpleSpiceDisplay, dc= l); > + > + surface_gl_update_texture(ssd->gls, ssd->ds, x, y, w, h); > + ssd->gl_updates++; > +} > + > +static void spice_gl_switch(DisplayChangeListener *dcl, > + struct DisplaySurface *new_surface) > +{ > + SimpleSpiceDisplay *ssd =3D container_of(dcl, SimpleSpiceDisplay, dc= l); > + EGLint stride, fourcc; > + int fd; > + > + if (ssd->ds) { > + surface_gl_destroy_texture(ssd->gls, ssd->ds); > + } > + ssd->ds =3D new_surface; > + if (ssd->ds) { > + surface_gl_create_texture(ssd->gls, ssd->ds); > + fd =3D egl_get_fd_for_texture(ssd->ds->texture, > + &stride, &fourcc); > + if (fd < 0) { > + surface_gl_destroy_texture(ssd->gls, ssd->ds); > + return; > + } > + > + dprint(1, "%s: %dx%d (stride %d/%d, fourcc 0x%x)\n", __func__, > + surface_width(ssd->ds), surface_height(ssd->ds), > + surface_stride(ssd->ds), stride, fourcc); > + > + /* note: spice server will close the fd */ > + spice_qxl_gl_scanout(&ssd->qxl, fd, > + surface_width(ssd->ds), > + surface_height(ssd->ds), > + stride, fourcc, false); > + ssd->have_surface =3D true; > + ssd->have_scanout =3D false; > + > + qemu_spice_gl_monitor_config(ssd, 0, 0, > + surface_width(ssd->ds), > + surface_height(ssd->ds)); > + } > +} > + > static QEMUGLContext qemu_spice_gl_create_context(DisplayChangeListener > *dcl, > QEMUGLParams *params) > { > @@ -887,6 +955,8 @@ static void > qemu_spice_gl_scanout(DisplayChangeListener *dcl, > /* note: spice server will close the fd */ > spice_qxl_gl_scanout(&ssd->qxl, fd, backing_width, backing_height, > stride, fourcc, y_0_top); > + ssd->have_surface =3D false; > + ssd->have_scanout =3D (tex_id !=3D 0); > > qemu_spice_gl_monitor_config(ssd, x, y, w, h); > } > @@ -897,6 +967,10 @@ static void > qemu_spice_gl_update(DisplayChangeListener *dcl, > SimpleSpiceDisplay *ssd =3D container_of(dcl, SimpleSpiceDisplay, dc= l); > uint64_t cookie; > > + if (!ssd->have_scanout) { > + return; > + } > + > dprint(2, "%s: %dx%d+%d+%d\n", __func__, w, h, x, y); > qemu_spice_gl_block(ssd, true); > cookie =3D (uintptr_t)qxl_cookie_new(QXL_COOKIE_TYPE_GL_DRAW_DONE, 0= ); > @@ -904,13 +978,13 @@ static void > qemu_spice_gl_update(DisplayChangeListener *dcl, > } > > static const DisplayChangeListenerOps display_listener_gl_ops =3D { > - .dpy_name =3D "spice-egl", > - .dpy_gfx_update =3D display_update, > - .dpy_gfx_switch =3D display_switch, > - .dpy_gfx_check_format =3D qemu_pixman_check_format, > - .dpy_refresh =3D display_refresh, > - .dpy_mouse_set =3D display_mouse_set, > - .dpy_cursor_define =3D display_mouse_define, > + .dpy_name =3D "spice-egl", > + .dpy_gfx_update =3D spice_gl_update, > + .dpy_gfx_switch =3D spice_gl_switch, > + .dpy_gfx_check_format =3D console_gl_check_format, > + .dpy_refresh =3D spice_gl_refresh, > + .dpy_mouse_set =3D display_mouse_set, > + .dpy_cursor_define =3D display_mouse_define, > > .dpy_gl_ctx_create =3D qemu_spice_gl_create_context, > .dpy_gl_ctx_destroy =3D qemu_egl_destroy_context, > @@ -933,10 +1007,12 @@ static void qemu_spice_display_init_one(QemuConsol= e > *con) > #ifdef HAVE_SPICE_GL > if (display_opengl) { > ssd->dcl.ops =3D &display_listener_gl_ops; > - ssd->dmabuf_fd =3D -1; > ssd->gl_unblock_bh =3D qemu_bh_new(qemu_spice_gl_unblock_bh, ssd= ); > ssd->gl_unblock_timer =3D timer_new_ms(QEMU_CLOCK_REALTIME, > qemu_spice_gl_block_timer, > ssd); > + ssd->gls =3D console_gl_init_context(); > + ssd->have_surface =3D false; > + ssd->have_scanout =3D false; > } > #endif > ssd->dcl.con =3D con; > -- > 1.8.3.1 > > > -- Marc-Andr=C3=A9 Lureau