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;
     

Attachment: pgpBu1wGu34uH.pgp
Description: PGP signature

Reply via email to