[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH 3/9] ui/console: add opengl context and scanout
From: |
Marc-André Lureau |
Subject: |
Re: [Qemu-devel] [PATCH 3/9] ui/console: add opengl context and scanout support interfaces. |
Date: |
Thu, 10 Sep 2015 14:40:54 +0200 |
On Wed, Sep 9, 2015 at 1:20 PM, Gerd Hoffmann <address@hidden> wrote:
> Add callbacks for opengl context management and scanout texture
> configuration to DisplayChangeListenerOps.
>
> Signed-off-by: Gerd Hoffmann <address@hidden>
> ---
> include/ui/console.h | 36 ++++++++++++++++++++++++++++
> ui/console.c | 67
> ++++++++++++++++++++++++++++++++++++++++++++++++++--
> 2 files changed, 101 insertions(+), 2 deletions(-)
>
> diff --git a/include/ui/console.h b/include/ui/console.h
> index 047a2b4..df92ccd 100644
> --- a/include/ui/console.h
> +++ b/include/ui/console.h
> @@ -157,6 +157,13 @@ void cursor_set_mono(QEMUCursor *c,
> void cursor_get_mono_image(QEMUCursor *c, int foreground, uint8_t *mask);
> void cursor_get_mono_mask(QEMUCursor *c, int transparent, uint8_t *mask);
>
> +typedef void *qemu_gl_context;
> +
> +struct qemu_gl_params {
> + int major_ver;
> + int minor_ver;
> +};
> +
> typedef struct DisplayChangeListenerOps {
> const char *dpy_name;
>
> @@ -183,6 +190,21 @@ typedef struct DisplayChangeListenerOps {
> int x, int y, int on);
> void (*dpy_cursor_define)(DisplayChangeListener *dcl,
> QEMUCursor *cursor);
> +
> + qemu_gl_context (*dpy_gl_ctx_create)(DisplayChangeListener *dcl,
> + struct qemu_gl_params *params);
> + void (*dpy_gl_ctx_destroy)(DisplayChangeListener *dcl,
> + qemu_gl_context ctx);
> + int (*dpy_gl_ctx_make_current)(DisplayChangeListener *dcl,
> + qemu_gl_context ctx);
> + qemu_gl_context (*dpy_gl_ctx_get_current)(DisplayChangeListener *dcl);
> +
> + void (*dpy_gl_scanout)(DisplayChangeListener *dcl,
> + uint32_t backing_id, bool backing_y_0_top,
> + uint32_t x, uint32_t y, uint32_t w, uint32_t h);
> + void (*dpy_gl_update)(DisplayChangeListener *dcl,
> + uint32_t x, uint32_t y, uint32_t w, uint32_t h);
> +
> } DisplayChangeListenerOps;
>
> struct DisplayChangeListener {
> @@ -244,6 +266,20 @@ bool dpy_cursor_define_supported(QemuConsole *con);
> bool dpy_gfx_check_format(QemuConsole *con,
> pixman_format_code_t format);
>
> +void dpy_gl_scanout(QemuConsole *con,
> + uint32_t backing_id, bool backing_y_0_top,
> + uint32_t x, uint32_t y, uint32_t w, uint32_t h);
> +void dpy_gl_update(QemuConsole *con,
> + uint32_t x, uint32_t y, uint32_t w, uint32_t h);
> +
> +qemu_gl_context dpy_gl_ctx_create(QemuConsole *con,
> + struct qemu_gl_params *params);
> +void dpy_gl_ctx_destroy(QemuConsole *con, qemu_gl_context ctx);
> +int dpy_gl_ctx_make_current(QemuConsole *con, qemu_gl_context ctx);
> +qemu_gl_context dpy_gl_ctx_get_current(QemuConsole *con);
> +
> +bool console_has_gl(QemuConsole *con);
> +
> static inline int surface_stride(DisplaySurface *s)
> {
> return pixman_image_get_stride(s->image);
> diff --git a/ui/console.c b/ui/console.c
> index 75fc492..61e45af 100644
> --- a/ui/console.c
> +++ b/ui/console.c
> @@ -121,6 +121,7 @@ struct QemuConsole {
> DisplayState *ds;
> DisplaySurface *surface;
> int dcls;
> + DisplayChangeListener *gl;
>
> /* Graphic console state. */
> Object *device;
> @@ -1332,6 +1333,11 @@ void qemu_free_displaysurface(DisplaySurface *surface)
> g_free(surface);
> }
>
> +bool console_has_gl(QemuConsole *con)
> +{
> + return con->gl != NULL;
> +}
> +
> void register_displaychangelistener(DisplayChangeListener *dcl)
> {
> static const char nodev[] =
> @@ -1339,6 +1345,17 @@ void
> register_displaychangelistener(DisplayChangeListener *dcl)
> static DisplaySurface *dummy;
> QemuConsole *con;
>
> + if (dcl->ops->dpy_gl_ctx_create) {
> + /* display has opengl support */
> + assert(dcl->con);
> + if (dcl->con->gl) {
> + fprintf(stderr, "can't register two opengl displays (%s, %s)\n",
> + dcl->ops->dpy_name, dcl->con->gl->ops->dpy_name);
> + exit(1);
> + }
> + dcl->con->gl = dcl;
> + }
> +
> trace_displaychangelistener_register(dcl, dcl->ops->dpy_name);
> dcl->ds = get_alloc_displaystate();
> QLIST_INSERT_HEAD(&dcl->ds->listeners, dcl, next);
> @@ -1417,9 +1434,13 @@ void dpy_gfx_update(QemuConsole *con, int x, int y,
> int w, int h)
> {
> DisplayState *s = con->ds;
> DisplayChangeListener *dcl;
> - int width = surface_width(con->surface);
> - int height = surface_height(con->surface);
> + int width = w;
> + int height = h;
>
> + if (con->surface) {
> + width = surface_width(con->surface);
> + height = surface_height(con->surface);
> + }
> x = MAX(x, 0);
> y = MAX(y, 0);
> x = MIN(x, width);
> @@ -1619,6 +1640,48 @@ bool dpy_cursor_define_supported(QemuConsole *con)
> return false;
> }
>
> +qemu_gl_context dpy_gl_ctx_create(QemuConsole *con,
> + struct qemu_gl_params *qparams)
> +{
> + assert(con->gl);
> + return con->gl->ops->dpy_gl_ctx_create(con->gl, qparams);
> +}
> +
> +void dpy_gl_ctx_destroy(QemuConsole *con, qemu_gl_context ctx)
> +{
> + assert(con->gl);
> + con->gl->ops->dpy_gl_ctx_destroy(con->gl, ctx);
> +}
> +
> +int dpy_gl_ctx_make_current(QemuConsole *con, qemu_gl_context ctx)
> +{
> + assert(con->gl);
> + return con->gl->ops->dpy_gl_ctx_make_current(con->gl, ctx);
> +}
> +
> +qemu_gl_context dpy_gl_ctx_get_current(QemuConsole *con)
> +{
> + assert(con->gl);
> + return con->gl->ops->dpy_gl_ctx_get_current(con->gl);
> +}
> +
> +void dpy_gl_scanout(QemuConsole *con,
> + uint32_t backing_id, bool backing_y_0_top,
> + uint32_t x, uint32_t y, uint32_t width, uint32_t height)
> +{
> + assert(con->gl);
> + con->gl->ops->dpy_gl_scanout(con->gl, backing_id,
> + backing_y_0_top,
> + x, y, width, height);
> +}
> +
> +void dpy_gl_update(QemuConsole *con,
> + uint32_t x, uint32_t y, uint32_t w, uint32_t h)
> +{
> + assert(con->gl);
> + con->gl->ops->dpy_gl_update(con->gl, x, y, w, h);
> +}
> +
> /***********************************************************/
> /* register display */
>
> --
> 1.8.3.1
>
>
dpy_gl_scanout() will eventually need to be extended to provide more
details, but that can be changed later.
Reviewed-by: Marc-André Lureau <address@hidden>
--
Marc-André Lureau
- Re: [Qemu-devel] [PATCH 1/9] shaders: initialize vertexes once, (continued)
Re: [Qemu-devel] [PATCH 1/9] shaders: initialize vertexes once, Max Reitz, 2015/09/14
[Qemu-devel] [PATCH 2/9] sdl2: quick & dirty flicker workaround, Gerd Hoffmann, 2015/09/09
[Qemu-devel] [PATCH 3/9] ui/console: add opengl context and scanout support interfaces., Gerd Hoffmann, 2015/09/09
[Qemu-devel] [PATCH 9/9] gtk/opengl: add opengl context and scanout support (GtkGLArea), Gerd Hoffmann, 2015/09/09
[Qemu-devel] [PATCH 8/9] gtk/opengl: add opengl context and scanout support (egl), Gerd Hoffmann, 2015/09/09
[Qemu-devel] [PATCH 5/9] virtio-gpu: add 3d mode and virgl rendering support., Gerd Hoffmann, 2015/09/09