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=fefc2773e03637d4e9f4e953e68fd4ef0c62769e;hp=808c8916f69f3f004fc15aa37762e12ddc8e6a12;hb=c006d9e3d7b4c7f0fda6c27062e362cfc7515630;hpb=e64dc4c54e96643522dc4b8c205d143c7d9b2f1d diff --git a/plugins/gpu_unai/gpu.cpp b/plugins/gpu_unai/gpu.cpp index 808c8916..fefc2773 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; @@ -284,7 +285,7 @@ void GPU_writeDataMem(u32* dmaAddress, s32 dmaCount) pvram += 1024; if (++py>=y_end) { - FrameToWrite = 0; + FrameToWrite = false; GPU_GP1 &= ~0x08000000; break; } @@ -297,7 +298,7 @@ void GPU_writeDataMem(u32* dmaAddress, s32 dmaCount) pvram += 1024; if (++py>=y_end) { - FrameToWrite = 0; + FrameToWrite = false; GPU_GP1 &= ~0x08000000; break; } @@ -331,7 +332,7 @@ INLINE int CheckForEndlessLoop(u32 *laddr) } /////////////////////////////////////////////////////////////////////////////// -void GPU_dmaChain(u32* baseAddr, u32 dmaVAddr) +long GPU_dmaChain(u32* baseAddr, u32 dmaVAddr) { #ifdef DEBUG_ANALYSIS dbg_anacnt_GPU_dmaChain++; @@ -339,6 +340,7 @@ void GPU_dmaChain(u32* baseAddr, u32 dmaVAddr) pcsx4all_prof_start_with_pause(PCSX4ALL_PROF_GPU,PCSX4ALL_PROF_HW_WRITE); u32 data, *address, count, offset; unsigned int DMACommandCounter = 0; + long dma_words = 0; GPU_GP1 &= ~0x14000000; lUsedAddr[0]=lUsedAddr[1]=lUsedAddr[2]=(u32*)0x1fffff; @@ -355,9 +357,12 @@ void GPU_dmaChain(u32* baseAddr, u32 dmaVAddr) else dmaVAddr = 0x1FFFFF; if(count>0) GPU_writeDataMem(address,count); + dma_words += 1 + count; } GPU_GP1 = (GPU_GP1 | 0x14000000) & ~0x60000000; pcsx4all_prof_end_with_resume(PCSX4ALL_PROF_GPU,PCSX4ALL_PROF_HW_WRITE); + + return dma_words; } /////////////////////////////////////////////////////////////////////////////// @@ -381,7 +386,7 @@ void GPU_writeData(u32 data) pvram += 1024; if (++py>=y_end) { - FrameToWrite = 0; + FrameToWrite = false; GPU_GP1 &= ~0x08000000; } } @@ -395,7 +400,7 @@ void GPU_writeData(u32 data) pvram += 1024; if (++py>=y_end) { - FrameToWrite = 0; + FrameToWrite = false; GPU_GP1 &= ~0x08000000; } } @@ -448,7 +453,7 @@ void GPU_readDataMem(u32* dmaAddress, s32 dmaCount) pvram += 1024; if (++py>=y_end) { - FrameToRead = 0; + FrameToRead = false; GPU_GP1 &= ~0x08000000; break; } @@ -481,7 +486,7 @@ u32 GPU_readData(void) pvram += 1024; if (++py>=y_end) { - FrameToRead = 0; + FrameToRead = false; GPU_GP1 &= ~0x08000000; } } @@ -493,7 +498,7 @@ u32 GPU_readData(void) pvram +=1024; if (++py>=y_end) { - FrameToRead = 0; + FrameToRead = false; GPU_GP1 &= ~0x08000000; } } @@ -529,11 +534,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); @@ -547,6 +552,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); @@ -634,71 +644,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) @@ -857,6 +812,7 @@ void GPU_updateLace(void) isSkip=true; } } + fb_dirty=false; pcsx4all_prof_end_with_resume(PCSX4ALL_PROF_GPU,PCSX4ALL_PROF_COUNTERS); } @@ -897,7 +853,7 @@ static void blit(void) old_res_horz = w0; old_res_vert = h1; old_rgb24 = (s16)isRGB24; - screen_buf = cbs->pl_fbdev_set_mode(w0, h1, isRGB24 ? 24 : 16); + screen_buf = cbs->pl_vout_set_mode(w0, h1, isRGB24 ? 24 : 16); } dest = (u8 *)screen_buf; @@ -923,7 +879,7 @@ static void blit(void) } } - screen_buf = cbs->pl_fbdev_flip(); + screen_buf = cbs->pl_vout_flip(); } void GPU_updateLace(void) @@ -934,27 +890,30 @@ 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; } long GPUopen(unsigned long *, char *, char *) { - cbs->pl_fbdev_open(); - screen_buf = cbs->pl_fbdev_flip(); + cbs->pl_vout_open(); + screen_buf = cbs->pl_vout_flip(); return 0; } long GPUclose(void) { - cbs->pl_fbdev_close(); + cbs->pl_vout_close(); return 0; } @@ -968,6 +927,10 @@ 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; + cbs = cbs_; }