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;
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;
}
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
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)
void fbClass::blit()
{
- if (m_manual_blit) {
+ if (m_manual_blit == 1) {
if (ioctl(fd, FBIO_BLIT) < 0)
perror("FBIO_BLIT");
}
{
if (locked)
return -1;
- locked=1;
+ if (m_manual_blit == 1)
+ {
+ locked = 2;
+ disableManualBlit();
+ }
+ else
+ locked = 1;
return fd;
}
{
if (!locked)
return;
+ if (locked == 2) // re-enable manualBlit
+ enableManualBlit();
locked=0;
SetMode(xRes, yRes, bpp);
PutCMAP();