summaryrefslogtreecommitdiff
path: root/src/video_core/pica.h
diff options
context:
space:
mode:
authorYuri Kunde Schlesner <yuriks@yuriks.net>2015-08-27 16:34:13 -0700
committerYuri Kunde Schlesner <yuriks@yuriks.net>2015-08-27 16:34:13 -0700
commitc5a4025b6581c1c64c2761d09510c5827eaada05 (patch)
treec7b7072b2ad53041127c454e7de0dcb0607d02e8 /src/video_core/pica.h
parent5831fe6a60befe33e6834eeeb8657d5e31ebfa9c (diff)
parenteff10959de41027da7a09298941fcb403f610192 (diff)
Merge pull request #1065 from yuriks/shader-fp
Shader FP compliance fixes
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..bb689f2a9 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 && !std::isnan(flt.value)) ||
+ (flt.value == 0.f && !std::isnan(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 && !std::isnan(flt.value)) ||
+ (flt.value == 0.f && !std::isnan(this->value)))
+ // PICA gives 0 instead of NaN when multiplying by inf
+ *this = Zero();
+ else value *= flt.ToFloat32();
return *this;
}