From f802c3bc6da1bce09eddb9b3b414fc6d2ebbe620 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Mon, 15 Nov 2021 06:09:12 -0800 Subject: [PATCH] softgpu: Add some comments and cleanup. --- GPU/Software/Rasterizer.cpp | 15 +++++++++------ GPU/Software/SoftGpu.h | 4 ++++ 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/GPU/Software/Rasterizer.cpp b/GPU/Software/Rasterizer.cpp index 88d8b763a5..3a0c33011a 100644 --- a/GPU/Software/Rasterizer.cpp +++ b/GPU/Software/Rasterizer.cpp @@ -1451,8 +1451,8 @@ void ClearRectangle(const VertexData &v0, const VertexData &v1) minY = std::max(minY, (int)TransformUnit::DrawingToScreen(scissorTL).y); maxY = std::max(0, std::min(maxY, (int)TransformUnit::DrawingToScreen(scissorBR).y + 16)); + // We thread based on PSP fixed point screen coordinates, 16 here is for the 4 subpixel bits. constexpr int MIN_LINES_PER_THREAD = 32 * 16; - const int w = (maxX - minX) / 16; if (w <= 0) return; @@ -1461,12 +1461,13 @@ void ClearRectangle(const VertexData &v0, const VertexData &v1) const u16 z = v1.screenpos.z; const int stride = gstate.DepthBufStride(); + // If both bytes of Z equal, we can just use memset directly which is faster. if ((z & 0xFF) == (z >> 8)) { ParallelRangeLoop(&g_threadManager, [=](int y1, int y2) { ScreenCoords pprime(minX, y1, 0); for (pprime.y = y1; pprime.y < y2; pprime.y += 16) { DrawingCoords p = TransformUnit::ScreenToDrawing(pprime); - u16 *row = &depthbuf.as16[p.x + p.y * stride]; + u16 *row = depthbuf.Get16Ptr(p.x, p.y, stride); memset(row, z, w * 2); } }, minY, maxY, MIN_LINES_PER_THREAD); @@ -1524,12 +1525,13 @@ void ClearRectangle(const VertexData &v0, const VertexData &v1) const int stride = gstate.FrameBufStride(); if (gstate.FrameBufFormat() == GE_FORMAT_8888) { + const bool canMemsetColor = (new_color & 0xFF) == (new_color >> 8) && (new_color & 0xFFFF) == (new_color >> 16); ParallelRangeLoop(&g_threadManager, [=](int y1, int y2) { ScreenCoords pprime(minX, y1, 0); for (pprime.y = y1; pprime.y < y2; pprime.y += 16) { DrawingCoords p = TransformUnit::ScreenToDrawing(pprime); - if ((new_color & 0xFF) == (new_color >> 8) && (new_color & 0xFFFF) == (new_color >> 16)) { - u32 *row = &fb.as32[p.x + p.y * stride]; + if (canMemsetColor) { + u32 *row = fb.Get32Ptr(p.x, p.y, stride); memset(row, new_color, w * 4); } else { for (int x = 0; x < w; ++x) { @@ -1539,12 +1541,13 @@ void ClearRectangle(const VertexData &v0, const VertexData &v1) } }, minY, maxY, MIN_LINES_PER_THREAD); } else { + const bool canMemsetColor = (new_color16 & 0xFF) == (new_color16 >> 8); ParallelRangeLoop(&g_threadManager, [=](int y1, int y2) { ScreenCoords pprime(minX, y1, 0); for (pprime.y = y1; pprime.y < y2; pprime.y += 16) { DrawingCoords p = TransformUnit::ScreenToDrawing(pprime); - if ((new_color16 & 0xFF) == (new_color16 >> 8)) { - u16 *row = &fb.as16[p.x + p.y * stride]; + if (canMemsetColor) { + u16 *row = fb.Get16Ptr(p.x, p.y, stride); memset(row, new_color16, w * 2); } else { for (int x = 0; x < w; ++x) { diff --git a/GPU/Software/SoftGpu.h b/GPU/Software/SoftGpu.h index bd8e6a12fe..d1d22d73e1 100644 --- a/GPU/Software/SoftGpu.h +++ b/GPU/Software/SoftGpu.h @@ -48,6 +48,10 @@ struct FormatBuffer { inline u16 *Get16Ptr(int x, int y, int stride) { return &as16[x + y * stride]; } + + inline u32 *Get32Ptr(int x, int y, int stride) { + return &as32[x + y * stride]; + } }; class PresentationCommon;