summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/video_core/renderer_opengl/gl_shader_decompiler.cpp55
-rw-r--r--src/video_core/renderer_opengl/gl_shader_gen.cpp9
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
16ProgramResult GenerateVertexShader(const ShaderSetup& setup) { 16ProgramResult 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
84ProgramResult GenerateGeometryShader(const ShaderSetup& setup) { 85ProgramResult 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
118ProgramResult GenerateFragmentShader(const ShaderSetup& setup) { 120ProgramResult 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