From 5cbad1982bec3276968ec3c72a3a7a04d863bb2c Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 23 Jul 2023 17:54:22 -0700 Subject: [PATCH 1/2] riscv: Correct 565 morph mistake. Observed ni Valkyria Chronicles 3. --- GPU/Common/VertexDecoderRiscV.cpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/GPU/Common/VertexDecoderRiscV.cpp b/GPU/Common/VertexDecoderRiscV.cpp index d20260b0ef..df7d04e14d 100644 --- a/GPU/Common/VertexDecoderRiscV.cpp +++ b/GPU/Common/VertexDecoderRiscV.cpp @@ -265,15 +265,15 @@ JittedVertexDecoder VertexDecoderJitCache::Compile(const VertexDecoder &dec, int if ((morphFlags & (1 << (int)MorphValuesIndex::COLOR_4)) != 0) { LI(scratchReg, 255.0f / 15.0f); - FMV(FMv::W, FMv::X, fpScratchReg1, scratchReg); + FMV(FMv::W, FMv::X, fpExtra[0], scratchReg); } if ((morphFlags & (1 << (int)MorphValuesIndex::COLOR_5)) != 0) { LI(scratchReg, 255.0f / 31.0f); - FMV(FMv::W, FMv::X, fpScratchReg2, scratchReg); + FMV(FMv::W, FMv::X, fpExtra[1], scratchReg); } if ((morphFlags & (1 << (int)MorphValuesIndex::COLOR_6)) != 0) { LI(scratchReg, 255.0f / 63.0f); - FMV(FMv::W, FMv::X, fpScratchReg3, scratchReg); + FMV(FMv::W, FMv::X, fpExtra[2], scratchReg); } // Premultiply the values we need and store them so we can reuse. @@ -287,11 +287,11 @@ JittedVertexDecoder VertexDecoderJitCache::Compile(const VertexDecoder &dec, int if ((morphFlags & (1 << (int)MorphValuesIndex::AS_FLOAT)) != 0) FS(32, fpScratchReg1, morphBaseReg, ((int)MorphValuesIndex::AS_FLOAT * 8 + n) * 4); if ((morphFlags & (1 << (int)MorphValuesIndex::COLOR_4)) != 0) - storePremultiply(fpScratchReg1, MorphValuesIndex::COLOR_4, n); + storePremultiply(fpExtra[0], MorphValuesIndex::COLOR_4, n); if ((morphFlags & (1 << (int)MorphValuesIndex::COLOR_5)) != 0) - storePremultiply(fpScratchReg2, MorphValuesIndex::COLOR_5, n); + storePremultiply(fpExtra[1], MorphValuesIndex::COLOR_5, n); if ((morphFlags & (1 << (int)MorphValuesIndex::COLOR_6)) != 0) - storePremultiply(fpScratchReg3, MorphValuesIndex::COLOR_6, n); + storePremultiply(fpExtra[2], MorphValuesIndex::COLOR_6, n); } } else if (dec_->skinInDecode) { LI(morphBaseReg, &skinMatrix[0]); @@ -538,7 +538,7 @@ void VertexDecoderJitCache::Jit_TcU16ThroughToFloat() { LHU(tempReg1, srcReg, dec_->tcoff + 0); LHU(tempReg2, srcReg, dec_->tcoff + 2); - if (cpu_info.RiscV_B) { + if (cpu_info.RiscV_Zbb) { MINU(boundsMinUReg, boundsMinUReg, tempReg1); MAXU(boundsMaxUReg, boundsMaxUReg, tempReg1); MINU(boundsMinVReg, boundsMinVReg, tempReg2); @@ -1110,7 +1110,7 @@ void VertexDecoderJitCache::Jit_Color565Morph() { SRLI(tempReg1, tempReg1, 6); FMUL(32, fpSrc[1], fpSrc[1], fpScratchReg4, Round::TOZERO); - FCVT(FConv::S, FConv::WU, fpSrc[0], tempReg1, Round::TOZERO); + FCVT(FConv::S, FConv::WU, fpSrc[2], tempReg1, Round::TOZERO); FMUL(32, fpSrc[2], fpSrc[2], fpScratchReg3, Round::TOZERO); for (int n = 1; n < dec_->morphcount; n++) { @@ -1172,7 +1172,7 @@ void VertexDecoderJitCache::Jit_Color5551Morph() { } void VertexDecoderJitCache::Jit_WriteMorphColor(int outOff, bool checkAlpha) { - if (cpu_info.RiscV_B) { + if (cpu_info.RiscV_Zbb) { LI(scratchReg, 0xFF); FCVT(FConv::WU, FConv::S, tempReg1, fpSrc[0], Round::TOZERO); MAX(tempReg1, tempReg1, R_ZERO); From b041e712def8be2d6b08c45765c44f0085271167 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 23 Jul 2023 17:55:07 -0700 Subject: [PATCH 2/2] riscv: Fix signed position bug in vertexjit. --- GPU/Common/VertexDecoderRiscV.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/GPU/Common/VertexDecoderRiscV.cpp b/GPU/Common/VertexDecoderRiscV.cpp index df7d04e14d..3dc1cf5c97 100644 --- a/GPU/Common/VertexDecoderRiscV.cpp +++ b/GPU/Common/VertexDecoderRiscV.cpp @@ -867,8 +867,8 @@ void VertexDecoderJitCache::Jit_PosS16Through() { LH(tempReg2, srcReg, dec_->posoff + 2); // This one, Z, has to be unsigned. LHU(tempReg3, srcReg, dec_->posoff + 4); - FCVT(FConv::S, FConv::WU, fpSrc[0], tempReg1, Round::TOZERO); - FCVT(FConv::S, FConv::WU, fpSrc[1], tempReg2, Round::TOZERO); + FCVT(FConv::S, FConv::W, fpSrc[0], tempReg1, Round::TOZERO); + FCVT(FConv::S, FConv::W, fpSrc[1], tempReg2, Round::TOZERO); FCVT(FConv::S, FConv::WU, fpSrc[2], tempReg3, Round::TOZERO); FS(32, fpSrc[0], dstReg, dec_->decFmt.posoff + 0); FS(32, fpSrc[1], dstReg, dec_->decFmt.posoff + 4);