D3D: Restore workaround for erroneous NaN optimization

The HLSL compiler incorrectly decides isnan can't be true, so this
workaround was originally added in 52c82733 but lost during the
conversion to SPIR-V.
This commit is contained in:
Dentomologist 2023-02-25 16:11:09 -08:00
parent 19e8569634
commit ad6e95afb4
1 changed files with 14 additions and 1 deletions

View File

@ -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,