aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorretro-wertz2019-03-27 00:36:09 +0800
committerhizzlekizzle2019-03-26 11:36:09 -0500
commite2a9a9a58dd4cff8a56f035e3380dd76785f6c45 (patch)
tree75d5d4ba80bd8b67424996476e1c54c67adbf527
parent3ab21f54ec87dab531fa45721441132be7dc8d74 (diff)
downloadpcsx_rearmed-e2a9a9a58dd4cff8a56f035e3380dd76785f6c45.tar.gz
pcsx_rearmed-e2a9a9a58dd4cff8a56f035e3380dd76785f6c45.tar.bz2
pcsx_rearmed-e2a9a9a58dd4cff8a56f035e3380dd76785f6c45.zip
Sync gte fixes from upstream (#260)
* gte: backport fix for RTPS/RTPT Fix glitched drawing of road surface in 'Burning Road'.. behavior now matches Mednafen. This also preserves the fix by Shalma from prior commit f916013 for missing elements in 'Legacy of Kain: Soul Reaver' (missing green plasma balls in first level). - backported fix from pcsx4all https://github.com/dmitrysmagin/pcsx4all/pull/41/commits/a6ff7d29d615bdb26b491f4e1e2a9f4608a8d643 - fixes R4 - Ridge Racer Type 4 lighting issue * gte: change return to s64 for BOUNDS_ fix https://github.com/notaz/pcsx_rearmed/issues/129
-rw-r--r--libpcsxcore/gte.c15
1 files changed, 10 insertions, 5 deletions
diff --git a/libpcsxcore/gte.c b/libpcsxcore/gte.c
index 62fc7f3..77dff1b 100644
--- a/libpcsxcore/gte.c
+++ b/libpcsxcore/gte.c
@@ -170,7 +170,7 @@
#ifndef FLAGLESS
-static inline s32 BOUNDS_(psxCP2Regs *regs, s64 n_value, s64 n_max, int n_maxflag, s64 n_min, int n_minflag) {
+static inline s64 BOUNDS_(psxCP2Regs *regs, s64 n_value, s64 n_max, int n_maxflag, s64 n_min, int n_minflag) {
if (n_value > n_max) {
gteFLAG |= n_maxflag;
} else if (n_value < n_min) {
@@ -404,6 +404,7 @@ static u32 DIVIDE_(s16 n, u16 d) {
void gteRTPS(psxCP2Regs *regs) {
int quotient;
+ s64 tmp;
#ifdef GTE_LOG
GTE_LOG("GTE RTPS\n");
@@ -426,14 +427,16 @@ void gteRTPS(psxCP2Regs *regs) {
gteSX2 = limG1(F((s64)gteOFX + ((s64)gteIR1 * quotient)) >> 16);
gteSY2 = limG2(F((s64)gteOFY + ((s64)gteIR2 * quotient)) >> 16);
- gteMAC0 = F((s64)gteDQB + ((s64)gteDQA * quotient));
- gteIR0 = limH(gteMAC0 >> 12);
+ tmp = (s64)gteDQB + ((s64)gteDQA * quotient);
+ gteMAC0 = F(tmp);
+ gteIR0 = limH(tmp >> 12);
}
void gteRTPT(psxCP2Regs *regs) {
int quotient;
int v;
s32 vx, vy, vz;
+ s64 tmp;
#ifdef GTE_LOG
GTE_LOG("GTE RTPT\n");
@@ -456,8 +459,10 @@ void gteRTPT(psxCP2Regs *regs) {
fSX(v) = limG1(F((s64)gteOFX + ((s64)gteIR1 * quotient)) >> 16);
fSY(v) = limG2(F((s64)gteOFY + ((s64)gteIR2 * quotient)) >> 16);
}
- gteMAC0 = F((s64)gteDQB + ((s64)gteDQA * quotient));
- gteIR0 = limH(gteMAC0 >> 12);
+
+ tmp = (s64)gteDQB + ((s64)gteDQA * quotient);
+ gteMAC0 = F(tmp);
+ gteIR0 = limH(tmp >> 12);
}
void gteMVMVA(psxCP2Regs *regs) {