accurate_sprites performance improvement, PSP is untested
authornotaz <notasas@gmail.com>
Sun, 1 Jun 2008 13:45:34 +0000 (13:45 +0000)
committernotaz <notasas@gmail.com>
Sun, 1 Jun 2008 13:45:34 +0000 (13:45 +0000)
git-svn-id: file:///home/notaz/opt/svn/PicoDrive/platform@478 be3aeb3a-fb24-0410-a615-afba39da0efa

gp2x/emu.c
psp/emu.c

index f580f84..5f4a0e2 100644 (file)
@@ -291,26 +291,39 @@ static void blit(const char *fps, const char *notice)
                // 8bit accurate renderer\r
                if (Pico.m.dirtyPal)\r
                {\r
+                       int pallen = 0x40;\r
                        Pico.m.dirtyPal = 0;\r
-                       if(Pico.video.reg[0xC]&8) { // shadow/hilight mode\r
+                       if (Pico.video.reg[0xC]&8) // shadow/hilight mode\r
+                       {\r
                                vidConvCpyRGB32(localPal, Pico.cram, 0x40);\r
                                vidConvCpyRGB32sh(localPal+0x40, Pico.cram, 0x40);\r
                                vidConvCpyRGB32hi(localPal+0x80, Pico.cram, 0x40);\r
                                memcpy32(localPal+0xc0, localPal+0x40, 0x40);\r
-                               localPal[0xc0] = 0x0000c000;\r
-                               localPal[0xd0] = 0x00c00000;\r
-                               localPal[0xe0] = 0x00000000; // reserved pixels for OSD\r
-                               localPal[0xf0] = 0x00ffffff;\r
-                               gp2x_video_setpalette(localPal, 0x100);\r
-                       } else if (rendstatus & PDRAW_SONIC_MODE) { // mid-frame palette changes\r
+                               pallen = 0x100;\r
+                       }\r
+                       else if (rendstatus & PDRAW_ACC_SPRITES) {\r
+                               vidConvCpyRGB32(localPal, Pico.cram, 0x40);\r
+                               memcpy32(localPal+0x40, localPal, 0x40);\r
+                               memcpy32(localPal+0x80, localPal, 0x40);\r
+                               memcpy32(localPal+0xc0, localPal, 0x40);\r
+                               pallen = 0x100;\r
+                       }\r
+                       else if (rendstatus & PDRAW_SONIC_MODE) { // mid-frame palette changes\r
                                vidConvCpyRGB32(localPal, Pico.cram, 0x40);\r
                                vidConvCpyRGB32(localPal+0x40, HighPal, 0x40);\r
                                vidConvCpyRGB32(localPal+0x80, HighPal+0x40, 0x40);\r
-                               gp2x_video_setpalette(localPal, 0xc0);\r
-                       } else {\r
+                               pallen = 0xc0;\r
+                       }\r
+                       else {\r
                                vidConvCpyRGB32(localPal, Pico.cram, 0x40);\r
-                               gp2x_video_setpalette(localPal, 0x40);\r
                        }\r
+                       if (pallen > 0xc0) {\r
+                               localPal[0xc0] = 0x0000c000;\r
+                               localPal[0xd0] = 0x00c00000;\r
+                               localPal[0xe0] = 0x00000000; // reserved pixels for OSD\r
+                               localPal[0xf0] = 0x00ffffff;\r
+                       }\r
+                       gp2x_video_setpalette(localPal, pallen);\r
                }\r
        }\r
 \r
index 46de80c..4857371 100644 (file)
--- a/psp/emu.c
+++ b/psp/emu.c
@@ -162,6 +162,9 @@ void emu_setDefaultConfig(void)
 
 
 extern void amips_clut(unsigned short *dst, unsigned char *src, unsigned short *pal, int count);
+extern void amips_clut_6bit(unsigned short *dst, unsigned char *src, unsigned short *pal, int count);
+
+extern void (*amips_clut_f)(unsigned short *dst, unsigned char *src, unsigned short *pal, int count) = NULL;
 
 struct Vertex
 {
@@ -235,7 +238,7 @@ static void set_scaling_params(void)
        */
 }
 
-static void do_pal_update(int allow_sh)
+static void do_pal_update(int allow_sh, int allow_as)
 {
        unsigned int *dpal=(void *)localPal;
        int i;
@@ -244,6 +247,9 @@ static void do_pal_update(int allow_sh)
        //      dpal[i] = ((spal[i]&0x000f000f)<< 1)|((spal[i]&0x00f000f0)<<3)|((spal[i]&0x0f000f00)<<4);
        do_pal_convert(localPal, Pico.cram, currentConfig.gamma, currentConfig.gamma2);
 
+       Pico.m.dirtyPal = 0;
+       need_pal_upload = 1;
+
        if (allow_sh && (Pico.video.reg[0xC]&8)) // shadow/hilight?
        {
                // shadowed pixels
@@ -260,8 +266,12 @@ static void do_pal_update(int allow_sh)
                }
                localPal[0xe0] = 0;
        }
-       Pico.m.dirtyPal = 0;
-       need_pal_upload = 1;
+       else if (allow_as && (rendstatus & PDRAW_ACC_SPRITES))
+       {
+               memcpy32(localPal+0x40, localPal, 0x40);
+               memcpy32(localPal+0x80, localPal, 0x40);
+               memcpy32(localPal+0xc0, localPal, 0x40);
+       }
 }
 
 static void do_slowmode_lines(int line_to)
@@ -272,7 +282,7 @@ static void do_slowmode_lines(int line_to)
        if (!(Pico.video.reg[1]&8)) { line = 8; dst += 512*8; src += 512*8; }
 
        for (; line < line_to; line++, dst+=512, src+=512)
-               amips_clut(dst, src, localPal, line_len);
+               amips_clut_f(dst, src, localPal, line_len);
 }
 
 static void EmuScanPrepare(void)
@@ -282,7 +292,10 @@ static void EmuScanPrepare(void)
 
        dynamic_palette = 0;
        if (Pico.m.dirtyPal)
-               do_pal_update(1);
+               do_pal_update(1, 1);
+       if ((rendstatus & PDRAW_ACC_SPRITES) && !(Pico.video.reg[0xC]&8))
+            amips_clut_f = amips_clut_6bit;
+       else amips_clut_f = amips_clut;
 }
 
 static int EmuScanSlowBegin(unsigned int num)
@@ -304,13 +317,13 @@ static int EmuScanSlowEnd(unsigned int num)
                        do_slowmode_lines(num);
                        dynamic_palette = 1;
                }
-               do_pal_update(1);
+               do_pal_update(1, 0);
        }
 
        if (dynamic_palette) {
                int line_len = (Pico.video.reg[12]&1) ? 320 : 256;
                void *dst = (char *)VRAM_STUFF + 512*240 + 512*2*num;
-               amips_clut(dst, HighCol + 8, localPal, line_len);
+               amips_clut_f(dst, HighCol + 8, localPal, line_len);
        }
 
        return 0;
@@ -344,7 +357,7 @@ static void blitscreen_clut(void)
                }
 
                if ((PicoOpt&0x10) && Pico.m.dirtyPal)
-                       do_pal_update(0);
+                       do_pal_update(0, 0);
 
                sceKernelDcacheWritebackAll();