Fix EGL fbdev palette problem. demo3 can save ppm of screen
authorJon Smirl <jonsmirl@gmail.com>
Thu, 19 May 2005 15:03:31 +0000 (15:03 +0000)
committerJon Smirl <jonsmirl@gmail.com>
Thu, 19 May 2005 15:03:31 +0000 (15:03 +0000)
progs/egl/demo3.c
src/mesa/drivers/dri/fb/fb_egl.c

index 399e3aad9e4f44bf367489366b11688f3ce2f507..f6e3bc56e4769cf59eb0e860761faab847cf3a5b 100644 (file)
@@ -500,6 +500,58 @@ static void Draw(EGLDisplay dpy, EGLSurface surf)
     }
 }
 
+static void
+write_ppm(const char *filename, const GLubyte *buffer, int width, int height)
+{
+   const int binary = 0;
+   FILE *f = fopen( filename, "w" );
+   if (f) {
+      int i, x, y;
+      const GLubyte *ptr = buffer;
+      if (binary) {
+         fprintf(f,"P6\n");
+         fprintf(f,"# ppm-file created by osdemo.c\n");
+         fprintf(f,"%i %i\n", width,height);
+         fprintf(f,"255\n");
+         fclose(f);
+         f = fopen( filename, "ab" );  /* reopen in binary append mode */
+         for (y=height-1; y>=0; y--) {
+            for (x=0; x<width; x++) {
+               i = (y*width + x) * 4;
+               fputc(ptr[i], f);   /* write red */
+               fputc(ptr[i+1], f); /* write green */
+               fputc(ptr[i+2], f); /* write blue */
+            }
+         }
+      }
+      else {
+         /*ASCII*/
+         int counter = 0;
+         fprintf(f,"P3\n");
+         fprintf(f,"# ascii ppm file created by osdemo.c\n");
+         fprintf(f,"%i %i\n", width, height);
+         fprintf(f,"255\n");
+         for (y=height-1; y>=0; y--) {
+            for (x=0; x<width; x++) {
+               i = (y*width + x) * 4;
+               fprintf(f, " %3d %3d %3d", ptr[i], ptr[i+1], ptr[i+2]);
+               counter++;
+               if (counter % 5 == 0)
+                  fprintf(f, "\n");
+            }
+         }
+      }
+      fclose(f);
+   }
+}
+
+#include "../src/egl/main/egldisplay.h"
+
+typedef struct fb_display
+{
+   _EGLDisplay Base;  /* base class/object */
+   void *pFB;
+} fbDisplay;
 
 
 int
@@ -561,9 +613,20 @@ main(int argc, char *argv[])
    Reshape(1024, 768);
 
    glDrawBuffer( GL_FRONT ); 
+   glClearColor( 0, 
+                1.0, 
+                0,
+                1);
 
-   Draw(d, screen_surf);
+   glClear( GL_COLOR_BUFFER_BIT ); 
+
+   doubleBuffer = 1;   
+   glDrawBuffer( GL_BACK ); 
 
+   Draw(d, screen_surf);
+   
+   write_ppm("dump.ppm", ((struct fb_display *)_eglLookupDisplay(d))->pFB, 1024, 768);
+   
    eglDestroySurface(d, screen_surf);
    eglDestroyContext(d, ctx);
    eglTerminate(d);
index 6c06c5373c2e5321646ff702dc90c671c7f7b2f9..bdc8f71993cbf9a80232c54e951ea7f6627f185f 100644 (file)
@@ -202,9 +202,40 @@ fbSetupFramebuffer(fbDisplay *disp, char *fbdev)
                strerror(errno));
       return EGL_FALSE;
    }
+   
+   if (fixedInfo.visual == FB_VISUAL_DIRECTCOLOR) {
+      struct fb_cmap cmap;
+      unsigned short red[256], green[256], blue[256];
+      int rcols = 1 << varInfo.red.length;
+      int gcols = 1 << varInfo.green.length;
+      int bcols = 1 << varInfo.blue.length;
+      int i;
+
+      cmap.start = 0;      
+      cmap.len = gcols;
+      cmap.red   = red;
+      cmap.green = green;
+      cmap.blue  = blue;
+      cmap.transp = NULL;
+
+      for (i = 0; i < rcols ; i++) 
+         red[i] = (65536/(rcols-1)) * i;
+
+      for (i = 0; i < gcols ; i++) 
+         green[i] = (65536/(gcols-1)) * i;
+
+      for (i = 0; i < bcols ; i++) 
+         blue[i] = (65536/(bcols-1)) * i;
+      
+      if (ioctl(fd, FBIOPUTCMAP, (void *) &cmap) < 0) {
+         fprintf(stderr, "ioctl(FBIOPUTCMAP) failed [%d]\n", i);
+         exit(1);
+      }
+   }
 
    /* mmap the framebuffer into our address space */
-   disp->pFB = (caddr_t)mmap(0,  /* start */
+   if (!disp->pFB)
+      disp->pFB = (caddr_t)mmap(0,  /* start */
                       fixedInfo.smem_len,  /* bytes */
                       PROT_READ | PROT_WRITE,  /* prot */
                       MAP_SHARED,  /* flags */
@@ -702,10 +733,11 @@ static EGLBoolean
 fbShowSurfaceMESA(_EGLDriver *drv, EGLDisplay dpy, EGLScreenMESA screen,
                     EGLSurface surface, EGLModeMESA m)
 {
-   FILE *file;
-   char buffer[NAME_MAX];
+   fbDisplay *display = Lookup_fbDisplay(dpy);
    fbScreen *scrn = Lookup_fbScreen(dpy, screen);
    fbSurface *surf = Lookup_fbSurface(surface);
+   FILE *file;
+   char buffer[NAME_MAX];
    _EGLMode *mode = _eglLookupMode(dpy, m);
    int bits;
    
@@ -745,6 +777,8 @@ err:
    fputs(buffer, file);
    fclose(file);
 
+   fbSetupFramebuffer(display, scrn->fb);
+   
    snprintf(buffer, sizeof(buffer), "%s/%s/blank", sysfs, scrn->fb);
    
    file = fopen(buffer, "r+");