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:
parent
56c90e29f0
commit
021393d1b8
44
glx/glxdri.c
44
glx/glxdri.c
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user