From d9e29a2edfcb5df58a453b2d0b9385182d1dfd79 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 16 Mar 2014 15:22:31 -0700 Subject: [PATCH] softgpu: Optimize alpha blending handling. This alone makes it a good bit faster. --- GPU/Software/Rasterizer.cpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/GPU/Software/Rasterizer.cpp b/GPU/Software/Rasterizer.cpp index 5133b3b9e8..1f65d962ba 100644 --- a/GPU/Software/Rasterizer.cpp +++ b/GPU/Software/Rasterizer.cpp @@ -893,18 +893,18 @@ inline void DrawSinglePixel(const DrawingCoords &p, u16 z, Vec4 prim_color) prim_color.b() <<= 1; } + const u32 old_color = GetPixelColor(p.x, p.y); + u32 new_color; + if (gstate.isAlphaBlendEnabled() && !clearMode) { - Vec4 dst = Vec4::FromRGBA(GetPixelColor(p.x, p.y)); - // We can discard the vertex alpha at this point. - prim_color = Vec4(AlphaBlendingResult(prim_color, dst), 0); + const Vec4 dst = Vec4::FromRGBA(old_color); + new_color = Vec4(AlphaBlendingResult(prim_color, dst).Clamp(0, 255), stencil).ToRGBA(); + } else { + if (!clearMode) + prim_color = prim_color.Clamp(0, 255); + new_color = Vec4(prim_color.r(), prim_color.g(), prim_color.b(), stencil).ToRGBA(); } - if (!clearMode) - prim_color = prim_color.Clamp(0, 255); - - u32 new_color = Vec4(prim_color.r(), prim_color.g(), prim_color.b(), stencil).ToRGBA(); - u32 old_color = GetPixelColor(p.x, p.y); - // TODO: Is alpha blending still performed if logic ops are enabled? if (gstate.isLogicOpEnabled() && !clearMode) { // Logic ops don't affect stencil.