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;
+
if ((screeninfo.xres!=nxRes) && (screeninfo.yres!=nyRes) && (screeninfo.bits_per_pixel!=nbpp))
{
eDebug("SetMode failed: wanted: %dx%dx%d, got %dx%dx%d",
static fbClass *instance;
int locked;
+ int m_number_of_pages;
public:
unsigned char *lfb;
int showConsole(int state);
int SetMode(unsigned int xRes, unsigned int yRes, unsigned int bpp);
int Available() { return available; }
+
+ int getNumPages() { return m_number_of_pages; }
+
int setOffset(int off);
int waitVSync();
unsigned int Stride() { return stride; }
surface.data_phys = 50*1024*1024; // FIXME
- surface_back.type = 0;
- surface_back.x = 720;
- surface_back.y = 576;
- surface_back.bpp = 32;
- surface_back.bypp = 4;
- surface_back.stride = fb->Stride();
- surface_back.offset = surface.y;
-
int fb_size = surface.stride * surface.y;
- surface_back.data = fb->lfb + fb_size;
- surface_back.data_phys = surface.data_phys + fb_size;
+ if (fb->getNumPages() > 1)
+ {
+ m_enable_double_buffering = 1;
+ surface_back.type = 0;
+ surface_back.x = 720;
+ surface_back.y = 576;
+ surface_back.bpp = 32;
+ surface_back.bypp = 4;
+ surface_back.stride = fb->Stride();
+ surface_back.offset = surface.y;
+ surface_back.data = fb->lfb + fb_size;
+ surface_back.data_phys = surface.data_phys + fb_size;
- fb_size *= 2;
+ fb_size *= 2;
+ } else
+ m_enable_double_buffering = 0;
eDebug("%dkB available for acceleration surfaces.", (fb->Available() - fb_size)/1024);
}
case gOpcode::flip:
{
- gSurface s(surface);
- surface = surface_back;
- surface_back = s;
+ if (m_enable_double_buffering)
+ {
+ gSurface s(surface);
+ surface = surface_back;
+ surface_back = s;
- fb->setOffset(surface_back.offset);
+ fb->setOffset(surface_back.offset);
+ }
break;
}
case gOpcode::waitVSync:
void calcRamp();
void setPalette();
gSurface surface, surface_back;
+ int m_enable_double_buffering;
public:
void reloadSettings();
void setAlpha(int alpha);
int getBrightness() { return brightness; }
int getGamma() { return gamma; }
+ int haveDoubleBuffering() { return m_enable_double_buffering; }
+
void saveSettings();
gFBDC();
ePython python;
eMain main;
+
+ int double_buffer = 0;
#if 1
#ifdef SDLDC
#else
ePtr<gFBDC> my_dc;
gFBDC::getInstance(my_dc);
+
+ double_buffer = my_dc->haveDoubleBuffering();
#endif
fontRenderClass::getInstance()->AddFont(FONTDIR "/arial.ttf", "Arial", 100);
eWidgetDesktop dsk(eSize(720, 576));
- dsk.setCompositionMode(eWidgetDesktop::cmBuffered);
+ if (double_buffer)
+ {
+ eDebug(" - double buffering found, enable buffered graphics mode.");
+ dsk.setCompositionMode(eWidgetDesktop::cmBuffered);
+ }
wdsk = &dsk;