From 704af241ff75bb41795cb5588f154aaf77274db5 Mon Sep 17 00:00:00 2001 From: Andreas Monzner Date: Wed, 9 Jan 2008 22:36:15 +0000 Subject: [PATCH] remap lfb on resolution change --- lib/gdi/fb.cpp | 88 ++++++++++++++++++++++++++++---------------------- 1 file changed, 50 insertions(+), 38 deletions(-) diff --git a/lib/gdi/fb.cpp b/lib/gdi/fb.cpp index adf06a2c..e5bb46d0 100644 --- a/lib/gdi/fb.cpp +++ b/lib/gdi/fb.cpp @@ -27,10 +27,11 @@ fbClass *fbClass::getInstance() fbClass::fbClass(const char *fb) { - m_manual_blit=0; + lfb=0; + fb_fix_screeninfo fix; + m_manual_blit=-1; instance=this; locked=0; - available=0; cmap.start=0; cmap.len=256; cmap.red=red; @@ -40,43 +41,25 @@ fbClass::fbClass(const char *fb) fd=open(fb, O_RDWR); if (fd<0) - { perror(fb); - goto nolfb; - } - - - if (ioctl(fd, FBIOGET_VSCREENINFO, &screeninfo)<0) - { + else if (ioctl(fd, FBIOGET_VSCREENINFO, &screeninfo)<0) perror("FBIOGET_VSCREENINFO"); - goto nolfb; - } - - memcpy(&oldscreen, &screeninfo, sizeof(screeninfo)); - - fb_fix_screeninfo fix; - if (ioctl(fd, FBIOGET_FSCREENINFO, &fix)<0) - { + else if (ioctl(fd, FBIOGET_FSCREENINFO, &fix)<0) perror("FBIOGET_FSCREENINFO"); - goto nolfb; - } - - available=fix.smem_len; - eDebug("%dk video mem", available/1024); - lfb=(unsigned char*)mmap(0, available, PROT_WRITE|PROT_READ, MAP_SHARED, fd, 0); - if (!lfb) + else { - perror("mmap"); - goto nolfb; + memcpy(&oldscreen, &screeninfo, sizeof(screeninfo)); + available=fix.smem_len; + lfb=(unsigned char*)mmap(0, available, PROT_WRITE|PROT_READ, MAP_SHARED, fd, 0); + if (!lfb) + perror("mmap"); + else + { + showConsole(0); + enableManualBlit(); + stride=fix.line_length; + } } - - showConsole(0); - - enableManualBlit(); - return; -nolfb: - lfb=0; - printf("framebuffer not available.\n"); return; } @@ -102,7 +85,12 @@ int fbClass::SetMode(unsigned int nxRes, unsigned int nyRes, unsigned int nbpp) screeninfo.width=0; screeninfo.xoffset=screeninfo.yoffset=0; screeninfo.bits_per_pixel=nbpp; - + + if (lfb) { + munmap(lfb, available); + lfb = 0; + } + if (ioctl(fd, FBIOPUT_VSCREENINFO, &screeninfo)<0) { // try single buffering @@ -131,15 +119,31 @@ int fbClass::SetMode(unsigned int nxRes, unsigned int nyRes, unsigned int nbpp) xRes=screeninfo.xres; yRes=screeninfo.yres; bpp=screeninfo.bits_per_pixel; + fb_fix_screeninfo fix; if (ioctl(fd, FBIOGET_FSCREENINFO, &fix)<0) { perror("FBIOGET_FSCREENINFO"); printf("fb failed\n"); + goto nolfb; } + + available=fix.smem_len; + eDebug("%dk video mem", available/1024); + lfb=(unsigned char*)mmap(0, available, PROT_WRITE|PROT_READ, MAP_SHARED, fd, 0); + if (!lfb) + { + perror("mmap"); + goto nolfb; + } + stride=fix.line_length; - memset(lfb, 0, stride*yRes); + return 0; +nolfb: + lfb=0; + eFatal("framebuffer no more ready after SetMode(%d, %d, %d)", nxRes, nyRes, nbpp); + return -1; } int fbClass::setOffset(int off) @@ -157,7 +161,7 @@ int fbClass::waitVSync() void fbClass::blit() { - if (m_manual_blit) { + if (m_manual_blit == 1) { if (ioctl(fd, FBIO_BLIT) < 0) perror("FBIO_BLIT"); } @@ -182,7 +186,13 @@ int fbClass::lock() { if (locked) return -1; - locked=1; + if (m_manual_blit == 1) + { + locked = 2; + disableManualBlit(); + } + else + locked = 1; return fd; } @@ -190,6 +200,8 @@ void fbClass::unlock() { if (!locked) return; + if (locked == 2) // re-enable manualBlit + enableManualBlit(); locked=0; SetMode(xRes, yRes, bpp); PutCMAP(); -- 2.30.2