diff --git a/GPU/Software/Rasterizer.cpp b/GPU/Software/Rasterizer.cpp index 43ab647733..e5bd69e107 100644 --- a/GPU/Software/Rasterizer.cpp +++ b/GPU/Software/Rasterizer.cpp @@ -1292,15 +1292,15 @@ inline Vec4 TriangleEdge::StepY(const Vec4 &w) { #endif } -static inline Vec4 MakeMask(const Vec4 &w0, const Vec4 &w1, const Vec4 &w2, const Vec4 &bias0, const Vec4 &bias1, const Vec4 &bias2) { +static inline Vec4 MakeMask(const Vec4 &w0, const Vec4 &w1, const Vec4 &w2, const Vec4 &bias0, const Vec4 &bias1, const Vec4 &bias2, const Vec4 &scissor) { #if defined(_M_SSE) && !defined(_M_IX86) __m128i biased0 = _mm_add_epi32(w0.ivec, bias0.ivec); __m128i biased1 = _mm_add_epi32(w1.ivec, bias1.ivec); __m128i biased2 = _mm_add_epi32(w2.ivec, bias2.ivec); - return _mm_or_si128(biased0, _mm_or_si128(biased1, biased2)); + return _mm_or_si128(_mm_or_si128(biased0, _mm_or_si128(biased1, biased2)), scissor.ivec); #else - return (w0 + bias0) | (w1 + bias1) | (w2 + bias2); + return (w0 + bias0) | (w1 + bias1) | (w2 + bias2) | scissor; #endif } @@ -1385,6 +1385,11 @@ void DrawTriangleSlice( Vec4 w1 = w1_base; Vec4 w2 = w2_base; + // TODO: Maybe we can clip the edges instead? + int scissorYPlus1 = pprime.y + 16 > maxY ? -1 : 0; + Vec4 scissor_mask = Vec4(0, maxX - minX - 1, scissorYPlus1, (maxX - minX - 1) | scissorYPlus1); + Vec4 scissor_step = Vec4(0, -32, 0, -32); + pprime.x = minX; DrawingCoords p = TransformUnit::ScreenToDrawing(pprime); @@ -1392,10 +1397,11 @@ void DrawTriangleSlice( w0 = e0.StepX(w0), w1 = e1.StepX(w1), w2 = e2.StepX(w2), + scissor_mask = scissor_mask + scissor_step, p.x = (p.x + 2) & 0x3FF) { // If p is on or inside all edges, render pixel - Vec4 mask = MakeMask(w0, w1, w2, bias0, bias1, bias2); + Vec4 mask = MakeMask(w0, w1, w2, bias0, bias1, bias2, scissor_mask); if (AnyMask(mask)) { Vec4 wsum_recip = EdgeRecip(w0, w1, w2);