int (*PicoScanBegin)(unsigned int num) = NULL;\r
int (*PicoScanEnd) (unsigned int num) = NULL;\r
\r
-#if OVERRIDE_HIGHCOL\r
static unsigned char DefHighCol[8+320+8];\r
-unsigned char *HighCol=DefHighCol;\r
-#else\r
-unsigned char HighCol[8+320+8];\r
-#endif\r
+unsigned char *HighCol = DefHighCol;\r
+static unsigned char *HighColBase = DefHighCol;\r
+static int HighColIncrement;\r
+\r
static unsigned int DefOutBuff[320*2/2];\r
-void *DrawLineDest=DefOutBuff; // pointer to dest buffer where to draw this line to\r
+void *DrawLineDest = DefOutBuff; // pointer to dest buffer where to draw this line to\r
+void *DrawLineDestBase = DefOutBuff;\r
+int DrawLineDestIncrement;\r
\r
static int HighCacheA[41+1]; // caches for high layers\r
static int HighCacheB[41+1];\r
}\r
}\r
\r
+#if 0\r
static void FinalizeLineBGR444(int sh, int line)\r
{\r
unsigned short *pd=DrawLineDest;\r
for(i = 0; i < len; i++)\r
pd[i] = pal[ps[i] & mask];\r
}\r
+#endif\r
\r
\r
-void FinalizeLineRGB555(int sh, int line)\r
+void FinalizeLine555(int sh, int line)\r
{\r
unsigned short *pd=DrawLineDest;\r
unsigned char *ps=HighCol+8;\r
// MUST be called every frame\r
PICO_INTERNAL void PicoFrameStart(void)\r
{\r
- int lines = 224;\r
+ int offs = 8, lines = 224;\r
\r
// prepare to do this frame\r
rendstatus = 0;\r
rendstatus |= PDRAW_INTERLACE; // interlace mode\r
if (!(Pico.video.reg[12] & 1))\r
rendstatus |= PDRAW_32_COLS;\r
- if (Pico.video.reg[1] & 8)\r
+ if (Pico.video.reg[1] & 8) {\r
+ offs = 0;\r
lines = 240;\r
+ }\r
\r
+ HighCol = HighColBase + offs * HighColIncrement;\r
+ DrawLineDest = (char *)DrawLineDestBase + offs * DrawLineDestIncrement;\r
DrawScanline = 0;\r
skip_next_line = 0;\r
\r
if (rendstatus != rendstatus_old || lines != rendlines) {\r
rendlines = lines;\r
- rendstatus_old = rendstatus;\r
+ // mode_change() might reset rendstatus_old by calling SetColorFormat\r
emu_video_mode_change((lines == 240) ? 0 : 8,\r
lines, (Pico.video.reg[12] & 1) ? 0 : 1);\r
+ rendstatus_old = rendstatus;\r
}\r
\r
if (PicoOpt & POPT_ALT_RENDERER)\r
\r
if (PicoScanEnd != NULL)\r
skip_next_line = PicoScanEnd(line + offs);\r
+\r
+ HighCol += HighColIncrement;\r
+ DrawLineDest = (char *)DrawLineDest + DrawLineDestIncrement;\r
}\r
\r
void PicoDrawSync(int to, int blank_last_line)\r
int sh = (Pico.video.reg[0xC] & 8) >> 3; // shadow/hilight?\r
int bgc = Pico.video.reg[7];\r
\r
+ pprof_start(draw);\r
+\r
if (rendlines != 240)\r
offs = 8;\r
\r
- // need to know which pixels are bg for 32x\r
- if (PicoAHW & PAHW_32X)\r
- bgc = 0;\r
-\r
for (line = DrawScanline; line < to; line++)\r
{\r
#if !CAN_HANDLE_240_LINES\r
line++;\r
}\r
DrawScanline = line;\r
+\r
+ pprof_end(draw);\r
+}\r
+\r
+// also works for fast renderer\r
+void PicoDrawUpdateHighPal(void)\r
+{\r
+ int sh = (Pico.video.reg[0xC] & 8) >> 3; // shadow/hilight?\r
+ if (PicoOpt & POPT_ALT_RENDERER)\r
+ sh = 0; // no s/h support\r
+\r
+ PicoDoHighPal555(sh);\r
+ if (rendstatus & PDRAW_SONIC_MODE) {\r
+ // FIXME?\r
+ memcpy(HighPal + 0x40, HighPal, 0x40*2);\r
+ memcpy(HighPal + 0x80, HighPal, 0x40*2);\r
+ }\r
}\r
\r
-void PicoDrawSetColorFormat(int which)\r
+void PicoDrawSetOutFormat(pdso_t which, int allow_32x)\r
{\r
switch (which)\r
{\r
- case 2: FinalizeLine = FinalizeLine8bit; break;\r
- case 1: FinalizeLine = (PicoAHW & PAHW_32X) ? FinalizeLine32xRGB555 : FinalizeLineRGB555; break;\r
- case 0: FinalizeLine = FinalizeLineBGR444; break;\r
- default:FinalizeLine = NULL; break;\r
+ case PDF_8BIT:\r
+ FinalizeLine = FinalizeLine8bit;\r
+ break;\r
+\r
+ case PDF_RGB555:\r
+ if ((PicoAHW & PAHW_32X) && allow_32x)\r
+ FinalizeLine = FinalizeLine32xRGB555;\r
+ else\r
+ FinalizeLine = FinalizeLine555;\r
+ break;\r
+\r
+ default:\r
+ FinalizeLine = NULL;\r
+ break;\r
+ }\r
+ PicoDrawSetOutputMode4(which);\r
+ rendstatus_old = -1;\r
+}\r
+\r
+// note: may be called on the middle of frame\r
+void PicoDrawSetOutBuf(void *dest, int increment)\r
+{\r
+ DrawLineDestBase = dest;\r
+ DrawLineDestIncrement = increment;\r
+ DrawLineDest = DrawLineDestBase + DrawScanline * increment;\r
+}\r
+\r
+void PicoDrawSetInternalBuf(void *dest, int increment)\r
+{\r
+ if (dest != NULL) {\r
+ HighColBase = dest;\r
+ HighColIncrement = increment;\r
+ HighCol = HighColBase + DrawScanline * increment;\r
+ }\r
+ else {\r
+ HighColBase = DefHighCol;\r
+ HighColIncrement = 0;\r
}\r
- PicoDrawSetColorFormatMode4(which);\r
-#if OVERRIDE_HIGHCOL\r
- if (which)\r
- HighCol=DefHighCol;\r
-#endif\r
}\r
\r