diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/glx/x11/glxext.c | 69 | 
1 files changed, 66 insertions, 3 deletions
diff --git a/src/glx/x11/glxext.c b/src/glx/x11/glxext.c index d386436396..bc4c606d23 100644 --- a/src/glx/x11/glxext.c +++ b/src/glx/x11/glxext.c @@ -722,6 +722,68 @@ static const __DRIinterfaceMethods interface_methods = {      __glXGetMscRateOML,  }; +#define DRM_MAX_FDS 16 +static struct { +   char *BusID; +   int fd; +   int refcount; +} connection[DRM_MAX_FDS]; + +static int nr_fds = 0; + +int drmOpenOnce(void *unused,  +		const char *BusID, +		int *newlyopened) +{ +   int i; +   int fd; +    +   for (i = 0; i < nr_fds; i++) +      if (strcmp(BusID, connection[i].BusID) == 0) { +	 connection[i].refcount++; +	 *newlyopened = 0; +	 return connection[i].fd; +      } + +   fd = drmOpen(unused, BusID); +   if (fd <= 0 || nr_fds == DRM_MAX_FDS) +      return fd; +    +   connection[nr_fds].BusID = strdup(BusID); +   connection[nr_fds].fd = fd; +   connection[nr_fds].refcount = 1; +   *newlyopened = 1; + +   fprintf(stderr, "saved connection %d for %s %d\n",  +	  nr_fds, connection[nr_fds].BusID,  +	  strcmp(BusID, connection[nr_fds].BusID)); + +   nr_fds++; + +   return fd;    +} + +void drmCloseOnce(int fd) +{ +   int i; + +    + +   for (i = 0; i < nr_fds; i++) { +      if (fd == connection[i].fd) { +	 if (--connection[i].refcount == 0) { +	    drmClose(connection[i].fd); +	    free(connection[i].BusID); +	     +	    if (i < --nr_fds)  +	       connection[i] = connection[nr_fds]; + +	    return; +	 } +      } +   } +} +  /**   * Perform the required libGL-side initialization and call the client-side @@ -773,7 +835,8 @@ CallCreateNewScreen(Display *dpy, int scrn, __DRIscreen *psc,      framebuffer.dev_priv = NULL;      if (XF86DRIOpenConnection(dpy, scrn, &hSAREA, &BusID)) { -	fd = drmOpen(NULL,BusID); +        int newlyopened; +	fd = drmOpenOnce(NULL,BusID, &newlyopened);  	Xfree(BusID); /* No longer needed */  	err_msg = "open DRM"; @@ -800,7 +863,7 @@ CallCreateNewScreen(Display *dpy, int scrn, __DRIscreen *psc,  		}  		err_msg = "XF86DRIAuthConnection"; -		if (XF86DRIAuthConnection(dpy, scrn, magic)) { +		if (!newlyopened || XF86DRIAuthConnection(dpy, scrn, magic)) {  		    char *driverName;  		    /* @@ -904,7 +967,7 @@ CallCreateNewScreen(Display *dpy, int scrn, __DRIscreen *psc,  	}  	if ( fd >= 0 ) { -	    (void)drmClose(fd); +	    (void)drmCloseOnce(fd);  	}  	(void)XF86DRICloseConnection(dpy, scrn);  | 
