diff --git a/Source/Core/VideoCommon/ShaderGenCommon.cpp b/Source/Core/VideoCommon/ShaderGenCommon.cpp index 44037d01dc..234703d7d5 100644 --- a/Source/Core/VideoCommon/ShaderGenCommon.cpp +++ b/Source/Core/VideoCommon/ShaderGenCommon.cpp @@ -100,7 +100,20 @@ std::string GetDiskShaderCacheFileName(APIType api_type, const char* type, bool void WriteIsNanHeader(ShaderCode& out, APIType api_type) { - out.Write("#define dolphin_isnan(f) isnan(f)\n"); + if (api_type == APIType::D3D) + { + out.Write("bool dolphin_isnan(float f) {{\n" + " // Workaround for the HLSL compiler deciding that isnan can never be true and\n" + " // optimising away the call, even though the value can actually be NaN\n" + " // Just look for the bit pattern that indicates NaN instead\n" + " return (floatBitsToInt(f) & 0x7FFFFFFF) > 0x7F800000;\n" + "}}\n\n"); + // If isfinite is needed, (floatBitsToInt(f) & 0x7F800000) != 0x7F800000 can be used + } + else + { + out.Write("#define dolphin_isnan(f) isnan(f)\n"); + } } void WriteBitfieldExtractHeader(ShaderCode& out, APIType api_type,