Mesa (master): egl_dri2: Flush before context switch and swap buffers.
Chia-I Wu
olv at kemper.freedesktop.org
Tue Apr 6 11:56:12 UTC 2010
Module: Mesa
Branch: master
Commit: d18d0fdcd8daa0d9979b72978795f0305d2db7c8
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=d18d0fdcd8daa0d9979b72978795f0305d2db7c8
Author: Chia-I Wu <olv at lunarg.com>
Date: Tue Apr 6 19:52:39 2010 +0800
egl_dri2: Flush before context switch and swap buffers.
DRI does not define any callback to flush the current context. GLX
loader simply calls glFlush. Follow the GLX loader here.
---
src/egl/drivers/dri2/egl_dri2.c | 18 ++++++++++++++++++
1 files changed, 18 insertions(+), 0 deletions(-)
diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c
index 15b3529..d941d82 100644
--- a/src/egl/drivers/dri2/egl_dri2.c
+++ b/src/egl/drivers/dri2/egl_dri2.c
@@ -54,6 +54,8 @@
struct dri2_egl_driver
{
_EGLDriver base;
+
+ void (*glFlush)(void);
};
struct dri2_egl_display
@@ -873,6 +875,7 @@ static EGLBoolean
dri2_make_current(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *dsurf,
_EGLSurface *rsurf, _EGLContext *ctx)
{
+ struct dri2_egl_driver *dri2_drv = dri2_egl_driver(drv);
struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
struct dri2_egl_surface *dri2_dsurf = dri2_egl_surface(dsurf);
struct dri2_egl_surface *dri2_rsurf = dri2_egl_surface(rsurf);
@@ -884,6 +887,10 @@ dri2_make_current(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *dsurf,
if (!_eglBindContext(&ctx, &dsurf, &rsurf))
return EGL_FALSE;
+ /* flush before context switch */
+ if (ctx && dri2_drv->glFlush)
+ dri2_drv->glFlush();
+
ddraw = (dri2_dsurf) ? dri2_dsurf->dri_drawable : NULL;
rdraw = (dri2_rsurf) ? dri2_rsurf->dri_drawable : NULL;
cctx = (dri2_ctx) ? dri2_ctx->dri_context : NULL;
@@ -1011,10 +1018,18 @@ dri2_create_pbuffer_surface(_EGLDriver *drv, _EGLDisplay *disp,
static EGLBoolean
dri2_swap_buffers(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *draw)
{
+ struct dri2_egl_driver *dri2_drv = dri2_egl_driver(drv);
struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
struct dri2_egl_surface *dri2_surf = dri2_egl_surface(draw);
+ _EGLContext *ctx;
xcb_dri2_copy_region_cookie_t cookie;
+ if (dri2_drv->glFlush) {
+ ctx = _eglGetCurrentContext();
+ if (ctx && ctx->DrawSurface == &dri2_surf->base)
+ dri2_drv->glFlush();
+ }
+
(*dri2_dpy->flush->flush)(dri2_surf->dri_drawable);
#if 0
@@ -1352,5 +1367,8 @@ _eglMain(const char *args)
dri2_drv->base.Name = "DRI2";
dri2_drv->base.Unload = dri2_unload;
+ dri2_drv->glFlush =
+ (void (*)(void)) dri2_get_proc_address(&dri2_drv->base, "glFlush");
+
return &dri2_drv->base;
}
More information about the mesa-commit
mailing list