diff options
author | Brian Paul <brian.paul@tungstengraphics.com> | 2005-11-29 03:00:02 +0000 |
---|---|---|
committer | Brian Paul <brian.paul@tungstengraphics.com> | 2005-11-29 03:00:02 +0000 |
commit | 4683e8e95447f0b10d59099d6c578126a4212757 (patch) | |
tree | 0fa53987ecb14badb57aab5cdf69e713f951df58 /src/egl/drivers/dri/egldri.c | |
parent | 2b8e66d210c333c1f9bdb4e2de079798f1c810f1 (diff) |
apparently need to load colormap after setting the mode to make it work reliably
Diffstat (limited to 'src/egl/drivers/dri/egldri.c')
-rw-r--r-- | src/egl/drivers/dri/egldri.c | 75 |
1 files changed, 50 insertions, 25 deletions
diff --git a/src/egl/drivers/dri/egldri.c b/src/egl/drivers/dri/egldri.c index a84611535a..8be48d03d4 100644 --- a/src/egl/drivers/dri/egldri.c +++ b/src/egl/drivers/dri/egldri.c @@ -306,6 +306,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. * Called via eglShowSurfaceMESA(). @@ -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; |