yuzu-emu
/
yuzu
Archived
1
0
Fork 0

shader_ir/other: Implement IPA.IDX

This commit is contained in:
ReinUsesLisp 2019-05-02 21:45:53 -03:00
parent 5321cdd276
commit d4df803b2b
2 changed files with 9 additions and 5 deletions

View File

@ -596,6 +596,7 @@ union Instruction {
} alu; } alu;
union { union {
BitField<38, 1, u64> idx;
BitField<51, 1, u64> saturate; BitField<51, 1, u64> saturate;
BitField<52, 2, IpaSampleMode> sample_mode; BitField<52, 2, IpaSampleMode> sample_mode;
BitField<54, 2, IpaInterpMode> interp_mode; BitField<54, 2, IpaInterpMode> interp_mode;

View File

@ -130,15 +130,18 @@ u32 ShaderIR::DecodeOther(NodeBlock& bb, u32 pc) {
break; break;
} }
case OpCode::Id::IPA: { case OpCode::Id::IPA: {
const auto& attribute = instr.attribute.fmt28; const bool is_physical = instr.ipa.idx && instr.gpr8.Value() != 0xff;
const auto attribute = instr.attribute.fmt28;
const Tegra::Shader::IpaMode input_mode{instr.ipa.interp_mode.Value(), const Tegra::Shader::IpaMode input_mode{instr.ipa.interp_mode.Value(),
instr.ipa.sample_mode.Value()}; instr.ipa.sample_mode.Value()};
const Node attr = GetInputAttribute(attribute.index, attribute.element); Node value = is_physical ? GetPhysicalInputAttribute(instr.gpr8)
Node value = attr; : GetInputAttribute(attribute.index, attribute.element);
const Tegra::Shader::Attribute::Index index = attribute.index.Value(); const Tegra::Shader::Attribute::Index index = attribute.index.Value();
if (index >= Tegra::Shader::Attribute::Index::Attribute_0 && const bool is_generic = index >= Tegra::Shader::Attribute::Index::Attribute_0 &&
index <= Tegra::Shader::Attribute::Index::Attribute_31) { index <= Tegra::Shader::Attribute::Index::Attribute_31;
if (is_generic || is_physical) {
// TODO(Blinkhawk): There are cases where a perspective attribute use PASS. // TODO(Blinkhawk): There are cases where a perspective attribute use PASS.
// In theory by setting them as perspective, OpenGL does the perspective correction. // In theory by setting them as perspective, OpenGL does the perspective correction.
// A way must figured to reverse the last step of it. // A way must figured to reverse the last step of it.