summaryrefslogtreecommitdiff
path: root/src/video_core/pica.h
diff options
context:
space:
mode:
authorYuri Kunde Schlesner <yuriks@yuriks.net>2015-08-24 01:48:15 -0300
committerYuri Kunde Schlesner <yuriks@yuriks.net>2015-08-24 01:48:15 -0300
commit630a850d4d5a0509b16e96aaccc81e9384e1fba8 (patch)
tree01a553c46e23e4f5d2b92ec1faf1a4b72a8e1466 /src/video_core/pica.h
parent082b74fa241ba71f27b2e3fdf756824a0467f7f4 (diff)
Shaders: Fix multiplications between 0.0 and inf
The PICA200 semantics for multiplication are so that when multiplying inf by exactly 0.0, the result is 0.0, instead of NaN, as defined by IEEE. This is relied upon by games. Fixes #1024 (missing OoT interface items)
Diffstat (limited to 'src/video_core/pica.h')
-rw-r--r--src/video_core/pica.h14
1 files changed, 13 insertions, 1 deletions
diff --git a/src/video_core/pica.h b/src/video_core/pica.h
index 58b924f9e..cf148de50 100644
--- a/src/video_core/pica.h
+++ b/src/video_core/pica.h
@@ -1021,12 +1021,20 @@ struct float24 {
return ret;
}
+ static float24 Zero() {
+ return FromFloat32(0.f);
+ }
+
// Not recommended for anything but logging
float ToFloat32() const {
return value;
}
float24 operator * (const float24& flt) const {
+ if ((this->value == 0.f && flt.value == flt.value) ||
+ (flt.value == 0.f && this->value == this->value))
+ // PICA gives 0 instead of NaN when multiplying by inf
+ return Zero();
return float24::FromFloat32(ToFloat32() * flt.ToFloat32());
}
@@ -1043,7 +1051,11 @@ struct float24 {
}
float24& operator *= (const float24& flt) {
- value *= flt.ToFloat32();
+ if ((this->value == 0.f && flt.value == flt.value) ||
+ (flt.value == 0.f && this->value == this->value))
+ // PICA gives 0 instead of NaN when multiplying by inf
+ *this = Zero();
+ else value *= flt.ToFloat32();
return *this;
}