mirror of
https://github.com/hrydgard/ppsspp.git
synced 2025-04-02 11:01:50 -04:00
Merge pull request #15288 from unknownbrackets/softgpu-self
softgpu: Draw top left of rectangles first
This commit is contained in:
commit
2d7a7fd34e
2 changed files with 13 additions and 6 deletions
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Add table
Reference in a new issue