Skip to content

Commit e50f480

Browse files
committed
ps1: gpu: Ensure hi >= lo when calling std::clamp()
1 parent 2c940b0 commit e50f480

File tree

1 file changed

+10
-8
lines changed

1 file changed

+10
-8
lines changed

Diff for: ares/ps1/gpu/renderer.cpp

+10-8
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
#define clip(X, LO, HI) std::clamp((X), (((LO) <= (HI)) ? (LO) : (HI)), (((HI) >= (LO)) ? (HI) : (LO)))
2+
13
auto GPU::generateTables() -> void {
24
static constexpr s8 table[4][4] = {
35
{-4, +0, -3, +1},
@@ -165,10 +167,10 @@ auto GPU::Render::line() -> void {
165167
v0.x += drawingAreaOffsetX, v0.y += drawingAreaOffsetY;
166168
v1.x += drawingAreaOffsetX, v1.y += drawingAreaOffsetY;
167169

168-
v0.x = std::clamp(v0.x, drawingAreaOriginX1, drawingAreaOriginX2);
169-
v0.y = std::clamp(v0.y, drawingAreaOriginY1, drawingAreaOriginY2);
170-
v1.x = std::clamp(v1.x, drawingAreaOriginX1, drawingAreaOriginX2);
171-
v1.y = std::clamp(v1.y, drawingAreaOriginY1, drawingAreaOriginY2);
170+
v0.x = clip(v0.x, drawingAreaOriginX1, drawingAreaOriginX2);
171+
v0.y = clip(v0.y, drawingAreaOriginY1, drawingAreaOriginY2);
172+
v1.x = clip(v1.x, drawingAreaOriginX1, drawingAreaOriginX2);
173+
v1.y = clip(v1.y, drawingAreaOriginY1, drawingAreaOriginY2);
172174

173175
Point d = {v1.x - v0.x, v1.y - v0.y};
174176
s32 steps = abs(d.x) > abs(d.y) ? abs(d.x) : abs(d.y);
@@ -215,10 +217,10 @@ auto GPU::Render::triangle() -> void {
215217
if(vmax.x - vmin.x > 1024 || vmax.y - vmin.y > 512) return;
216218

217219
//clip rendering to drawing area
218-
vmin.x = std::clamp(vmin.x, drawingAreaOriginX1, drawingAreaOriginX2);
219-
vmin.y = std::clamp(vmin.y, drawingAreaOriginY1, drawingAreaOriginY2);
220-
vmax.x = std::clamp(vmax.x, drawingAreaOriginX1, drawingAreaOriginX2);
221-
vmax.y = std::clamp(vmax.y, drawingAreaOriginY1, drawingAreaOriginY2);
220+
vmin.x = clip(vmin.x, drawingAreaOriginX1, drawingAreaOriginX2);
221+
vmin.y = clip(vmin.y, drawingAreaOriginY1, drawingAreaOriginY2);
222+
vmax.x = clip(vmax.x, drawingAreaOriginX1, drawingAreaOriginX2);
223+
vmax.y = clip(vmax.y, drawingAreaOriginY1, drawingAreaOriginY2);
222224

223225
s32 area = weight(v0, v1, v2); //<0 = counter-clockwise; 0 = colinear, >0 = clockwise
224226
if(area == 0) return; //do not render colinear triangles

0 commit comments

Comments
 (0)