Skip to content

Commit

Permalink
glx: Factor out glxProbeDriver function.
Browse files Browse the repository at this point in the history
DRI, DRI2 and swrast all had near-identical driver probing logic.
Pull it into glxdricommon.

[ajax: warning fix]
Reviewed-by: Adam Jackson <[email protected]>
Signed-off-by: Christopher James Halse Rogers <[email protected]>
  • Loading branch information
RAOF authored and nwnk committed Mar 14, 2011
1 parent 56c90e2 commit 021393d
Show file tree
Hide file tree
Showing 5 changed files with 77 additions and 110 deletions.
44 changes: 6 additions & 38 deletions glx/glxdri.c
Original file line number Diff line number Diff line change
Expand Up @@ -858,8 +858,6 @@ static const __DRIextension *loader_extensions[] = {



static const char dri_driver_path[] = DRI_DRIVER_PATH;

static Bool
glxDRIEnterVT (int index, int flags)
{
Expand Down Expand Up @@ -971,13 +969,10 @@ __glXDRIscreenProbe(ScreenPtr pScreen)
drm_handle_t hFB;
int junk;
__GLXDRIscreen *screen;
char filename[128];
Bool isCapable;
size_t buffer_size;
ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
const __DRIconfig **driConfigs;
const __DRIextension **extensions;
int i;

if (!xf86LoaderCheckSymbol("DRIQueryDirectRenderingCapable") ||
!DRIQueryDirectRenderingCapable(pScreen, &isCapable) ||
Expand Down Expand Up @@ -1052,42 +1047,15 @@ __glXDRIscreenProbe(ScreenPtr pScreen)
goto handle_error;
}

snprintf(filename, sizeof filename, "%s/%s_dri.so",
dri_driver_path, driverName);

screen->driver = dlopen(filename, RTLD_LAZY | RTLD_LOCAL);
screen->driver = glxProbeDriver(driverName,
(void **)&screen->core,
__DRI_CORE, __DRI_CORE_VERSION,
(void **)&screen->legacy,
__DRI_LEGACY, __DRI_LEGACY_VERSION);
if (screen->driver == NULL) {
LogMessage(X_ERROR, "AIGLX error: dlopen of %s failed (%s)\n",
filename, dlerror());
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
* (such as DRIRADEONRec in xfree86/driver/ati/radeon_dri.h) that
Expand Down Expand Up @@ -1172,7 +1140,7 @@ __glXDRIscreenProbe(ScreenPtr pScreen)
pScrn->LeaveVT = glxDRILeaveVT;

LogMessage(X_INFO,
"AIGLX: Loaded and initialized %s\n", filename);
"AIGLX: Loaded and initialized %s\n", driverName);

return &screen->base;

Expand Down
39 changes: 3 additions & 36 deletions glx/glxdri2.c
Original file line number Diff line number Diff line change
Expand Up @@ -599,8 +599,6 @@ static const __DRIextension *loader_extensions[] = {
NULL
};

static const char dri_driver_path[] = DRI_DRIVER_PATH;

static Bool
glxDRIEnterVT (int index, int flags)
{
Expand Down Expand Up @@ -702,12 +700,9 @@ __glXDRIscreenProbe(ScreenPtr pScreen)
{
const char *driverName, *deviceName;
__GLXDRIscreen *screen;
char filename[128];
size_t buffer_size;
ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
const __DRIextension **extensions;
const __DRIconfig **driConfigs;
int i;

screen = calloc(1, sizeof *screen);
if (screen == NULL)
Expand All @@ -729,40 +724,12 @@ __glXDRIscreenProbe(ScreenPtr pScreen)

__glXInitExtensionEnableBits(screen->glx_enable_bits);

snprintf(filename, sizeof filename,
"%s/%s_dri.so", dri_driver_path, driverName);

screen->driver = dlopen(filename, RTLD_LAZY | RTLD_LOCAL);
screen->driver = glxProbeDriver(driverName, (void **)&screen->core, __DRI_CORE, 1,
(void **)&screen->dri2, __DRI_DRI2, 1);
if (screen->driver == NULL) {
LogMessage(X_ERROR, "AIGLX error: dlopen of %s failed (%s)\n",
filename, dlerror());
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->dri2->createNewScreen)(pScreen->myNum,
screen->fd,
Expand Down Expand Up @@ -816,7 +783,7 @@ __glXDRIscreenProbe(ScreenPtr pScreen)
pScrn->LeaveVT = glxDRILeaveVT;

LogMessage(X_INFO,
"AIGLX: Loaded and initialized %s\n", filename);
"AIGLX: Loaded and initialized %s\n", driverName);

return &screen->base;

Expand Down
57 changes: 57 additions & 0 deletions glx/glxdricommon.c
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@

#include <stdint.h>
#include <errno.h>
#include <dlfcn.h>
#include <sys/time.h>
#include <GL/gl.h>
#include <GL/glxtokens.h>
Expand Down Expand Up @@ -204,3 +205,59 @@ glxConvertConfigs(const __DRIcoreExtension *core,

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;
}
5 changes: 5 additions & 0 deletions glx/glxdricommon.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,4 +38,9 @@ glxConvertConfigs(const __DRIcoreExtension *core,

extern const __DRIsystemTimeExtension systemTimeExtension;

void *
glxProbeDriver(const char *name,
void **coreExt, const char *coreName, int coreVersion,
void **renderExt, const char *renderName, int renderVersion);

#endif
42 changes: 6 additions & 36 deletions glx/glxdriswrast.c
Original file line number Diff line number Diff line change
Expand Up @@ -435,17 +435,12 @@ initializeExtensions(__GLXDRIscreen *screen)
}
}

static const char dri_driver_path[] = DRI_DRIVER_PATH;

static __GLXscreen *
__glXDRIscreenProbe(ScreenPtr pScreen)
{
const char *driverName = "swrast";
__GLXDRIscreen *screen;
char filename[128];
const __DRIextension **extensions;
const __DRIconfig **driConfigs;
int i;

screen = calloc(1, sizeof *screen);
if (screen == NULL)
Expand All @@ -457,40 +452,15 @@ __glXDRIscreenProbe(ScreenPtr pScreen)
screen->base.swapInterval = NULL;
screen->base.pScreen = pScreen;

snprintf(filename, sizeof filename,
"%s/%s_dri.so", dri_driver_path, driverName);

screen->driver = dlopen(filename, RTLD_LAZY | RTLD_LOCAL);
screen->driver = glxProbeDriver(driverName,
(void **)&screen->core,
__DRI_CORE, __DRI_CORE_VERSION,
(void **)&screen->swrast,
__DRI_SWRAST, __DRI_SWRAST_VERSION);
if (screen->driver == NULL) {
LogMessage(X_ERROR, "AIGLX error: dlopen of %s failed (%s)\n",
filename, dlerror());
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->swrast->createNewScreen)(pScreen->myNum,
loader_extensions,
Expand All @@ -516,7 +486,7 @@ __glXDRIscreenProbe(ScreenPtr pScreen)
screen->base.GLXminor = 4;

LogMessage(X_INFO,
"AIGLX: Loaded and initialized %s\n", filename);
"AIGLX: Loaded and initialized %s\n", driverName);

return &screen->base;

Expand Down

0 comments on commit 021393d

Please sign in to comment.