diff options
author | Chia-I Wu <[email protected]> | 2010-04-06 19:52:39 +0800 |
---|---|---|
committer | Chia-I Wu <[email protected]> | 2010-04-06 19:54:06 +0800 |
commit | d18d0fdcd8daa0d9979b72978795f0305d2db7c8 (patch) | |
tree | 87e1294208f2ef9a44a725b70e704dfd1ba21199 | |
parent | 7915151f2d05e175d00e739e9a3fead922e60096 (diff) |
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.
-rw-r--r-- | 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 15b3529cd29..d941d82efb8 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; } |