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=1552bed90af2c2a92cce7b7bb6e88e1a06649277;hp=3515814322239f6a18f6ff7798e6760beb46cd9b;hb=ecd502e11f1d17998924f2de5909380b75c67d49;hpb=76f7048eff4f5357df048268e40b5bc6b9387fe5 diff --git a/plugins/gpu_unai/gpu.cpp b/plugins/gpu_unai/gpu.cpp index 35158143..1552bed9 100644 --- a/plugins/gpu_unai/gpu.cpp +++ b/plugins/gpu_unai/gpu.cpp @@ -24,25 +24,29 @@ #include "debug.h" int skipCount = 2; /* frame skip (0,1,2,3...) */ -int skCount=0; /* internal frame skip */ +int skCount = 0; /* internal frame skip */ int linesInterlace = 0; /* internal lines interlace */ int linesInterlace_user = 0; /* Lines interlace */ -bool isSkip=false; /* skip frame (info coming from GPU) */ -bool skipFrame=false; /* skip frame (according to frame skip) */ +bool isSkip = false; /* skip frame (info coming from GPU) */ +bool wasSkip = false; +bool skipFrame = false; /* skip frame (according to frame skip) */ bool alt_fps = false; /* Alternative FPS algorithm */ bool show_fps = false; /* Show FPS statistics */ -bool isPAL=false; /* PAL video timing */ +bool isPAL = false; /* PAL video timing */ bool progressInterlace_flag = false; /* Progressive interlace flag */ bool progressInterlace = false; /* Progressive interlace option*/ bool frameLimit = false; /* frames to wait */ + bool light = true; /* lighting */ bool blend = true; /* blending */ - +bool FrameToRead = false; /* load image in progress */ +bool FrameToWrite = false; /* store image in progress */ bool fb_dirty = false; bool enableAbbeyHack = false; /* Abe's Odyssey hack */ + u8 BLEND_MODE; u8 TEXT_MODE; u8 Masking; @@ -60,9 +64,6 @@ s32 px,py; s32 x_end,y_end; u16* pvram; -u32 FrameToRead; -u32 FrameToWrite; - u32 GP0; s32 PacketCount; s32 PacketIndex; @@ -95,7 +96,7 @@ u32 tInc, tMsk; GPUPacket PacketBuffer; // 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))); +u16 GPU_FrameBuffer[(FRAME_BUFFER_SIZE+512*1024)/2] __attribute__((aligned(2048))); u32 GPU_GP1; /////////////////////////////////////////////////////////////////////////////// @@ -106,12 +107,10 @@ u32 GPU_GP1; // GPU Raster Macros #define GPU_RGB16(rgb) ((((rgb)&0xF80000)>>9)|(((rgb)&0xF800)>>6)|(((rgb)&0xF8)>>3)) -#define GPU_EXPANDSIGN_POLY(x) (((s32)(x)<<20)>>20) -//#define GPU_EXPANDSIGN_POLY(x) (((s32)(x)<<21)>>21) -#define GPU_EXPANDSIGN_SPRT(x) (((s32)(x)<<21)>>21) +#define GPU_EXPANDSIGN(x) (((s32)(x)<<21)>>21) -//#define GPU_TESTRANGE(x) { if((u32)(x+1024) > 2047) return; } -#define GPU_TESTRANGE(x) { if ((x<-1023) || (x>1023)) return; } +#define CHKMAX_X 1024 +#define CHKMAX_Y 512 #define GPU_SWAP(a,b,t) {(t)=(a);(a)=(b);(b)=(t);} @@ -273,8 +272,9 @@ void GPU_writeDataMem(u32* dmaAddress, s32 dmaCount) { if (FrameToWrite) { - while (dmaCount--) + while (dmaCount) { + dmaCount--; data = *dmaAddress++; if ((&pvram[px])>(VIDEO_END)) pvram-=512*1024; pvram[px] = data; @@ -284,7 +284,7 @@ void GPU_writeDataMem(u32* dmaAddress, s32 dmaCount) pvram += 1024; if (++py>=y_end) { - FrameToWrite = 0; + FrameToWrite = false; GPU_GP1 &= ~0x08000000; break; } @@ -297,7 +297,7 @@ void GPU_writeDataMem(u32* dmaAddress, s32 dmaCount) pvram += 1024; if (++py>=y_end) { - FrameToWrite = 0; + FrameToWrite = false; GPU_GP1 &= ~0x08000000; break; } @@ -385,7 +385,7 @@ void GPU_writeData(u32 data) pvram += 1024; if (++py>=y_end) { - FrameToWrite = 0; + FrameToWrite = false; GPU_GP1 &= ~0x08000000; } } @@ -399,7 +399,7 @@ void GPU_writeData(u32 data) pvram += 1024; if (++py>=y_end) { - FrameToWrite = 0; + FrameToWrite = false; GPU_GP1 &= ~0x08000000; } } @@ -432,7 +432,7 @@ void GPU_readDataMem(u32* dmaAddress, s32 dmaCount) { if ((&pvram[px])>(VIDEO_END)) pvram-=512*1024; // lower 16 bit - u32 data = (unsigned long)pvram[px]; + u32 data = pvram[px]; if (++px>=x_end) { @@ -442,7 +442,7 @@ void GPU_readDataMem(u32* dmaAddress, s32 dmaCount) if ((&pvram[px])>(VIDEO_END)) pvram-=512*1024; // higher 16 bit (always, even if it's an odd width) - data |= (unsigned long)(pvram[px])<<16; + data |= (u32)(pvram[px])<<16; *dmaAddress++ = data; @@ -452,7 +452,7 @@ void GPU_readDataMem(u32* dmaAddress, s32 dmaCount) pvram += 1024; if (++py>=y_end) { - FrameToRead = 0; + FrameToRead = false; GPU_GP1 &= ~0x08000000; break; } @@ -485,7 +485,7 @@ u32 GPU_readData(void) pvram += 1024; if (++py>=y_end) { - FrameToRead = 0; + FrameToRead = false; GPU_GP1 &= ~0x08000000; } } @@ -497,7 +497,7 @@ u32 GPU_readData(void) pvram +=1024; if (++py>=y_end) { - FrameToRead = 0; + FrameToRead = false; GPU_GP1 &= ~0x08000000; } } @@ -533,11 +533,11 @@ void GPU_writeStatus(u32 data) break; case 0x01: GPU_GP1 &= ~0x08000000; - PacketCount = FrameToRead = FrameToWrite = 0; + PacketCount = 0; FrameToRead = FrameToWrite = false; break; case 0x02: GPU_GP1 &= ~0x08000000; - PacketCount = FrameToRead = FrameToWrite = 0; + PacketCount = 0; FrameToRead = FrameToWrite = false; break; case 0x03: GPU_GP1 = (GPU_GP1 & ~0x00800000) | ((data & 1) << 23); @@ -551,6 +551,11 @@ void GPU_writeStatus(u32 data) DisplayArea[0] = (data & 0x000003FF); //(short)(data & 0x3ff); DisplayArea[1] = ((data & 0x0007FC00)>>10); //(data & 0x000FFC00) >> 10; //(short)((data>>10)&0x1ff); fb_dirty = true; + wasSkip = isSkip; + if (isSkip) + isSkip = false; + else + isSkip = skipFrame; break; case 0x07: DisplayArea[4] = data & 0x000003FF; //(short)(data & 0x3ff); @@ -638,71 +643,16 @@ INLINE void gpuVideoOutput(void) int incY = (h0==480) ? 2 : 1; h0=(h0==480 ? 2048 : 1024); - if (!progressInterlace) - { - const int li=linesInterlace; - switch ( w0 ) - { - case 256: - for(int y1=y0+h1; y0=1000000) @@ -861,6 +811,7 @@ void GPU_updateLace(void) isSkip=true; } } + fb_dirty=false; pcsx4all_prof_end_with_resume(PCSX4ALL_PROF_GPU,PCSX4ALL_PROF_COUNTERS); } @@ -868,24 +819,21 @@ void GPU_updateLace(void) #else #include "../../frontend/plugin_lib.h" -#include "../../frontend/arm_utils.h" extern "C" { static const struct rearmed_cbs *cbs; -static void *screen_buf; +static s16 old_res_horz, old_res_vert, old_rgb24; static void blit(void) { - static s16 old_res_horz, old_res_vert, old_rgb24; + u16 *base = (u16 *)GPU_FrameBuffer; s16 isRGB24 = (GPU_GP1 & 0x00200000) ? 1 : 0; s16 h0, x0, y0, w0, h1; - u16 *srcs; - u8 *dest; x0 = DisplayArea[0] & ~1; // alignment needed by blitter y0 = DisplayArea[1]; - srcs = &((u16*)GPU_FrameBuffer)[FRAME_OFFSET(x0,y0)]; + base += FRAME_OFFSET(x0, y0); w0 = DisplayArea[2]; h0 = DisplayArea[3]; // video mode @@ -901,33 +849,10 @@ static void blit(void) old_res_horz = w0; old_res_vert = h1; old_rgb24 = (s16)isRGB24; - screen_buf = cbs->pl_vout_set_mode(w0, h1, isRGB24 ? 24 : 16); + cbs->pl_vout_set_mode(w0, h1, w0, h1, isRGB24 ? 24 : 16); } - dest = (u8 *)screen_buf; - 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 - { - for (; h1-- > 0; dest += w0 * 2, srcs += 1024) - { - bgr555_to_rgb565(dest, srcs, w0 * 2); - } - } - - screen_buf = cbs->pl_vout_flip(); + cbs->pl_vout_flip(base, 1024, isRGB24, w0, h1); } void GPU_updateLace(void) @@ -938,21 +863,23 @@ void GPU_updateLace(void) if (!fb_dirty || (GPU_GP1&0x08800000)) return; - if (!isSkip) { + if (!wasSkip) { blit(); - fb_dirty = false; - if (cbs->fskip_advice) - isSkip = true; + skCount = 0; } - else - isSkip = false; + else { + skCount++; + if (skCount >= 8) + wasSkip = isSkip = 0; + } + + skipFrame = cbs->fskip_advice || cbs->frameskip == 1; } long GPUopen(unsigned long *, char *, char *) { cbs->pl_vout_open(); - screen_buf = cbs->pl_vout_flip(); return 0; } @@ -972,7 +899,15 @@ long GPUfreeze(unsigned int ulGetFreezeData, GPUFreeze_t* p2) void GPUrearmedCallbacks(const struct rearmed_cbs *cbs_) { + enableAbbeyHack = cbs_->gpu_unai.abe_hack; + light = !cbs_->gpu_unai.no_light; + blend = !cbs_->gpu_unai.no_blend; + if (cbs_->pl_vout_set_raw_vram) + cbs_->pl_vout_set_raw_vram((void *)GPU_FrameBuffer); + cbs = cbs_; + if (cbs->pl_set_gpu_caps) + cbs->pl_set_gpu_caps(0); } } /* extern "C" */