diff options
author | 2020-10-14 23:34:00 +1100 | |
---|---|---|
committer | 2020-10-14 23:34:00 +1100 | |
commit | 621341c33cf75866d13e62c63e7d1ee6760cdc29 (patch) | |
tree | 037ed6b920b2588f9fc3cc2421a386e605aee1c8 | |
parent | cb4a840d0e0b26b5b7623b455bbb0052697fa5f4 (diff) |
emu/rendlay.cpp: Work around error accumulation issue that could cause hang with x87 floating-point.
-rw-r--r-- | src/emu/rendlay.cpp | 10 |
1 files changed, 5 insertions, 5 deletions
diff --git a/src/emu/rendlay.cpp b/src/emu/rendlay.cpp index db80b06c22a..2d56083d359 100644 --- a/src/emu/rendlay.cpp +++ b/src/emu/rendlay.cpp @@ -2065,7 +2065,7 @@ public: auto const draw_edge_row = [this, &dest, &c, &curbounds, xcenter, xradius, scale, ooyradius2] (s32 row, float ycoord, bool cross_axis) { - float const xval = xradius * std::sqrt(1.0F - (ycoord * ycoord) * ooyradius2); + float const xval = xradius * std::sqrt((std::max)(1.0F - (ycoord * ycoord) * ooyradius2, 0.0F)); float const l = xcenter - xval; float const r = xcenter + xval; if (!cross_axis) @@ -2115,7 +2115,7 @@ public: // draw rows above the axis s32 y = miny + 1; float ycoord1 = ycenter - float(y); - float xval1 = xradius * std::sqrt(1.0F - (ycoord1 * ycoord1) * ooyradius2); + float xval1 = xradius * std::sqrt((std::max)(1.0F - (ycoord1 * ycoord1) * ooyradius2, 0.0F)); float l1 = xcenter - xval1; float r1 = xcenter + xval1; for ( ; (maxy > y) && (float(y + 1) <= ycenter); ++y) @@ -2123,7 +2123,7 @@ public: float const l0 = l1; float const r0 = r1; ycoord1 = ycenter - float(y + 1); - xval1 = xradius * std::sqrt(1.0F - (ycoord1 * ycoord1) * ooyradius2); + xval1 = xradius * std::sqrt((std::max)(1.0F - (ycoord1 * ycoord1) * ooyradius2, 0.0F)); l1 = xcenter - xval1; r1 = xcenter + xval1; s32 minx = int(l1); @@ -2166,7 +2166,7 @@ public: float const l0 = l1; float const r0 = r1; ycoord1 = float(y + 1) - ycenter; - xval1 = xradius * std::sqrt(1.0F - (ycoord1 * ycoord1) * ooyradius2); + xval1 = xradius * std::sqrt((std::max)(1.0F - (ycoord1 * ycoord1) * ooyradius2, 0.0F)); l1 = xcenter - xval1; r1 = xcenter + xval1; s32 const minx = int(curbounds.x0 * float(dest.width())); @@ -2216,7 +2216,7 @@ public: float const l0 = l1; float const r0 = r1; ycoord1 = float(y + 1) - ycenter; - xval1 = xradius * std::sqrt(1.0F - (ycoord1 * ycoord1) * ooyradius2); + xval1 = xradius * std::sqrt((std::max)(1.0F - (ycoord1 * ycoord1) * ooyradius2, 0.0F)); l1 = xcenter - xval1; r1 = xcenter + xval1; s32 minx = int(l0); |