diff options
Diffstat (limited to 'xorg-server/glx/glxdriswrast.c')
-rw-r--r-- | xorg-server/glx/glxdriswrast.c | 34 |
1 files changed, 25 insertions, 9 deletions
diff --git a/xorg-server/glx/glxdriswrast.c b/xorg-server/glx/glxdriswrast.c index b47839868..7b1c67732 100644 --- a/xorg-server/glx/glxdriswrast.c +++ b/xorg-server/glx/glxdriswrast.c @@ -27,6 +27,7 @@ #ifdef HAVE_DIX_CONFIG_H #include <dix-config.h> #endif +#include "glheader.h" #include <stdint.h> #include <stdio.h> @@ -54,13 +55,6 @@ #include "dispatch.h" #include "extension_string.h" -/* RTLD_LOCAL is not defined on Cygwin */ -#ifdef __CYGWIN__ -#ifndef RTLD_LOCAL -#define RTLD_LOCAL 0 -#endif -#endif - typedef struct __GLXDRIscreen __GLXDRIscreen; typedef struct __GLXDRIcontext __GLXDRIcontext; typedef struct __GLXDRIdrawable __GLXDRIdrawable; @@ -241,14 +235,18 @@ __glXDRIscreenDestroy(__GLXscreen * baseScreen) (*screen->core->destroyScreen) (screen->driScreen); +#ifdef _MSC_VER + FreeLibrary(screen->driver); +#else dlclose(screen->driver); +#endif __glXScreenDestroy(baseScreen); if (screen->driConfigs) { for (i = 0; screen->driConfigs[i] != NULL; i++) free((__DRIconfig **) screen->driConfigs[i]); - free(screen->driConfigs); + free((void*)screen->driConfigs); } free(screen); @@ -337,6 +335,13 @@ __glXDRIscreenCreateDrawable(ClientPtr client, private->driDrawable = (*driScreen->swrast->createNewDrawable) (driScreen->driScreen, config->driConfig, private); + if (!private->driDrawable) + { + FreeGC(private->gc, (GContext)0); + FreeGC(private->swapgc, (GContext)0); + free(private); + return NULL; + } return &private->base; } @@ -429,11 +434,18 @@ initializeExtensions(__GLXDRIscreen * screen) } } +extern Bool g_fswrastwgl; + static __GLXscreen * __glXDRIscreenProbe(ScreenPtr pScreen) { - const char *driverName = "swrast"; + const char *driverName; __GLXDRIscreen *screen; + + if (g_fswrastwgl) + driverName = "swrastwgl"; + else + driverName = "swrast"; screen = calloc(1, sizeof *screen); if (screen == NULL) @@ -482,7 +494,11 @@ __glXDRIscreenProbe(ScreenPtr pScreen) handle_error: if (screen->driver) +#ifdef _MSC_VER + FreeLibrary(screen->driver); +#else dlclose(screen->driver); +#endif free(screen); |