apparently need to load colormap after setting the mode to make it work reliably
authorBrian Paul <brian.paul@tungstengraphics.com>
Tue, 29 Nov 2005 03:00:02 +0000 (03:00 +0000)
committerBrian Paul <brian.paul@tungstengraphics.com>
Tue, 29 Nov 2005 03:00:02 +0000 (03:00 +0000)
src/egl/drivers/dri/egldri.c

index a84611535a3d42f358aa44aa839b31331a9632e5..8be48d03d43a71b90e81b35f6c68f43abc338f65 100644 (file)
@@ -305,6 +305,42 @@ _eglDRICreateScreenSurfaceMESA(_EGLDriver *drv, EGLDisplay dpy, EGLConfig cfg,
 }
 
 
+/**
+ * Set the fbdev colormap to a simple linear ramp.
+ */
+static void
+_eglDRILoadColormap(driScreen *scrn)
+{
+   char path[ NAME_MAX ];
+   char *buffer;
+   int i, fd;
+
+   /* cmap attribute uses 256 lines of 16 bytes.
+    * Allocate one extra char for the \0 added by sprintf()
+    */
+   if ( !( buffer = malloc( 256 * 16 + 1 ) ) ) {
+      _eglLog(_EGL_WARNING, "Out of memory in _eglDRILoadColormap");
+      return;
+   }
+
+   /* cmap attribute uses 256 lines of 16 bytes */
+   for ( i = 0; i < 256; i++ ) {
+      int c = (i << 8) | i; /* expand to 16-bit value */
+      sprintf(&buffer[i * 16], "%02x%c%04x%04x%04x\n", i, ' ', c, c, c);
+   }
+
+   snprintf(path, sizeof(path), "%s/graphics/%s/color_map", sysfs, scrn->fb);
+   if ( !( fd = open( path, O_RDWR ) ) ) {
+      _eglLog(_EGL_WARNING, "Unable to open %s to set colormap", path);
+      return;
+   }
+   write( fd, buffer, 256 * 16 );
+   close( fd );
+
+   free( buffer );
+}
+
+
 /**
  * Show the given surface on the named screen.
  * If surface is EGL_NO_SURFACE, disable the screen's output.
@@ -322,6 +358,8 @@ _eglDRIShowSurfaceMESA(_EGLDriver *drv, EGLDisplay dpy, EGLScreenMESA screen,
    char fname[NAME_MAX], buffer[1000];
    int temp;
 
+   _eglLog(_EGL_DEBUG, "Enter _eglDRIShowSurface");
+
    /* This will check that surface, screen, and mode are valid.
     * Also, it checks that the surface is large enough for the mode, etc.
     */
@@ -442,6 +480,9 @@ _eglDRIShowSurfaceMESA(_EGLDriver *drv, EGLDisplay dpy, EGLScreenMESA screen,
       */
    }
 
+   /* This used to be done in the _eglDRICreateScreens routine. */
+   _eglDRILoadColormap(scrn);
+
    return EGL_TRUE;
 }
 
@@ -536,14 +577,17 @@ _eglDRIGetDisplayInfo(driDisplay *dpy)
          break;
       if ( type == DRM_SHM ) {
          if ( drmMap( dpy->drmFD, offset, size, ( drmAddressPtr ) ( &dpy->pSAREA ) ) < 0 ) {
-            _eglLog(_EGL_WARNING, "drmMap failed.");
-            return 0;
+            _eglLog(_EGL_WARNING, "drmMap DRM_SHM failed.");
+            return EGL_FALSE;
          }
          break;
       }
    }
-   if ( !dpy->pSAREA )
+   if ( !dpy->pSAREA ) {
+      /* if this happens, make sure you're using the most recent DRM modules */
+      _eglLog(_EGL_WARNING, "Unable to map SAREA");
       return 0;
+   }
 
    memset( dpy->pSAREA, 0, dpy->SAREASize );
 
@@ -1008,29 +1052,10 @@ _eglDRICreateScreens(driDisplay *dpy)
       fclose( file );
 
       /*
-       * Initialize the colormap.  XXX is this per-screen?
+       * NOTE: we used to set the colormap here, but that didn't work reliably.
+       * Some entries near the start of the table would get corrupted by later
+       * mode changes.
        */
-      {
-         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 */
-         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 );
-
-         free( buffer );
-      }
    }
 
    return EGL_TRUE;