summaryrefslogtreecommitdiff
path: root/src/video_core/renderer_opengl
diff options
context:
space:
mode:
authorGravatar ReinUsesLisp2018-10-15 02:08:31 -0300
committerGravatar ReinUsesLisp2018-10-15 02:55:51 -0300
commit3d65aa4caf88a440eeaf2082b1f5ca3e2c41317c (patch)
tree39d062165482925c7e0b584daaecbfa97df26939 /src/video_core/renderer_opengl
parentgl_shader_decompiler: Implement HADD2_IMM and HMUL2_IMM (diff)
downloadyuzu-3d65aa4caf88a440eeaf2082b1f5ca3e2c41317c.tar.gz
yuzu-3d65aa4caf88a440eeaf2082b1f5ca3e2c41317c.tar.xz
yuzu-3d65aa4caf88a440eeaf2082b1f5ca3e2c41317c.zip
gl_shader_decompiler: Implement HFMA2 instructions
Diffstat (limited to 'src/video_core/renderer_opengl')
-rw-r--r--src/video_core/renderer_opengl/gl_shader_decompiler.cpp53
1 files changed, 53 insertions, 0 deletions
diff --git a/src/video_core/renderer_opengl/gl_shader_decompiler.cpp b/src/video_core/renderer_opengl/gl_shader_decompiler.cpp
index ab30aafc3..ca2030e97 100644
--- a/src/video_core/renderer_opengl/gl_shader_decompiler.cpp
+++ b/src/video_core/renderer_opengl/gl_shader_decompiler.cpp
@@ -1964,6 +1964,59 @@ private:
1964 instr.alu.saturate_d); 1964 instr.alu.saturate_d);
1965 break; 1965 break;
1966 } 1966 }
1967 case OpCode::Type::Hfma2: {
1968 if (opcode->GetId() == OpCode::Id::HFMA2_RR) {
1969 ASSERT_MSG(instr.hfma2.rr.precision == Tegra::Shader::HalfPrecision::None,
1970 "Unimplemented");
1971 } else {
1972 ASSERT_MSG(instr.hfma2.precision == Tegra::Shader::HalfPrecision::None,
1973 "Unimplemented");
1974 }
1975 const bool saturate = opcode->GetId() == OpCode::Id::HFMA2_RR
1976 ? instr.hfma2.rr.saturate != 0
1977 : instr.hfma2.saturate != 0;
1978
1979 const std::string op_a =
1980 GetHalfFloat(regs.GetRegisterAsInteger(instr.gpr8, 0, false), instr.hfma2.type_a);
1981 std::string op_b, op_c;
1982
1983 switch (opcode->GetId()) {
1984 case OpCode::Id::HFMA2_CR:
1985 op_b = GetHalfFloat(regs.GetUniform(instr.cbuf34.index, instr.cbuf34.offset,
1986 GLSLRegister::Type::UnsignedInteger),
1987 instr.hfma2.type_b, false, instr.hfma2.negate_b);
1988 op_c = GetHalfFloat(regs.GetRegisterAsInteger(instr.gpr39, 0, false),
1989 instr.hfma2.type_reg39, false, instr.hfma2.negate_c);
1990 break;
1991 case OpCode::Id::HFMA2_RC:
1992 op_b = GetHalfFloat(regs.GetRegisterAsInteger(instr.gpr39, 0, false),
1993 instr.hfma2.type_reg39, false, instr.hfma2.negate_b);
1994 op_c = GetHalfFloat(regs.GetUniform(instr.cbuf34.index, instr.cbuf34.offset,
1995 GLSLRegister::Type::UnsignedInteger),
1996 instr.hfma2.type_b, false, instr.hfma2.negate_c);
1997 break;
1998 case OpCode::Id::HFMA2_RR:
1999 op_b = GetHalfFloat(regs.GetRegisterAsInteger(instr.gpr20, 0, false),
2000 instr.hfma2.type_b, false, instr.hfma2.negate_b);
2001 op_c = GetHalfFloat(regs.GetRegisterAsInteger(instr.gpr39, 0, false),
2002 instr.hfma2.rr.type_c, false, instr.hfma2.rr.negate_c);
2003 break;
2004 case OpCode::Id::HFMA2_IMM_R:
2005 op_b = UnpackHalfImmediate(instr, true);
2006 op_c = GetHalfFloat(regs.GetRegisterAsInteger(instr.gpr39, 0, false),
2007 instr.hfma2.type_reg39, false, instr.hfma2.negate_c);
2008 break;
2009 default:
2010 UNREACHABLE();
2011 op_c = op_b = "vec2(0)";
2012 break;
2013 }
2014
2015 const std::string result = '(' + op_a + " * " + op_b + " + " + op_c + ')';
2016
2017 regs.SetRegisterToHalfFloat(instr.gpr0, 0, result, instr.hfma2.merge, 1, 1, saturate);
2018 break;
2019 }
1967 case OpCode::Type::Conversion: { 2020 case OpCode::Type::Conversion: {
1968 switch (opcode->GetId()) { 2021 switch (opcode->GetId()) {
1969 case OpCode::Id::I2I_R: { 2022 case OpCode::Id::I2I_R: {