driReleaseDrawables(&pcp->base);
- if (context->extensions)
- XFree((char *) context->extensions);
+ free((char *) context->extensions);
(*psc->core->destroyContext) (pcp->driContext);
- Xfree(pcp);
+ free(pcp);
}
static Bool
shared = pcp_shared->driContext;
}
- pcp = Xmalloc(sizeof *pcp);
+ pcp = calloc(1, sizeof *pcp);
if (pcp == NULL)
return NULL;
- memset(pcp, 0, sizeof *pcp);
if (!glx_context_init(&pcp->base, &psc->base, &config->base)) {
- Xfree(pcp);
+ free(pcp);
return NULL;
}
config->driConfig, shared, pcp);
if (pcp->driContext == NULL) {
- Xfree(pcp);
+ free(pcp);
return NULL;
}
uint32_t major_ver = 2;
uint32_t flags = 0;
unsigned api;
- uint32_t ctx_attribs[2 * 4];
+ int reset = __DRI_CTX_RESET_NO_NOTIFICATION;
+ uint32_t ctx_attribs[2 * 5];
unsigned num_ctx_attribs = 0;
if (psc->dri2->base.version < 3) {
/* Remap the GLX tokens to DRI2 tokens.
*/
if (!dri2_convert_glx_attribs(num_attribs, attribs,
- &major_ver, &minor_ver, &flags, &api, error))
+ &major_ver, &minor_ver, &flags, &api, &reset,
+ error))
goto error_exit;
if (shareList) {
shared = pcp_shared->driContext;
}
- pcp = Xmalloc(sizeof *pcp);
+ pcp = calloc(1, sizeof *pcp);
if (pcp == NULL) {
*error = __DRI_CTX_ERROR_NO_MEMORY;
goto error_exit;
}
- memset(pcp, 0, sizeof *pcp);
if (!glx_context_init(&pcp->base, &psc->base, &config->base))
goto error_exit;
ctx_attribs[num_ctx_attribs++] = __DRI_CTX_ATTRIB_MINOR_VERSION;
ctx_attribs[num_ctx_attribs++] = minor_ver;
+ /* Only send a value when the non-default value is requested. By doing
+ * this we don't have to check the driver's DRI2 version before sending the
+ * default value.
+ */
+ if (reset != __DRI_CTX_RESET_NO_NOTIFICATION) {
+ ctx_attribs[num_ctx_attribs++] = __DRI_CTX_ATTRIB_RESET_STRATEGY;
+ ctx_attribs[num_ctx_attribs++] = reset;
+ }
+
if (flags != 0) {
ctx_attribs[num_ctx_attribs++] = __DRI_CTX_ATTRIB_FLAGS;
return &pcp->base;
error_exit:
- if (pcp != NULL)
- Xfree(pcp);
+ free(pcp);
return NULL;
}
if (pdraw->base.xDrawable != pdraw->base.drawable)
DRI2DestroyDrawable(psc->base.dpy, pdraw->base.xDrawable);
- Xfree(pdraw);
+ free(pdraw);
}
static __GLXDRIdrawable *
struct dri2_display *pdp;
GLint vblank_mode = DRI_CONF_VBLANK_DEF_INTERVAL_1;
- pdraw = Xmalloc(sizeof(*pdraw));
+ pdraw = calloc(1, sizeof(*pdraw));
if (!pdraw)
return NULL;
- memset(pdraw, 0, sizeof *pdraw);
pdraw->base.destroyDrawable = dri2DestroyDrawable;
pdraw->base.xDrawable = xDrawable;
pdraw->base.drawable = drawable;
if (!pdraw->driDrawable) {
DRI2DestroyDrawable(psc->base.dpy, xDrawable);
- Xfree(pdraw);
+ free(pdraw);
return NULL;
}
if (__glxHashInsert(pdp->dri2Hash, xDrawable, pdraw)) {
(*psc->core->destroyDrawable) (pdraw->driDrawable);
DRI2DestroyDrawable(psc->base.dpy, xDrawable);
- Xfree(pdraw);
+ free(pdraw);
return None;
}
(*psc->core->destroyScreen) (psc->driScreen);
driDestroyConfigs(psc->driver_configs);
close(psc->fd);
- Xfree(psc);
+ free(psc);
}
/**
pdraw->height = *height;
process_buffers(pdraw, buffers, *out_count);
- Xfree(buffers);
+ free(buffers);
return pdraw->buffers;
}
pdraw->height = *height;
process_buffers(pdraw, buffers, *out_count);
- Xfree(buffers);
+ free(buffers);
return pdraw->buffers;
}
if (((strcmp(extensions[i]->name, __DRI2_THROTTLE) == 0)))
psc->throttle = (__DRI2throttleExtension *) extensions[i];
+
+ /* DRI2 version 3 is also required because
+ * GLX_ARB_create_context_robustness requires GLX_ARB_create_context.
+ */
+ if (psc->dri2->base.version >= 3
+ && strcmp(extensions[i]->name, __DRI2_ROBUSTNESS) == 0)
+ __glXEnableDirectExtension(&psc->base,
+ "GLX_ARB_create_context_robustness");
}
}
drm_magic_t magic;
int i;
- psc = Xmalloc(sizeof *psc);
+ psc = calloc(1, sizeof *psc);
if (psc == NULL)
return NULL;
- memset(psc, 0, sizeof *psc);
psc->fd = -1;
if (!glx_screen_init(&psc->base, screen, priv)) {
- Xfree(psc);
+ free(psc);
return NULL;
}
if (!DRI2Connect(priv->dpy, RootWindow(priv->dpy, screen),
&driverName, &deviceName)) {
glx_screen_cleanup(&psc->base);
- XFree(psc);
+ free(psc);
InfoMessageF("screen %d does not appear to be DRI2 capable\n", screen);
return NULL;
}
goto handle_error;
}
- psc->fd = open(deviceName, O_RDWR);
+#ifdef O_CLOEXEC
+ psc->fd = open(deviceName, O_RDWR | O_CLOEXEC);
+ if (psc->fd == -1 && errno == EINVAL)
+#endif
+ {
+ psc->fd = open(deviceName, O_RDWR);
+ if (psc->fd != -1)
+ fcntl(psc->fd, F_SETFD, fcntl(psc->fd, F_GETFD) | FD_CLOEXEC);
+ }
if (psc->fd < 0) {
ErrorMessageF("failed to open drm device: %s\n", strerror(errno));
goto handle_error;
psp->copySubBuffer = dri2CopySubBuffer;
__glXEnableDirectExtension(&psc->base, "GLX_MESA_copy_sub_buffer");
- Xfree(driverName);
- Xfree(deviceName);
+ free(driverName);
+ free(deviceName);
tmp = getenv("LIBGL_SHOW_FPS");
psc->show_fps = tmp && strcmp(tmp, "1") == 0;
if (psc->driver)
dlclose(psc->driver);
- Xfree(driverName);
- Xfree(deviceName);
+ free(driverName);
+ free(deviceName);
glx_screen_cleanup(&psc->base);
- XFree(psc);
+ free(psc);
return NULL;
}
struct dri2_display *pdp = (struct dri2_display *) dpy;
__glxHashDestroy(pdp->dri2Hash);
- Xfree(dpy);
+ free(dpy);
}
_X_HIDDEN __GLXDRIdrawable *
if (!DRI2QueryExtension(dpy, &eventBase, &errorBase))
return NULL;
- pdp = Xmalloc(sizeof *pdp);
+ pdp = malloc(sizeof *pdp);
if (pdp == NULL)
return NULL;
if (!DRI2QueryVersion(dpy, &pdp->driMajor, &pdp->driMinor)) {
- Xfree(pdp);
+ free(pdp);
return NULL;
}
pdp->dri2Hash = __glxHashCreate();
if (pdp->dri2Hash == NULL) {
- Xfree(pdp);
+ free(pdp);
return NULL;
}