summaryrefslogtreecommitdiffstats
path: root/src/glx
diff options
context:
space:
mode:
Diffstat (limited to 'src/glx')
-rw-r--r--src/glx/dri2_glx.c3
-rw-r--r--src/glx/glxext.c11
-rw-r--r--src/glx/indirect.c15
-rw-r--r--src/glx/indirect.h1
-rw-r--r--src/glx/indirect_init.c4
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;