From c70dace6942feda07d797feb845782d136097f5c Mon Sep 17 00:00:00 2001 From: Jon Smirl Date: Thu, 19 May 2005 15:03:31 +0000 Subject: [PATCH] Fix EGL fbdev palette problem. demo3 can save ppm of screen --- progs/egl/demo3.c | 65 +++++++++++++++++++++++++++++++- src/mesa/drivers/dri/fb/fb_egl.c | 40 ++++++++++++++++++-- 2 files changed, 101 insertions(+), 4 deletions(-) diff --git a/progs/egl/demo3.c b/progs/egl/demo3.c index 399e3aad9e4..f6e3bc56e47 100644 --- a/progs/egl/demo3.c +++ b/progs/egl/demo3.c @@ -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=0; y--) { + for (x=0; xpFB, 1024, 768); + eglDestroySurface(d, screen_surf); eglDestroyContext(d, ctx); eglTerminate(d); diff --git a/src/mesa/drivers/dri/fb/fb_egl.c b/src/mesa/drivers/dri/fb/fb_egl.c index 6c06c5373c2..bdc8f71993c 100644 --- a/src/mesa/drivers/dri/fb/fb_egl.c +++ b/src/mesa/drivers/dri/fb/fb_egl.c @@ -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+"); -- 2.30.2