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=3e69aaa91d7a97bf02753e3735c8417e6bb1f182;hp=ba32d1806351ccae174f69ba6dcf6d25f7f7ff22;hb=297b3d633ad25797a4f355c57964b7ce3aee6936;hpb=86aad47b0418b1715a4d223adf8f59aa92619d15 diff --git a/plugins/gpu_unai/gpu.cpp b/plugins/gpu_unai/gpu.cpp index ba32d180..3e69aaa9 100644 --- a/plugins/gpu_unai/gpu.cpp +++ b/plugins/gpu_unai/gpu.cpp @@ -18,8 +18,8 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307 USA. * ***************************************************************************/ -#include "gpu.h" #include "port.h" +#include "gpu.h" #include "profiler.h" #include "debug.h" @@ -40,6 +40,8 @@ bool frameLimit = false; /* frames to wait */ bool light = true; /* lighting */ bool blend = true; /* blending */ +bool fb_dirty = false; + bool enableAbbeyHack = false; /* Abe's Odyssey hack */ u8 BLEND_MODE; u8 TEXT_MODE; @@ -92,7 +94,7 @@ u32 lInc; u32 tInc, tMsk; GPUPacket PacketBuffer; -u16 GPU_FrameBuffer[FRAME_BUFFER_SIZE/2]; // FRAME_BUFFER_SIZE is defined in bytes +u16 GPU_FrameBuffer[FRAME_BUFFER_SIZE/2] __attribute__((aligned(16))); // FRAME_BUFFER_SIZE is defined in bytes u32 GPU_GP1; /////////////////////////////////////////////////////////////////////////////// @@ -298,6 +300,7 @@ void GPU_writeDataMem(u32* dmaAddress, s32 dmaCount) } GPU_GP1 = (GPU_GP1 | 0x14000000) & ~0x60000000; + fb_dirty = true; pcsx4all_prof_end_with_resume(PCSX4ALL_PROF_GPU,PCSX4ALL_PROF_HW_WRITE); pcsx4all_prof_resume(PCSX4ALL_PROF_CPU); } @@ -390,6 +393,7 @@ void GPU_writeData(u32 data) gpuCheckPacket(data); } GPU_GP1 |= 0x14000000; + fb_dirty = true; pcsx4all_prof_end_with_resume(PCSX4ALL_PROF_GPU,PCSX4ALL_PROF_HW_WRITE); pcsx4all_prof_resume(PCSX4ALL_PROF_CPU); @@ -529,10 +533,12 @@ void GPU_writeStatus(u32 data) case 0x05: DisplayArea[0] = (data & 0x000003FF); //(short)(data & 0x3ff); DisplayArea[1] = ((data & 0x0007FC00)>>10); //(data & 0x000FFC00) >> 10; //(short)((data>>10)&0x1ff); + fb_dirty = true; break; case 0x07: DisplayArea[4] = data & 0x000003FF; //(short)(data & 0x3ff); DisplayArea[5] = (data & 0x000FFC00) >> 10; //(short)((data>>10) & 0x3ff); + fb_dirty = true; break; case 0x08: { @@ -543,6 +549,7 @@ void GPU_writeStatus(u32 data) DisplayArea[3] = VerticalResolution[(GPU_GP1 >> 19) & 3]; isPAL = (data & 0x08) ? true : false; // if 1 - PAL mode, else NTSC } + fb_dirty = true; break; case 0x10: switch (data & 0xffff) { @@ -570,6 +577,8 @@ void GPU_writeStatus(u32 data) pcsx4all_prof_resume(PCSX4ALL_PROF_CPU); } +#ifndef REARMED + // Blitting functions #include "gpu_blit.h" @@ -838,3 +847,111 @@ void GPU_updateLace(void) pcsx4all_prof_end_with_resume(PCSX4ALL_PROF_GPU,PCSX4ALL_PROF_COUNTERS); } + +#else + +#include "../../frontend/plugin_lib.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; + +static void blit(void) +{ + static s16 old_res_horz, old_res_vert, old_rgb24; + s16 isRGB24 = (GPU_GP1 & 0x00200000) ? 1 : 0; + s16 h0, x0, y0, w0, h1; + u16 *srcs; + u8 *dest; + + x0 = DisplayArea[0] & ~3; // alignment needed by blitter + y0 = DisplayArea[1]; + srcs = &((u16*)GPU_FrameBuffer)[FRAME_OFFSET(x0,y0)]; + + w0 = DisplayArea[2]; + h0 = DisplayArea[3]; // video mode + + h1 = DisplayArea[5] - DisplayArea[4]; // display needed + if (h0 == 480) h1 = Min2(h1*2,480); + + if (h1 <= 0) + return; + + if (w0 != old_res_horz || h1 != old_res_vert || isRGB24 != old_rgb24) + { + old_res_horz = w0; + old_res_vert = h1; + old_rgb24 = (s16)isRGB24; + screen_buf = cbs->pl_fbdev_set_mode(w0, h1, isRGB24 ? 24 : 16); + } + dest = (u8 *)screen_buf; + + if (isRGB24) + { + for (; h1-- > 0; dest += w0 * 3, srcs += 1024) + { + bgr888_to_rgb888(dest, srcs, w0 * 3); + } + } + else + { + for (; h1-- > 0; dest += w0 * 2, srcs += 1024) + { + bgr555_to_rgb565(dest, srcs, w0 * 2); + } + } + + screen_buf = cbs->pl_fbdev_flip(); +} + +void GPU_updateLace(void) +{ + // Interlace bit toggle + GPU_GP1 ^= 0x80000000; + + if (!fb_dirty || (GPU_GP1&0x08800000)) + return; + + if (!isSkip) { + blit(); + + fb_dirty = false; + if (*cbs->fskip_option) + isSkip = true; + } + else + isSkip = false; +} + +long GPUopen(unsigned long *, char *, char *) +{ + cbs->pl_fbdev_open(); + screen_buf = cbs->pl_fbdev_flip(); + return 0; +} + +long GPUclose(void) +{ + cbs->pl_fbdev_close(); + return 0; +} + +long GPUfreeze(unsigned int ulGetFreezeData, GPUFreeze_t* p2) +{ + if (ulGetFreezeData > 1) + return 0; + + return GPU_freeze(ulGetFreezeData, p2); +} + +void GPUrearmedCallbacks(const struct rearmed_cbs *cbs_) +{ + cbs = cbs_; +} + +} /* extern "C" */ + +#endif