Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Merge pull request #11603 from Dentomologist/fix_d3d_nan_regression
D3D: Restore workaround for erroneous NaN optimization
  • Loading branch information
OatmealDome committed Feb 26, 2023
2 parents 19e8569 + ad6e95a commit c0d0a04
Showing 1 changed file with 14 additions and 1 deletion.
15 changes: 14 additions & 1 deletion Source/Core/VideoCommon/ShaderGenCommon.cpp
Expand Up @@ -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,
Expand Down

0 comments on commit c0d0a04

Please sign in to comment.