X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/966258dd4ca61e0fc632dba295cd0ced1ad0364e..06578d6778bff8aa2bd6a2387651dd0ba55aa27c:/lib/gdi/fb.cpp diff --git a/lib/gdi/fb.cpp b/lib/gdi/fb.cpp index 4a801bfe..8e8221c3 100644 --- a/lib/gdi/fb.cpp +++ b/lib/gdi/fb.cpp @@ -7,13 +7,16 @@ #include #include -#include #include #ifndef FBIO_WAITFORVSYNC #define FBIO_WAITFORVSYNC _IOW('F', 0x20, __u32) #endif +#ifndef FBIO_BLIT +#define FBIO_SET_MANUAL_BLIT _IOW('F', 0x21, __u8) +#define FBIO_BLIT 0x22 +#endif fbClass *fbClass::instance; @@ -24,6 +27,7 @@ fbClass *fbClass::getInstance() fbClass::fbClass(const char *fb) { + m_manual_blit=-1; instance=this; locked=0; available=0; @@ -40,6 +44,8 @@ fbClass::fbClass(const char *fb) perror(fb); goto nolfb; } + + if (ioctl(fd, FBIOGET_VSCREENINFO, &screeninfo)<0) { perror("FBIOGET_VSCREENINFO"); @@ -65,6 +71,8 @@ fbClass::fbClass(const char *fb) } showConsole(0); + + enableManualBlit(); return; nolfb: lfb=0; @@ -94,12 +102,26 @@ 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 (ioctl(fd, FBIOPUT_VSCREENINFO, &screeninfo)<0) { - perror("FBIOPUT_VSCREENINFO"); - printf("fb failed\n"); - return -1; - } + // try single buffering + screeninfo.yres_virtual=screeninfo.yres=nyRes; + + if (ioctl(fd, FBIOPUT_VSCREENINFO, &screeninfo)<0) + { + perror("FBIOPUT_VSCREENINFO"); + printf("fb failed\n"); + return -1; + } + eDebug(" - double buffering not available."); + } else + eDebug(" - double buffering available!"); + + m_number_of_pages = screeninfo.yres_virtual / nyRes; + + ioctl(fd, FBIOGET_VSCREENINFO, &screeninfo); + if ((screeninfo.xres!=nxRes) && (screeninfo.yres!=nyRes) && (screeninfo.bits_per_pixel!=nbpp)) { eDebug("SetMode failed: wanted: %dx%dx%d, got %dx%dx%d", @@ -133,6 +155,14 @@ int fbClass::waitVSync() return ioctl(fd, FBIO_WAITFORVSYNC, &c); } +void fbClass::blit() +{ + if (m_manual_blit == 1) { + if (ioctl(fd, FBIO_BLIT) < 0) + perror("FBIO_BLIT"); + } +} + fbClass::~fbClass() { if (available) @@ -140,6 +170,7 @@ fbClass::~fbClass() if (lfb) munmap(lfb, available); showConsole(1); + disableManualBlit(); } int fbClass::PutCMAP() @@ -151,7 +182,13 @@ int fbClass::lock() { if (locked) return -1; - locked=1; + if (m_manual_blit == 1) + { + locked = 2; + disableManualBlit(); + } + else + locked = 1; return fd; } @@ -159,7 +196,28 @@ void fbClass::unlock() { if (!locked) return; + if (locked == 2) // re-enable manualBlit + enableManualBlit(); locked=0; SetMode(xRes, yRes, bpp); PutCMAP(); } + +void fbClass::enableManualBlit() +{ + unsigned char tmp = 1; + if (ioctl(fd,FBIO_SET_MANUAL_BLIT, &tmp)<0) + perror("FBIO_SET_MANUAL_BLIT"); + else + m_manual_blit = 1; +} + +void fbClass::disableManualBlit() +{ + unsigned char tmp = 0; + if (ioctl(fd,FBIO_SET_MANUAL_BLIT, &tmp)<0) + perror("FBIO_SET_MANUAL_BLIT"); + else + m_manual_blit = 0; +} +