[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 07/18] gl: allow to keep current context in ctx-crea
From: |
Marc-André Lureau |
Subject: |
[Qemu-devel] [PATCH 07/18] gl: allow to keep current context in ctx-create |
Date: |
Mon, 5 Sep 2016 02:20:28 +0400 |
Each thread may have its own context (having the same context shared
with several threads is wrong).
Signed-off-by: Marc-André Lureau <address@hidden>
---
hw/display/virtio-gpu-3d.c | 9 ++++++++-
hw/display/virtio-gpu.c | 2 +-
ui/console.c | 5 +++--
ui/gtk-egl.c | 9 ++++++---
ui/gtk-gl-area.c | 3 ++-
ui/sdl2-gl.c | 7 +++++--
ui/spice-display.c | 10 +++++++---
include/ui/console.h | 6 ++++--
include/ui/gtk.h | 6 ++++--
include/ui/sdl2.h | 3 ++-
10 files changed, 42 insertions(+), 18 deletions(-)
diff --git a/hw/display/virtio-gpu-3d.c b/hw/display/virtio-gpu-3d.c
index 6381e78..8f068b5 100644
--- a/hw/display/virtio-gpu-3d.c
+++ b/hw/display/virtio-gpu-3d.c
@@ -543,11 +543,18 @@ virgl_create_context(void *opaque, int scanout_idx,
VirtIOGPU *g = opaque;
QEMUGLContext ctx;
QEMUGLParams qparams;
+ bool make_current = true;
qparams.major_ver = params->major_ver;
qparams.minor_ver = params->minor_ver;
- ctx = dpy_gl_ctx_create(g->scanout[scanout_idx].con, &qparams);
+ if (g->thread_ctx) {
+ dpy_gl_ctx_make_current(g->scanout[scanout_idx].con, g->thread_ctx);
+ make_current = false;
+ }
+
+ ctx = dpy_gl_ctx_create(g->scanout[scanout_idx].con,
+ &qparams, make_current);
return (virgl_renderer_gl_context)ctx;
}
diff --git a/hw/display/virtio-gpu.c b/hw/display/virtio-gpu.c
index a238090..9a768c5 100644
--- a/hw/display/virtio-gpu.c
+++ b/hw/display/virtio-gpu.c
@@ -968,7 +968,7 @@ static void virtio_gpu_gl_register(DisplayChangeListener
*dcl,
}
if (g->iothread && !g->thread_ctx) {
- g->thread_ctx = dpy_gl_ctx_create(dcl->con, &qparams);
+ g->thread_ctx = dpy_gl_ctx_create(dcl->con, &qparams, true);
}
}
diff --git a/ui/console.c b/ui/console.c
index a2e410e..5174a3f 100644
--- a/ui/console.c
+++ b/ui/console.c
@@ -1693,10 +1693,11 @@ bool dpy_gl_ctx_is_mt_safe(QemuConsole *con)
}
QEMUGLContext dpy_gl_ctx_create(QemuConsole *con,
- struct QEMUGLParams *qparams)
+ struct QEMUGLParams *qparams,
+ bool make_current)
{
assert(con->gl);
- return con->gl->ops->dpy_gl_ctx_create(con->gl, qparams);
+ return con->gl->ops->dpy_gl_ctx_create(con->gl, qparams, make_current);
}
void dpy_gl_ctx_destroy(QemuConsole *con, QEMUGLContext ctx)
diff --git a/ui/gtk-egl.c b/ui/gtk-egl.c
index 3f5d328..5bc0ef4 100644
--- a/ui/gtk-egl.c
+++ b/ui/gtk-egl.c
@@ -161,12 +161,15 @@ void gd_egl_switch(DisplayChangeListener *dcl,
}
QEMUGLContext gd_egl_create_context(DisplayChangeListener *dcl,
- QEMUGLParams *params)
+ QEMUGLParams *params,
+ bool make_current)
{
VirtualConsole *vc = container_of(dcl, VirtualConsole, gfx.dcl);
- eglMakeCurrent(qemu_egl_display, vc->gfx.esurface,
- vc->gfx.esurface, vc->gfx.ectx);
+ if (make_current) {
+ eglMakeCurrent(qemu_egl_display, vc->gfx.esurface,
+ vc->gfx.esurface, vc->gfx.ectx);
+ }
return qemu_egl_create_context(dcl, params);
}
diff --git a/ui/gtk-gl-area.c b/ui/gtk-gl-area.c
index 0df5a36..2eacd48 100644
--- a/ui/gtk-gl-area.c
+++ b/ui/gtk-gl-area.c
@@ -145,7 +145,8 @@ void gd_gl_area_switch(DisplayChangeListener *dcl,
}
QEMUGLContext gd_gl_area_create_context(DisplayChangeListener *dcl,
- QEMUGLParams *params)
+ QEMUGLParams *params,
+ bool make_curent)
{
VirtualConsole *vc = container_of(dcl, VirtualConsole, gfx.dcl);
GdkWindow *window;
diff --git a/ui/sdl2-gl.c b/ui/sdl2-gl.c
index 039645d..3a744be 100644
--- a/ui/sdl2-gl.c
+++ b/ui/sdl2-gl.c
@@ -139,14 +139,17 @@ void sdl2_gl_redraw(struct sdl2_console *scon)
}
QEMUGLContext sdl2_gl_create_context(DisplayChangeListener *dcl,
- QEMUGLParams *params)
+ QEMUGLParams *params,
+ bool make_current)
{
struct sdl2_console *scon = container_of(dcl, struct sdl2_console, dcl);
SDL_GLContext ctx;
assert(scon->opengl);
- SDL_GL_MakeCurrent(scon->real_window, scon->winctx);
+ if (make_current) {
+ SDL_GL_MakeCurrent(scon->real_window, scon->winctx);
+ }
SDL_GL_SetAttribute(SDL_GL_SHARE_WITH_CURRENT_CONTEXT, 1);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK,
diff --git a/ui/spice-display.c b/ui/spice-display.c
index 1c916dd..15a322d 100644
--- a/ui/spice-display.c
+++ b/ui/spice-display.c
@@ -851,10 +851,14 @@ static void qemu_spice_gl_block_timer(void *opaque)
}
static QEMUGLContext qemu_spice_gl_create_context(DisplayChangeListener *dcl,
- QEMUGLParams *params)
+ QEMUGLParams *params,
+ bool make_current)
{
- eglMakeCurrent(qemu_egl_display, EGL_NO_SURFACE, EGL_NO_SURFACE,
- qemu_egl_rn_ctx);
+ if (make_current) {
+ eglMakeCurrent(qemu_egl_display, EGL_NO_SURFACE, EGL_NO_SURFACE,
+ qemu_egl_rn_ctx);
+ }
+
return qemu_egl_create_context(dcl, params);
}
diff --git a/include/ui/console.h b/include/ui/console.h
index ed5975f..a1891b7 100644
--- a/include/ui/console.h
+++ b/include/ui/console.h
@@ -208,7 +208,8 @@ typedef struct DisplayChangeListenerOps {
QEMUCursor *cursor);
QEMUGLContext (*dpy_gl_ctx_create)(DisplayChangeListener *dcl,
- QEMUGLParams *params);
+ QEMUGLParams *params,
+ bool make_current);
void (*dpy_gl_ctx_destroy)(DisplayChangeListener *dcl,
QEMUGLContext ctx);
int (*dpy_gl_ctx_make_current)(DisplayChangeListener *dcl,
@@ -292,7 +293,8 @@ void dpy_gl_update(QemuConsole *con,
uint32_t x, uint32_t y, uint32_t w, uint32_t h);
QEMUGLContext dpy_gl_ctx_create(QemuConsole *con,
- QEMUGLParams *params);
+ QEMUGLParams *params,
+ bool make_current);
void dpy_gl_ctx_destroy(QemuConsole *con, QEMUGLContext ctx);
int dpy_gl_ctx_make_current(QemuConsole *con, QEMUGLContext ctx);
QEMUGLContext dpy_gl_ctx_get_current(QemuConsole *con);
diff --git a/include/ui/gtk.h b/include/ui/gtk.h
index 42ca0fe..c1240be 100644
--- a/include/ui/gtk.h
+++ b/include/ui/gtk.h
@@ -98,7 +98,8 @@ void gd_egl_refresh(DisplayChangeListener *dcl);
void gd_egl_switch(DisplayChangeListener *dcl,
DisplaySurface *surface);
QEMUGLContext gd_egl_create_context(DisplayChangeListener *dcl,
- QEMUGLParams *params);
+ QEMUGLParams *params,
+ bool make_current);
void gd_egl_scanout(DisplayChangeListener *dcl,
uint32_t backing_id, bool backing_y_0_top,
uint32_t backing_width, uint32_t backing_height,
@@ -119,7 +120,8 @@ void gd_gl_area_refresh(DisplayChangeListener *dcl);
void gd_gl_area_switch(DisplayChangeListener *dcl,
DisplaySurface *surface);
QEMUGLContext gd_gl_area_create_context(DisplayChangeListener *dcl,
- QEMUGLParams *params);
+ QEMUGLParams *params,
+ bool make_current);
void gd_gl_area_destroy_context(DisplayChangeListener *dcl,
QEMUGLContext ctx);
void gd_gl_area_scanout(DisplayChangeListener *dcl,
diff --git a/include/ui/sdl2.h b/include/ui/sdl2.h
index 683bb6a..64d1b25 100644
--- a/include/ui/sdl2.h
+++ b/include/ui/sdl2.h
@@ -56,7 +56,8 @@ void sdl2_gl_refresh(DisplayChangeListener *dcl);
void sdl2_gl_redraw(struct sdl2_console *scon);
QEMUGLContext sdl2_gl_create_context(DisplayChangeListener *dcl,
- QEMUGLParams *params);
+ QEMUGLParams *params,
+ bool make_current);
void sdl2_gl_destroy_context(DisplayChangeListener *dcl, QEMUGLContext ctx);
int sdl2_gl_make_context_current(DisplayChangeListener *dcl,
QEMUGLContext ctx);
--
2.9.0
- [Qemu-devel] [PATCH 00/18] virgl: use a seperate rendering thread, Marc-André Lureau, 2016/09/04
- [Qemu-devel] [PATCH 02/18] console: add dpy_gl_ctx_is_mt_safe, Marc-André Lureau, 2016/09/04
- [Qemu-devel] [PATCH 04/18] virtio-gpu: start splitting scanout/resource flushing, Marc-André Lureau, 2016/09/04
- [Qemu-devel] [PATCH 01/18] console: skip same-size resize, Marc-André Lureau, 2016/09/04
- [Qemu-devel] [PATCH 03/18] virtio-gpu: add "iothread" property, Marc-André Lureau, 2016/09/04
- [Qemu-devel] [PATCH 05/18] virtio-gpu: start introducing a lock around the display info, Marc-André Lureau, 2016/09/04
- [Qemu-devel] [PATCH 06/18] virtio-gpu: create a thread context, Marc-André Lureau, 2016/09/04
- [Qemu-devel] [PATCH 08/18] gl: bind GL api before context creation, Marc-André Lureau, 2016/09/04
- [Qemu-devel] [PATCH 07/18] gl: allow to keep current context in ctx-create,
Marc-André Lureau <=
- [Qemu-devel] [PATCH 09/18] bitmap: add a simple foreach util, Marc-André Lureau, 2016/09/04
- [Qemu-devel] [PATCH 11/18] virtio-gpu: use a bh for cursor modifications, Marc-André Lureau, 2016/09/04
- [Qemu-devel] [PATCH 10/18] virtio-blk: use bitmap_foreach, Marc-André Lureau, 2016/09/04
- [Qemu-devel] [PATCH 12/18] virtio-gpu: save a pointer from virtio_gpu_ctrl_command, Marc-André Lureau, 2016/09/04
- [Qemu-devel] [PATCH 14/18] virtio-gpu: batch virtio_notify when using a data-plane, Marc-André Lureau, 2016/09/04
- [Qemu-devel] [PATCH 13/18] virtio-gpu: add a virgl data-plane, Marc-André Lureau, 2016/09/04
- [Qemu-devel] [PATCH 16/18] virtio-gpu: use virgl thread sync with the data-plane, Marc-André Lureau, 2016/09/04
- [Qemu-devel] [PATCH 15/18] virtio-gpu: dispatch to main thread for scanout & flush, Marc-André Lureau, 2016/09/04
- [Qemu-devel] [PATCH 17/18] virtio-gpu: schedule a bh to unblock the data-plane, Marc-André Lureau, 2016/09/04
- [Qemu-devel] [PATCH 18/18] virtio-gpu: start/stop the data-plane, Marc-André Lureau, 2016/09/04