spu: compact chan structure a bit
[pcsx_rearmed.git] / plugins / gpu_unai / gpu.cpp
index 3e69aaa..5152327 100644 (file)
@@ -94,7 +94,8 @@ u32   lInc;
 u32   tInc, tMsk;
 
 GPUPacket PacketBuffer;
-u16   GPU_FrameBuffer[FRAME_BUFFER_SIZE/2] __attribute__((aligned(16)));    // FRAME_BUFFER_SIZE is defined in bytes
+// FRAME_BUFFER_SIZE is defined in bytes; 512K is guard memory for out of range reads
+u16   GPU_FrameBuffer[(FRAME_BUFFER_SIZE+512*1024)/2] __attribute__((aligned(16)));
 u32   GPU_GP1;
 
 ///////////////////////////////////////////////////////////////////////////////
@@ -182,6 +183,14 @@ long  GPU_freeze(unsigned int bWrite, GPUFreeze_t* p2)
        if (bWrite)
        {
                p2->GPU_gp1 = GPU_GP1;
+               memset(p2->Control, 0, sizeof(p2->Control));
+               // save resolution and registers for P.E.Op.S. compatibility
+               p2->Control[3] = (3 << 24) | ((GPU_GP1 >> 23) & 1);
+               p2->Control[4] = (4 << 24) | ((GPU_GP1 >> 29) & 3);
+               p2->Control[5] = (5 << 24) | (DisplayArea[0] | (DisplayArea[1] << 10));
+               p2->Control[6] = (6 << 24) | (2560 << 12);
+               p2->Control[7] = (7 << 24) | (DisplayArea[4] | (DisplayArea[5] << 10));
+               p2->Control[8] = (8 << 24) | ((GPU_GP1 >> 17) & 0x3f) | ((GPU_GP1 >> 10) & 0x40);
                memcpy(p2->FrameBuffer, (u16*)GPU_FrameBuffer, FRAME_BUFFER_SIZE);
                return (1);
        }
@@ -189,6 +198,10 @@ long  GPU_freeze(unsigned int bWrite, GPUFreeze_t* p2)
        {
                GPU_GP1 = p2->GPU_gp1;
                memcpy((u16*)GPU_FrameBuffer, p2->FrameBuffer, FRAME_BUFFER_SIZE);
+               GPU_writeStatus((5 << 24) | p2->Control[5]);
+               GPU_writeStatus((7 << 24) | p2->Control[7]);
+               GPU_writeStatus((8 << 24) | p2->Control[8]);
+               gpuSetTexture(GPU_GP1);
                return (1);
        }
        return (0);
@@ -851,11 +864,10 @@ void  GPU_updateLace(void)
 #else
 
 #include "../../frontend/plugin_lib.h"
+#include "../../frontend/arm_utils.h"
 
 extern "C" {
 
-extern void bgr555_to_rgb565(void *dst, void *src, int bytes);
-extern void bgr888_to_rgb888(void *dst, void *src, int bytes);
 static const struct rearmed_cbs *cbs;
 static void *screen_buf;
 
@@ -891,10 +903,17 @@ static void blit(void)
 
        if (isRGB24)
        {
+#ifndef MAEMO
                for (; h1-- > 0; dest += w0 * 3, srcs += 1024)
                {
                        bgr888_to_rgb888(dest, srcs, w0 * 3);
                }
+#else
+               for (; h1-- > 0; dest += w0 * 2, srcs += 1024)
+               {
+                       bgr888_to_rgb565(dest, srcs, w0 * 3);
+               }
+#endif
        }
        else
        {