From 7c49c8a2a0cd00c453425b0f88c7b117223c92f4 Mon Sep 17 00:00:00 2001 From: notaz Date: Sun, 2 Jan 2011 21:34:28 +0200 Subject: [PATCH] gpu_unai: pcsx-rearmed port --- plugins/gpu_unai/Makefile | 20 ++++++++ plugins/gpu_unai/debug.h | 0 plugins/gpu_unai/gpu.cpp | 100 +++++++++++++++++++++++++++++++++++- plugins/gpu_unai/port.h | 36 +++++++++++++ plugins/gpu_unai/profiler.h | 4 ++ 5 files changed, 158 insertions(+), 2 deletions(-) create mode 100644 plugins/gpu_unai/Makefile create mode 100644 plugins/gpu_unai/debug.h create mode 100644 plugins/gpu_unai/port.h create mode 100644 plugins/gpu_unai/profiler.h diff --git a/plugins/gpu_unai/Makefile b/plugins/gpu_unai/Makefile new file mode 100644 index 00000000..92f7ade4 --- /dev/null +++ b/plugins/gpu_unai/Makefile @@ -0,0 +1,20 @@ +CC = $(CROSS_COMPILE)gcc + +CFLAGS += -fPIC -Wall -DREARMED +CFLAGS += -O2 -ffast-math -fomit-frame-pointer +CFLAGS += -mcpu=cortex-a8 -mtune=cortex-a8 -mfpu=neon -mfloat-abi=softfp +# -fschedule-insns (from -O2+) causes bugs, probably bad asm() statements +CFLAGS += -fno-schedule-insns -fno-schedule-insns2 + +TARGET = gpuPCSX4ALL.so +LDFLAGS += -shared -Wl,-soname,$(TARGET) + +all: $(TARGET) + +$(TARGET): gpu.cpp ../../frontend/arm_utils.s + $(CC) -o $@ $^ $(CFLAGS) $(LDFLAGS) + +# $(TARGET): *.h + +clean: + $(RM) $(TARGET) $(OBJ) diff --git a/plugins/gpu_unai/debug.h b/plugins/gpu_unai/debug.h new file mode 100644 index 00000000..e69de29b diff --git a/plugins/gpu_unai/gpu.cpp b/plugins/gpu_unai/gpu.cpp index ba32d180..991610cf 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" @@ -92,7 +92,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; /////////////////////////////////////////////////////////////////////////////// @@ -570,6 +570,8 @@ void GPU_writeStatus(u32 data) pcsx4all_prof_resume(PCSX4ALL_PROF_CPU); } +#ifndef REARMED + // Blitting functions #include "gpu_blit.h" @@ -838,3 +840,97 @@ 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; + u8 *dest = (u8 *)screen_buf; + u16 *srcs; + + 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 (w0 != old_res_horz || h1 != old_res_vert || isRGB24 != old_rgb24) + { + old_res_horz = w0; + old_res_vert = h1; + old_rgb24 = (s16)isRGB24; + cbs->pl_fbdev_set_mode(w0, h1, isRGB24 ? 24 : 16); + } + + 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 (!((GPU_GP1&0x08000000) || (GPU_GP1&0x00800000))) + blit(); +} + +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 diff --git a/plugins/gpu_unai/port.h b/plugins/gpu_unai/port.h new file mode 100644 index 00000000..3561acdc --- /dev/null +++ b/plugins/gpu_unai/port.h @@ -0,0 +1,36 @@ +#include +#include + +#define INLINE static inline + +#define GPU_init GPUinit +#define GPU_shutdown GPUshutdown +//#define GPU_freeze GPUfreeze +#define GPU_writeDataMem GPUwriteDataMem +#define GPU_dmaChain GPUdmaChain +#define GPU_writeData GPUwriteData +#define GPU_readDataMem GPUreadDataMem +#define GPU_readData GPUreadData +#define GPU_readStatus GPUreadStatus +#define GPU_writeStatus GPUwriteStatus +#define GPU_updateLace GPUupdateLace + +extern "C" { + +#define u32 unsigned int +#define s32 signed int + +bool GPUinit(void); +void GPUshutdown(void); +void GPUwriteDataMem(u32* dmaAddress, s32 dmaCount); +void GPUdmaChain(u32* baseAddr, u32 dmaVAddr); +void GPUwriteData(u32 data); +void GPUreadDataMem(u32* dmaAddress, s32 dmaCount); +u32 GPUreadData(void); +u32 GPUreadStatus(void); +void GPUwriteStatus(u32 data); + +#undef u32 +#undef s32 + +} diff --git a/plugins/gpu_unai/profiler.h b/plugins/gpu_unai/profiler.h new file mode 100644 index 00000000..c09c95f5 --- /dev/null +++ b/plugins/gpu_unai/profiler.h @@ -0,0 +1,4 @@ +#define pcsx4all_prof_pause(...) +#define pcsx4all_prof_start_with_pause(...) +#define pcsx4all_prof_end_with_resume(...) +#define pcsx4all_prof_resume(...) -- 2.39.2