mirror of https://github.com/PCSX2/pcsx2.git
Counters: Correct H-Blank for 1080i mode
This commit is contained in:
parent
94910216f7
commit
0c5df806bf
|
@ -66,9 +66,10 @@ static void rcntWmode(int index, u32 value);
|
||||||
static void rcntWtarget(int index, u32 value);
|
static void rcntWtarget(int index, u32 value);
|
||||||
static void rcntWhold(int index, u32 value);
|
static void rcntWhold(int index, u32 value);
|
||||||
|
|
||||||
static bool IsAnalogVideoMode()
|
// For Analog/Double Strike and Interlace modes
|
||||||
|
static bool IsInterlacedVideoMode()
|
||||||
{
|
{
|
||||||
return (gsVideoMode == GS_VideoMode::PAL || gsVideoMode == GS_VideoMode::NTSC || gsVideoMode == GS_VideoMode::DVD_NTSC || gsVideoMode == GS_VideoMode::DVD_PAL);
|
return (gsVideoMode == GS_VideoMode::PAL || gsVideoMode == GS_VideoMode::NTSC || gsVideoMode == GS_VideoMode::DVD_NTSC || gsVideoMode == GS_VideoMode::DVD_PAL || gsVideoMode == GS_VideoMode::HDTV_1080I);
|
||||||
}
|
}
|
||||||
|
|
||||||
void rcntReset(int index) {
|
void rcntReset(int index) {
|
||||||
|
@ -225,7 +226,7 @@ static void vSyncInfoCalc(vSyncTimingInfo* info, Fixed100 framesPerSecond, u32 s
|
||||||
u64 hBlank = Scanline / 2;
|
u64 hBlank = Scanline / 2;
|
||||||
u64 hRender = Scanline - hBlank;
|
u64 hRender = Scanline - hBlank;
|
||||||
|
|
||||||
if (!IsAnalogVideoMode())
|
if (!IsInterlacedVideoMode())
|
||||||
{
|
{
|
||||||
hBlank /= 2;
|
hBlank /= 2;
|
||||||
hRender /= 2;
|
hRender /= 2;
|
||||||
|
@ -249,7 +250,7 @@ static void vSyncInfoCalc(vSyncTimingInfo* info, Fixed100 framesPerSecond, u32 s
|
||||||
if ((hBlank % 10000) >= 5000) info->hBlank++;
|
if ((hBlank % 10000) >= 5000) info->hBlank++;
|
||||||
|
|
||||||
// Calculate accumulative hSync rounding error per half-frame:
|
// Calculate accumulative hSync rounding error per half-frame:
|
||||||
if (IsAnalogVideoMode()) // gets off the chart in that mode
|
if (IsInterlacedVideoMode()) // gets off the chart in that mode
|
||||||
{
|
{
|
||||||
u32 hSyncCycles = ((info->hRender + info->hBlank) * scansPerFrame) / 2;
|
u32 hSyncCycles = ((info->hRender + info->hBlank) * scansPerFrame) / 2;
|
||||||
u32 vSyncCycles = (info->Render + info->Blank);
|
u32 vSyncCycles = (info->Render + info->Blank);
|
||||||
|
@ -362,13 +363,14 @@ u32 UpdateVSyncRate()
|
||||||
|
|
||||||
case GS_VideoMode::SDTV_480P:
|
case GS_VideoMode::SDTV_480P:
|
||||||
case GS_VideoMode::SDTV_576P:
|
case GS_VideoMode::SDTV_576P:
|
||||||
case GS_VideoMode::HDTV_1080P:
|
|
||||||
case GS_VideoMode::HDTV_1080I:
|
|
||||||
case GS_VideoMode::HDTV_720P:
|
case GS_VideoMode::HDTV_720P:
|
||||||
case GS_VideoMode::VESA:
|
case GS_VideoMode::VESA:
|
||||||
scanlines = SCANLINES_TOTAL_NTSC;
|
scanlines = SCANLINES_TOTAL_NTSC;
|
||||||
break;
|
break;
|
||||||
|
case GS_VideoMode::HDTV_1080P:
|
||||||
|
case GS_VideoMode::HDTV_1080I:
|
||||||
|
scanlines = SCANLINES_TOTAL_1080;
|
||||||
|
break;
|
||||||
case GS_VideoMode::Unknown:
|
case GS_VideoMode::Unknown:
|
||||||
default:
|
default:
|
||||||
// Falls through to default when unidentified mode parameter of SetGsCrt is detected.
|
// Falls through to default when unidentified mode parameter of SetGsCrt is detected.
|
||||||
|
@ -522,7 +524,11 @@ static __fi void VSyncStart(u32 sCycle)
|
||||||
|
|
||||||
//cpuRegs.eCycle[30] = 2;
|
//cpuRegs.eCycle[30] = 2;
|
||||||
|
|
||||||
// Should no longer be required (Refraction)
|
// Update 08/2021: The only game I know to require this kind of thing as of 1.7.0 is Penny Racers/Gadget Racers (which has a patch to avoid the problem and others)
|
||||||
|
// These games have a tight loop checking INTC_STAT waiting for the VBLANK Start, however the game also has a VBLANK Hander which clears it.
|
||||||
|
// Therefore, there needs to be some delay in order for it to see the interrupt flag before the interrupt is acknowledged, likely helped on real hardware by the pipelines.
|
||||||
|
// Without the patch and fixing this, the games have other issues, so I'm not going to rush to fix it.
|
||||||
|
// Refraction
|
||||||
}
|
}
|
||||||
|
|
||||||
static __fi void GSVSync()
|
static __fi void GSVSync()
|
||||||
|
|
|
@ -88,6 +88,7 @@ struct SyncCounter
|
||||||
#define HBLANK_COUNTER_SPEED 1 //Set to '3' to double the speed of games like KHII
|
#define HBLANK_COUNTER_SPEED 1 //Set to '3' to double the speed of games like KHII
|
||||||
//#define HBLANK_TIMER_SLOWDOWN 1 //Set to '2' to increase the speed of games like God of War (FPS will be less, but game will be faster)
|
//#define HBLANK_TIMER_SLOWDOWN 1 //Set to '2' to increase the speed of games like God of War (FPS will be less, but game will be faster)
|
||||||
|
|
||||||
|
#define SCANLINES_TOTAL_1080 1125 // total number of scanlines for 1080I mode
|
||||||
//------------------------------------------------------------------
|
//------------------------------------------------------------------
|
||||||
// NTSC Timing Information!!! (some scanline info is guessed)
|
// NTSC Timing Information!!! (some scanline info is guessed)
|
||||||
//------------------------------------------------------------------
|
//------------------------------------------------------------------
|
||||||
|
|
Loading…
Reference in New Issue