driReleaseDrawables(&pcp->base);
- if (context->xid)
- glx_send_destroy_context(psc->base.dpy, context->xid);
-
if (context->extensions)
XFree((char *) context->extensions);
struct glx_context *gc = __glXGetCurrentContext();
struct drisw_context *pcp = (struct drisw_context *) gc;
__GLXDRIdrawable *base = GetGLXDRIDrawable(dpy, drawable);
- struct glx_display *dpyPriv = __glXInitialize(dpy);
struct drisw_drawable *pdraw = (struct drisw_drawable *) base;
struct drisw_screen *psc;
+ __glXInitialize(dpy);
+
if (pdraw != NULL) {
psc = (struct drisw_screen *) base->psc;
return NULL;
if (shareList) {
+ /* If the shareList context is not a DRISW context, we cannot possibly
+ * create a DRISW context that shares it.
+ */
+ if (shareList->vtable->destroy != drisw_destroy_context) {
+ return NULL;
+ }
+
pcp_shared = (struct drisw_context *) shareList;
shared = pcp_shared->driContext;
}
{
int i;
+ __glXEnableDirectExtension(&psc->base, "GLX_SGI_make_current_read");
+
/* FIXME: Figure out what other extensions can be ported here from dri2. */
for (i = 0; extensions[i]; i++) {
if ((strcmp(extensions[i]->name, __DRI_TEX_BUFFER) == 0)) {
const __DRIconfig **driver_configs;
const __DRIextension **extensions;
struct drisw_screen *psc;
+ struct glx_config *configs = NULL, *visuals = NULL;
int i;
psc = Xcalloc(1, sizeof *psc);
extensions = psc->core->getExtensions(psc->driScreen);
driswBindExtensions(psc, extensions);
- psc->base.configs =
- driConvertConfigs(psc->core, psc->base.configs, driver_configs);
- psc->base.visuals =
- driConvertConfigs(psc->core, psc->base.visuals, driver_configs);
+ configs = driConvertConfigs(psc->core, psc->base.configs, driver_configs);
+ visuals = driConvertConfigs(psc->core, psc->base.visuals, driver_configs);
+
+ if (!configs || !visuals)
+ goto handle_error;
+
+ glx_config_destroy_list(psc->base.configs);
+ psc->base.configs = configs;
+ glx_config_destroy_list(psc->base.visuals);
+ psc->base.visuals = visuals;
psc->driver_configs = driver_configs;
return &psc->base;
handle_error:
+ if (configs)
+ glx_config_destroy_list(configs);
+ if (visuals)
+ glx_config_destroy_list(visuals);
+ if (psc->driScreen)
+ psc->core->destroyScreen(psc->driScreen);
+ psc->driScreen = NULL;
+
if (psc->driver)
dlclose(psc->driver);
glx_screen_cleanup(&psc->base);