Update the rounding modes to match the spec.

The spec was clarified that a value of .5 rounds towards the even value.
This matches the HLSL `round` method. This CL updates SPIR-V to use the
`RoundEven` GLSL450 call and the `rint` MSL call so they match the spec
requirements.

Change-Id: I97ce2e29b9639ad72b6846b32dbe3abb8d9f6cff
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/42421
Auto-Submit: dan sinclair <dsinclair@chromium.org>
Commit-Queue: Ryan Harrison <rharrison@chromium.org>
Reviewed-by: Ryan Harrison <rharrison@chromium.org>
This commit is contained in:
dan sinclair 2021-02-24 18:01:54 +00:00 committed by Commit Bot service account
parent eb496d0a4d
commit 8feb9b847f
5 changed files with 8 additions and 6 deletions

View File

@ -817,7 +817,6 @@ std::string GeneratorImpl::generate_builtin_name(
case semantic::IntrinsicType::kNormalize: case semantic::IntrinsicType::kNormalize:
case semantic::IntrinsicType::kPow: case semantic::IntrinsicType::kPow:
case semantic::IntrinsicType::kReflect: case semantic::IntrinsicType::kReflect:
case semantic::IntrinsicType::kRound:
case semantic::IntrinsicType::kSelect: case semantic::IntrinsicType::kSelect:
case semantic::IntrinsicType::kSin: case semantic::IntrinsicType::kSin:
case semantic::IntrinsicType::kSinh: case semantic::IntrinsicType::kSinh:
@ -899,6 +898,9 @@ std::string GeneratorImpl::generate_builtin_name(
case semantic::IntrinsicType::kReverseBits: case semantic::IntrinsicType::kReverseBits:
out += "reverse_bits"; out += "reverse_bits";
break; break;
case semantic::IntrinsicType::kRound:
out += "rint";
break;
case semantic::IntrinsicType::kSmoothStep: case semantic::IntrinsicType::kSmoothStep:
out += "smoothstep"; out += "smoothstep";
break; break;

View File

@ -85,7 +85,7 @@ INSTANTIATE_TEST_SUITE_P(MslGeneratorImplTest,
MslImportData{"length", "length"}, MslImportData{"length", "length"},
MslImportData{"log", "log"}, MslImportData{"log", "log"},
MslImportData{"log2", "log2"}, MslImportData{"log2", "log2"},
MslImportData{"round", "round"}, MslImportData{"round", "rint"},
MslImportData{"sign", "sign"}, MslImportData{"sign", "sign"},
MslImportData{"sin", "sin"}, MslImportData{"sin", "sin"},
MslImportData{"sinh", "sinh"}, MslImportData{"sinh", "sinh"},

View File

@ -271,7 +271,7 @@ INSTANTIATE_TEST_SUITE_P(
"metal::reflect"}, "metal::reflect"},
IntrinsicData{IntrinsicType::kReverseBits, ParamType::kU32, IntrinsicData{IntrinsicType::kReverseBits, ParamType::kU32,
"metal::reverse_bits"}, "metal::reverse_bits"},
IntrinsicData{IntrinsicType::kRound, ParamType::kU32, "metal::round"}, IntrinsicData{IntrinsicType::kRound, ParamType::kU32, "metal::rint"},
IntrinsicData{IntrinsicType::kSelect, ParamType::kF32, "metal::select"}, IntrinsicData{IntrinsicType::kSelect, ParamType::kF32, "metal::select"},
IntrinsicData{IntrinsicType::kSign, ParamType::kF32, "metal::sign"}, IntrinsicData{IntrinsicType::kSign, ParamType::kF32, "metal::sign"},
IntrinsicData{IntrinsicType::kSin, ParamType::kF32, "metal::sin"}, IntrinsicData{IntrinsicType::kSin, ParamType::kF32, "metal::sin"},

View File

@ -266,7 +266,7 @@ uint32_t intrinsic_to_glsl_method(const semantic::Intrinsic* intrinsic) {
case IntrinsicType::kReflect: case IntrinsicType::kReflect:
return GLSLstd450Reflect; return GLSLstd450Reflect;
case IntrinsicType::kRound: case IntrinsicType::kRound:
return GLSLstd450Round; return GLSLstd450RoundEven;
case IntrinsicType::kSign: case IntrinsicType::kSign:
return GLSLstd450FSign; return GLSLstd450FSign;
case IntrinsicType::kSin: case IntrinsicType::kSin:

View File

@ -479,7 +479,7 @@ OpName %7 "a_func"
%7 = OpFunction %6 None %5 %7 = OpFunction %6 None %5
%8 = OpLabel %8 = OpLabel
%11 = OpLoad %3 %1 %11 = OpLoad %3 %1
%9 = OpExtInst %3 %10 Round %11 %9 = OpExtInst %3 %10 RoundEven %11
OpReturn OpReturn
OpFunctionEnd OpFunctionEnd
)"); )");
@ -563,7 +563,7 @@ INSTANTIATE_TEST_SUITE_P(IntrinsicBuilderTest,
"InverseSqrt"}, "InverseSqrt"},
IntrinsicData{"log", "Log"}, IntrinsicData{"log", "Log"},
IntrinsicData{"log2", "Log2"}, IntrinsicData{"log2", "Log2"},
IntrinsicData{"round", "Round"}, IntrinsicData{"round", "RoundEven"},
IntrinsicData{"sign", "FSign"}, IntrinsicData{"sign", "FSign"},
IntrinsicData{"sin", "Sin"}, IntrinsicData{"sin", "Sin"},
IntrinsicData{"sinh", "Sinh"}, IntrinsicData{"sinh", "Sinh"},