X-Git-Url: http://code.vuplus.com/gitweb/?p=vuplus_dvbapp;a=blobdiff_plain;f=lib%2Fgdi%2Fgfbdc.cpp;fp=lib%2Fgdi%2Fgfbdc.cpp;h=08b4586a6077952059e419a793e556831c6e9037;hp=8dc0a7d2431c27c2cb109e4403cc4d58704316da;hb=54b9e2790954b623c99823ab64782d4e39c128bf;hpb=966258dd4ca61e0fc632dba295cd0ced1ad0364e diff --git a/lib/gdi/gfbdc.cpp b/lib/gdi/gfbdc.cpp index 8dc0a7d..08b4586 100644 --- a/lib/gdi/gfbdc.cpp +++ b/lib/gdi/gfbdc.cpp @@ -4,6 +4,10 @@ #include #include +#include + +#include + gFBDC *gFBDC::instance; gFBDC::gFBDC() @@ -26,8 +30,34 @@ gFBDC::gFBDC() surface.bypp = 4; surface.stride = fb->Stride(); surface.data = fb->lfb; - surface.clut.colors=256; - surface.clut.data=new gRGB[surface.clut.colors]; + surface.offset = 0; + + 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; + + fb_size *= 2; + + 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); @@ -38,6 +68,8 @@ gFBDC::gFBDC() gFBDC::~gFBDC() { delete fb; + + delete[] surface.clut.data; instance=0; } @@ -91,8 +123,6 @@ void gFBDC::setPalette() 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; - if (!fb->CMAP()->red[i]) - fb->CMAP()->red[i]=0x100; } fb->PutCMAP(); } @@ -107,6 +137,29 @@ void gFBDC::exec(gOpcode *o) setPalette(); break; } + case gOpcode::flip: + { + gSurface s(surface); + surface = surface_back; + surface_back = s; + + fb->setOffset(surface_back.offset); + break; + } + case gOpcode::waitVSync: + { + static timeval l; + timeval now; + 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, 1000 / diff ?: 1); + + l = now; + + fb->waitVSync(); + break; + } default: gDC::exec(o); break; @@ -161,4 +214,3 @@ void gFBDC::reloadSettings() #ifndef SDLDC eAutoInitPtr init_gFBDC(eAutoInitNumbers::graphic-1, "GFBDC"); #endif -