X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=pico%2Fdraw.c;h=6670ba3be0b431ffdcd90f4a3e42e53bea871f7d;hb=f6c49d38cbb965c502ca2af66d76e92f95acda7c;hp=180045d26f736a53fafefd38542b324d8e8e8413;hpb=974fdb5bfda8ed006661031e22c920828ddb60dc;p=picodrive.git diff --git a/pico/draw.c b/pico/draw.c index 180045d2..6670ba3b 100644 --- a/pico/draw.c +++ b/pico/draw.c @@ -54,6 +54,7 @@ int HighPreSpr[80*2+1]; // slightly preprocessed sprites unsigned char HighLnSpr[240][3 + MAX_LINE_SPRITES]; // sprite_count, ^flags, tile_count, [spritep]... int rendstatus, rendstatus_old; +int rendlines; int DrawScanline; int PicoDrawMask = -1; @@ -1404,21 +1405,26 @@ static int DrawDisplay(int sh) // MUST be called every frame PICO_INTERNAL void PicoFrameStart(void) { + int lines = 224; + // prepare to do this frame rendstatus = 0; - if ((Pico.video.reg[12]&6) == 6) + if ((Pico.video.reg[12] & 6) == 6) rendstatus |= PDRAW_INTERLACE; // interlace mode + if (!(Pico.video.reg[12] & 1)) + rendstatus |= PDRAW_32_COLS; if (Pico.video.reg[1] & 8) - rendstatus |= PDRAW_240LINES; + lines = 240; DrawScanline = 0; skip_next_line = 0; - if (rendstatus != rendstatus_old) { + if (rendstatus != rendstatus_old || lines != rendlines) { + rendlines = lines; + // mode_change() might reset rendstatus_old by calling SetColorFormat + emu_video_mode_change((lines == 240) ? 0 : 8, + lines, (Pico.video.reg[12] & 1) ? 0 : 1); rendstatus_old = rendstatus; - emu_video_mode_change((rendstatus & PDRAW_240LINES) ? 0 : 8, - (rendstatus & PDRAW_240LINES) ? 240 : 224, - (Pico.video.reg[12] & 1) ? 0 : 1); } if (PicoOpt & POPT_ALT_RENDERER) @@ -1445,6 +1451,8 @@ static void DrawBlankedLine(int line, int offs, int sh, int bgc) static void PicoLine(int line, int offs, int sh, int bgc) { + int skip = 0; + if (skip_next_line > 0) { skip_next_line--; return; @@ -1452,7 +1460,12 @@ static void PicoLine(int line, int offs, int sh, int bgc) DrawScanline = line; if (PicoScanBegin != NULL) - skip_next_line = PicoScanBegin(line + offs); + skip = PicoScanBegin(line + offs); + + if (skip) { + skip_next_line = skip - 1; + return; + } // Draw screen: BackFill(bgc, sh); @@ -1472,7 +1485,9 @@ void PicoDrawSync(int to, int blank_last_line) int sh = (Pico.video.reg[0xC] & 8) >> 3; // shadow/hilight? int bgc = Pico.video.reg[7]; - if (!(rendstatus & PDRAW_240LINES)) + pprof_start(draw); + + if (rendlines != 240) offs = 8; // need to know which pixels are bg for 32x @@ -1503,6 +1518,8 @@ void PicoDrawSync(int to, int blank_last_line) line++; } DrawScanline = line; + + pprof_end(draw); } void PicoDrawSetColorFormat(int which) @@ -1515,6 +1532,7 @@ void PicoDrawSetColorFormat(int which) default:FinalizeLine = NULL; break; } PicoDrawSetColorFormatMode4(which); + rendstatus_old = -1; #if OVERRIDE_HIGHCOL if (which) HighCol=DefHighCol;