egl: added args string to _eglMain()
authorBrian Paul <brian.paul@tungstengraphics.com>
Wed, 28 May 2008 18:56:36 +0000 (12:56 -0600)
committerBrian Paul <brian.paul@tungstengraphics.com>
Wed, 28 May 2008 18:56:36 +0000 (12:56 -0600)
src/egl/drivers/demo/demo.c
src/egl/drivers/dri/egldri.c
src/egl/main/eglapi.c
src/egl/main/egldisplay.c
src/egl/main/egldisplay.h
src/egl/main/egldriver.c
src/egl/main/egldriver.h
src/egl/main/egltypedefs.h

index 1033f1b4ed6854729c6d6628dc6ecdad5a365786..6b8b71d16badb46018a766a0a0be8da0ed73b295 100644 (file)
@@ -286,7 +286,7 @@ demoMakeCurrent(_EGLDriver *drv, EGLDisplay dpy, EGLSurface draw, EGLSurface rea
  * plug in API functions.
  */
 _EGLDriver *
-_eglMain(_EGLDisplay *dpy)
+_eglMain(_EGLDisplay *dpy, const char *args)
 {
    DemoDriver *demo;
 
index f00625a0593e3f78e7405119be0583462dd4ada5..677073fb3a0d83b4b42f6fd647082a5b8b335dac 100644 (file)
@@ -79,11 +79,11 @@ driver_name_from_card_number(int card, char *driverName, int maxDriverName)
  * This function, in turn, loads a specific DRI driver (ex: r200_dri.so).
  */
 _EGLDriver *
-_eglMain(_EGLDisplay *dpy)
+_eglMain(_EGLDisplay *dpy, const char *args)
 {
 #if 1
    const char *displayString = (const char *) dpy->NativeDisplay;
-   const int card = atoi(displayString + 1);
+   const int card = atoi(args);
    _EGLDriver *driver = NULL;
    char driverName[1000];
 
index fe63d36b803a3ff4d99a789e417f46e42b1f8e11..984af4ea22ea7e379abfc77f276fabc6c7bbc70b 100644 (file)
@@ -68,7 +68,9 @@ eglInitialize(EGLDisplay dpy, EGLint *major, EGLint *minor)
       if (!dpyPriv) {
          return EGL_FALSE;
       }
-      dpyPriv->Driver = _eglOpenDriver(dpyPriv, dpyPriv->DriverName);
+      dpyPriv->Driver = _eglOpenDriver(dpyPriv,
+                                       dpyPriv->DriverName,
+                                       dpyPriv->DriverArgs);
       if (!dpyPriv->Driver) {
          return EGL_FALSE;
       }
index 9c42194c6119019718aea01979ab388d1ad7b065..b2d30d42749f3c545b824ab41eba742066c2a42c 100644 (file)
 #include "egldriver.h"
 #include "eglglobals.h"
 #include "eglhash.h"
-
-
-static char *
-my_strdup(const char *s)
-{
-   if (s) {
-      int l = strlen(s);
-      char *s2 = malloc(l + 1);
-      if (s2)
-         strcpy(s2, s);
-      return s2;
-   }
-   return NULL;
-}
+#include "eglstring.h"
 
 
 /**
  * Allocate a new _EGLDisplay object for the given nativeDisplay handle.
  * We'll also try to determine the device driver name at this time.
+ *
+ * Note that nativeDisplay may be an X Display ptr, or a string.
  */
 _EGLDisplay *
 _eglNewDisplay(NativeDisplayType nativeDisplay)
@@ -46,7 +35,7 @@ _eglNewDisplay(NativeDisplayType nativeDisplay)
       dpy->Xdpy = (Display *) nativeDisplay;
 #endif
 
-      dpy->DriverName = my_strdup(_eglChooseDriver(dpy));
+      dpy->DriverName = _eglstrdup(_eglChooseDriver(dpy));
       if (!dpy->DriverName) {
          free(dpy);
          return NULL;
index be134374ca4912c922f792559cc2bf4c2ac860fd..e2ebab0b218fa6192968c69661271b68b2037664 100644 (file)
@@ -14,6 +14,7 @@ struct _egl_display
    EGLDisplay Handle;
 
    const char *DriverName;
+   const char *DriverArgs;
    _EGLDriver *Driver;
 
    EGLint NumScreens;
index cbdd47948dbe1f203f604dfce6bad3980379a34c..599077190afe3f51a02e51db140297dc2dc9a86c 100644 (file)
@@ -6,6 +6,7 @@
 #include <assert.h>
 #include <dlfcn.h>
 #include <stdio.h>
+#include <stdlib.h>
 #include <string.h>
 #include "eglconfig.h"
 #include "eglcontext.h"
@@ -15,6 +16,7 @@
 #include "egllog.h"
 #include "eglmode.h"
 #include "eglscreen.h"
+#include "eglstring.h"
 #include "eglsurface.h"
 
 #if defined(_EGL_PLATFORM_X)
@@ -25,7 +27,7 @@
 /* XXX to do */
 #endif
 
-const char *DefaultDriverName = "demodriver";
+const char *DefaultDriverName = ":0";
 
 
 /**
@@ -44,23 +46,36 @@ const char *DefaultDriverName = "demodriver";
 const char *
 _eglChooseDriver(_EGLDisplay *dpy)
 {
-   const char *name = (const char *) dpy->NativeDisplay;
+   const char *displayString = (const char *) dpy->NativeDisplay;
    const char *driverName = NULL;
 
-   if (!dpy->NativeDisplay) {
+   if (!displayString) {
       /* choose a default */
-      driverName = DefaultDriverName;
+      displayString = DefaultDriverName;
    }
-   else if (name && name[0] == ':' &&
-            (name[1] >= '0' && name[1] <= '9') && !name[2]) {
+
+   /* extract default DriverArgs = whatever follows ':' */
+   if (displayString[0] == '!' ||
+       displayString[0] == ':') {
+      const char *args = strchr(displayString, ':');
+      if (args)
+         dpy->DriverArgs = _eglstrdup(args + 1);
+   }
+
+
+   if (displayString && displayString[0] == ':' &&
+       (displayString[1] >= '0' && displayString[1] <= '9') &&
+       !displayString[2]) {
       /* XXX probe hardware here to determine which driver to open */
       driverName = "libEGLdri";
    }
-   else if (name && name[0] == '!') {
+   else if (displayString && displayString[0] == '!') {
       /* use specified driver name */
-      driverName = name + 1;
+      driverName = displayString + 1;
    }
    else {
+      /* NativeDisplay is not a string! */
+
 #if defined(_EGL_PLATFORM_X)
       driverName = _xeglChooseDriver(dpy);
 #elif defined(_EGL_PLATFORM_WINDOWS)
@@ -83,7 +98,7 @@ _eglChooseDriver(_EGLDisplay *dpy)
  * \return  new _EGLDriver object.
  */
 _EGLDriver *
-_eglOpenDriver(_EGLDisplay *dpy, const char *driverName)
+_eglOpenDriver(_EGLDisplay *dpy, const char *driverName, const char *args)
 {
    _EGLDriver *drv;
    _EGLMain_t mainFunc;
@@ -110,7 +125,7 @@ _eglOpenDriver(_EGLDisplay *dpy, const char *driverName)
       return NULL;
    }
 
-   drv = mainFunc(dpy);
+   drv = mainFunc(dpy, args);
    if (!drv) {
       dlclose(lib);
       return NULL;
index bde726e25e0fd1663fd4d5cbc0f95d049b1c083c..9c505880b7a61678c3606209a45e750c4d6601f4 100644 (file)
@@ -42,7 +42,7 @@ struct _egl_driver
 };
 
 
-extern _EGLDriver *_eglMain(_EGLDisplay *dpy);
+extern _EGLDriver *_eglMain(_EGLDisplay *dpy, const char *args);
 
 
 extern const char *
@@ -50,7 +50,7 @@ _eglChooseDriver(_EGLDisplay *dpy);
 
 
 extern _EGLDriver *
-_eglOpenDriver(_EGLDisplay *dpy, const char *DriverName);
+_eglOpenDriver(_EGLDisplay *dpy, const char *driverName, const char *args);
 
 
 extern EGLBoolean
index 53810a5a44015ff5d69281c03a28c7ab371e9df8..b1c8ec1f02ed7d8173929586bb08d17552d757db 100644 (file)
@@ -30,7 +30,7 @@ typedef struct _egl_thread_info _EGLThreadInfo;
 
 typedef void (*_EGLProc)();
 
-typedef _EGLDriver *(*_EGLMain_t)(_EGLDisplay *dpy);
+typedef _EGLDriver *(*_EGLMain_t)(_EGLDisplay *dpy, const char *args);
 
 
 #endif /* EGLTYPEDEFS_INCLUDED */