Lots of fixes, clean-ups, new comments, etc.
authorBrian Paul <brian.paul@tungstengraphics.com>
Mon, 28 Nov 2005 00:00:08 +0000 (00:00 +0000)
committerBrian Paul <brian.paul@tungstengraphics.com>
Mon, 28 Nov 2005 00:00:08 +0000 (00:00 +0000)
To set the FBdev video mode, need to add a \n char to the string.

src/egl/drivers/dri/egldri.c
src/egl/drivers/dri/egldri.h

index bfc3364904e3a22f55a4c7e27fd569aac6f3b5dd..a84611535a3d42f358aa44aa839b31331a9632e5 100644 (file)
@@ -1,6 +1,13 @@
-/*
- * Generic EGL driver for DRI
+/**
+ * Generic EGL driver for DRI.
+ *
+ * This file contains all the code needed to interface DRI-based drivers
+ * with libEGL.
+ *
+ * There's a lot of dependencies on fbdev and the /sys/ filesystem.
  */
+
+
 #include <dirent.h>
 #include <stdio.h>
 #include <string.h>
@@ -19,6 +26,7 @@
 #include "eglsurface.h"
 #include "eglscreen.h"
 #include "eglglobals.h"
+#include "egllog.h"
 #include "eglmode.h"
 
 #include "egldri.h"
@@ -27,9 +35,11 @@ const char *sysfs = "/sys/class";
 #define None 0
 static const int empty_attribute_list[1] = { None };
 
+
 /**
- * The bootstrap function.  Return a new driDriver object and
- * plug in API functions.
+ * The bootstrap function.
+ * Return a new driDriver object and plug in API functions.
+ * This function, in turn, loads a specific DRI driver (ex: r200_dri.so).
  */
 _EGLDriver *
 _eglMain(_EGLDisplay *dpy)
@@ -37,13 +47,15 @@ _eglMain(_EGLDisplay *dpy)
    int length;
    char path[NAME_MAX];
    struct dirent *dirent;
+#if 1
    FILE *file;
+#endif
    DIR *dir;
    _EGLDriver *driver = NULL;;
 
    snprintf(path, sizeof(path), "%s/drm", sysfs);
    if (!(dir = opendir(path))) {
-      printf("EGL - %s DRM devices not found.", path);
+      _eglLog(_EGL_WARNING, "%s DRM devices not found.", path);
       return EGL_FALSE;
    }
    while ((dirent = readdir(dir))) {
@@ -54,10 +66,18 @@ _eglMain(_EGLDisplay *dpy)
          continue;
 
       snprintf(path, sizeof(path), "%s/drm/card%s/dri_library_name", sysfs, &dpy->Name[1]);
+      _eglLog(_EGL_INFO, "Opening %s", path);
+#if 1
       file = fopen(path, "r");
+      if (!file) {
+         _eglLog(_EGL_WARNING, "Failed to open %s", path);
+         return NULL;
+      }
       fgets(path, sizeof(path), file);
       fclose(file);
-
+#else
+      strcpy(path, "r200\n");
+#endif
       if ((length = strlen(path)) > 0)
          path[length - 1] = '\0';  /* remove the trailing newline from sysfs */
       strncat(path, "_dri", sizeof(path));
@@ -72,52 +92,47 @@ _eglMain(_EGLDisplay *dpy)
 }
 
 
+/**
+ * Called by eglCreateContext via drv->API.CreateContext().
+ */
 static EGLContext
-_eglDRICreateContext(_EGLDriver *drv, EGLDisplay dpy, EGLConfig config, EGLContext share_list, const EGLint *attrib_list)
+_eglDRICreateContext(_EGLDriver *drv, EGLDisplay dpy, EGLConfig config,
+                     EGLContext share_list, const EGLint *attrib_list)
 {
-   _EGLConfig *conf;
-   driContext *c;
    driDisplay *disp = Lookup_driDisplay(dpy);
-   driContext *share = Lookup_driContext(share_list);
+   driContext *c, *share;
    void *sharePriv;
-   __GLcontextModes mode;
-   int i;
-
-   conf = _eglLookupConfig(drv, dpy, config);
-   if (!conf) {
-      _eglError(EGL_BAD_CONFIG, "eglCreateContext");
-      return EGL_NO_CONTEXT;
-   }
-
-   for (i = 0; attrib_list && attrib_list[i] != EGL_NONE; i++) {
-      switch (attrib_list[i]) {
-         /* no attribs defined for now */
-      default:
-         _eglError(EGL_BAD_ATTRIBUTE, "eglCreateContext");
-         return EGL_NO_CONTEXT;
-      }
-   }
+   _EGLConfig *conf;
+   __GLcontextModes visMode;
 
    c = (driContext *) calloc(1, sizeof(*c));
    if (!c)
       return EGL_NO_CONTEXT;
 
-   _eglInitContext(&c->Base);
-   c->Base.Display = &disp->Base;
-   c->Base.Config = conf;
-   c->Base.DrawSurface = EGL_NO_SURFACE;
-   c->Base.ReadSurface = EGL_NO_SURFACE;
-
-   _eglConfigToContextModesRec(conf, &mode);
+   if (!_eglInitContext(drv, dpy, &c->Base, config, attrib_list)) {
+      free(c);
+      return EGL_NO_CONTEXT;
+   }
 
+   if (share_list != EGL_NO_CONTEXT) {
+      _EGLContext *shareCtx = _eglLookupContext(share_list);
+      if (!shareCtx) {
+         _eglError(EGL_BAD_CONTEXT, "eglCreateContext(share_list)");
+         return EGL_FALSE;
+      }
+   }
+   share = Lookup_driContext(share_list);
    if (share)
       sharePriv = share->driContext.private;
    else
       sharePriv = NULL;
 
-   c->driContext.private = disp->driScreen.createNewContext(disp, &mode,
-           GLX_WINDOW_BIT, sharePriv, &c->driContext);
+   conf = _eglLookupConfig(drv, dpy, config);
+   assert(conf);
+   _eglConfigToContextModesRec(conf, &visMode);
 
+   c->driContext.private = disp->driScreen.createNewContext(disp, &visMode,
+           GLX_WINDOW_BIT, sharePriv, &c->driContext);
    if (!c->driContext.private) {
       free(c);
       return EGL_FALSE;
@@ -125,14 +140,14 @@ _eglDRICreateContext(_EGLDriver *drv, EGLDisplay dpy, EGLConfig config, EGLConte
 
    /* generate handle and insert into hash table */
    _eglSaveContext(&c->Base);
-   assert(c->Base.Handle);
 
    return c->Base.Handle;
 }
 
 
 static EGLBoolean
-_eglDRIMakeCurrent(_EGLDriver *drv, EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext context)
+_eglDRIMakeCurrent(_EGLDriver *drv, EGLDisplay dpy, EGLSurface draw,
+                   EGLSurface read, EGLContext context)
 {
    driDisplay *disp = Lookup_driDisplay(dpy);
    driContext *ctx = Lookup_driContext(context);
@@ -144,65 +159,18 @@ _eglDRIMakeCurrent(_EGLDriver *drv, EGLDisplay dpy, EGLSurface draw, EGLSurface
 
    if (ctx) {
       ctx->driContext.bindContext(disp, 0, read, draw, &ctx->driContext);
-   } else {
-//      _mesa_make_current( NULL, NULL, NULL );
-   }
-   return EGL_TRUE;
-}
-
-
-static EGLSurface
-_eglDRICreateWindowSurface(_EGLDriver *drv, EGLDisplay dpy, EGLConfig config, NativeWindowType window, const EGLint *attrib_list)
-{
-   int i;
-   for (i = 0; attrib_list && attrib_list[i] != EGL_NONE; i++) {
-      switch (attrib_list[i]) {
-         /* no attribs at this time */
-      default:
-         _eglError(EGL_BAD_ATTRIBUTE, "eglCreateWindowSurface");
-         return EGL_NO_SURFACE;
-      }
-   }
-   printf("eglCreateWindowSurface()\n");
-   /* XXX unfinished */
-
-   return EGL_NO_SURFACE;
-}
-
-
-static EGLSurface
-_eglDRICreatePixmapSurface(_EGLDriver *drv, EGLDisplay dpy, EGLConfig config, NativePixmapType pixmap, const EGLint *attrib_list)
-{
-   _EGLConfig *conf;
-   EGLint i;
-
-   conf = _eglLookupConfig(drv, dpy, config);
-   if (!conf) {
-      _eglError(EGL_BAD_CONFIG, "eglCreatePixmapSurface");
-      return EGL_NO_SURFACE;
    }
-
-   for (i = 0; attrib_list && attrib_list[i] != EGL_NONE; i++) {
-      switch (attrib_list[i]) {
-         /* no attribs at this time */
-      default:
-         _eglError(EGL_BAD_ATTRIBUTE, "eglCreatePixmapSurface");
-         return EGL_NO_SURFACE;
-      }
-   }
-
-   if (conf->Attrib[EGL_SURFACE_TYPE - FIRST_ATTRIB] == 0) {
-      _eglError(EGL_BAD_MATCH, "eglCreatePixmapSurface");
-      return EGL_NO_SURFACE;
+   else {
+      /* what's this??? */
+      /*      _mesa_make_current( NULL, NULL, NULL );*/
    }
-
-   printf("eglCreatePixmapSurface()\n");
-   return EGL_NO_SURFACE;
+   return EGL_TRUE;
 }
 
 
 static EGLSurface
-_eglDRICreatePbufferSurface(_EGLDriver *drv, EGLDisplay dpy, EGLConfig config, const EGLint *attrib_list)
+_eglDRICreatePbufferSurface(_EGLDriver *drv, EGLDisplay dpy, EGLConfig config,
+                            const EGLint *attrib_list)
 {
    driSurface *surf;
 
@@ -211,26 +179,29 @@ _eglDRICreatePbufferSurface(_EGLDriver *drv, EGLDisplay dpy, EGLConfig config, c
       return EGL_NO_SURFACE;
    }
 
-   if (_eglInitPbufferSurface(&surf->Base, drv, dpy, config, attrib_list) == EGL_NO_SURFACE) {
+   if (!_eglInitSurface(drv, dpy, &surf->Base, EGL_PBUFFER_BIT,
+                        config, attrib_list)) {
       free(surf);
       return EGL_NO_SURFACE;
    }
 
    /* create software-based pbuffer */
    {
-//      GLcontext *ctx = NULL; /* this _should_ be OK */
-      GLvisual vis;
+#if 0
+      GLcontext *ctx = NULL; /* this _should_ be OK */
+#endif
+      GLvisual visMode;
       _EGLConfig *conf = _eglLookupConfig(drv, dpy, config);
       assert(conf); /* bad config should be caught earlier */
-      _eglConfigToContextModesRec(conf, &vis);
+      _eglConfigToContextModesRec(conf, &visMode);
 
 #if 0
-      surf->mesa_framebuffer = _mesa_create_framebuffer(&vis);
+      surf->mesa_framebuffer = _mesa_create_framebuffer(&visMode);
       _mesa_add_soft_renderbuffers(surf->mesa_framebuffer,
                                    GL_TRUE, /* color bufs */
-                                   vis.haveDepthBuffer,
-                                   vis.haveStencilBuffer,
-                                   vis.haveAccumBuffer,
+                                   visMode.haveDepthBuffer,
+                                   visMode.haveStencilBuffer,
+                                   visMode.haveAccumBuffer,
                                    GL_FALSE, /* alpha */
                                    GL_FALSE /* aux */ );
 
@@ -240,6 +211,8 @@ _eglDRICreatePbufferSurface(_EGLDriver *drv, EGLDisplay dpy, EGLConfig config, c
 #endif
    }
 
+   _eglSaveSurface(&surf->Base);
+
    return surf->Base.Handle;
 }
 
@@ -249,6 +222,7 @@ _eglDRIDestroySurface(_EGLDriver *drv, EGLDisplay dpy, EGLSurface surface)
 {
    driDisplay *disp = Lookup_driDisplay(dpy);
    driSurface *fs = Lookup_driSurface(surface);
+
    _eglRemoveSurface(&fs->Base);
 
    fs->drawable.destroyDrawable(disp, fs->drawable.private);
@@ -275,7 +249,8 @@ _eglDRIDestroyContext(_EGLDriver *drv, EGLDisplay dpy, EGLContext context)
 
    if (fc->Base.IsBound) {
       fc->Base.DeletePending = EGL_TRUE;
-   } else {
+   }
+   else {
       free(fc);
    }
    return EGL_TRUE;
@@ -287,139 +262,201 @@ _eglDRIDestroyContext(_EGLDriver *drv, EGLDisplay dpy, EGLContext context)
  */
 static EGLSurface
 _eglDRICreateScreenSurfaceMESA(_EGLDriver *drv, EGLDisplay dpy, EGLConfig cfg,
-                          const EGLint *attrib_list)
+                               const EGLint *attrib_list)
 {
    _EGLConfig *config = _eglLookupConfig(drv, dpy, cfg);
    driDisplay *disp = Lookup_driDisplay(dpy);
    driSurface *surface;
-   EGLSurface surf;
-   GLvisual vis;
+   GLvisual visMode;
 
-   surface = (driSurface *) malloc(sizeof(*surface));
+   surface = (driSurface *) calloc(1, sizeof(*surface));
    if (!surface) {
       return EGL_NO_SURFACE;
    }
 
-   /* init base class, error check, etc. */
-   surf = _eglInitScreenSurface(&surface->Base, drv, dpy, cfg, attrib_list);
-   if (surf == EGL_NO_SURFACE) {
+   /* init base class, do error checking, etc. */
+   if (!_eglInitSurface(drv, dpy, &surface->Base, EGL_SCREEN_BIT_MESA,
+                        cfg, attrib_list)) {
       free(surface);
       return EGL_NO_SURFACE;
    }
 
+   _eglSaveSurface(&surface->Base);
+
+
+   /*
+    * XXX this is where we should allocate video memory for the surface!
+    */
+
+
    /* convert EGLConfig to GLvisual */
-   _eglConfigToContextModesRec(config, &vis);
+   _eglConfigToContextModesRec(config, &visMode);
 
-   /* Create a new drawable */
-   if (!disp->driScreen.createNewDrawable(disp, &vis, surf, &surface->drawable,
-                           GLX_WINDOW_BIT, empty_attribute_list)) {
-      free(surface);
+   /* Create a new DRI drawable */
+   if (!disp->driScreen.createNewDrawable(disp, &visMode, surface->Base.Handle,
+                                          &surface->drawable, GLX_WINDOW_BIT,
+                                          empty_attribute_list)) {
       _eglRemoveSurface(&surface->Base);
+      free(surface);
       return EGL_NO_SURFACE;
    }
-   return surf;
+
+   return surface->Base.Handle;
 }
 
 
 /**
  * Show the given surface on the named screen.
  * If surface is EGL_NO_SURFACE, disable the screen's output.
+ * Called via eglShowSurfaceMESA().
  */
 EGLBoolean
 _eglDRIShowSurfaceMESA(_EGLDriver *drv, EGLDisplay dpy, EGLScreenMESA screen,
-                    EGLSurface surface, EGLModeMESA m)
+                       EGLSurface surface, EGLModeMESA m)
 {
    driDisplay *display = Lookup_driDisplay(dpy);
    driScreen *scrn = Lookup_driScreen(dpy, screen);
    driSurface *surf = Lookup_driSurface(surface);
-   FILE *file;
-   char buffer[NAME_MAX];
    _EGLMode *mode = _eglLookupMode(dpy, m);
-   int width, height, temp;
-
-   _eglQuerySurface(drv, dpy, surface, EGL_WIDTH, &width);
-   _eglQuerySurface(drv, dpy, surface, EGL_HEIGHT, &height);
+   FILE *file;
+   char fname[NAME_MAX], buffer[1000];
+   int temp;
 
+   /* This will check that surface, screen, and mode are valid.
+    * Also, it checks that the surface is large enough for the mode, etc.
+    */
    if (!_eglShowSurfaceMESA(drv, dpy, screen, surface, m))
       return EGL_FALSE;
 
-   snprintf(buffer, sizeof(buffer), "%s/graphics/%s/blank", sysfs, scrn->fb);
+   assert(surface == EGL_NO_SURFACE || surf);
+   assert(m == EGL_NO_MODE_MESA || mode);
+   assert(scrn);
 
-   file = fopen(buffer, "r+");
+   /*
+    * Blank/unblank screen depending on if m == EGL_NO_MODE_MESA
+    */
+   snprintf(fname, sizeof(fname), "%s/graphics/%s/blank", sysfs, scrn->fb);
+   file = fopen(fname, "r+");
    if (!file) {
-err:
-      printf("kernel patch?? chown all fb sysfs attrib to allow write - %s\n", buffer);
-      _eglError(EGL_BAD_SURFACE, "eglShowSurfaceMESA");
+      _eglLog(_EGL_WARNING, "kernel patch?? chown all fb sysfs attrib to allow"
+              " write - %s\n", fname);
       return EGL_FALSE;
    }
-   snprintf(buffer, sizeof(buffer), "%d", (m == EGL_NO_MODE_MESA ? VESA_POWERDOWN : VESA_VSYNC_SUSPEND));
+   snprintf(buffer, sizeof(buffer), "%d",
+            (m == EGL_NO_MODE_MESA ? VESA_POWERDOWN : VESA_VSYNC_SUSPEND));
    fputs(buffer, file);
    fclose(file);
 
-   if (m == EGL_NO_MODE_MESA)
+   if (m == EGL_NO_MODE_MESA) {
+      /* all done! */
       return EGL_TRUE;
+   }
 
-   snprintf(buffer, sizeof(buffer), "%s/graphics/%s/mode", sysfs, scrn->fb);
+   _eglLog(_EGL_INFO, "Setting display mode to %d x %d, %d bpp",
+           mode->Width, mode->Height, display->bpp);
 
-   file = fopen(buffer, "r+");
-   if (!file)
-      goto err;
-   fputs(mode->Name, file);
+   /*
+    * Set the display mode
+    */
+   snprintf(fname, sizeof(fname), "%s/graphics/%s/mode", sysfs, scrn->fb);
+   file = fopen(fname, "r+");
+   if (!file) {
+      _eglLog(_EGL_WARNING, "Failed to open %s to set mode", fname);
+      return EGL_FALSE;
+   }
+   /* note: nothing happens without the \n! */
+   snprintf(buffer, sizeof(buffer), "%s\n", mode->Name);
+   fputs(buffer, file);
    fclose(file);
+   _eglLog(_EGL_INFO, "Set mode to %s in %s", mode->Name, fname);
 
-   snprintf(buffer, sizeof(buffer), "%s/graphics/%s/bits_per_pixel", sysfs, scrn->fb);
-
-   file = fopen(buffer, "r+");
-   if (!file)
-      goto err;
+   /*
+    * Set display bpp
+    */
+   snprintf(fname, sizeof(fname), "%s/graphics/%s/bits_per_pixel",
+            sysfs, scrn->fb);
+   file = fopen(fname, "r+");
+   if (!file) {
+      _eglLog(_EGL_WARNING, "Failed to open %s to set bpp", fname);
+      return EGL_FALSE;
+   }
    display->bpp = GET_CONFIG_ATTRIB(surf->Base.Config, EGL_BUFFER_SIZE);
    display->cpp = display->bpp / 8;
    snprintf(buffer, sizeof(buffer), "%d", display->bpp);
    fputs(buffer, file);
    fclose(file);
 
-   snprintf(buffer, sizeof(buffer), "%s/graphics/%s/blank", sysfs, scrn->fb);
-
-   file = fopen(buffer, "r+");
-   if (!file)
-      goto err;
-
+   /*
+    * Unblank display
+    */
+   snprintf(fname, sizeof(fname), "%s/graphics/%s/blank", sysfs, scrn->fb);
+   file = fopen(fname, "r+");
+   if (!file) {
+      _eglLog(_EGL_WARNING, "Failed to open %s", fname);
+      return EGL_FALSE;
+   }
    snprintf(buffer, sizeof(buffer), "%d", VESA_NO_BLANKING);
    fputs(buffer, file);
    fclose(file);
 
-   snprintf(buffer, sizeof(buffer), "%s/graphics/%s/virtual_size", sysfs, scrn->fb);
-   file = fopen(buffer, "r+");
-   snprintf(buffer, sizeof(buffer), "%d,%d", width, height);
+   /*
+    * Set fbdev buffer virtual size to surface's size.
+    */
+   snprintf(fname, sizeof(fname), "%s/graphics/%s/virtual_size", sysfs, scrn->fb);
+   file = fopen(fname, "r+");
+   snprintf(buffer, sizeof(buffer), "%d,%d", surf->Base.Width, surf->Base.Height);
    fputs(buffer, file);
    rewind(file);
    fgets(buffer, sizeof(buffer), file);
    sscanf(buffer, "%d,%d", &display->virtualWidth, &display->virtualHeight);
    fclose(file);
 
+   /*
+    * round up pitch as needed
+    */
    temp = display->virtualWidth;
    switch (display->bpp / 8) {
    case 1: temp = (display->virtualWidth + 127) & ~127; break;
    case 2: temp = (display->virtualWidth +  31) &  ~31; break;
    case 3:
    case 4: temp = (display->virtualWidth +  15) &  ~15; break;
+   default:
+      _eglLog(_EGL_WARNING, "Bad display->bpp = %d in _eglDRIShowSurface");
    }
    display->virtualWidth = temp;
 
-   if ((width != display->virtualWidth) || (height != display->virtualHeight))
-      goto err;
+   /*
+    * sanity check
+    */
+   if (surf->Base.Width < display->virtualWidth ||
+       surf->Base.Height < display->virtualHeight) {
+      /* this case _should_ have been caught at the top of this function */
+      _eglLog(_EGL_WARNING, "too small of surface in _eglDRIShowSurfaceMESA "
+              "%d x %d < %d x %d", 
+              surf->Base.Width,
+              surf->Base.Height,
+              display->virtualWidth,
+              display->virtualHeight);
+      /*
+      return EGL_FALSE;
+      */
+   }
 
    return EGL_TRUE;
 }
 
 
-/* If the backbuffer is on a videocard, this is extraordinarily slow!
+/**
+ * Called by eglSwapBuffers via the drv->API.SwapBuffers() pointer.
+ *
+ * If the backbuffer is on a videocard, this is extraordinarily slow!
  */
 static EGLBoolean
 _eglDRISwapBuffers(_EGLDriver *drv, EGLDisplay dpy, EGLSurface draw)
 {
    driSurface *drawable = Lookup_driSurface(draw);
 
+   /* this does error checking */
    if (!_eglSwapBuffers(drv, dpy, draw))
       return EGL_FALSE;
 
@@ -430,7 +467,8 @@ _eglDRISwapBuffers(_EGLDriver *drv, EGLDisplay dpy, EGLSurface draw)
 
 
 EGLBoolean
-_eglDRIGetDisplayInfo( driDisplay *dpy) {
+_eglDRIGetDisplayInfo(driDisplay *dpy)
+{
    char path[ NAME_MAX ];
    FILE *file;
    int rc, mtrr;
@@ -444,13 +482,17 @@ _eglDRIGetDisplayInfo( driDisplay *dpy) {
 
    snprintf( path, sizeof( path ), "%s/graphics/fb%d/device/device", sysfs, dpy->minor );
    file = fopen( path, "r" );
+   if (!file) {
+      _eglLog(_EGL_WARNING, "Unable to open %s", path);
+      return EGL_FALSE;
+   }
    fgets( path, sizeof( path ), file );
    sscanf( path, "%x", &dpy->chipset );
    fclose( file );
 
    sprintf(path, DRM_DEV_NAME, DRM_DIR_NAME, dpy->minor);
    if ( ( dpy->drmFD = open(path, O_RDWR, 0) ) < 0 ) {
-      fprintf( stderr, "[drm] drmOpen failed\n" );
+      _eglLog(_EGL_WARNING, "drmOpen failed.");
       return EGL_FALSE;
    }
 
@@ -468,17 +510,24 @@ _eglDRIGetDisplayInfo( driDisplay *dpy) {
       return EGL_FALSE;
 
    for ( i = 0;; i++ ) {
-      if ( ( rc = drmGetMap( dpy->drmFD, i, &offset, &size, &type, &flags, &handle, &mtrr ) ) != 0 )
+      if ( ( rc = drmGetMap( dpy->drmFD, i, &offset, &size, &type, &flags, &handle, &mtrr ) ) != 0 ) {
+         _eglLog(_EGL_WARNING, "drmGetMap failed (%s)", strerror(errno)); 
          break;
+      }
       if ( type == DRM_FRAME_BUFFER ) {
-         if ( ( rc = drmMap( dpy->drmFD, offset, size, ( drmAddressPtr ) & dpy->pFB ) ) < 0 )
+         if ( ( rc = drmMap( dpy->drmFD, offset, size, ( drmAddressPtr ) & dpy->pFB ) ) < 0 ) {
+            _eglLog(_EGL_WARNING, "drmMap failed");
             return EGL_FALSE;
+         }
          dpy->fbSize = size;
          break;
       }
+      _eglLog(_EGL_INFO, "Map %d offset=0x%x", i, (int) offset);
    }
-   if ( !dpy->pFB )
+   if ( !dpy->pFB ) {
+      _eglLog(_EGL_WARNING, "failed to map framebuffer");
       return EGL_FALSE;
+   }
 
    dpy->SAREASize = SAREA_MAX;
 
@@ -487,7 +536,7 @@ _eglDRIGetDisplayInfo( driDisplay *dpy) {
          break;
       if ( type == DRM_SHM ) {
          if ( drmMap( dpy->drmFD, offset, size, ( drmAddressPtr ) ( &dpy->pSAREA ) ) < 0 ) {
-            fprintf( stderr, "[drm] drmMap failed\n" );
+            _eglLog(_EGL_WARNING, "drmMap failed.");
             return 0;
          }
          break;
@@ -497,20 +546,28 @@ _eglDRIGetDisplayInfo( driDisplay *dpy) {
       return 0;
 
    memset( dpy->pSAREA, 0, dpy->SAREASize );
-   fprintf( stderr, "[drm] mapped SAREA 0x%08lx to %p, size %d\n",
-            offset, dpy->pSAREA, dpy->SAREASize );
+
+   _eglLog(_EGL_INFO, "Found framebuffer size: %d", dpy->fbSize);
+   _eglLog(_EGL_DEBUG, "mapped SAREA 0x%08lx to %p, size %d",
+           (unsigned long) offset, dpy->pSAREA, dpy->SAREASize );
+
    return EGL_TRUE;
 }
 
 
  /* Return the DRI per screen structure */
-static __DRIscreen *__eglFindDRIScreen(__DRInativeDisplay *ndpy, int scrn)
+static __DRIscreen *
+__eglFindDRIScreen(__DRInativeDisplay *ndpy, int scrn)
 {
    driDisplay *disp = (driDisplay *)ndpy;
    return &disp->driScreen;
 }
 
-static GLboolean __eglCreateContextWithConfig(__DRInativeDisplay* ndpy, int screen, int configID, void* context, drm_context_t * hHWContext)
+
+static GLboolean
+__eglCreateContextWithConfig(__DRInativeDisplay* ndpy, int screen,
+                             int configID, void* context,
+                             drm_context_t * hHWContext)
 {
     __DRIscreen *pDRIScreen;
     __DRIscreenPrivate *psp;
@@ -522,7 +579,7 @@ static GLboolean __eglCreateContextWithConfig(__DRInativeDisplay* ndpy, int scre
     psp = (__DRIscreenPrivate *) pDRIScreen->private;
     if (psp->fd) {
         if (drmCreateContext(psp->fd, hHWContext)) {
-            fprintf(stderr, ">>> drmCreateContext failed\n");
+            _eglLog(_EGL_WARNING, "drmCreateContext failed.");
             return GL_FALSE;
         }
         *(void**)context = (void*) *hHWContext;
@@ -540,7 +597,7 @@ static GLboolean __eglCreateContextWithConfig(__DRInativeDisplay* ndpy, int scre
 
     if (psp->fd) {
         if (drmCreateContext(psp->fd, hHWContext)) {
-            fprintf(stderr, ">>> drmCreateContext failed\n");
+            _eglLog(_EGL_WARNING, "drmCreateContext failed.");
             return GL_FALSE;
         }
         *(void**)contextID = (void*) *hHWContext;
@@ -549,7 +606,9 @@ static GLboolean __eglCreateContextWithConfig(__DRInativeDisplay* ndpy, int scre
     return GL_TRUE;
 }
 
-static GLboolean __eglDestroyContext( __DRInativeDisplay * ndpy, int screen,  __DRIid context )
+
+static GLboolean
+__eglDestroyContext( __DRInativeDisplay * ndpy, int screen,  __DRIid context )
 {
     __DRIscreen *pDRIScreen;
     __DRIscreenPrivate *psp;
@@ -565,7 +624,10 @@ static GLboolean __eglDestroyContext( __DRInativeDisplay * ndpy, int screen,  __
    return GL_TRUE;
 }
 
-static GLboolean __eglCreateDrawable( __DRInativeDisplay * ndpy, int screen, __DRIid drawable, drm_drawable_t * hHWDrawable )
+
+static GLboolean
+__eglCreateDrawable(__DRInativeDisplay * ndpy, int screen,
+                    __DRIid drawable, drm_drawable_t * hHWDrawable)
 {
     __DRIscreen *pDRIScreen;
     __DRIscreenPrivate *psp;
@@ -577,14 +639,16 @@ static GLboolean __eglCreateDrawable( __DRInativeDisplay * ndpy, int screen, __D
     psp = (__DRIscreenPrivate *) pDRIScreen->private;
     if (psp->fd) {
         if (drmCreateDrawable(psp->fd, hHWDrawable)) {
-            fprintf(stderr, ">>> drmCreateDrawable failed\n");
+            _eglLog(_EGL_WARNING, "drmCreateDrawable failed.");
             return GL_FALSE;
         }
     }
     return GL_TRUE;
 }
 
-static GLboolean __eglDestroyDrawable( __DRInativeDisplay * ndpy, int screen, __DRIid drawable )
+
+static GLboolean
+__eglDestroyDrawable( __DRInativeDisplay * ndpy, int screen, __DRIid drawable )
 {
     __DRIscreen *pDRIScreen;
     __DRIscreenPrivate *psp;
@@ -600,12 +664,13 @@ static GLboolean __eglDestroyDrawable( __DRInativeDisplay * ndpy, int screen, __
    return GL_TRUE;
 }
 
-static GLboolean __eglGetDrawableInfo(__DRInativeDisplay * ndpy, int screen, __DRIid drawable,
-    unsigned int* index, unsigned int* stamp,
-    int* X, int* Y, int* W, int* H,
-    int* numClipRects, drm_clip_rect_t ** pClipRects,
-    int* backX, int* backY,
-    int* numBackClipRects, drm_clip_rect_t ** pBackClipRects )
+static GLboolean
+__eglGetDrawableInfo(__DRInativeDisplay * ndpy, int screen, __DRIid drawable,
+                     unsigned int* index, unsigned int* stamp,
+                     int* X, int* Y, int* W, int* H,
+                     int* numClipRects, drm_clip_rect_t ** pClipRects,
+                     int* backX, int* backY,
+                     int* numBackClipRects, drm_clip_rect_t ** pBackClipRects )
 {
    driSurface *surf = Lookup_driSurface(drawable);
 
@@ -652,16 +717,13 @@ static GLboolean __eglGetDrawableInfo(__DRInativeDisplay * ndpy, int screen, __D
    return GL_TRUE;
 }
 
+
 /**
  * Implement \c __DRIinterfaceMethods::getProcAddress.
  */
-static __DRIfuncPtr get_proc_address( const char * proc_name )
+static __DRIfuncPtr
+get_proc_address(const char * proc_name)
 {
-#if 0
-   if (strcmp( proc_name, "glxEnableExtension" ) == 0) {
-      return (__DRIfuncPtr) __glXScrEnableExtension;
-   }
-#endif
    return NULL;
 }
 
@@ -674,7 +736,7 @@ static __DRIfuncPtr get_proc_address( const char * proc_name )
  *               in the list will be freed.
  */
 static void
-__egl_context_modes_destroy( __GLcontextModes * modes )
+__egl_context_modes_destroy(__GLcontextModes *modes)
 {
    while ( modes != NULL ) {
       __GLcontextModes * const next = modes->next;
@@ -712,7 +774,7 @@ __egl_context_modes_destroy( __GLcontextModes * modes )
  *          extend the \c __GLcontextModes data-structure.
  */
 static __GLcontextModes *
-__egl_context_modes_create( unsigned count, size_t minimum_size )
+__egl_context_modes_create(unsigned count, size_t minimum_size)
 {
    const size_t size = (minimum_size > sizeof( __GLcontextModes ))
        ? minimum_size : sizeof( __GLcontextModes );
@@ -772,7 +834,7 @@ __eglWindowExists(__DRInativeDisplay *dpy, __DRIid draw)
  * \since Internal API version 20030317.
  */
 static int
-__eglGetUST( int64_t * ust )
+__eglGetUST(int64_t *ust)
 {
     struct timeval  tv;
     
@@ -783,7 +845,8 @@ __eglGetUST( int64_t * ust )
     if ( gettimeofday( & tv, NULL ) == 0 ) {
        ust[0] = (tv.tv_sec * 1000000) + tv.tv_usec;
        return 0;
-    } else {
+    }
+    else {
        return -errno;
     }
 }
@@ -835,15 +898,21 @@ static const __DRIinterfaceMethods interface_methods = {
 };
 
 
-int __glXGetInternalVersion(void)
+static int
+__glXGetInternalVersion(void)
 {
     return 20050725;
 }
 
 static const char createNewScreenName[] = "__driCreateNewScreen_20050727";
 
+
+/**
+ * Do per-display initialization.
+ */
 EGLBoolean
-_eglDRICreateDisplay( driDisplay *dpy, __DRIframebuffer *framebuffer) {
+_eglDRICreateDisplay(driDisplay *dpy, __DRIframebuffer *framebuffer)
+{
    PFNCREATENEWSCREENFUNC createNewScreen;
     int api_ver = __glXGetInternalVersion();
    __DRIversion ddx_version;
@@ -857,7 +926,8 @@ _eglDRICreateDisplay( driDisplay *dpy, __DRIframebuffer *framebuffer) {
       drm_version.minor = version->version_minor;
       drm_version.patch = version->version_patchlevel;
       drmFreeVersion( version );
-   } else {
+   }
+   else {
       drm_version.major = -1;
       drm_version.minor = -1;
       drm_version.patch = -1;
@@ -881,7 +951,8 @@ _eglDRICreateDisplay( driDisplay *dpy, __DRIframebuffer *framebuffer) {
 
    createNewScreen = ( PFNCREATENEWSCREENFUNC ) dlsym( dpy->Base.Driver->LibHandle, createNewScreenName );
    if ( !createNewScreen ) {
-      fprintf( stderr, "Couldn't find %s in CallCreateNewScreen\n", createNewScreenName );
+      _eglLog(_EGL_WARNING, "Couldn't find %s function in the driver.",
+              createNewScreenName );
       return EGL_FALSE;
    }
 
@@ -891,7 +962,7 @@ _eglDRICreateDisplay( driDisplay *dpy, __DRIframebuffer *framebuffer) {
                             dpy->pSAREA, dpy->drmFD,
                             api_ver,
                             & interface_methods,
-                            ( __GLcontextModes ** ) & dpy->driver_modes );
+                            NULL);
    if (!dpy->driScreen.private)
       return EGL_FALSE;
 
@@ -901,60 +972,83 @@ _eglDRICreateDisplay( driDisplay *dpy, __DRIframebuffer *framebuffer) {
 }
 
 
+/**
+ * Create all the EGL screens for the given display.
+ */
 EGLBoolean
-_eglDRICreateScreen( driDisplay *dpy) {
-   char c, *buffer, path[ NAME_MAX ];
-   unsigned int i, x, y, r;
-   int fd;
-   FILE *file;
-   driScreen *s;
-   _EGLScreen *scrn;
-
-   /* Create a screen */
-   if ( !( s = ( driScreen * ) calloc( 1, sizeof( *s ) ) ) )
-      return EGL_FALSE;
+_eglDRICreateScreens(driDisplay *dpy)
+{
+   const int numScreens = 1;  /* XXX fix this someday */
+   int i;
 
-   snprintf( s->fb, NAME_MAX, "fb%d", dpy->minor );
-   scrn = &s->Base;
-   _eglInitScreen( scrn );
-   _eglAddScreen( &dpy->Base, scrn );
+   for (i = 0; i < numScreens; i++) {
+      char path[ NAME_MAX ];
+      FILE *file;
+      driScreen *s;
+
+      /* Create a screen */
+      if ( !( s = ( driScreen * ) calloc( 1, sizeof( *s ) ) ) )
+         return EGL_FALSE;
+
+      snprintf( s->fb, NAME_MAX, "fb%d", dpy->minor );
+      _eglInitScreen( &s->Base );
+
+      _eglAddScreen( &dpy->Base, &s->Base );
+
+      /* Create the screen's mode list */
+      snprintf( path, sizeof( path ), "%s/graphics/%s/modes", sysfs, s->fb );
+      file = fopen( path, "r" );
+      while ( fgets( path, sizeof( path ), file ) ) {
+         unsigned int x, y, r;
+         char c;
+         path[ strlen( path ) - 1 ] = '\0';  /* strip off \n from sysfs */
+         sscanf( path, "%c:%ux%u-%u", &c, &x, &y, &r );
+         _eglAddMode( &s->Base, x, y, r * 1000, path );
+      }
+      fclose( file );
 
-   snprintf( path, sizeof( path ), "%s/graphics/%s/modes", sysfs, s->fb );
-   file = fopen( path, "r" );
-   while ( fgets( path, sizeof( path ), file ) ) {
-      path[ strlen( path ) - 1 ] = '\0';  /* strip off \n from sysfs */
-      sscanf( path, "%c:%ux%u-%u", &c, &x, &y, &r );
-      _eglAddMode( scrn, x, y, r * 1000, path );
-   }
-   fclose( file );
+      /*
+       * Initialize the colormap.  XXX is this per-screen?
+       */
+      {
+         char *buffer;
+         int i, fd;
 
-   /* cmap attribute uses 256 lines of 16 bytes */
-   if ( !( buffer = malloc( 256 * 16 ) ) )
-      return EGL_FALSE;
+         /* cmap attribute uses 256 lines of 16 bytes */
+         if ( !( buffer = malloc( 256 * 16 ) ) )
+            return EGL_FALSE;
 
-   /* cmap attribute uses 256 lines of 16 bytes */
-   for ( i = 0; i < 256; i++ )
-      sprintf( &buffer[ i * 16 ], "%02x%c%4x%4x%4x\n",
-               i, ' ', 256 * i, 256 * i, 256 * i );
+         /* cmap attribute uses 256 lines of 16 bytes */
+         for ( i = 0; i < 256; i++ )
+            sprintf( &buffer[ i * 16 ], "%02x%c%4x%4x%4x\n",
+                     i, ' ', 256 * i, 256 * i, 256 * i );
 
-   snprintf( path, sizeof( path ), "%s/graphics/%s/color_map", sysfs, s->fb );
-   if ( !( fd = open( path, O_RDWR ) ) )
-      return EGL_FALSE;
-   write( fd, buffer, 256 * 16 );
-   close( fd );
+         snprintf(path, sizeof(path), "%s/graphics/%s/color_map", sysfs,s->fb);
+         if ( !( fd = open( path, O_RDWR ) ) )
+            return EGL_FALSE;
+         write( fd, buffer, 256 * 16 );
+         close( fd );
 
-   free( buffer );
+         free( buffer );
+      }
+   }
 
    return EGL_TRUE;
 }
 
+
 EGLBoolean
-_eglDRIInitialize(_EGLDriver *drv, EGLDisplay dpy, EGLint *major, EGLint *minor)
+_eglDRIInitialize(_EGLDriver *drv, EGLDisplay dpy,
+                  EGLint *major, EGLint *minor)
 {
    _EGLDisplay *disp = _eglLookupDisplay(dpy);
    driDisplay *display;
 
-   /* Switch display structure to one with our private fields */
+   assert(disp);
+
+   /* Create new driDisplay object to replace the _EGLDisplay that was
+    * previously created.
+    */
    display = calloc(1, sizeof(*display));
    display->Base = *disp;
    _eglHashInsert(_eglGlobal.Displays, disp->Handle, display);
@@ -974,13 +1068,17 @@ static EGLBoolean
 _eglDRITerminate(_EGLDriver *drv, EGLDisplay dpy)
 {
    driDisplay *display = Lookup_driDisplay(dpy);
-   _eglCleanupDisplay(&display->Base);
+   _eglCleanupDisplay(&display->Base);/*rename that function*/
    free(display);
    free(drv);
    return EGL_TRUE;
 }
 
 
+/**
+ * Plug in the DRI-specific functions into the driver's dispatch table.
+ * Also, enable some EGL extensions.
+ */
 void
 _eglDRIInitDriverFallbacks(_EGLDriver *drv)
 {
@@ -990,8 +1088,6 @@ _eglDRIInitDriverFallbacks(_EGLDriver *drv)
    drv->API.Terminate = _eglDRITerminate;
    drv->API.CreateContext = _eglDRICreateContext;
    drv->API.MakeCurrent = _eglDRIMakeCurrent;
-   drv->API.CreateWindowSurface = _eglDRICreateWindowSurface;
-   drv->API.CreatePixmapSurface = _eglDRICreatePixmapSurface;
    drv->API.CreatePbufferSurface = _eglDRICreatePbufferSurface;
    drv->API.DestroySurface = _eglDRIDestroySurface;
    drv->API.DestroyContext = _eglDRIDestroyContext;
@@ -1002,5 +1098,4 @@ _eglDRIInitDriverFallbacks(_EGLDriver *drv)
    /* enable supported extensions */
    drv->MESA_screen_surface = EGL_TRUE;
    drv->MESA_copy_context = EGL_TRUE;
-
 }
index 4573c50ea6ab91c41c899c004083d9490e92556b..5881196043c8e13d066d744838a67ce439dc30e7 100644 (file)
@@ -36,18 +36,18 @@ typedef struct dri_display
    void *driverPrivate;
    drm_magic_t magic;
 
-   __GLcontextModes *driver_modes;
    __DRIscreen driScreen;
 
 } driDisplay;
 
+
 /**
  * dri driver-specific screen class derived from _EGLScreen
  */
 typedef struct dri_screen
 {
    _EGLScreen Base;
-   char fb[NAME_MAX];
+   char fb[NAME_MAX];   /** the screen name, like "fb0" */
 } driScreen;
 
 
@@ -108,6 +108,6 @@ extern EGLBoolean _eglDRIShowSurfaceMESA(_EGLDriver *drv, EGLDisplay dpy, EGLScr
 extern EGLBoolean _eglDRIInitialize(_EGLDriver *drv, EGLDisplay dpy, EGLint *major, EGLint *minor);
 extern EGLBoolean _eglDRIGetDisplayInfo(driDisplay *dpy);
 extern EGLBoolean _eglDRICreateDisplay(driDisplay *dpy, __DRIframebuffer *framebuffer);
-extern EGLBoolean _eglDRICreateScreen(driDisplay *dpy);
+extern EGLBoolean _eglDRICreateScreens(driDisplay *dpy);
 
 #endif /* EGLDRI_INCLUDED */