Date: Tue, 22 Feb 2005 22:08:05 +0100 From: Felix =?ISO-8859-1?Q?K=FChling?= <fxkuehl@gmx.de> To: Mikhail Teterin <Mikhail.Teterin@murex.com> Cc: acardenas@bsdperu.org Subject: Re: ports/76257: nvidia_driver breaks xorg-clients build Message-ID: <1109106485.6323.13.camel@trabant> In-Reply-To: <200502221710.j1MH9a5v009787@harik.murex.com> References: <200502220508.j1M58MAN094098@corbulon.video-collage.com> <1109078622.3320.2.camel@trabant> <200502221710.j1MH9a5v009787@harik.murex.com>
next in thread | previous in thread | raw e-mail | index | archive | help
[-- Attachment #1 --]
Am Dienstag, den 22.02.2005, 12:19 -0500 schrieb Mikhail Teterin:
> > It was already changed in my patch. Do you have any better suggestions?
>
> Not really...
>
> > As I mentioned in an earlier mail, the GLX headers from Xorg don't seem
> > to define the ARB function any more.
>
> 6.8.1 still has it. Not sure about 6.8.2. In that case, the following little
> hunk:
>
> +#ifndef GLX_VERSION_1_4
> +# define glXGetProcAddress glXGetProcAddressARB
> +#endif
>
> seems less intrusive :-) The utility will still not *work* when compiled
> against GLX-1.3 headers, but it will *compile*.
>
> To allow for -lGL to be interchangible post-build, however, it may be required
> to make a dlopen/dlsym search for the glXGetProcAddress symbol at run-time.
>
> Would you like a patch? It will, unavoidably, system-specific, but should work
> on most (all?) systems supported by Xorg. You will also be able to remove
> this hack in a few years, when all available GLX implementations are
> upgraded. Yours,
>
> -mi
The attached patch (undo my other patch first) implements something like
this without actually loading libGL dynamically. It uses
dlopen(NULL, ...) to get a handle for the main program (including
libGL). I hope this is portable. Does this work for you?
Note that the patch also changes the Imakefile. In xc/programs/xdriinfo
run this to update the Makefile:
make Makefile
make depend
Then recompile xdriinfo as usual.
--
| Felix Kühling <fxkuehl@gmx.de> http://fxk.de.vu |
| PGP Fingerprint: 6A3C 9566 5B30 DDED 73C3 B152 151C 5CC1 D888 E595 |
[-- Attachment #2 --]
--- ./xdriinfo.c.~1.1.3.1.~ 2004-06-16 11:27:39.000000000 +0200
+++ ./xdriinfo.c 2005-02-22 21:58:15.000000000 +0100
@@ -27,10 +27,13 @@
#include <stdio.h>
#include <unistd.h>
#include <string.h>
+#include <dlfcn.h>
+typedef void (* glXGetProcAddress_t (const GLubyte *procname)) (void);
typedef const char * glXGetScreenDriver_t (Display *dpy, int scrNum);
typedef const char * glXGetDriverConfig_t (const char *driverName);
+glXGetProcAddress_t *GetProcAddress;
glXGetScreenDriver_t *GetScreenDriver;
glXGetDriverConfig_t *GetDriverConfig;
@@ -56,11 +59,33 @@
enum INFO_FUNC func = LIST;
char *funcArg = NULL;
char *dpyName = NULL;
+ void *dlHandle;
- GetScreenDriver = (glXGetScreenDriver_t *)glXGetProcAddress ("glXGetScreenDriver");
- GetDriverConfig = (glXGetDriverConfig_t *)glXGetProcAddress ("glXGetDriverConfig");
+ /* dlopen (NULL, ...) returns a handle for the main program. */
+ dlHandle = dlopen (NULL, RTLD_NOW | RTLD_GLOBAL);
+ if (dlHandle == NULL) {
+ /* should never happen */
+ fprintf (stderr, "Can't dlopen main program.\n");
+ return 1;
+ }
+ GetProcAddress = (glXGetProcAddress_t *)
+ dlsym (dlHandle, "glXGetProcAddress");
+ if (GetProcAddress == NULL)
+ GetProcAddress = (glXGetProcAddress_t *)
+ dlsym (dlHandle, "glXGetProcAddressARB");
+ if (GetProcAddress == NULL) {
+ fprintf (stderr, "Couldn't find glXGetProcAddress[ARB].\n");
+ return 1;
+ }
+ dlclose (dlHandle);
+
+ GetScreenDriver = (glXGetScreenDriver_t *)
+ GetProcAddress ((GLubyte*)"glXGetScreenDriver");
+ GetDriverConfig = (glXGetDriverConfig_t *)
+ GetProcAddress ((GLubyte*)"glXGetDriverConfig");
if (!GetScreenDriver || !GetDriverConfig) {
- fprintf (stderr, "libGL is too old.\n");
+ fprintf (stderr, "libGL does not support the "
+ "DRI configuration infrastructure.\n");
return 1;
}
--- ./Imakefile.~1.2.~ 2004-08-28 15:44:48.000000000 +0200
+++ ./Imakefile 2005-02-22 21:50:48.000000000 +0100
@@ -4,7 +4,7 @@
SRCS = xdriinfo.c
OBJS = xdriinfo.o
- LOCAL_LIBRARIES = $(GLXLIB) $(XLIB)
+ LOCAL_LIBRARIES = $(GLXLIB) $(XLIB) -ldl
DEPLIBS =
AllTarget(ProgramTargetName(xdriinfo))
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?1109106485.6323.13.camel>
