gl_shader_decompiler: F2F: Implement rounding modes.
This commit is contained in:
parent
03f877919d
commit
128aeba0f3
2 changed files with 35 additions and 10 deletions
|
@ -1056,10 +1056,27 @@ private:
|
|||
break;
|
||||
}
|
||||
case OpCode::Id::F2F_R: {
|
||||
// TODO(Subv): Implement rounding operations.
|
||||
ASSERT_MSG(instr.conversion.f2f.rounding == 0, "Unimplemented rounding operation");
|
||||
std::string op_a = regs.GetRegisterAsFloat(instr.gpr20);
|
||||
|
||||
switch (instr.conversion.f2f.rounding) {
|
||||
case Tegra::Shader::F2fRoundingOp::None:
|
||||
break;
|
||||
case Tegra::Shader::F2fRoundingOp::Floor:
|
||||
op_a = "floor(" + op_a + ')';
|
||||
break;
|
||||
case Tegra::Shader::F2fRoundingOp::Ceil:
|
||||
op_a = "ceil(" + op_a + ')';
|
||||
break;
|
||||
case Tegra::Shader::F2fRoundingOp::Trunc:
|
||||
op_a = "trunc(" + op_a + ')';
|
||||
break;
|
||||
default:
|
||||
NGLOG_CRITICAL(HW_GPU, "Unimplemented f2f rounding mode {}",
|
||||
static_cast<u32>(instr.conversion.f2f.rounding.Value()));
|
||||
UNREACHABLE();
|
||||
break;
|
||||
}
|
||||
|
||||
if (instr.conversion.abs_a) {
|
||||
op_a = "abs(" + op_a + ')';
|
||||
}
|
||||
|
@ -1074,17 +1091,16 @@ private:
|
|||
op_a = "abs(" + op_a + ')';
|
||||
}
|
||||
|
||||
using Tegra::Shader::FloatRoundingOp;
|
||||
switch (instr.conversion.f2i.rounding) {
|
||||
case FloatRoundingOp::None:
|
||||
case Tegra::Shader::F2iRoundingOp::None:
|
||||
break;
|
||||
case FloatRoundingOp::Floor:
|
||||
case Tegra::Shader::F2iRoundingOp::Floor:
|
||||
op_a = "floor(" + op_a + ')';
|
||||
break;
|
||||
case FloatRoundingOp::Ceil:
|
||||
case Tegra::Shader::F2iRoundingOp::Ceil:
|
||||
op_a = "ceil(" + op_a + ')';
|
||||
break;
|
||||
case FloatRoundingOp::Trunc:
|
||||
case Tegra::Shader::F2iRoundingOp::Trunc:
|
||||
op_a = "trunc(" + op_a + ')';
|
||||
break;
|
||||
default:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue