diff options
| author | Fernando Sahmkow <fsahmkow27@gmail.com> | 2020-03-31 14:45:02 -0400 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-03-31 14:45:02 -0400 | 
| commit | b03c0536ce24ab261e1ed99f2bd180a1b7825f2f (patch) | |
| tree | b985eb4a295a27fde19302dee625aba60eea46f6 /src/video_core | |
| parent | 5b95a01463d5ad8ba32c40f7e261edf5e1e501b9 (diff) | |
| parent | 46791c464a100ff37ecaf813a024858afa8ad9ff (diff) | |
Merge pull request #3561 from ReinUsesLisp/f2f-conversion
shader/conversion: Fix F2F rounding operations with different sizes
Diffstat (limited to 'src/video_core')
| -rw-r--r-- | src/video_core/shader/decode/conversion.cpp | 15 | 
1 files changed, 10 insertions, 5 deletions
diff --git a/src/video_core/shader/decode/conversion.cpp b/src/video_core/shader/decode/conversion.cpp index 6ead42070..c72690b2b 100644 --- a/src/video_core/shader/decode/conversion.cpp +++ b/src/video_core/shader/decode/conversion.cpp @@ -138,18 +138,23 @@ u32 ShaderIR::DecodeConversion(NodeBlock& bb, u32 pc) {          value = GetOperandAbsNegFloat(value, instr.conversion.abs_a, instr.conversion.negate_a); -        value = [&]() { +        value = [&] { +            if (instr.conversion.src_size != instr.conversion.dst_size) { +                // Rounding operations only matter when the source and destination conversion size +                // is the same. +                return value; +            }              switch (instr.conversion.f2f.GetRoundingMode()) {              case Tegra::Shader::F2fRoundingOp::None:                  return value;              case Tegra::Shader::F2fRoundingOp::Round: -                return Operation(OperationCode::FRoundEven, PRECISE, value); +                return Operation(OperationCode::FRoundEven, value);              case Tegra::Shader::F2fRoundingOp::Floor: -                return Operation(OperationCode::FFloor, PRECISE, value); +                return Operation(OperationCode::FFloor, value);              case Tegra::Shader::F2fRoundingOp::Ceil: -                return Operation(OperationCode::FCeil, PRECISE, value); +                return Operation(OperationCode::FCeil, value);              case Tegra::Shader::F2fRoundingOp::Trunc: -                return Operation(OperationCode::FTrunc, PRECISE, value); +                return Operation(OperationCode::FTrunc, value);              default:                  UNIMPLEMENTED_MSG("Unimplemented F2F rounding mode {}",                                    static_cast<u32>(instr.conversion.f2f.rounding.Value()));  | 
