Merge pull request #2118 from FernandoS27/ipa-improve
shader_decompiler: Improve Accuracy of Attribute Interpolation.
This commit is contained in:
		| @@ -48,7 +48,7 @@ u32 ShaderIR::DecodeMemory(NodeBlock& bb, u32 pc) { | ||||
|         UNIMPLEMENTED_IF_MSG((instr.attribute.fmt20.immediate.Value() % sizeof(u32)) != 0, | ||||
|                              "Unaligned attribute loads are not supported"); | ||||
|  | ||||
|         Tegra::Shader::IpaMode input_mode{Tegra::Shader::IpaInterpMode::Perspective, | ||||
|         Tegra::Shader::IpaMode input_mode{Tegra::Shader::IpaInterpMode::Pass, | ||||
|                                           Tegra::Shader::IpaSampleMode::Default}; | ||||
|  | ||||
|         u64 next_element = instr.attribute.fmt20.element; | ||||
|   | ||||
| @@ -135,7 +135,18 @@ u32 ShaderIR::DecodeOther(NodeBlock& bb, u32 pc) { | ||||
|                                                 instr.ipa.sample_mode.Value()}; | ||||
|  | ||||
|         const Node attr = GetInputAttribute(attribute.index, attribute.element, input_mode); | ||||
|         const Node value = GetSaturatedFloat(attr, instr.ipa.saturate); | ||||
|         Node value = attr; | ||||
|         const Tegra::Shader::Attribute::Index index = attribute.index.Value(); | ||||
|         if (index >= Tegra::Shader::Attribute::Index::Attribute_0 && | ||||
|             index <= Tegra::Shader::Attribute::Index::Attribute_31) { | ||||
|             // TODO(Blinkhawk): There are cases where a perspective attribute use PASS. | ||||
|             // In theory by setting them as perspective, OpenGL does the perspective correction. | ||||
|             // A way must figured to reverse the last step of it. | ||||
|             if (input_mode.interpolation_mode == Tegra::Shader::IpaInterpMode::Multiply) { | ||||
|                 value = Operation(OperationCode::FMul, PRECISE, value, GetRegister(instr.gpr20)); | ||||
|             } | ||||
|         } | ||||
|         value = GetSaturatedFloat(value, instr.ipa.saturate); | ||||
|  | ||||
|         SetRegister(bb, instr.gpr0, value); | ||||
|         break; | ||||
| @@ -175,4 +186,4 @@ u32 ShaderIR::DecodeOther(NodeBlock& bb, u32 pc) { | ||||
|     return pc; | ||||
| } | ||||
|  | ||||
| } // namespace VideoCommon::Shader | ||||
| } // namespace VideoCommon::Shader | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 bunnei
					bunnei