diff options
Diffstat (limited to 'src/glx')
-rw-r--r-- | src/glx/dri2_glx.c | 3 | ||||
-rw-r--r-- | src/glx/glxext.c | 11 | ||||
-rw-r--r-- | src/glx/indirect.c | 15 | ||||
-rw-r--r-- | src/glx/indirect.h | 1 | ||||
-rw-r--r-- | src/glx/indirect_init.c | 4 |
5 files changed, 31 insertions, 3 deletions
diff --git a/src/glx/dri2_glx.c b/src/glx/dri2_glx.c index 2c28bc2..fc0237a 100644 --- a/src/glx/dri2_glx.c +++ b/src/glx/dri2_glx.c @@ -945,6 +945,9 @@ handle_error: static void dri2DestroyDisplay(__GLXDRIdisplay * dpy) { + struct dri2_display *pdp = (struct dri2_display *) dpy; + + __glxHashDestroy(pdp->dri2Hash); Xfree(dpy); } diff --git a/src/glx/glxext.c b/src/glx/glxext.c index e35dcb7..278c719 100644 --- a/src/glx/glxext.c +++ b/src/glx/glxext.c @@ -250,19 +250,24 @@ glx_display_free(struct glx_display *priv) static int __glXCloseDisplay(Display * dpy, XExtCodes * codes) { - struct glx_display *priv, **prev; + struct glx_display *priv, **prev, *next; _XLockMutex(_Xglobal_lock); prev = &glx_displays; for (priv = glx_displays; priv; prev = &priv->next, priv = priv->next) { if (priv->dpy == dpy) { - (*prev) = priv->next; break; } } - _XUnlockMutex(_Xglobal_lock); + /* Only remove the display from the list after it's destroyed. The cleanup + * code (e.g. driReleaseDrawables()) ends up calling __glXInitialize(), + * which would create a new glx_display while we're trying to destroy this + * one. */ + next = priv->next; glx_display_free(priv); + *prev = next; + _XUnlockMutex(_Xglobal_lock); return 1; } diff --git a/src/glx/indirect.c b/src/glx/indirect.c index b2675c2..c80a237 100644 --- a/src/glx/indirect.c +++ b/src/glx/indirect.c @@ -8597,6 +8597,21 @@ __indirect_glDrawBuffersARB(GLsizei n, const GLenum * bufs) } } +#define X_GLrop_ClampColorARB 234 +void +__indirect_glClampColorARB(GLenum target, GLenum clamp) +{ + struct glx_context *const gc = __glXGetCurrentContext(); + const GLuint cmdlen = 12; + emit_header(gc->pc, X_GLrop_ClampColorARB, cmdlen); + (void) memcpy((void *) (gc->pc + 4), (void *) (&target), 4); + (void) memcpy((void *) (gc->pc + 8), (void *) (&clamp), 4); + gc->pc += cmdlen; + if (__builtin_expect(gc->pc > gc->limit, 0)) { + (void) __glXFlushRenderBuffer(gc, gc->pc); + } +} + #define X_GLrop_RenderbufferStorageMultisample 4331 void __indirect_glRenderbufferStorageMultisample(GLenum target, GLsizei samples, diff --git a/src/glx/indirect.h b/src/glx/indirect.h index b610cc2..22bdb82 100644 --- a/src/glx/indirect.h +++ b/src/glx/indirect.h @@ -573,6 +573,7 @@ extern HIDDEN void __indirect_glGetQueryObjectuivARB(GLuint id, GLenum pname, GL extern HIDDEN void __indirect_glGetQueryivARB(GLenum target, GLenum pname, GLint * params); extern HIDDEN GLboolean __indirect_glIsQueryARB(GLuint id); extern HIDDEN void __indirect_glDrawBuffersARB(GLsizei n, const GLenum * bufs); +extern HIDDEN void __indirect_glClampColorARB(GLenum target, GLenum clamp); extern HIDDEN void __indirect_glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); extern HIDDEN void __indirect_glSampleMaskSGIS(GLclampf value, GLboolean invert); extern HIDDEN void __indirect_glSamplePatternSGIS(GLenum pattern); diff --git a/src/glx/indirect_init.c b/src/glx/indirect_init.c index 9f1ee59..7bb6754 100644 --- a/src/glx/indirect_init.c +++ b/src/glx/indirect_init.c @@ -588,6 +588,10 @@ struct _glapi_table * __glXNewIndirectAPI( void ) glAPI->DrawBuffersARB = __indirect_glDrawBuffersARB; + /* 39. GL_ARB_color_buffer_float */ + + glAPI->ClampColorARB = __indirect_glClampColorARB; + /* 45. GL_ARB_framebuffer_object */ glAPI->RenderbufferStorageMultisample = __indirect_glRenderbufferStorageMultisample; |