summaryrefslogtreecommitdiffstatshomepage
path: root/src/emu/rendlay.cpp
diff options
context:
space:
mode:
author Vas Crabb <vas@vastheman.com>2020-10-14 23:34:00 +1100
committer Vas Crabb <vas@vastheman.com>2020-10-14 23:34:00 +1100
commit621341c33cf75866d13e62c63e7d1ee6760cdc29 (patch)
tree037ed6b920b2588f9fc3cc2421a386e605aee1c8 /src/emu/rendlay.cpp
parentcb4a840d0e0b26b5b7623b455bbb0052697fa5f4 (diff)
emu/rendlay.cpp: Work around error accumulation issue that could cause hang with x87 floating-point.
Diffstat (limited to 'src/emu/rendlay.cpp')
-rw-r--r--src/emu/rendlay.cpp10
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);