From: Dave Airlie <airl...@redhat.com> This keeps track of the creation process and stores a drawable type, it then blocks DRI2 from getting called if the drawable is a pixmap.
v2: check if we have a GLX drawable, which means we aren't a pbuffer, avoid doing flush at all since its meant to be a no-op. Suggested by Michel Dänzer <mic...@daenzer.net> Signed-off-by: Dave Airlie <airl...@redhat.com> --- src/glx/glx_pbuffer.c | 3 ++- src/glx/glxclient.h | 3 ++- src/glx/glxcmds.c | 10 ++++++++-- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/glx/glx_pbuffer.c b/src/glx/glx_pbuffer.c index 6738252..4bc3292 100644 --- a/src/glx/glx_pbuffer.c +++ b/src/glx/glx_pbuffer.c @@ -434,7 +434,8 @@ CreateDrawable(Display *dpy, struct glx_config *config, UnlockDisplay(dpy); SyncHandle(); - if (InitGLXDrawable(dpy, glxDraw, drawable, xid)) { + if (InitGLXDrawable(dpy, glxDraw, drawable, xid, + (glxCode == X_GLXCreatePixmap) ? GLX_PIXMAP_BIT : GLX_WINDOW_BIT)) { free(glxDraw); return None; } diff --git a/src/glx/glxclient.h b/src/glx/glxclient.h index f915426..a47a2f7 100644 --- a/src/glx/glxclient.h +++ b/src/glx/glxclient.h @@ -585,6 +585,7 @@ struct glx_drawable { XID xDrawable; XID drawable; + uint32_t drawableType; uint32_t lastEventSbc; int64_t eventSbcWrap; }; @@ -797,7 +798,7 @@ applegl_create_display(struct glx_display *display); extern struct glx_drawable *GetGLXDrawable(Display *dpy, GLXDrawable drawable); extern int InitGLXDrawable(Display *dpy, struct glx_drawable *glxDraw, - XID xDrawable, GLXDrawable drawable); + XID xDrawable, GLXDrawable drawable, uint32_t drawableType); extern void DestroyGLXDrawable(Display *dpy, GLXDrawable drawable); extern struct glx_context dummyContext; diff --git a/src/glx/glxcmds.c b/src/glx/glxcmds.c index c8ec9c2..634f0c5 100644 --- a/src/glx/glxcmds.c +++ b/src/glx/glxcmds.c @@ -107,7 +107,7 @@ GetGLXDrawable(Display *dpy, GLXDrawable drawable) _X_HIDDEN int InitGLXDrawable(Display *dpy, struct glx_drawable *glxDraw, XID xDrawable, - GLXDrawable drawable) + GLXDrawable drawable, uint32_t drawableType) { struct glx_display *priv = __glXInitialize(dpy); @@ -118,6 +118,7 @@ InitGLXDrawable(Display *dpy, struct glx_drawable *glxDraw, XID xDrawable, glxDraw->drawable = drawable; glxDraw->lastEventSbc = 0; glxDraw->eventSbcWrap = 0; + glxDraw->drawableType = drawableType; return __glxHashInsert(priv->glXDrawHash, drawable, glxDraw); } @@ -678,7 +679,7 @@ glXCreateGLXPixmap(Display * dpy, XVisualInfo * vis, Pixmap pixmap) UnlockDisplay(dpy); SyncHandle(); - if (InitGLXDrawable(dpy, glxDraw, pixmap, req->glxpixmap)) { + if (InitGLXDrawable(dpy, glxDraw, pixmap, req->glxpixmap, GLX_PIXMAP_BIT)) { free(glxDraw); return None; } @@ -796,6 +797,11 @@ glXSwapBuffers(Display * dpy, GLXDrawable drawable) #if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL) { __GLXDRIdrawable *pdraw = GetGLXDRIDrawable(dpy, drawable); + struct glx_drawable *glx_draw = GetGLXDrawable(dpy, drawable); + + /* GLX specifies a swapbuffer on a Pixmap to be a no-op. */ + if (glx_draw && glx_draw->drawableType == GLX_PIXMAP_BIT) + return; if (pdraw != NULL) { if (gc && drawable == gc->currentDrawable) { -- 1.7.6.4 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev