diff options
author | Thomas Hellstrom <[email protected]> | 2017-08-10 15:35:39 +0200 |
---|---|---|
committer | Thomas Hellstrom <[email protected]> | 2017-08-17 07:39:42 +0200 |
commit | 2db95482964caf872f8f4b0ad6e0c34b3402c774 (patch) | |
tree | 88439f4993669e48a60935719b040d57f18543ab /src/egl/drivers | |
parent | 5198e48a0d9a991d897cf4c71fdb82ac0e43b025 (diff) |
loader_dri3/glx/egl: Optionally use a blit context for blitting operations
The code was relying on us always having a current context for client local
image blit operations. Otherwise the blit would be skipped. However,
glxSwapBuffers, for example, doesn't require a current context and that was a
common problem in the dri1 era. It seems the problem has resurfaced with dri3.
If we don't have a current context when we want to blit, try creating a private
dri context and maintain a context cache of a single context.
Signed-off-by: Thomas Hellstrom <[email protected]>
Reviewed-by: Michel Dänzer <[email protected]>
Diffstat (limited to 'src/egl/drivers')
-rw-r--r-- | src/egl/drivers/dri2/egl_dri2.c | 5 | ||||
-rw-r--r-- | src/egl/drivers/dri2/egl_dri2.h | 2 | ||||
-rw-r--r-- | src/egl/drivers/dri2/platform_x11_dri3.c | 9 |
3 files changed, 15 insertions, 1 deletions
diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c index 975d39d1e49..ed79e0d0a35 100644 --- a/src/egl/drivers/dri2/egl_dri2.c +++ b/src/egl/drivers/dri2/egl_dri2.c @@ -945,8 +945,11 @@ dri2_display_destroy(_EGLDisplay *disp) { struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp); - if (dri2_dpy->own_dri_screen) + if (dri2_dpy->own_dri_screen) { + if (dri2_dpy->vtbl->close_screen_notify) + dri2_dpy->vtbl->close_screen_notify(disp); dri2_dpy->core->destroyScreen(dri2_dpy->dri_screen); + } if (dri2_dpy->fd >= 0) close(dri2_dpy->fd); if (dri2_dpy->driver) diff --git a/src/egl/drivers/dri2/egl_dri2.h b/src/egl/drivers/dri2/egl_dri2.h index 751e7a4e2f3..f471561ed0c 100644 --- a/src/egl/drivers/dri2/egl_dri2.h +++ b/src/egl/drivers/dri2/egl_dri2.h @@ -154,6 +154,8 @@ struct dri2_egl_display_vtbl { EGLuint64KHR *sbc); __DRIdrawable *(*get_dri_drawable)(_EGLSurface *surf); + + void (*close_screen_notify)(_EGLDisplay *dpy); }; struct dri2_egl_display diff --git a/src/egl/drivers/dri2/platform_x11_dri3.c b/src/egl/drivers/dri2/platform_x11_dri3.c index 991749803ea..290b1504732 100644 --- a/src/egl/drivers/dri2/platform_x11_dri3.c +++ b/src/egl/drivers/dri2/platform_x11_dri3.c @@ -401,6 +401,14 @@ dri3_get_dri_drawable(_EGLSurface *surf) return dri3_surf->loader_drawable.dri_drawable; } +static void +dri3_close_screen_notify(_EGLDisplay *dpy) +{ + struct dri2_egl_display *dri2_dpy = dri2_egl_display(dpy); + + loader_dri3_close_screen(dri2_dpy->dri_screen); +} + struct dri2_egl_display_vtbl dri3_x11_display_vtbl = { .authenticate = dri3_authenticate, .create_window_surface = dri3_create_window_surface, @@ -420,6 +428,7 @@ struct dri2_egl_display_vtbl dri3_x11_display_vtbl = { .create_wayland_buffer_from_image = dri2_fallback_create_wayland_buffer_from_image, .get_sync_values = dri3_get_sync_values, .get_dri_drawable = dri3_get_dri_drawable, + .close_screen_notify = dri3_close_screen_notify, }; EGLBoolean |