Skip to content

Commit

Permalink
Merge pull request #15288 from unknownbrackets/softgpu-self
Browse files Browse the repository at this point in the history
softgpu: Draw top left of rectangles first
  • Loading branch information
hrydgard committed Jan 9, 2022
2 parents fe37d8e + 88ef2d1 commit 2d7a7fd
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 6 deletions.
8 changes: 4 additions & 4 deletions GPU/Software/Clipper.cpp
Expand Up @@ -244,10 +244,10 @@ void ProcessRect(const VertexData& v0, const VertexData& v1)
Rasterizer::ClearRectangle(v0, v1);
} else {
// Four triangles to do backfaces as well. Two of them will get backface culled.
Rasterizer::DrawTriangle(*topleft, *topright, *bottomright);
Rasterizer::DrawTriangle(*bottomright, *topright, *topleft);
Rasterizer::DrawTriangle(*bottomright, *bottomleft, *topleft);
Rasterizer::DrawTriangle(*topleft, *bottomleft, *bottomright);
Rasterizer::DrawTriangle(*topleft, *topright, *bottomleft);
Rasterizer::DrawTriangle(*bottomleft, *topright, *topleft);
Rasterizer::DrawTriangle(*topright, *bottomright, *bottomleft);
Rasterizer::DrawTriangle(*bottomleft, *bottomright, *topright);
}
}
}
Expand Down
11 changes: 9 additions & 2 deletions GPU/Software/Rasterizer.cpp
Expand Up @@ -991,14 +991,21 @@ void DrawTriangle(const VertexData& v0, const VertexData& v1, const VertexData&

const int MIN_LINES_PER_THREAD = 4;

if (rangeY >= 12 && rangeX >= rangeY * 4) {
const uint32_t renderTarget = gstate.getFrameBufAddress() & 0x0FFFFFFF;
bool selfRender = (gstate.getTextureAddress(0) & 0x0FFFFFFF) == renderTarget;
if (gstate.isMipmapEnabled()) {
for (int i = 0; i <= gstate.getTextureMaxLevel(); ++i)
selfRender = selfRender || (gstate.getTextureAddress(i) & 0x0FFFFFFF) == renderTarget;
}

if (rangeY >= 12 && rangeX >= rangeY * 4 && !selfRender) {
auto bound = [&](int a, int b) -> void {
int x1 = minX + a * 16 * 2;
int x2 = std::min(maxX, minX + b * 16 * 2 - 1);
drawSlice(v0, v1, v2, x1, minY, x2, maxY, pixelID, drawPixel, sampler);
};
ParallelRangeLoop(&g_threadManager, bound, 0, rangeX, MIN_LINES_PER_THREAD);
} else if (rangeY >= 12 && rangeX >= 12) {
} else if (rangeY >= 12 && rangeX >= 12 && !selfRender) {
auto bound = [&](int a, int b) -> void {
int y1 = minY + a * 16 * 2;
int y2 = std::min(maxY, minY + b * 16 * 2 - 1);
Expand Down

0 comments on commit 2d7a7fd

Please sign in to comment.