diff options
Diffstat (limited to 'src/glx')
-rw-r--r-- | src/glx/dri2_glx.c | 16 | ||||
-rw-r--r-- | src/glx/dri_glx.c | 39 | ||||
-rw-r--r-- | src/glx/drisw_glx.c | 7 | ||||
-rw-r--r-- | src/glx/glx_pbuffer.c | 11 | ||||
-rw-r--r-- | src/glx/glxclient.h | 2 | ||||
-rw-r--r-- | src/glx/glxcmds.c | 8 | ||||
-rw-r--r-- | src/glx/glxext.c | 30 |
7 files changed, 69 insertions, 44 deletions
diff --git a/src/glx/dri2_glx.c b/src/glx/dri2_glx.c index 75b1a103f01..a275ba5b9fe 100644 --- a/src/glx/dri2_glx.c +++ b/src/glx/dri2_glx.c @@ -804,11 +804,16 @@ dri2CreateScreen(int screen, struct glx_display * priv) return NULL; memset(psc, 0, sizeof *psc); - if (!glx_screen_init(&psc->base, screen, priv)) - return NULL; + psc->fd = -1; + + if (!glx_screen_init(&psc->base, screen, priv)) { + Xfree(psc); + return NULL; + } if (!DRI2Connect(priv->dpy, RootWindow(priv->dpy, screen), &driverName, &deviceName)) { + glx_screen_cleanup(&psc->base); XFree(psc); return NULL; } @@ -918,12 +923,15 @@ dri2CreateScreen(int screen, struct glx_display * priv) return &psc->base; handle_error: + if (psc->fd >= 0) + close(psc->fd); + if (psc->driver) + dlclose(psc->driver); Xfree(driverName); Xfree(deviceName); + glx_screen_cleanup(&psc->base); XFree(psc); - /* FIXME: clean up here */ - return NULL; } diff --git a/src/glx/dri_glx.c b/src/glx/dri_glx.c index 42b263c6377..ff027dc9e9c 100644 --- a/src/glx/dri_glx.c +++ b/src/glx/dri_glx.c @@ -836,26 +836,24 @@ driCreateScreen(int screen, struct glx_display *priv) return NULL; memset(psc, 0, sizeof *psc); - if (!glx_screen_init(&psc->base, screen, priv)) - return NULL; - - if (!driGetDriverName(priv->dpy, screen, &driverName)) { + if (!glx_screen_init(&psc->base, screen, priv)) { Xfree(psc); return NULL; } + if (!driGetDriverName(priv->dpy, screen, &driverName)) { + goto cleanup; + } + psc->driver = driOpenDriver(driverName); Xfree(driverName); - if (psc->driver == NULL) { - Xfree(psc); - return NULL; - } + if (psc->driver == NULL) + goto cleanup; extensions = dlsym(psc->driver, __DRI_DRIVER_EXTENSIONS); if (extensions == NULL) { ErrorMessageF("driver exports no extensions (%s)\n", dlerror()); - Xfree(psc); - return NULL; + goto cleanup; } for (i = 0; extensions[i]; i++) { @@ -865,19 +863,14 @@ driCreateScreen(int screen, struct glx_display *priv) psc->legacy = (__DRIlegacyExtension *) extensions[i]; } - if (psc->core == NULL || psc->legacy == NULL) { - Xfree(psc); - return NULL; - } + if (psc->core == NULL || psc->legacy == NULL) + goto cleanup; pdp = (struct dri_display *) priv->driDisplay; psc->driScreen = CallCreateNewScreen(psc->base.dpy, screen, psc, pdp); - if (psc->driScreen == NULL) { - dlclose(psc->driver); - Xfree(psc); - return NULL; - } + if (psc->driScreen == NULL) + goto cleanup; extensions = psc->core->getExtensions(psc->driScreen); driBindExtensions(psc, extensions); @@ -902,6 +895,14 @@ driCreateScreen(int screen, struct glx_display *priv) psp->getSwapInterval = driGetSwapInterval; return &psc->base; + +cleanup: + if (psc->driver) + dlclose(psc->driver); + glx_screen_cleanup(&psc->base); + Xfree(psc); + + return NULL; } /* Called from __glXFreeDisplayPrivate. diff --git a/src/glx/drisw_glx.c b/src/glx/drisw_glx.c index 237ce176176..5c7f40cdffa 100644 --- a/src/glx/drisw_glx.c +++ b/src/glx/drisw_glx.c @@ -452,8 +452,10 @@ driCreateScreen(int screen, struct glx_display *priv) return NULL; memset(psc, 0, sizeof *psc); - if (!glx_screen_init(&psc->base, screen, priv)) - return NULL; + if (!glx_screen_init(&psc->base, screen, priv)) { + Xfree(psc); + return NULL; + } psc->driver = driOpenSwrast(); if (psc->driver == NULL) @@ -504,6 +506,7 @@ driCreateScreen(int screen, struct glx_display *priv) handle_error: if (psc->driver) dlclose(psc->driver); + glx_screen_cleanup(&psc->base); Xfree(psc); ErrorMessageF("reverting to indirect rendering\n"); diff --git a/src/glx/glx_pbuffer.c b/src/glx/glx_pbuffer.c index 34892e8b1a2..5f91bc623a9 100644 --- a/src/glx/glx_pbuffer.c +++ b/src/glx/glx_pbuffer.c @@ -106,7 +106,7 @@ ChangeDrawableAttribute(Display * dpy, GLXDrawable drawable, if ((priv->majorVersion > 1) || (priv->minorVersion >= 3)) { xGLXChangeDrawableAttributesReq *req; - GetReqExtra(GLXChangeDrawableAttributes, 8 + (8 * num_attribs), req); + GetReqExtra(GLXChangeDrawableAttributes, 8 * num_attribs, req); output = (CARD32 *) (req + 1); req->reqType = opcode; @@ -117,7 +117,7 @@ ChangeDrawableAttribute(Display * dpy, GLXDrawable drawable, else { xGLXVendorPrivateWithReplyReq *vpreq; - GetReqExtra(GLXVendorPrivateWithReply, 4 + (8 * num_attribs), vpreq); + GetReqExtra(GLXVendorPrivateWithReply, 8 + (8 * num_attribs), vpreq); output = (CARD32 *) (vpreq + 1); vpreq->reqType = opcode; @@ -125,7 +125,8 @@ ChangeDrawableAttribute(Display * dpy, GLXDrawable drawable, vpreq->vendorCode = X_GLXvop_ChangeDrawableAttributesSGIX; output[0] = (CARD32) drawable; - output++; + output[1] = num_attribs; + output += 2; } (void) memcpy(output, attribs, sizeof(CARD32) * 2 * num_attribs); @@ -297,7 +298,7 @@ GetDrawableAttribute(Display * dpy, GLXDrawable drawable, if (use_glx_1_3) { xGLXGetDrawableAttributesReq *req; - GetReqExtra(GLXGetDrawableAttributes, 4, req); + GetReq(GLXGetDrawableAttributes, req); req->reqType = opcode; req->glxCode = X_GLXGetDrawableAttributes; req->drawable = drawable; @@ -435,7 +436,7 @@ DestroyDrawable(Display * dpy, GLXDrawable drawable, CARD32 glxCode) LockDisplay(dpy); - GetReqExtra(GLXDestroyPbuffer, 4, req); + GetReq(GLXDestroyPbuffer, req); req->reqType = opcode; req->glxCode = glxCode; req->pbuffer = (GLXPbuffer) drawable; diff --git a/src/glx/glxclient.h b/src/glx/glxclient.h index 36a0808c048..fdcef8075a8 100644 --- a/src/glx/glxclient.h +++ b/src/glx/glxclient.h @@ -585,6 +585,8 @@ struct glx_display extern int glx_screen_init(struct glx_screen *psc, int screen, struct glx_display * priv); +extern void +glx_screen_cleanup(struct glx_screen *psc); #if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL) extern __GLXDRIdrawable * diff --git a/src/glx/glxcmds.c b/src/glx/glxcmds.c index d12ff9684e2..80eaf72b7d5 100644 --- a/src/glx/glxcmds.c +++ b/src/glx/glxcmds.c @@ -215,12 +215,16 @@ CreateContext(Display * dpy, int generic_id, Bool allowDirect, unsigned code, int renderType, int screen) { - struct glx_context *gc = NULL; - struct glx_screen *const psc = GetGLXScreenConfigs(dpy, screen); + struct glx_context *gc; + struct glx_screen *psc; struct glx_context *shareList = (struct glx_context *) shareList_user; if (dpy == NULL) return NULL; + psc = GetGLXScreenConfigs(dpy, screen); + if (psc == NULL) + return NULL; + if (generic_id == None) return NULL; diff --git a/src/glx/glxext.c b/src/glx/glxext.c index c5e9d0510b6..25d266e18e1 100644 --- a/src/glx/glxext.c +++ b/src/glx/glxext.c @@ -194,17 +194,7 @@ FreeScreenConfigs(struct glx_display * priv) screens = ScreenCount(priv->dpy); for (i = 0; i < screens; i++) { psc = priv->screens[i]; - if (psc->configs) { - glx_config_destroy_list(psc->configs); - if (psc->effectiveGLXexts) - Xfree(psc->effectiveGLXexts); - psc->configs = NULL; /* NOTE: just for paranoia */ - } - if (psc->visuals) { - glx_config_destroy_list(psc->visuals); - psc->visuals = NULL; /* NOTE: just for paranoia */ - } - Xfree((char *) psc->serverGLXexts); + glx_screen_cleanup(psc); #if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL) if (psc->driScreen) { @@ -688,7 +678,7 @@ static GLboolean } else if (strstr(psc->serverGLXexts, "GLX_SGIX_fbconfig") != NULL) { GetReqExtra(GLXVendorPrivateWithReply, - sz_xGLXGetFBConfigsSGIXReq + + sz_xGLXGetFBConfigsSGIXReq - sz_xGLXVendorPrivateWithReplyReq, vpreq); sgi_req = (xGLXGetFBConfigsSGIXReq *) vpreq; sgi_req->reqType = priv->majorOpcode; @@ -728,6 +718,22 @@ glx_screen_init(struct glx_screen *psc, return GL_TRUE; } +_X_HIDDEN void +glx_screen_cleanup(struct glx_screen *psc) +{ + if (psc->configs) { + glx_config_destroy_list(psc->configs); + if (psc->effectiveGLXexts) + Xfree(psc->effectiveGLXexts); + psc->configs = NULL; /* NOTE: just for paranoia */ + } + if (psc->visuals) { + glx_config_destroy_list(psc->visuals); + psc->visuals = NULL; /* NOTE: just for paranoia */ + } + Xfree((char *) psc->serverGLXexts); +} + /* ** Allocate the memory for the per screen configs for each screen. ** If that works then fetch the per screen configs data. |