aboutsummaryrefslogtreecommitdiff
path: root/lib/gdi/fb.cpp
diff options
context:
space:
mode:
authorAndreas Monzner <andreas.monzner@multimedia-labs.de>2008-01-09 22:36:15 +0000
committerAndreas Monzner <andreas.monzner@multimedia-labs.de>2008-01-09 22:36:15 +0000
commit704af241ff75bb41795cb5588f154aaf77274db5 (patch)
tree9ac0404f0aa31615a4eab3a98c73da14dd835584 /lib/gdi/fb.cpp
parent919f87eea9070dd03ce260516bcf80381866d956 (diff)
downloadenigma2-704af241ff75bb41795cb5588f154aaf77274db5.tar.gz
enigma2-704af241ff75bb41795cb5588f154aaf77274db5.zip
remap lfb on resolution change
Diffstat (limited to 'lib/gdi/fb.cpp')
-rw-r--r--lib/gdi/fb.cpp88
1 files 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();