3baa38f5c76f34d6f6f158c44d46333b781adb41
1 Index: xorg-server/glx/glxdricommon.h
2 ===================================================================
3 --- xorg-server.orig/glx/glxdricommon.h 2011-09-11 18:41:08.000000000 -0500
4 +++ xorg-server/glx/glxdricommon.h 2011-09-11 18:41:43.381346390 -0500
5 @@ -39,7 +39,7 @@
6 extern const __DRIsystemTimeExtension systemTimeExtension;
8 void *
9 -glxProbeDriver(const char *name,
10 +glxProbeDriver(const char *name, void **cookie,
11 void **coreExt, const char *coreName, int coreVersion,
12 void **renderExt, const char *renderName, int renderVersion);
14 Index: xorg-server/glx/glxdriswrast.c
15 ===================================================================
16 --- xorg-server.orig/glx/glxdriswrast.c 2011-09-11 18:41:08.000000000 -0500
17 +++ xorg-server/glx/glxdriswrast.c 2011-09-11 18:41:43.381346390 -0500
18 @@ -427,6 +427,7 @@
19 const char *driverName = "swrast";
20 __GLXDRIscreen *screen;
21 const __DRIconfig **driConfigs;
22 + void *cookie = NULL;
24 screen = calloc(1, sizeof *screen);
25 if (screen == NULL)
26 @@ -438,7 +439,7 @@
27 screen->base.swapInterval = NULL;
28 screen->base.pScreen = pScreen;
30 - screen->driver = glxProbeDriver(driverName,
31 + screen->driver = glxProbeDriver(driverName, &cookie,
32 (void **)&screen->core,
33 __DRI_CORE, __DRI_CORE_VERSION,
34 (void **)&screen->swrast,
35 Index: xorg-server/configure.ac
36 ===================================================================
37 --- xorg-server.orig/configure.ac 2011-09-11 18:41:08.000000000 -0500
38 +++ xorg-server/configure.ac 2011-09-11 18:41:43.381346390 -0500
39 @@ -1260,7 +1260,12 @@
40 AC_DEFINE_DIR(SERVER_MISC_CONFIG_PATH, SERVERCONFIG, [Server miscellaneous config path])
41 AC_DEFINE_DIR(BASE_FONT_PATH, FONTROOTDIR, [Default base font path])
42 dridriverdir=`$PKG_CONFIG --variable=dridriverdir dri`
43 -AC_DEFINE_DIR(DRI_DRIVER_PATH, dridriverdir, [Default DRI driver path])
44 +drisearchdirs=`$PKG_CONFIG --variable=drisearchdirs dri`
45 +if test -n "$drisearchdirs" ; then
46 + AC_DEFINE_DIR(DRI_DRIVER_PATH, drisearchdirs, [Default DRI search dirs])
47 +else
48 + AC_DEFINE_DIR(DRI_DRIVER_PATH, dridriverdir, [Default DRI driver path])
49 +fi
50 AC_DEFINE_UNQUOTED(XVENDORNAME, ["$VENDOR_NAME"], [Vendor name])
51 AC_DEFINE_UNQUOTED(XVENDORNAMESHORT, ["$VENDOR_NAME_SHORT"], [Short vendor name])
52 AC_DEFINE_UNQUOTED(XORG_DATE, ["$RELEASE_DATE"], [Vendor release])
53 Index: xorg-server/glx/glxdricommon.c
54 ===================================================================
55 --- xorg-server.orig/glx/glxdricommon.c 2011-09-11 18:41:08.000000000 -0500
56 +++ xorg-server/glx/glxdricommon.c 2011-09-11 18:46:45.296354364 -0500
57 @@ -209,7 +209,7 @@
58 static const char dri_driver_path[] = DRI_DRIVER_PATH;
60 void *
61 -glxProbeDriver(const char *driverName,
62 +glxProbeDriver(const char *driverName, void **cookie,
63 void **coreExt, const char *coreName, int coreVersion,
64 void **renderExt, const char *renderName, int renderVersion)
65 {
66 @@ -218,49 +218,60 @@
67 char filename[PATH_MAX];
68 const __DRIextension **extensions;
69 int from = X_ERROR;
70 -
71 - snprintf(filename, sizeof filename, "%s/%s_dri.so",
72 - dri_driver_path, driverName);
73 -
74 - driver = dlopen(filename, RTLD_LAZY | RTLD_LOCAL);
75 - if (driver == NULL) {
76 - LogMessage(X_ERROR, "AIGLX error: dlopen of %s failed (%s)\n",
77 - filename, dlerror());
78 - goto cleanup_failure;
79 - }
80 -
81 - extensions = dlsym(driver, __DRI_DRIVER_EXTENSIONS);
82 - if (extensions == NULL) {
83 - LogMessage(X_ERROR, "AIGLX error: %s exports no extensions (%s)\n",
84 - driverName, dlerror());
85 - goto cleanup_failure;
86 - }
87 -
88 - for (i = 0; extensions[i]; i++) {
89 - if (strcmp(extensions[i]->name, coreName) == 0 &&
90 - extensions[i]->version >= coreVersion) {
91 - *coreExt = (void *)extensions[i];
92 + char *driDriverPath;
93 + const char *pathStart = *cookie ? (const char*)*cookie : dri_driver_path;
94 + const char *pathEnd = strchr(pathStart, ':');
95 +
96 + for (; *pathStart; pathEnd = strchr(pathStart, ':')) {
97 + driDriverPath = strndup(pathStart,
98 + pathEnd ? pathEnd - pathStart : sizeof filename);
99 + snprintf(filename, sizeof filename, "%s/%s_dri.so",
100 + driDriverPath, driverName);
101 + free(driDriverPath);
102 + pathStart = pathEnd ? pathEnd + 1 : pathStart + strlen(pathStart);
103 + *cookie = (void *)pathStart;
104 +
105 + LogMessage(X_INFO, "AIGLX: Trying DRI driver %s\n", filename);
106 +
107 + driver = dlopen(filename, RTLD_LAZY | RTLD_LOCAL);
108 + if (driver == NULL) {
109 + LogMessage(X_INFO, "AIGLX: dlopen of %s failed (%s)\n",
110 + filename, dlerror());
111 + continue;
112 }
114 - if (strcmp(extensions[i]->name, renderName) == 0 &&
115 - extensions[i]->version >= renderVersion) {
116 - *renderExt = (void *)extensions[i];
117 + extensions = dlsym(driver, __DRI_DRIVER_EXTENSIONS);
118 + if (extensions == NULL) {
119 + LogMessage(X_INFO, "AIGLX: %s exports no extensions (%s)\n",
120 + driverName, dlerror());
121 + dlclose(driver);
122 + continue;
123 + }
124 +
125 + for (i = 0; extensions[i]; i++) {
126 + if (strcmp(extensions[i]->name, coreName) == 0 &&
127 + extensions[i]->version >= coreVersion) {
128 + *coreExt = (void *)extensions[i];
129 + }
130 +
131 + if (strcmp(extensions[i]->name, renderName) == 0 &&
132 + extensions[i]->version >= renderVersion) {
133 + *renderExt = (void *)extensions[i];
134 + }
135 }
136 - }
138 - if (*coreExt == NULL || *renderExt == NULL) {
139 - if (!strcmp(driverName, "nouveau"))
140 - from = X_INFO;
141 - LogMessage(from,
142 - "AIGLX error: %s does not export required DRI extension\n",
143 - driverName);
144 - goto cleanup_failure;
145 + if (*coreExt == NULL || *renderExt == NULL) {
146 + if (!strcmp(driverName, "nouveau"))
147 + from = X_INFO;
148 + LogMessage(from,
149 + "AIGLX: %s does not export required DRI extension\n",
150 + driverName);
151 + *coreExt = *renderExt = NULL;
152 + dlclose(driver);
153 + continue;
154 + }
155 + return driver;
156 }
157 - return driver;
158 -
159 -cleanup_failure:
160 - if (driver)
161 - dlclose(driver);
162 *coreExt = *renderExt = NULL;
163 return NULL;
164 }
165 Index: xorg-server/glx/glxdri.c
166 ===================================================================
167 --- xorg-server.orig/glx/glxdri.c 2011-09-11 18:41:08.000000000 -0500
168 +++ xorg-server/glx/glxdri.c 2011-09-11 18:41:43.381346390 -0500
169 @@ -968,6 +968,7 @@
170 size_t buffer_size;
171 ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
172 const __DRIconfig **driConfigs;
173 + void *cookie = NULL;
175 if (!xf86LoaderCheckSymbol("DRIQueryDirectRenderingCapable") ||
176 !DRIQueryDirectRenderingCapable(pScreen, &isCapable) ||
177 @@ -1042,7 +1043,7 @@
178 goto handle_error;
179 }
181 - screen->driver = glxProbeDriver(driverName,
182 + screen->driver = glxProbeDriver(driverName, &cookie,
183 (void **)&screen->core,
184 __DRI_CORE, __DRI_CORE_VERSION,
185 (void **)&screen->legacy,
186 Index: xorg-server/glx/glxdri2.c
187 ===================================================================
188 --- xorg-server.orig/glx/glxdri2.c 2011-09-11 18:41:08.000000000 -0500
189 +++ xorg-server/glx/glxdri2.c 2011-09-11 18:41:43.381346390 -0500
190 @@ -689,6 +689,7 @@
191 size_t buffer_size;
192 ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
193 const __DRIconfig **driConfigs;
194 + void *cookie = NULL;
196 screen = calloc(1, sizeof *screen);
197 if (screen == NULL)
198 @@ -710,24 +711,24 @@
200 __glXInitExtensionEnableBits(screen->glx_enable_bits);
202 - screen->driver = glxProbeDriver(driverName, (void **)&screen->core, __DRI_CORE, 1,
203 - (void **)&screen->dri2, __DRI_DRI2, 1);
204 - if (screen->driver == NULL) {
205 - goto handle_error;
206 - }
207 -
208 - screen->driScreen =
209 - (*screen->dri2->createNewScreen)(pScreen->myNum,
210 - screen->fd,
211 - loader_extensions,
212 - &driConfigs,
213 - screen);
214 -
215 - if (screen->driScreen == NULL) {
216 - LogMessage(X_ERROR,
217 - "AIGLX error: Calling driver entry point failed\n");
218 - goto handle_error;
219 - }
220 + do {
221 + screen->driver = glxProbeDriver(driverName, &cookie,
222 + (void **)&screen->core, __DRI_CORE, 1,
223 + (void **)&screen->dri2, __DRI_DRI2, 1);
224 + if (screen->driver == NULL)
225 + goto handle_error;
226 +
227 + screen->driScreen =
228 + (*screen->dri2->createNewScreen)(pScreen->myNum,
229 + screen->fd,
230 + loader_extensions,
231 + &driConfigs,
232 + screen);
233 + if (screen->driScreen == NULL) {
234 + LogMessage(X_INFO,
235 + "AIGLX: Calling driver entry point failed\n");
236 + }
237 + } while (screen->driScreen == NULL);
239 initializeExtensions(screen);