diff --git a/GPU/Software/Rasterizer.cpp b/GPU/Software/Rasterizer.cpp index 2a1ca59d42..7f2820b0ac 100644 --- a/GPU/Software/Rasterizer.cpp +++ b/GPU/Software/Rasterizer.cpp @@ -830,14 +830,13 @@ static inline Vec3 GetSourceFactor(const Vec4& source, const Vec4 return Vec3::AssignToAll(2 * source.a()); case GE_SRCBLEND_DOUBLEINVSRCALPHA: - return Vec3::AssignToAll(255 - 2 * source.a()); + return Vec3::AssignToAll(255 - std::min(2 * source.a(), 255)); case GE_SRCBLEND_DOUBLEDSTALPHA: return Vec3::AssignToAll(2 * dst.a()); case GE_SRCBLEND_DOUBLEINVDSTALPHA: - // TODO: Clamping? - return Vec3::AssignToAll(255 - 2 * dst.a()); + return Vec3::AssignToAll(255 - std::min(2 * dst.a(), 255)); case GE_SRCBLEND_FIXA: default: @@ -879,13 +878,13 @@ static inline Vec3 GetDestFactor(const Vec4& source, const Vec4& return Vec3::AssignToAll(2 * source.a()); case GE_DSTBLEND_DOUBLEINVSRCALPHA: - return Vec3::AssignToAll(255 - 2 * source.a()); + return Vec3::AssignToAll(255 - std::min(2 * source.a(), 255)); case GE_DSTBLEND_DOUBLEDSTALPHA: return Vec3::AssignToAll(2 * dst.a()); case GE_DSTBLEND_DOUBLEINVDSTALPHA: - return Vec3::AssignToAll(255 - 2 * dst.a()); + return Vec3::AssignToAll(255 - std::min(2 * dst.a(), 255)); case GE_DSTBLEND_FIXB: default: @@ -896,6 +895,7 @@ static inline Vec3 GetDestFactor(const Vec4& source, const Vec4& static inline Vec3 AlphaBlendingResult(const Vec4 &source, const Vec4 &dst) { + // Note: These factors cannot go below 0, but they can go above 255 when doubling. Vec3 srcfactor = GetSourceFactor(source, dst); Vec3 dstfactor = GetDestFactor(source, dst);