glx: Factor out glxProbeDriver function.

DRI, DRI2 and swrast all had near-identical driver probing logic.
Pull it into glxdricommon.

[ajax: warning fix]
Reviewed-by: Adam Jackson <ajax@redhat.com>
Signed-off-by: Christopher James Halse Rogers <christopher.halse.rogers@canonical.com>
This commit is contained in:
Christopher James Halse Rogers 2011-03-09 11:15:07 +11:00 committed by Adam Jackson
parent 56c90e29f0
commit 021393d1b8
5 changed files with 77 additions and 110 deletions

View File

@ -858,8 +858,6 @@ static const __DRIextension *loader_extensions[] = {
static const char dri_driver_path[] = DRI_DRIVER_PATH;
static Bool static Bool
glxDRIEnterVT (int index, int flags) glxDRIEnterVT (int index, int flags)
{ {
@ -971,13 +969,10 @@ __glXDRIscreenProbe(ScreenPtr pScreen)
drm_handle_t hFB; drm_handle_t hFB;
int junk; int junk;
__GLXDRIscreen *screen; __GLXDRIscreen *screen;
char filename[128];
Bool isCapable; Bool isCapable;
size_t buffer_size; size_t buffer_size;
ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
const __DRIconfig **driConfigs; const __DRIconfig **driConfigs;
const __DRIextension **extensions;
int i;
if (!xf86LoaderCheckSymbol("DRIQueryDirectRenderingCapable") || if (!xf86LoaderCheckSymbol("DRIQueryDirectRenderingCapable") ||
!DRIQueryDirectRenderingCapable(pScreen, &isCapable) || !DRIQueryDirectRenderingCapable(pScreen, &isCapable) ||
@ -1052,42 +1047,15 @@ __glXDRIscreenProbe(ScreenPtr pScreen)
goto handle_error; goto handle_error;
} }
snprintf(filename, sizeof filename, "%s/%s_dri.so", screen->driver = glxProbeDriver(driverName,
dri_driver_path, driverName); (void **)&screen->core,
__DRI_CORE, __DRI_CORE_VERSION,
screen->driver = dlopen(filename, RTLD_LAZY | RTLD_LOCAL); (void **)&screen->legacy,
__DRI_LEGACY, __DRI_LEGACY_VERSION);
if (screen->driver == NULL) { if (screen->driver == NULL) {
LogMessage(X_ERROR, "AIGLX error: dlopen of %s failed (%s)\n",
filename, dlerror());
goto handle_error; goto handle_error;
} }
extensions = dlsym(screen->driver, __DRI_DRIVER_EXTENSIONS);
if (extensions == NULL) {
LogMessage(X_ERROR, "AIGLX error: %s exports no extensions (%s)\n",
driverName, dlerror());
goto handle_error;
}
for (i = 0; extensions[i]; i++) {
if (strcmp(extensions[i]->name, __DRI_CORE) == 0 &&
extensions[i]->version >= __DRI_CORE_VERSION) {
screen->core = (__DRIcoreExtension *) extensions[i];
}
if (strcmp(extensions[i]->name, __DRI_LEGACY) == 0 &&
extensions[i]->version >= __DRI_LEGACY_VERSION) {
screen->legacy = (__DRIlegacyExtension *) extensions[i];
}
}
if (screen->core == NULL || screen->legacy == NULL) {
LogMessage(X_ERROR,
"AIGLX error: %s does not export required DRI extension\n",
driverName);
goto handle_error;
}
/* /*
* Get device-specific info. pDevPriv will point to a struct * Get device-specific info. pDevPriv will point to a struct
* (such as DRIRADEONRec in xfree86/driver/ati/radeon_dri.h) that * (such as DRIRADEONRec in xfree86/driver/ati/radeon_dri.h) that
@ -1172,7 +1140,7 @@ __glXDRIscreenProbe(ScreenPtr pScreen)
pScrn->LeaveVT = glxDRILeaveVT; pScrn->LeaveVT = glxDRILeaveVT;
LogMessage(X_INFO, LogMessage(X_INFO,
"AIGLX: Loaded and initialized %s\n", filename); "AIGLX: Loaded and initialized %s\n", driverName);
return &screen->base; return &screen->base;

View File

@ -599,8 +599,6 @@ static const __DRIextension *loader_extensions[] = {
NULL NULL
}; };
static const char dri_driver_path[] = DRI_DRIVER_PATH;
static Bool static Bool
glxDRIEnterVT (int index, int flags) glxDRIEnterVT (int index, int flags)
{ {
@ -702,12 +700,9 @@ __glXDRIscreenProbe(ScreenPtr pScreen)
{ {
const char *driverName, *deviceName; const char *driverName, *deviceName;
__GLXDRIscreen *screen; __GLXDRIscreen *screen;
char filename[128];
size_t buffer_size; size_t buffer_size;
ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
const __DRIextension **extensions;
const __DRIconfig **driConfigs; const __DRIconfig **driConfigs;
int i;
screen = calloc(1, sizeof *screen); screen = calloc(1, sizeof *screen);
if (screen == NULL) if (screen == NULL)
@ -729,40 +724,12 @@ __glXDRIscreenProbe(ScreenPtr pScreen)
__glXInitExtensionEnableBits(screen->glx_enable_bits); __glXInitExtensionEnableBits(screen->glx_enable_bits);
snprintf(filename, sizeof filename, screen->driver = glxProbeDriver(driverName, (void **)&screen->core, __DRI_CORE, 1,
"%s/%s_dri.so", dri_driver_path, driverName); (void **)&screen->dri2, __DRI_DRI2, 1);
screen->driver = dlopen(filename, RTLD_LAZY | RTLD_LOCAL);
if (screen->driver == NULL) { if (screen->driver == NULL) {
LogMessage(X_ERROR, "AIGLX error: dlopen of %s failed (%s)\n",
filename, dlerror());
goto handle_error; goto handle_error;
} }
extensions = dlsym(screen->driver, __DRI_DRIVER_EXTENSIONS);
if (extensions == NULL) {
LogMessage(X_ERROR, "AIGLX error: %s exports no extensions (%s)\n",
driverName, dlerror());
goto handle_error;
}
for (i = 0; extensions[i]; i++) {
if (strcmp(extensions[i]->name, __DRI_CORE) == 0 &&
extensions[i]->version >= 1) {
screen->core = (const __DRIcoreExtension *) extensions[i];
}
if (strcmp(extensions[i]->name, __DRI_DRI2) == 0 &&
extensions[i]->version >= 1) {
screen->dri2 = (const __DRIdri2Extension *) extensions[i];
}
}
if (screen->core == NULL || screen->dri2 == NULL) {
LogMessage(X_ERROR, "AIGLX error: %s exports no DRI extension\n",
driverName);
goto handle_error;
}
screen->driScreen = screen->driScreen =
(*screen->dri2->createNewScreen)(pScreen->myNum, (*screen->dri2->createNewScreen)(pScreen->myNum,
screen->fd, screen->fd,
@ -816,7 +783,7 @@ __glXDRIscreenProbe(ScreenPtr pScreen)
pScrn->LeaveVT = glxDRILeaveVT; pScrn->LeaveVT = glxDRILeaveVT;
LogMessage(X_INFO, LogMessage(X_INFO,
"AIGLX: Loaded and initialized %s\n", filename); "AIGLX: Loaded and initialized %s\n", driverName);
return &screen->base; return &screen->base;

View File

@ -29,6 +29,7 @@
#include <stdint.h> #include <stdint.h>
#include <errno.h> #include <errno.h>
#include <dlfcn.h>
#include <sys/time.h> #include <sys/time.h>
#include <GL/gl.h> #include <GL/gl.h>
#include <GL/glxtokens.h> #include <GL/glxtokens.h>
@ -204,3 +205,59 @@ glxConvertConfigs(const __DRIcoreExtension *core,
return head.next; return head.next;
} }
static const char dri_driver_path[] = DRI_DRIVER_PATH;
void *
glxProbeDriver(const char *driverName,
void **coreExt, const char *coreName, int coreVersion,
void **renderExt, const char *renderName, int renderVersion)
{
int i;
void *driver;
char filename[128];
const __DRIextension **extensions;
snprintf(filename, sizeof filename, "%s/%s_dri.so",
dri_driver_path, driverName);
driver = dlopen(filename, RTLD_LAZY | RTLD_LOCAL);
if (driver == NULL) {
LogMessage(X_ERROR, "AIGLX error: dlopen of %s failed (%s)\n",
filename, dlerror());
goto cleanup_failure;
}
extensions = dlsym(driver, __DRI_DRIVER_EXTENSIONS);
if (extensions == NULL) {
LogMessage(X_ERROR, "AIGLX error: %s exports no extensions (%s)\n",
driverName, dlerror());
goto cleanup_failure;
}
for (i = 0; extensions[i]; i++) {
if (strcmp(extensions[i]->name, coreName) == 0 &&
extensions[i]->version >= coreVersion) {
*coreExt = (void *)extensions[i];
}
if (strcmp(extensions[i]->name, renderName) == 0 &&
extensions[i]->version >= renderVersion) {
*renderExt = (void *)extensions[i];
}
}
if (*coreExt == NULL || *renderExt == NULL) {
LogMessage(X_ERROR,
"AIGLX error: %s does not export required DRI extension\n",
driverName);
goto cleanup_failure;
}
return driver;
cleanup_failure:
if (driver)
dlclose(driver);
*coreExt = *renderExt = NULL;
return NULL;
}

View File

@ -38,4 +38,9 @@ glxConvertConfigs(const __DRIcoreExtension *core,
extern const __DRIsystemTimeExtension systemTimeExtension; extern const __DRIsystemTimeExtension systemTimeExtension;
void *
glxProbeDriver(const char *name,
void **coreExt, const char *coreName, int coreVersion,
void **renderExt, const char *renderName, int renderVersion);
#endif #endif

View File

@ -435,17 +435,12 @@ initializeExtensions(__GLXDRIscreen *screen)
} }
} }
static const char dri_driver_path[] = DRI_DRIVER_PATH;
static __GLXscreen * static __GLXscreen *
__glXDRIscreenProbe(ScreenPtr pScreen) __glXDRIscreenProbe(ScreenPtr pScreen)
{ {
const char *driverName = "swrast"; const char *driverName = "swrast";
__GLXDRIscreen *screen; __GLXDRIscreen *screen;
char filename[128];
const __DRIextension **extensions;
const __DRIconfig **driConfigs; const __DRIconfig **driConfigs;
int i;
screen = calloc(1, sizeof *screen); screen = calloc(1, sizeof *screen);
if (screen == NULL) if (screen == NULL)
@ -457,40 +452,15 @@ __glXDRIscreenProbe(ScreenPtr pScreen)
screen->base.swapInterval = NULL; screen->base.swapInterval = NULL;
screen->base.pScreen = pScreen; screen->base.pScreen = pScreen;
snprintf(filename, sizeof filename, screen->driver = glxProbeDriver(driverName,
"%s/%s_dri.so", dri_driver_path, driverName); (void **)&screen->core,
__DRI_CORE, __DRI_CORE_VERSION,
screen->driver = dlopen(filename, RTLD_LAZY | RTLD_LOCAL); (void **)&screen->swrast,
__DRI_SWRAST, __DRI_SWRAST_VERSION);
if (screen->driver == NULL) { if (screen->driver == NULL) {
LogMessage(X_ERROR, "AIGLX error: dlopen of %s failed (%s)\n",
filename, dlerror());
goto handle_error; goto handle_error;
} }
extensions = dlsym(screen->driver, __DRI_DRIVER_EXTENSIONS);
if (extensions == NULL) {
LogMessage(X_ERROR, "AIGLX error: %s exports no extensions (%s)\n",
driverName, dlerror());
goto handle_error;
}
for (i = 0; extensions[i]; i++) {
if (strcmp(extensions[i]->name, __DRI_CORE) == 0 &&
extensions[i]->version >= __DRI_CORE_VERSION) {
screen->core = (const __DRIcoreExtension *) extensions[i];
}
if (strcmp(extensions[i]->name, __DRI_SWRAST) == 0 &&
extensions[i]->version >= __DRI_SWRAST_VERSION) {
screen->swrast = (const __DRIswrastExtension *) extensions[i];
}
}
if (screen->core == NULL || screen->swrast == NULL) {
LogMessage(X_ERROR, "AIGLX error: %s exports no DRI extension\n",
driverName);
goto handle_error;
}
screen->driScreen = screen->driScreen =
(*screen->swrast->createNewScreen)(pScreen->myNum, (*screen->swrast->createNewScreen)(pScreen->myNum,
loader_extensions, loader_extensions,
@ -516,7 +486,7 @@ __glXDRIscreenProbe(ScreenPtr pScreen)
screen->base.GLXminor = 4; screen->base.GLXminor = 4;
LogMessage(X_INFO, LogMessage(X_INFO,
"AIGLX: Loaded and initialized %s\n", filename); "AIGLX: Loaded and initialized %s\n", driverName);
return &screen->base; return &screen->base;