X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=drivers%2Fcli%2Fsdl-video.c;h=f2d404c4745c6f5d076e3ace5b37ccd99aef4659;hb=5232c20c0fa2c80964fe1d3f597c239bcf93d6fc;hp=5ca240c0ba314b44e8f363c066226e42ba73c5a6;hpb=c62d28102c77e19c291c78bf6bf7f0a81abd54b9;p=fceu.git diff --git a/drivers/cli/sdl-video.c b/drivers/cli/sdl-video.c index 5ca240c..f2d404c 100644 --- a/drivers/cli/sdl-video.c +++ b/drivers/cli/sdl-video.c @@ -21,14 +21,38 @@ #include #include #include +#include +#include #include "sdl.h" #include "../common/vidblit.h" + +#ifdef GP2X +#include "minimal.h" + +char* fps_str=NULL; +#endif +extern int showfps; + +int stretch_offset=32; + +unsigned long framesRendered; +unsigned long fps; +unsigned long fps_samplecount=0; +unsigned long total_fps=-1; +unsigned long ticks; + +pthread_t gp2x_video_thread=0; +uint8 * XBufHelper=NULL; + + #define _sline srendline #define _eline erendline +#ifndef GP2X SDL_Surface *screen; +#endif static int tlines; static int inited=0; @@ -37,8 +61,125 @@ static int exs,eys,eefx; #define NWIDTH (256-((eoptions&EO_CLIPSIDES)?16:0)) #define NOFFSET (eoptions&EO_CLIPSIDES?8:0) -static void CleanSurface(void) + + +int paletterefresh; +#ifdef GP2X +static int screenSizeInBytes = 320 * 240; +#endif +#define FPS_COLOR 61 + + + + +static unsigned char fontdata8x8[] = +{ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x3C,0x42,0x99,0xBD,0xBD,0x99,0x42,0x3C,0x3C,0x42,0x81,0x81,0x81,0x81,0x42,0x3C, + 0xFE,0x82,0x8A,0xD2,0xA2,0x82,0xFE,0x00,0xFE,0x82,0x82,0x82,0x82,0x82,0xFE,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x64,0x74,0x7C,0x38,0x00,0x00, + 0x80,0xC0,0xF0,0xFC,0xF0,0xC0,0x80,0x00,0x01,0x03,0x0F,0x3F,0x0F,0x03,0x01,0x00, + 0x18,0x3C,0x7E,0x18,0x7E,0x3C,0x18,0x00,0xEE,0xEE,0xEE,0xCC,0x00,0xCC,0xCC,0x00, + 0x00,0x00,0x30,0x68,0x78,0x30,0x00,0x00,0x00,0x38,0x64,0x74,0x7C,0x38,0x00,0x00, + 0x3C,0x66,0x7A,0x7A,0x7E,0x7E,0x3C,0x00,0x0E,0x3E,0x3A,0x22,0x26,0x6E,0xE4,0x40, + 0x18,0x3C,0x7E,0x3C,0x3C,0x3C,0x3C,0x00,0x3C,0x3C,0x3C,0x3C,0x7E,0x3C,0x18,0x00, + 0x08,0x7C,0x7E,0x7E,0x7C,0x08,0x00,0x00,0x10,0x3E,0x7E,0x7E,0x3E,0x10,0x00,0x00, + 0x58,0x2A,0xDC,0xC8,0xDC,0x2A,0x58,0x00,0x24,0x66,0xFF,0xFF,0x66,0x24,0x00,0x00, + 0x00,0x10,0x10,0x38,0x38,0x7C,0xFE,0x00,0xFE,0x7C,0x38,0x38,0x10,0x10,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x1C,0x1C,0x18,0x00,0x18,0x18,0x00, + 0x6C,0x6C,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x7C,0x28,0x7C,0x28,0x00,0x00, + 0x10,0x38,0x60,0x38,0x0C,0x78,0x10,0x00,0x40,0xA4,0x48,0x10,0x24,0x4A,0x04,0x00, + 0x18,0x34,0x18,0x3A,0x6C,0x66,0x3A,0x00,0x18,0x18,0x20,0x00,0x00,0x00,0x00,0x00, + 0x30,0x60,0x60,0x60,0x60,0x60,0x30,0x00,0x0C,0x06,0x06,0x06,0x06,0x06,0x0C,0x00, + 0x10,0x54,0x38,0x7C,0x38,0x54,0x10,0x00,0x00,0x18,0x18,0x7E,0x18,0x18,0x00,0x00, + 0x00,0x00,0x00,0x00,0x18,0x18,0x30,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x04,0x08,0x10,0x20,0x40,0x00,0x00, + 0x38,0x4C,0xC6,0xC6,0xC6,0x64,0x38,0x00,0x18,0x38,0x18,0x18,0x18,0x18,0x7E,0x00, + 0x7C,0xC6,0x0E,0x3C,0x78,0xE0,0xFE,0x00,0x7E,0x0C,0x18,0x3C,0x06,0xC6,0x7C,0x00, + 0x1C,0x3C,0x6C,0xCC,0xFE,0x0C,0x0C,0x00,0xFC,0xC0,0xFC,0x06,0x06,0xC6,0x7C,0x00, + 0x3C,0x60,0xC0,0xFC,0xC6,0xC6,0x7C,0x00,0xFE,0xC6,0x0C,0x18,0x30,0x30,0x30,0x00, + 0x78,0xC4,0xE4,0x78,0x86,0x86,0x7C,0x00,0x7C,0xC6,0xC6,0x7E,0x06,0x0C,0x78,0x00, + 0x00,0x00,0x18,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x18,0x18,0x30, + 0x1C,0x38,0x70,0xE0,0x70,0x38,0x1C,0x00,0x00,0x7C,0x00,0x00,0x7C,0x00,0x00,0x00, + 0x70,0x38,0x1C,0x0E,0x1C,0x38,0x70,0x00,0x7C,0xC6,0xC6,0x1C,0x18,0x00,0x18,0x00, + 0x3C,0x42,0x99,0xA1,0xA5,0x99,0x42,0x3C,0x38,0x6C,0xC6,0xC6,0xFE,0xC6,0xC6,0x00, + 0xFC,0xC6,0xC6,0xFC,0xC6,0xC6,0xFC,0x00,0x3C,0x66,0xC0,0xC0,0xC0,0x66,0x3C,0x00, + 0xF8,0xCC,0xC6,0xC6,0xC6,0xCC,0xF8,0x00,0xFE,0xC0,0xC0,0xFC,0xC0,0xC0,0xFE,0x00, + 0xFE,0xC0,0xC0,0xFC,0xC0,0xC0,0xC0,0x00,0x3E,0x60,0xC0,0xCE,0xC6,0x66,0x3E,0x00, + 0xC6,0xC6,0xC6,0xFE,0xC6,0xC6,0xC6,0x00,0x7E,0x18,0x18,0x18,0x18,0x18,0x7E,0x00, + 0x06,0x06,0x06,0x06,0xC6,0xC6,0x7C,0x00,0xC6,0xCC,0xD8,0xF0,0xF8,0xDC,0xCE,0x00, + 0x60,0x60,0x60,0x60,0x60,0x60,0x7E,0x00,0xC6,0xEE,0xFE,0xFE,0xD6,0xC6,0xC6,0x00, + 0xC6,0xE6,0xF6,0xFE,0xDE,0xCE,0xC6,0x00,0x7C,0xC6,0xC6,0xC6,0xC6,0xC6,0x7C,0x00, + 0xFC,0xC6,0xC6,0xC6,0xFC,0xC0,0xC0,0x00,0x7C,0xC6,0xC6,0xC6,0xDE,0xCC,0x7A,0x00, + 0xFC,0xC6,0xC6,0xCE,0xF8,0xDC,0xCE,0x00,0x78,0xCC,0xC0,0x7C,0x06,0xC6,0x7C,0x00, + 0x7E,0x18,0x18,0x18,0x18,0x18,0x18,0x00,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0x7C,0x00, + 0xC6,0xC6,0xC6,0xEE,0x7C,0x38,0x10,0x00,0xC6,0xC6,0xD6,0xFE,0xFE,0xEE,0xC6,0x00, + 0xC6,0xEE,0x3C,0x38,0x7C,0xEE,0xC6,0x00,0x66,0x66,0x66,0x3C,0x18,0x18,0x18,0x00, + 0xFE,0x0E,0x1C,0x38,0x70,0xE0,0xFE,0x00,0x3C,0x30,0x30,0x30,0x30,0x30,0x3C,0x00, + 0x60,0x60,0x30,0x18,0x0C,0x06,0x06,0x00,0x3C,0x0C,0x0C,0x0C,0x0C,0x0C,0x3C,0x00, + 0x18,0x3C,0x66,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF, + 0x30,0x30,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x06,0x3E,0x66,0x66,0x3C,0x00, + 0x60,0x7C,0x66,0x66,0x66,0x66,0x7C,0x00,0x00,0x3C,0x66,0x60,0x60,0x66,0x3C,0x00, + 0x06,0x3E,0x66,0x66,0x66,0x66,0x3E,0x00,0x00,0x3C,0x66,0x66,0x7E,0x60,0x3C,0x00, + 0x1C,0x30,0x78,0x30,0x30,0x30,0x30,0x00,0x00,0x3E,0x66,0x66,0x66,0x3E,0x06,0x3C, + 0x60,0x7C,0x76,0x66,0x66,0x66,0x66,0x00,0x18,0x00,0x38,0x18,0x18,0x18,0x18,0x00, + 0x0C,0x00,0x1C,0x0C,0x0C,0x0C,0x0C,0x38,0x60,0x60,0x66,0x6C,0x78,0x6C,0x66,0x00, + 0x38,0x18,0x18,0x18,0x18,0x18,0x18,0x00,0x00,0xEC,0xFE,0xFE,0xFE,0xD6,0xC6,0x00, + 0x00,0x7C,0x76,0x66,0x66,0x66,0x66,0x00,0x00,0x3C,0x66,0x66,0x66,0x66,0x3C,0x00, + 0x00,0x7C,0x66,0x66,0x66,0x7C,0x60,0x60,0x00,0x3E,0x66,0x66,0x66,0x3E,0x06,0x06, + 0x00,0x7E,0x70,0x60,0x60,0x60,0x60,0x00,0x00,0x3C,0x60,0x3C,0x06,0x66,0x3C,0x00, + 0x30,0x78,0x30,0x30,0x30,0x30,0x1C,0x00,0x00,0x66,0x66,0x66,0x66,0x6E,0x3E,0x00, + 0x00,0x66,0x66,0x66,0x66,0x3C,0x18,0x00,0x00,0xC6,0xD6,0xFE,0xFE,0x7C,0x6C,0x00, + 0x00,0x66,0x3C,0x18,0x3C,0x66,0x66,0x00,0x00,0x66,0x66,0x66,0x66,0x3E,0x06,0x3C, + 0x00,0x7E,0x0C,0x18,0x30,0x60,0x7E,0x00,0x0E,0x18,0x0C,0x38,0x0C,0x18,0x0E,0x00, + 0x18,0x18,0x18,0x00,0x18,0x18,0x18,0x00,0x70,0x18,0x30,0x1C,0x30,0x18,0x70,0x00, + 0x00,0x00,0x76,0xDC,0x00,0x00,0x00,0x00,0x10,0x28,0x10,0x54,0xAA,0x44,0x00,0x00, +}; + +static void gp2x_text(unsigned char *screen, int x, int y, char *text, int color, int flip) +{ + int i,l,slen; + slen=strlen(text); + + screen=screen+x+y*320; + + for (i=0;ipitch*screen->h; @@ -46,27 +187,55 @@ static void CleanSurface(void) if(SDL_MUSTLOCK(screen)) SDL_LockSurface(screen); - memset((uint8*)screen->pixels, 0x80, x); + memset((uint8*)screen->pixels, 0x3F, x); if(SDL_MUSTLOCK(screen)) SDL_UnlockSurface(screen); SDL_UpdateRect(screen, 0, 0, 0, 0); +#endif } -static int paletterefresh; + void KillVideo(void) { +#ifdef GP2X + if (fps_str) + free(fps_str); + inited&=~1; + + +#else if(inited&1) { SDL_QuitSubSystem(SDL_INIT_VIDEO); } inited=0; +#endif } int InitVideo(void) { +#ifdef GP2X + + + fps_str=malloc(3); + fps_str[0]='5'; fps_str[1]='0'; fps_str[2]=0; + + CleanSurface(); + + + inited|=1; + + puts("Initialized GP2X VIDEO via minimal"); + + srendline=0; + erendline=239; + return 1; + + +#else const SDL_VideoInfo *vinf; int flags=0; @@ -131,11 +300,14 @@ int InitVideo(void) SDL_WM_SetCaption("FCE Ultra","FCE Ultra"); paletterefresh=1; + printf("srendline %d, erendline %d\n", srendline, erendline); return 1; +#endif } void ToggleFS(void) { +#ifndef GP2X KillVideo(); _fullscreen=!_fullscreen; @@ -148,7 +320,11 @@ void ToggleFS(void) exit(1); } } +#endif } + + +#ifndef GP2X static SDL_Color psdl[256]; void FCEUD_SetPalette(uint8 index, uint8 r, uint8 g, uint8 b) @@ -172,14 +348,199 @@ static void RedoPalette(void) { SDL_SetPalette(screen,SDL_PHYSPAL,psdl,0,256); } +#else + + + +void FCEUD_SetPalette(uint8 index, uint8 r, uint8 g, uint8 b) +{ + gp2x_video_color8(index, r, g, b); + gp2x_video_setpalette(); + + + paletterefresh = 1; +} +void FCEUD_GetPalette(uint8 index, uint8 * r, uint8 * g, uint8 * b) +{ + *r = (uint8) gp2x_palette[(index << 1) + 1]; + *g = (uint8) (gp2x_palette[(index << 1) + 0] >> 8); + *b = (uint8) gp2x_palette[(index << 1) + 0]; +} + +static void RedoPalette(void) +{ +} + + + +unsigned int gp2x_ticks_per_ms=7372800; +int needfpsflip=1; +#ifdef FRAMESKIP +int skipval=16; +int framecount=0; +int numrepeats=0; +int doskipping=0; +#endif + + +INLINE void printFps(uint8 *screen) +{ + int y; + int* destt; + + if (needfpsflip) + { + if (stretch_offset > 0) + { + y=240; + while (y--) + { + + int* dest=(int *) (screen+((y << 8) + (y << 6))+stretch_offset); + + destt=dest - 8; + destt[0]=0x3F3F3F3F; destt[1]=0x3F3F3F3F; destt[2]=0x3F3F3F3F; destt[3]=0x3F3F3F3F; + destt[4]=0x3F3F3F3F; destt[5]=0x3F3F3F3F; destt[6]=0x3F3F3F3F; destt[7]=0x3F3F3F3F; + + destt=dest + 64; + destt[0]=0x3F3F3F3F; destt[1]=0x3F3F3F3F; destt[2]=0x3F3F3F3F; destt[3]=0x3F3F3F3F; + destt[4]=0x3F3F3F3F; destt[5]=0x3F3F3F3F; destt[6]=0x3F3F3F3F; destt[7]=0x3F3F3F3F; + } + if (showfps) + { + gp2x_text(screen, 0, 0, fps_str, FPS_COLOR, 0); + } + } + + if (needfpsflip <= 3) + { + if (showfps) + { + gp2x_text(screen, 0, 0, fps_str, FPS_COLOR, 0); + } + needfpsflip++; + } + else + { + needfpsflip=0; + } + } +#ifdef FRAMESKIP + if ((fps < 59) && doskipping && ((framesRendered % skipval) == (skipval-1))) + { + FCEUI_FrameSkip(1); + } +#endif + if ((framesRendered & 0x3F) != 0x3F) + { + return; + } + + unsigned long currTime=gp2x_timer_read_ms(); + fps= (unsigned long)( framesRendered * 7372800 / (currTime - ticks)); + if (fps > 90) + fps=90; + + if (fps > 30) + { + fps_samplecount++; + total_fps+=fps; + } + if (stretch_offset && showfps) + { + sprintf(fps_str, "%d", (int)fps); + needfpsflip=1; + fps_str[2]=0; + gp2x_text(screen, 0, 0, fps_str, stretch_offset, 0); + } + +#ifdef FRAMESKIP + if (fps < 59) + { + numrepeats++; + if (numrepeats >= 4) + { + if (skipval > 4) + { + skipval-=2; + } + doskipping=1; + printf("skipping every %dth frame, currfps=%d\n", skipval, fps); + numrepeats=0; + } + } + else + { + numrepeats=0; + } +#endif + ticks = currTime; + framesRendered = 0; +} +#endif + + + + + + + + + + void LockConsole(){} void UnlockConsole(){} + + +#ifdef GP2X + +void BlitScreen(uint8 * XBuf) +{ + + int x, y, yinc; + if (!XBuf) return; + XBufHelper=XBuf; + framesRendered++; + XBuf = XBuf ; + + y=240; + yinc=272*(y-1); + while (y--) + { + int* dest=(int *) (gp2x_screen8+((y << 8) + (y << 6))+stretch_offset); + + int* src=(int *) (XBuf+yinc); + x=64; + while (x--) + { + dest[x]=src[x]; + } + yinc-=272; + } + + if (paletterefresh) + { + gp2x_video_setpalette(); + paletterefresh = 0; + } + + printFps(gp2x_screen8); + gp2x_video_flip(); +} + + + + +#else +extern void SpeedThrottle(); void BlitScreen(uint8 *XBuf) { uint8 *dest; int xo=0,yo=0; + SpeedThrottle(); + if(paletterefresh) { RedoPalette(); @@ -210,6 +571,11 @@ void BlitScreen(uint8 *XBuf) SDL_UnlockSurface(screen); SDL_UpdateRect(screen, xo, yo, NWIDTH*exs, tlines*eys); + + if (0) + { + gp2x_text(NULL, 0, 0, NULL, 0, 0); + } } uint32 PtoV(uint16 x, uint16 y) @@ -226,3 +592,4 @@ uint32 PtoV(uint16 x, uint16 y) } return(x|(y<<16)); } +#endif