mirror of
				https://git.suyu.dev/suyu/suyu
				synced 2025-10-30 15:39:02 -05:00 
			
		
		
		
	gl_shader_decompiler: Use GLSL scope on instructions unrelated to textures
This commit is contained in:
		| @@ -854,14 +854,12 @@ private: | |||||||
|         } |         } | ||||||
|  |  | ||||||
|         if (precise && stage != Maxwell3D::Regs::ShaderStage::Fragment) { |         if (precise && stage != Maxwell3D::Regs::ShaderStage::Fragment) { | ||||||
|             shader.AddLine('{'); |             const auto scope = shader.Scope(); | ||||||
|             ++shader.scope; |  | ||||||
|             // This avoids optimizations of constant propagation and keeps the code as the original |             // This avoids optimizations of constant propagation and keeps the code as the original | ||||||
|             // Sadly using the precise keyword causes "linking" errors on fragment shaders. |             // Sadly using the precise keyword causes "linking" errors on fragment shaders. | ||||||
|             shader.AddLine("precise float tmp = " + src + ';'); |             shader.AddLine("precise float tmp = " + src + ';'); | ||||||
|             shader.AddLine(dest + " = tmp;"); |             shader.AddLine(dest + " = tmp;"); | ||||||
|             --shader.scope; |  | ||||||
|             shader.AddLine('}'); |  | ||||||
|         } else { |         } else { | ||||||
|             shader.AddLine(dest + " = " + src + ';'); |             shader.AddLine(dest + " = " + src + ';'); | ||||||
|         } |         } | ||||||
| @@ -1382,12 +1380,10 @@ private: | |||||||
|      * top. |      * top. | ||||||
|      */ |      */ | ||||||
|     void EmitPushToFlowStack(u32 target) { |     void EmitPushToFlowStack(u32 target) { | ||||||
|         shader.AddLine('{'); |         const auto scope = shader.Scope(); | ||||||
|         ++shader.scope; |  | ||||||
|         shader.AddLine("flow_stack[flow_stack_top] = " + std::to_string(target) + "u;"); |         shader.AddLine("flow_stack[flow_stack_top] = " + std::to_string(target) + "u;"); | ||||||
|         shader.AddLine("flow_stack_top++;"); |         shader.AddLine("flow_stack_top++;"); | ||||||
|         --shader.scope; |  | ||||||
|         shader.AddLine('}'); |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /* |     /* | ||||||
| @@ -1395,13 +1391,11 @@ private: | |||||||
|      * popped address and decrementing the stack top. |      * popped address and decrementing the stack top. | ||||||
|      */ |      */ | ||||||
|     void EmitPopFromFlowStack() { |     void EmitPopFromFlowStack() { | ||||||
|         shader.AddLine('{'); |         const auto scope = shader.Scope(); | ||||||
|         ++shader.scope; |  | ||||||
|         shader.AddLine("flow_stack_top--;"); |         shader.AddLine("flow_stack_top--;"); | ||||||
|         shader.AddLine("jmp_to = flow_stack[flow_stack_top];"); |         shader.AddLine("jmp_to = flow_stack[flow_stack_top];"); | ||||||
|         shader.AddLine("break;"); |         shader.AddLine("break;"); | ||||||
|         --shader.scope; |  | ||||||
|         shader.AddLine('}'); |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /// Writes the output values from a fragment shader to the corresponding GLSL output variables. |     /// Writes the output values from a fragment shader to the corresponding GLSL output variables. | ||||||
| @@ -2313,8 +2307,7 @@ private: | |||||||
|                 UNIMPLEMENTED_IF(instr.conversion.selector); |                 UNIMPLEMENTED_IF(instr.conversion.selector); | ||||||
|                 UNIMPLEMENTED_IF_MSG(instr.generates_cc, |                 UNIMPLEMENTED_IF_MSG(instr.generates_cc, | ||||||
|                                      "Condition codes generation in I2F is not implemented"); |                                      "Condition codes generation in I2F is not implemented"); | ||||||
|  |                 std::string op_a; | ||||||
|                 std::string op_a{}; |  | ||||||
|  |  | ||||||
|                 if (instr.is_b_gpr) { |                 if (instr.is_b_gpr) { | ||||||
|                     op_a = |                     op_a = | ||||||
| @@ -2470,10 +2463,7 @@ private: | |||||||
|             case OpCode::Id::LD_C: { |             case OpCode::Id::LD_C: { | ||||||
|                 UNIMPLEMENTED_IF(instr.ld_c.unknown != 0); |                 UNIMPLEMENTED_IF(instr.ld_c.unknown != 0); | ||||||
|  |  | ||||||
|                 // Add an extra scope and declare the index register inside to prevent |                 const auto scope = shader.Scope(); | ||||||
|                 // overwriting it in case it is used as an output of the LD instruction. |  | ||||||
|                 shader.AddLine("{"); |  | ||||||
|                 ++shader.scope; |  | ||||||
|  |  | ||||||
|                 shader.AddLine("uint index = (" + regs.GetRegisterAsInteger(instr.gpr8, 0, false) + |                 shader.AddLine("uint index = (" + regs.GetRegisterAsInteger(instr.gpr8, 0, false) + | ||||||
|                                " / 4) & (MAX_CONSTBUFFER_ELEMENTS - 1);"); |                                " / 4) & (MAX_CONSTBUFFER_ELEMENTS - 1);"); | ||||||
| @@ -2499,19 +2489,13 @@ private: | |||||||
|                     UNIMPLEMENTED_MSG("Unhandled type: {}", |                     UNIMPLEMENTED_MSG("Unhandled type: {}", | ||||||
|                                       static_cast<unsigned>(instr.ld_c.type.Value())); |                                       static_cast<unsigned>(instr.ld_c.type.Value())); | ||||||
|                 } |                 } | ||||||
|  |  | ||||||
|                 --shader.scope; |  | ||||||
|                 shader.AddLine("}"); |  | ||||||
|                 break; |                 break; | ||||||
|             } |             } | ||||||
|             case OpCode::Id::LD_L: { |             case OpCode::Id::LD_L: { | ||||||
|                 UNIMPLEMENTED_IF_MSG(instr.ld_l.unknown == 1, "LD_L Unhandled mode: {}", |                 UNIMPLEMENTED_IF_MSG(instr.ld_l.unknown == 1, "LD_L Unhandled mode: {}", | ||||||
|                                      static_cast<unsigned>(instr.ld_l.unknown.Value())); |                                      static_cast<unsigned>(instr.ld_l.unknown.Value())); | ||||||
|  |  | ||||||
|                 // Add an extra scope and declare the index register inside to prevent |                 const auto scope = shader.Scope(); | ||||||
|                 // overwriting it in case it is used as an output of the LD instruction. |  | ||||||
|                 shader.AddLine('{'); |  | ||||||
|                 ++shader.scope; |  | ||||||
|  |  | ||||||
|                 std::string op = '(' + regs.GetRegisterAsInteger(instr.gpr8, 0, false) + " + " + |                 std::string op = '(' + regs.GetRegisterAsInteger(instr.gpr8, 0, false) + " + " + | ||||||
|                                  std::to_string(instr.smem_imm.Value()) + ')'; |                                  std::to_string(instr.smem_imm.Value()) + ')'; | ||||||
| @@ -2528,9 +2512,6 @@ private: | |||||||
|                     UNIMPLEMENTED_MSG("LD_L Unhandled type: {}", |                     UNIMPLEMENTED_MSG("LD_L Unhandled type: {}", | ||||||
|                                       static_cast<unsigned>(instr.ldst_sl.type.Value())); |                                       static_cast<unsigned>(instr.ldst_sl.type.Value())); | ||||||
|                 } |                 } | ||||||
|  |  | ||||||
|                 --shader.scope; |  | ||||||
|                 shader.AddLine('}'); |  | ||||||
|                 break; |                 break; | ||||||
|             } |             } | ||||||
|             case OpCode::Id::ST_A: { |             case OpCode::Id::ST_A: { | ||||||
| @@ -2565,10 +2546,7 @@ private: | |||||||
|                 UNIMPLEMENTED_IF_MSG(instr.st_l.unknown == 0, "ST_L Unhandled mode: {}", |                 UNIMPLEMENTED_IF_MSG(instr.st_l.unknown == 0, "ST_L Unhandled mode: {}", | ||||||
|                                      static_cast<unsigned>(instr.st_l.unknown.Value())); |                                      static_cast<unsigned>(instr.st_l.unknown.Value())); | ||||||
|  |  | ||||||
|                 // Add an extra scope and declare the index register inside to prevent |                 const auto scope = shader.Scope(); | ||||||
|                 // overwriting it in case it is used as an output of the LD instruction. |  | ||||||
|                 shader.AddLine('{'); |  | ||||||
|                 ++shader.scope; |  | ||||||
|  |  | ||||||
|                 std::string op = '(' + regs.GetRegisterAsInteger(instr.gpr8, 0, false) + " + " + |                 std::string op = '(' + regs.GetRegisterAsInteger(instr.gpr8, 0, false) + " + " + | ||||||
|                                  std::to_string(instr.smem_imm.Value()) + ')'; |                                  std::to_string(instr.smem_imm.Value()) + ')'; | ||||||
| @@ -2583,9 +2561,6 @@ private: | |||||||
|                     UNIMPLEMENTED_MSG("ST_L Unhandled type: {}", |                     UNIMPLEMENTED_MSG("ST_L Unhandled type: {}", | ||||||
|                                       static_cast<unsigned>(instr.ldst_sl.type.Value())); |                                       static_cast<unsigned>(instr.ldst_sl.type.Value())); | ||||||
|                 } |                 } | ||||||
|  |  | ||||||
|                 --shader.scope; |  | ||||||
|                 shader.AddLine('}'); |  | ||||||
|                 break; |                 break; | ||||||
|             } |             } | ||||||
|             case OpCode::Id::TEX: { |             case OpCode::Id::TEX: { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 ReinUsesLisp
					ReinUsesLisp