X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?p=pcsx_rearmed.git;a=blobdiff_plain;f=plugins%2Fgpu_unai%2Fgpu.cpp;h=808c8916f69f3f004fc15aa37762e12ddc8e6a12;hp=3e69aaa91d7a97bf02753e3735c8417e6bb1f182;hb=ea3d2e6e638ffd02aee0be8bdd27d8a9babd179f;hpb=297b3d633ad25797a4f355c57964b7ce3aee6936 diff --git a/plugins/gpu_unai/gpu.cpp b/plugins/gpu_unai/gpu.cpp index 3e69aaa9..808c8916 100644 --- a/plugins/gpu_unai/gpu.cpp +++ b/plugins/gpu_unai/gpu.cpp @@ -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; @@ -867,7 +879,7 @@ static void blit(void) u16 *srcs; u8 *dest; - x0 = DisplayArea[0] & ~3; // alignment needed by blitter + x0 = DisplayArea[0] & ~1; // alignment needed by blitter y0 = DisplayArea[1]; srcs = &((u16*)GPU_FrameBuffer)[FRAME_OFFSET(x0,y0)]; @@ -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 { @@ -919,7 +938,7 @@ void GPU_updateLace(void) blit(); fb_dirty = false; - if (*cbs->fskip_option) + if (cbs->fskip_advice) isSkip = true; } else