On Thursday 30 December 2004 14:20, Adam Jackson wrote: > - Option 4: Link libdrm into the DRI drivers dynamically instead. > Pros: Doesn't change libGL/driver ABI. > Cons: Requires server control over runtime link path, sketchy. DDX also > calls into libdrm, so DRI driver would need to be loaded into the server > quite early. Creates a new unshared DSO.
This one looks best since most of the cons end up not applying. Attached patches implement this. xf86drmCompat.c has been dropped from libdrm (still there just not built). The default target in drm/libdrm will now build libdrm.so. Also did some visibility cleanups on libdrm while I was in the area. Tested on mga, works just fine. libdrm.so installs into /lib since in a solo world we'll want it before /usr is mounted. Also gave it a real soname so we can install multiple API versions in parallel should the need ever arise. If I add the X module info pieces, libdrm might be usable on the server too, at least under dlloader. - ajax
Index: configs/linux-dri =================================================================== RCS file: /cvs/mesa/Mesa/configs/linux-dri,v retrieving revision 1.20 diff -u -d -r1.20 linux-dri --- configs/linux-dri 27 Dec 2004 20:38:29 -0000 1.20 +++ configs/linux-dri 31 Dec 2004 22:17:12 -0000 @@ -34,7 +34,7 @@ ASM_SOURCES = # Library/program dependencies -DRI_LIB_DEPS = -lm -lpthread -lexpat -ldl +DRI_LIB_DEPS = -ldrm -lm -lpthread -lexpat -ldl GL_LIB_DEPS = -L/usr/X11R6/lib -lX11 -lXext -lXxf86vm -lm -lpthread -ldl GLUT_LIB_DEPS = -L$(LIB_DIR) -l$(GLU_LIB) -l$(GL_LIB) -L/usr/X11R6/lib -lX11 -lXmu -lXt -lXi -lm Index: src/mesa/drivers/dri/Makefile.template =================================================================== RCS file: /cvs/mesa/Mesa/src/mesa/drivers/dri/Makefile.template,v retrieving revision 1.15 diff -u -d -r1.15 Makefile.template --- src/mesa/drivers/dri/Makefile.template 9 Dec 2004 08:42:20 -0000 1.15 +++ src/mesa/drivers/dri/Makefile.template 31 Dec 2004 22:17:12 -0000 @@ -4,7 +4,7 @@ ifeq ($(WINDOW_SYSTEM),dri) -WINOBJ=../dri_client/dri.a +WINOBJ= WINLIB= INCLUDES = $(SHARED_INCLUDES) \ -I../dri_client \
Index: Makefile =================================================================== RCS file: /cvs/dri/drm/libdrm/Makefile,v retrieving revision 1.2 diff -u -d -r1.2 Makefile --- Makefile 7 Nov 2004 02:15:11 -0000 1.2 +++ Makefile 31 Dec 2004 21:42:09 -0000 @@ -1,12 +1,22 @@ -SOURCES = xf86drm.c xf86drmCompat.c xf86drmHash.c xf86drmRandom.c xf86drmSL.c -OBJECTS = xf86drm.o xf86drmCompat.o xf86drmHash.o xf86drmRandom.o xf86drmSL.o +SOURCES = xf86drm.c xf86drmHash.c xf86drmRandom.c xf86drmSL.c +OBJECTS = xf86drm.o xf86drmHash.o xf86drmRandom.o xf86drmSL.o + +CFLAGS = -O2 -fPIC -g -momit-leaf-frame-pointer + +all: libdrm.so libxf86drm.a: $(OBJECTS) ar rc $@ $+ ranlib $@ +libdrm.so: $(OBJECTS) + gcc -shared -Wl,-hlibdrm.so.1 -o $@ $+ + $(OBJECTS): $(SOURCES) $(CC) $(CFLAGS) -c -I../shared -I../linux $+ clean: - rm *.a *.o + rm -f *.a *.o *.so + +install: libdrm.so + install -m 755 libdrm.so /lib Index: xf86drm.c =================================================================== RCS file: /cvs/dri/drm/libdrm/xf86drm.c,v retrieving revision 1.50 diff -u -d -r1.50 xf86drm.c --- xf86drm.c 11 Aug 2004 23:23:35 -0000 1.50 +++ xf86drm.c 31 Dec 2004 21:42:10 -0000 @@ -152,14 +152,14 @@ void *tagTable; } drmHashEntry; -void *drmMalloc(int size) +drm_internal void *drmMalloc(int size) { void *pt; if ((pt = _DRM_MALLOC(size))) memset(pt, 0, size); return pt; } -void drmFree(void *pt) +drm_internal void drmFree(void *pt) { if (pt) _DRM_FREE(pt); } @@ -384,9 +384,9 @@ return 0; } - if ((version = drmGetVersion(fd))) { + if ((version = _drmGetVersion(fd))) { retval = 1; - drmFreeVersion(version); + _drmFreeVersion(version); } close(fd); @@ -422,14 +422,14 @@ sv.drm_di_major = 1; sv.drm_di_minor = 1; sv.drm_dd_major = -1; /* Don't care */ - drmSetInterfaceVersion(fd, &sv); - buf = drmGetBusid(fd); + _drmSetInterfaceVersion(fd, &sv); + buf = _drmGetBusid(fd); drmMsg("drmOpenByBusid: drmGetBusid reports %s\n", buf); if (buf && drmMatchBusID(buf, busid)) { - drmFreeBusid(buf); + _drmFreeBusid(buf); return fd; } - if (buf) drmFreeBusid(buf); + if (buf) _drmFreeBusid(buf); close(fd); } } @@ -458,7 +458,7 @@ drmVersionPtr version; char * id; - if (!drmAvailable()) { + if (!_drmAvailable()) { #if !defined(XFree86Server) return -1; #else @@ -477,21 +477,21 @@ */ for (i = 0; i < DRM_MAX_MINOR; i++) { if ((fd = drmOpenMinor(i, 1)) >= 0) { - if ((version = drmGetVersion(fd))) { + if ((version = _drmGetVersion(fd))) { if (!strcmp(version->name, name)) { - drmFreeVersion(version); - id = drmGetBusid(fd); + _drmFreeVersion(version); + id = _drmGetBusid(fd); drmMsg("drmGetBusid returned '%s'\n", id ? id : "NULL"); if (!id || !*id) { if (id) { - drmFreeBusid(id); + _drmFreeBusid(id); } return fd; } else { - drmFreeBusid(id); + _drmFreeBusid(id); } } else { - drmFreeVersion(version); + _drmFreeVersion(version); } } close(fd); @@ -552,7 +552,7 @@ int drmOpen(const char *name, const char *busid) { #ifdef XFree86Server - if (!drmAvailable() && name != NULL) { + if (!_drmAvailable() && name != NULL) { /* try to load the kernel */ if (!xf86LoadKernelModule(name)) { ErrorF("[drm] failed to load kernel module \"%s\"\n", Index: xf86drm.h =================================================================== RCS file: /cvs/dri/drm/libdrm/xf86drm.h,v retrieving revision 1.2 diff -u -d -r1.2 xf86drm.h --- xf86drm.h 31 Jul 2004 08:12:39 -0000 1.2 +++ xf86drm.h 31 Dec 2004 21:42:10 -0000 @@ -482,6 +482,17 @@ } \ } while(0) +/* + * alias and visibility support for modern gcc + * for libdrm all functions are exported unless marked otherwise + */ +#if defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__) >= 303 +# define drm_internal __attribute__((visibility("hidden"))) +# define DRM_ALIAS(f) typeof(f) _##f drm_internal __attribute__((alias(#f))); +#else +# define drm_internal +#endif + /* General user-level programmer's API: unprivileged */ extern int drmAvailable(void); extern int drmOpen(const char *name, const char *busid); @@ -633,4 +644,23 @@ unsigned long *prev_key, void **prev_value, unsigned long *next_key, void **next_value); +/* + * aliases for internal use + */ +#ifdef DRM_ALIAS +DRM_ALIAS(drmAvailable) +DRM_ALIAS(drmGetVersion) +DRM_ALIAS(drmFreeVersion) +DRM_ALIAS(drmSetInterfaceVersion) +DRM_ALIAS(drmGetBusid) +DRM_ALIAS(drmFreeBusid) +#else +#define _drmAvailable drmAvailable +#define _drmGetVersion drmGetVersion +#define _drmFreeVersion drmFreeVersion +#define _drmSetInterfaceVersion drmSetInterfaceVersion +#define _drmGetBusid drmGetBusid +#define _drmFreeBusid drmFreeBusid +#endif + #endif Index: xf86drmHash.c =================================================================== RCS file: /cvs/dri/drm/libdrm/xf86drmHash.c,v retrieving revision 1.5 diff -u -d -r1.5 xf86drmHash.c --- xf86drmHash.c 9 Apr 2001 21:56:31 -0000 1.5 +++ xf86drmHash.c 31 Dec 2004 21:42:10 -0000 @@ -162,7 +162,7 @@ return hash; } -void *N(HashCreate)(void) +drm_internal void *N(HashCreate)(void) { HashTablePtr table; int i; @@ -179,7 +179,7 @@ return table; } -int N(HashDestroy)(void *t) +drm_internal int N(HashDestroy)(void *t) { HashTablePtr table = (HashTablePtr)t; HashBucketPtr bucket; @@ -203,7 +203,7 @@ top. */ static HashBucketPtr HashFind(HashTablePtr table, - unsigned long key, unsigned long *h) + unsigned long key, unsigned long *h) { unsigned long hash = HashHash(key); HashBucketPtr prev = NULL; @@ -230,7 +230,7 @@ return NULL; } -int N(HashLookup)(void *t, unsigned long key, void **value) +drm_internal int N(HashLookup)(void *t, unsigned long key, void **value) { HashTablePtr table = (HashTablePtr)t; HashBucketPtr bucket; @@ -243,7 +243,7 @@ return 0; /* Found */ } -int N(HashInsert)(void *t, unsigned long key, void *value) +drm_internal int N(HashInsert)(void *t, unsigned long key, void *value) { HashTablePtr table = (HashTablePtr)t; HashBucketPtr bucket; @@ -265,7 +265,7 @@ return 0; /* Added to table */ } -int N(HashDelete)(void *t, unsigned long key) +drm_internal int N(HashDelete)(void *t, unsigned long key) { HashTablePtr table = (HashTablePtr)t; unsigned long hash; @@ -282,7 +282,7 @@ return 0; } -int N(HashNext)(void *t, unsigned long *key, void **value) +drm_internal int N(HashNext)(void *t, unsigned long *key, void **value) { HashTablePtr table = (HashTablePtr)t; @@ -298,7 +298,7 @@ return 0; } -int N(HashFirst)(void *t, unsigned long *key, void **value) +drm_internal int N(HashFirst)(void *t, unsigned long *key, void **value) { HashTablePtr table = (HashTablePtr)t; Index: xf86drmRandom.c =================================================================== RCS file: /cvs/dri/drm/libdrm/xf86drmRandom.c,v retrieving revision 1.3 diff -u -d -r1.3 xf86drmRandom.c --- xf86drmRandom.c 11 Jul 2000 11:41:06 -0000 1.3 +++ xf86drmRandom.c 31 Dec 2004 21:42:10 -0000 @@ -119,7 +119,7 @@ extern double N(RandomDouble)(void *state); #endif -void *N(RandomCreate)(unsigned long seed) +drm_internal void *N(RandomCreate)(unsigned long seed) { RandomState *state; @@ -149,13 +149,13 @@ return state; } -int N(RandomDestroy)(void *state) +drm_internal int N(RandomDestroy)(void *state) { RANDOM_FREE(state); return 0; } -unsigned long N(Random)(void *state) +drm_internal unsigned long N(Random)(void *state) { RandomState *s = (RandomState *)state; long hi; @@ -169,7 +169,7 @@ return s->seed; } -double N(RandomDouble)(void *state) +drm_internal double N(RandomDouble)(void *state) { RandomState *s = (RandomState *)state;
pgpBu1wGu34uH.pgp
Description: PGP signature