X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/d63d2c3c6cbbd574dda4f8b00ebe6c661735edd5..e09118574a32038b352e01a2ed085175406778d7:/lib/gdi/gfbdc.cpp diff --git a/lib/gdi/gfbdc.cpp b/lib/gdi/gfbdc.cpp index 83f681d7..ee2227cf 100644 --- a/lib/gdi/gfbdc.cpp +++ b/lib/gdi/gfbdc.cpp @@ -4,6 +4,10 @@ #include #include +#include + +#include + gFBDC *gFBDC::instance; gFBDC::gFBDC() @@ -14,28 +18,62 @@ gFBDC::gFBDC() if (!fb->Available()) eFatal("no framebuffer available"); - fb->SetMode(720, 576, 8); + fb->SetMode(720, 576, 32); + for (int y=0; y<576; y++) // make whole screen transparent memset(fb->lfb+y*fb->Stride(), 0x00, fb->Stride()); - pixmap=new gPixmap(); - pixmap->x=720; - pixmap->y=576; - pixmap->bpp=8; - pixmap->bypp=1; - pixmap->stride=fb->Stride(); - pixmap->data=fb->lfb; + surface.type = 0; + surface.x = 720; + surface.y = 576; + surface.bpp = 32; + surface.bypp = 4; + surface.stride = fb->Stride(); + surface.data = fb->lfb; + surface.offset = 0; + + surface.data_phys = 50*1024*1024; // FIXME + + int fb_size = surface.stride * surface.y; + + 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; + } else + m_enable_double_buffering = 0; - pixmap->clut.colors=256; - pixmap->clut.data=new gRGB[pixmap->clut.colors]; - memset(pixmap->clut.data, 0, sizeof(*pixmap->clut.data)*pixmap->clut.colors); + eDebug("%dkB available for acceleration surfaces.", (fb->Available() - fb_size)/1024); + + if (gAccel::getInstance()) + gAccel::getInstance()->setAccelMemorySpace(fb->lfb + fb_size, surface.data_phys + fb_size, fb->Available() - fb_size); + + surface.clut.colors = 256; + surface.clut.data = new gRGB[surface.clut.colors]; + + surface_back.clut = surface.clut; + + m_pixmap = new gPixmap(&surface); + + memset(surface.clut.data, 0, sizeof(*surface.clut.data)*surface.clut.colors); reloadSettings(); } gFBDC::~gFBDC() { - delete pixmap; delete fb; + + delete[] surface.clut.data; instance=0; } @@ -72,10 +110,7 @@ void gFBDC::calcRamp() d=255; ramp[i]=d; -/* if ( eDVB::getInstance()->getmID == 1 ) - rampalpha[i]=i*alpha/65535; - else*/ - rampalpha[i]=i*alpha/256; + rampalpha[i]=i*alpha/256; } rampalpha[255]=255; // transparent BLEIBT bitte so. @@ -83,17 +118,15 @@ void gFBDC::calcRamp() void gFBDC::setPalette() { - if (!pixmap->clut.data) + if (!surface.clut.data) return; for (int i=0; i<256; ++i) { - fb->CMAP()->red[i]=ramp[pixmap->clut.data[i].r]<<8; - fb->CMAP()->green[i]=ramp[pixmap->clut.data[i].g]<<8; - fb->CMAP()->blue[i]=ramp[pixmap->clut.data[i].b]<<8; - fb->CMAP()->transp[i]=rampalpha[pixmap->clut.data[i].a]<<8; - if (!fb->CMAP()->red[i]) - fb->CMAP()->red[i]=0x100; + fb->CMAP()->red[i]=ramp[surface.clut.data[i].r]<<8; + fb->CMAP()->green[i]=ramp[surface.clut.data[i].g]<<8; + fb->CMAP()->blue[i]=ramp[surface.clut.data[i].b]<<8; + fb->CMAP()->transp[i]=rampalpha[surface.clut.data[i].a]<<8; } fb->PutCMAP(); } @@ -104,21 +137,49 @@ void gFBDC::exec(gOpcode *o) { case gOpcode::setPalette: { - gPixmapDC::exec(o); + gDC::exec(o); setPalette(); break; } + case gOpcode::flip: + { + if (m_enable_double_buffering) + { + gSurface s(surface); + surface = surface_back; + surface_back = s; + + fb->setOffset(surface_back.offset); + } + break; + } + case gOpcode::waitVSync: + { + static timeval l; + static int t; + timeval now; + + if (t == 1000) + { + gettimeofday(&now, 0); + + int diff = (now.tv_sec - l.tv_sec) * 1000 + (now.tv_usec - l.tv_usec) / 1000; + eDebug("%d ms latency (%d fps)", diff, t * 1000 / (diff ? diff : 1)); + l = now; + t = 0; + } + + ++t; + + fb->waitVSync(); + break; + } default: - gPixmapDC::exec(o); + gDC::exec(o); break; } } -gFBDC *gFBDC::getInstance() -{ - return instance; -} - void gFBDC::setAlpha(int a) { alpha=a; @@ -163,4 +224,7 @@ void gFBDC::reloadSettings() setPalette(); } -eAutoInitP0 init_gFBDC(eAutoInitNumbers::graphic+1, "GFBDC"); +// eAutoInitPtr init_gFBDC(eAutoInitNumbers::graphic-1, "GFBDC"); +#ifndef SDLDC +eAutoInitPtr init_gFBDC(eAutoInitNumbers::graphic-1, "GFBDC"); +#endif