#include "xf86drm.h"
#include "dri2.h"
#include "dri_common.h"
+#include "dri2_priv.h"
/* From xmlpool/options.h, user exposed so should be stable */
#define DRI_CONF_VBLANK_NEVER 0
const __DRIextension *loader_extensions[4];
};
-struct dri2_screen {
- struct glx_screen base;
-
- __DRIscreen *driScreen;
- __GLXDRIscreen vtable;
- const __DRIdri2Extension *dri2;
- const __DRIcoreExtension *core;
-
- const __DRI2flushExtension *f;
- const __DRI2configQueryExtension *config;
- const __DRItexBufferExtension *texBuffer;
- const __DRI2throttleExtension *throttle;
- const __DRIconfig **driver_configs;
-
- void *driver;
- int fd;
-
- int show_fps_interval;
-};
-
struct dri2_context
{
struct glx_context base;
__GLXDRIconfigPrivate *config = (__GLXDRIconfigPrivate *) config_base;
__DRIcontext *shared = NULL;
- uint32_t minor_ver = 1;
- uint32_t major_ver = 2;
- uint32_t renderType = GLX_RGBA_TYPE;
- uint32_t flags = 0;
+ uint32_t minor_ver;
+ uint32_t major_ver;
+ uint32_t renderType;
+ uint32_t flags;
unsigned api;
- int reset = __DRI_CTX_RESET_NO_NOTIFICATION;
+ int reset;
uint32_t ctx_attribs[2 * 5];
unsigned num_ctx_attribs = 0;
struct dri2_display *pdp;
GLint vblank_mode = DRI_CONF_VBLANK_DEF_INTERVAL_1;
+ dpyPriv = __glXInitialize(psc->base.dpy);
+ if (dpyPriv == NULL)
+ return NULL;
+
pdraw = calloc(1, sizeof(*pdraw));
if (!pdraw)
return NULL;
}
DRI2CreateDrawable(psc->base.dpy, xDrawable);
-
- dpyPriv = __glXInitialize(psc->base.dpy);
pdp = (struct dri2_display *)dpyPriv->dri2Display;;
/* Create a new drawable */
pdraw->driDrawable =
psc = (struct dri2_screen *) pdraw->base.psc;
priv = __glXInitialize(psc->base.dpy);
+
+ if (priv == NULL)
+ return;
+
pdp = (struct dri2_display *) priv->dri2Display;
gc = __glXGetCurrentContext();
__GLXDRIdrawable *base = GetGLXDRIDrawable(dpy, drawable);
struct glx_display *dpyPriv = __glXInitialize(dpy);
struct dri2_drawable *pdraw = (struct dri2_drawable *) base;
- struct dri2_display *pdp =
- (struct dri2_display *) dpyPriv->dri2Display;
+ struct dri2_display *pdp;
struct dri2_screen *psc;
+ if (dpyPriv == NULL)
+ return;
+
+ pdp = (struct dri2_display *) dpyPriv->dri2Display;
+
if (pdraw != NULL) {
psc = (struct dri2_screen *) base->psc;
&& strcmp(extensions[i]->name, __DRI2_ROBUSTNESS) == 0)
__glXEnableDirectExtension(&psc->base,
"GLX_ARB_create_context_robustness");
+
+ /* DRI2 version 3 is also required because GLX_MESA_query_renderer
+ * requires GLX_ARB_create_context_profile.
+ */
+ if (psc->dri2->base.version >= 3
+ && strcmp(extensions[i]->name, __DRI2_RENDERER_QUERY) == 0) {
+ psc->rendererQuery = (__DRI2rendererQueryExtension *) extensions[i];
+ __glXEnableDirectExtension(&psc->base, "GLX_MESA_query_renderer");
+ }
}
}
static const struct glx_screen_vtable dri2_screen_vtable = {
dri2_create_context,
- dri2_create_context_attribs
+ dri2_create_context_attribs,
+ dri2_query_renderer_integer,
+ dri2_query_renderer_string,
};
static struct glx_screen *
goto handle_error;
}
- extensions = dlsym(psc->driver, __DRI_DRIVER_EXTENSIONS);
- if (extensions == NULL) {
- ErrorMessageF("driver exports no extensions (%s)\n", dlerror());
+ extensions = driGetDriverExtensions(psc->driver, driverName);
+ if (extensions == NULL)
goto handle_error;
- }
for (i = 0; extensions[i]; i++) {
if (strcmp(extensions[i]->name, __DRI_CORE) == 0)
goto handle_error;
}
-
- /* If the server does not support the protocol for
- * DRI2GetBuffersWithFormat, don't supply that interface to the driver.
- */
- psc->driScreen =
- psc->dri2->createNewScreen(screen, psc->fd,
- (const __DRIextension **)
- &pdp->loader_extensions[0],
- &driver_configs, psc);
+ if (psc->dri2->base.version >= 4) {
+ psc->driScreen =
+ psc->dri2->createNewScreen2(screen, psc->fd,
+ (const __DRIextension **)
+ &pdp->loader_extensions[0],
+ extensions,
+ &driver_configs, psc);
+ } else {
+ psc->driScreen =
+ psc->dri2->createNewScreen(screen, psc->fd,
+ (const __DRIextension **)
+ &pdp->loader_extensions[0],
+ &driver_configs, psc);
+ }
if (psc->driScreen == NULL) {
ErrorMessageF("failed to create dri screen\n");