diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/video_core/renderer_opengl/gl_shader_decompiler.cpp | 55 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_shader_gen.cpp | 9 |
2 files changed, 58 insertions, 6 deletions
diff --git a/src/video_core/renderer_opengl/gl_shader_decompiler.cpp b/src/video_core/renderer_opengl/gl_shader_decompiler.cpp index dec291a7d..002ae90a7 100644 --- a/src/video_core/renderer_opengl/gl_shader_decompiler.cpp +++ b/src/video_core/renderer_opengl/gl_shader_decompiler.cpp | |||
| @@ -1510,8 +1510,25 @@ private: | |||
| 1510 | ASSERT_MSG(instr.fmul.cc == 0, "FMUL cc is not implemented"); | 1510 | ASSERT_MSG(instr.fmul.cc == 0, "FMUL cc is not implemented"); |
| 1511 | 1511 | ||
| 1512 | op_b = GetOperandAbsNeg(op_b, false, instr.fmul.negate_b); | 1512 | op_b = GetOperandAbsNeg(op_b, false, instr.fmul.negate_b); |
| 1513 | regs.SetRegisterToFloat(instr.gpr0, 0, op_a + " * " + op_b, 1, 1, | 1513 | |
| 1514 | shader.AddLine('{'); | ||
| 1515 | ++shader.scope; | ||
| 1516 | |||
| 1517 | // This avoids optimizations of constant propagation and keeps the code as the original | ||
| 1518 | // Sadly using the precise keyword causes "linking" errors on fragment shaders. | ||
| 1519 | if (stage == Maxwell3D::Regs::ShaderStage::Fragment) { | ||
| 1520 | shader.AddLine("float tmp = " + op_a + " * " + op_b + ';'); | ||
| 1521 | } else { | ||
| 1522 | shader.AddLine("precise float tmp = " + op_a + " * " + op_b + ';'); | ||
| 1523 | } | ||
| 1524 | |||
| 1525 | |||
| 1526 | regs.SetRegisterToFloat(instr.gpr0, 0, "tmp", 1, 1, | ||
| 1514 | instr.alu.saturate_d); | 1527 | instr.alu.saturate_d); |
| 1528 | |||
| 1529 | |||
| 1530 | --shader.scope; | ||
| 1531 | shader.AddLine('}'); | ||
| 1515 | break; | 1532 | break; |
| 1516 | } | 1533 | } |
| 1517 | case OpCode::Id::FADD_C: | 1534 | case OpCode::Id::FADD_C: |
| @@ -1519,8 +1536,25 @@ private: | |||
| 1519 | case OpCode::Id::FADD_IMM: { | 1536 | case OpCode::Id::FADD_IMM: { |
| 1520 | op_a = GetOperandAbsNeg(op_a, instr.alu.abs_a, instr.alu.negate_a); | 1537 | op_a = GetOperandAbsNeg(op_a, instr.alu.abs_a, instr.alu.negate_a); |
| 1521 | op_b = GetOperandAbsNeg(op_b, instr.alu.abs_b, instr.alu.negate_b); | 1538 | op_b = GetOperandAbsNeg(op_b, instr.alu.abs_b, instr.alu.negate_b); |
| 1522 | regs.SetRegisterToFloat(instr.gpr0, 0, op_a + " + " + op_b, 1, 1, | 1539 | |
| 1540 | shader.AddLine('{'); | ||
| 1541 | ++shader.scope; | ||
| 1542 | |||
| 1543 | // This avoids optimizations of constant propagation and keeps the code as the original | ||
| 1544 | // Sadly using the precise keyword causes "linking" errors on fragment shaders. | ||
| 1545 | if (stage == Maxwell3D::Regs::ShaderStage::Fragment) { | ||
| 1546 | shader.AddLine("float tmp = " + op_a + " + " + op_b + ';'); | ||
| 1547 | } else { | ||
| 1548 | shader.AddLine("precise float tmp = " + op_a + " + " + op_b + ';'); | ||
| 1549 | } | ||
| 1550 | regs.SetRegisterToFloat(instr.gpr0, 0, "tmp", 1, 1, | ||
| 1523 | instr.alu.saturate_d); | 1551 | instr.alu.saturate_d); |
| 1552 | |||
| 1553 | |||
| 1554 | --shader.scope; | ||
| 1555 | shader.AddLine('}'); | ||
| 1556 | |||
| 1557 | |||
| 1524 | break; | 1558 | break; |
| 1525 | } | 1559 | } |
| 1526 | case OpCode::Id::MUFU: { | 1560 | case OpCode::Id::MUFU: { |
| @@ -2087,8 +2121,23 @@ private: | |||
| 2087 | } | 2121 | } |
| 2088 | } | 2122 | } |
| 2089 | 2123 | ||
| 2090 | regs.SetRegisterToFloat(instr.gpr0, 0, op_a + " * " + op_b + " + " + op_c, 1, 1, | 2124 | shader.AddLine('{'); |
| 2125 | ++shader.scope; | ||
| 2126 | |||
| 2127 | // This avoids optimizations of constant propagation and keeps the code as the original | ||
| 2128 | // Sadly using the precise keyword causes "linking" errors on fragment shaders. | ||
| 2129 | if (stage == Maxwell3D::Regs::ShaderStage::Fragment) { | ||
| 2130 | shader.AddLine("float tmp = fma(" + op_a + ", " + op_b + ", " + op_c + ");"); | ||
| 2131 | } else { | ||
| 2132 | shader.AddLine("precise float tmp = fma(" + op_a + ", " + op_b + ", " + op_c + ");"); | ||
| 2133 | } | ||
| 2134 | |||
| 2135 | regs.SetRegisterToFloat(instr.gpr0, 0, "tmp", 1, 1, | ||
| 2091 | instr.alu.saturate_d); | 2136 | instr.alu.saturate_d); |
| 2137 | |||
| 2138 | |||
| 2139 | --shader.scope; | ||
| 2140 | shader.AddLine('}'); | ||
| 2092 | break; | 2141 | break; |
| 2093 | } | 2142 | } |
| 2094 | case OpCode::Type::Hfma2: { | 2143 | case OpCode::Type::Hfma2: { |
diff --git a/src/video_core/renderer_opengl/gl_shader_gen.cpp b/src/video_core/renderer_opengl/gl_shader_gen.cpp index dfb562706..08dd8dc6c 100644 --- a/src/video_core/renderer_opengl/gl_shader_gen.cpp +++ b/src/video_core/renderer_opengl/gl_shader_gen.cpp | |||
| @@ -15,7 +15,8 @@ static constexpr u32 PROGRAM_OFFSET{10}; | |||
| 15 | 15 | ||
| 16 | ProgramResult GenerateVertexShader(const ShaderSetup& setup) { | 16 | ProgramResult GenerateVertexShader(const ShaderSetup& setup) { |
| 17 | std::string out = "#version 430 core\n"; | 17 | std::string out = "#version 430 core\n"; |
| 18 | out += "#extension GL_ARB_separate_shader_objects : enable\n\n"; | 18 | out += "#extension GL_ARB_separate_shader_objects : enable\n"; |
| 19 | out += "#extension GL_ARB_gpu_shader5 : enable\n\n"; | ||
| 19 | out += Decompiler::GetCommonDeclarations(); | 20 | out += Decompiler::GetCommonDeclarations(); |
| 20 | 21 | ||
| 21 | out += R"( | 22 | out += R"( |
| @@ -83,7 +84,8 @@ void main() { | |||
| 83 | 84 | ||
| 84 | ProgramResult GenerateGeometryShader(const ShaderSetup& setup) { | 85 | ProgramResult GenerateGeometryShader(const ShaderSetup& setup) { |
| 85 | std::string out = "#version 430 core\n"; | 86 | std::string out = "#version 430 core\n"; |
| 86 | out += "#extension GL_ARB_separate_shader_objects : enable\n\n"; | 87 | out += "#extension GL_ARB_separate_shader_objects : enable\n"; |
| 88 | out += "#extension GL_ARB_gpu_shader5 : enable\n\n"; | ||
| 87 | out += Decompiler::GetCommonDeclarations(); | 89 | out += Decompiler::GetCommonDeclarations(); |
| 88 | out += "bool exec_geometry();\n"; | 90 | out += "bool exec_geometry();\n"; |
| 89 | 91 | ||
| @@ -117,7 +119,8 @@ void main() { | |||
| 117 | 119 | ||
| 118 | ProgramResult GenerateFragmentShader(const ShaderSetup& setup) { | 120 | ProgramResult GenerateFragmentShader(const ShaderSetup& setup) { |
| 119 | std::string out = "#version 430 core\n"; | 121 | std::string out = "#version 430 core\n"; |
| 120 | out += "#extension GL_ARB_separate_shader_objects : enable\n\n"; | 122 | out += "#extension GL_ARB_separate_shader_objects : enable\n"; |
| 123 | out += "#extension GL_ARB_gpu_shader5 : enable\n\n"; | ||
| 121 | out += Decompiler::GetCommonDeclarations(); | 124 | out += Decompiler::GetCommonDeclarations(); |
| 122 | out += "bool exec_fragment();\n"; | 125 | out += "bool exec_fragment();\n"; |
| 123 | 126 | ||