diff options
Diffstat (limited to 'src/shader_recompiler/frontend/maxwell')
| -rw-r--r-- | src/shader_recompiler/frontend/maxwell/program.cpp | 35 | ||||
| -rw-r--r-- | src/shader_recompiler/frontend/maxwell/translate/impl/load_store_attribute.cpp | 10 |
2 files changed, 36 insertions, 9 deletions
diff --git a/src/shader_recompiler/frontend/maxwell/program.cpp b/src/shader_recompiler/frontend/maxwell/program.cpp index 6efaf6ee0..a914a91f4 100644 --- a/src/shader_recompiler/frontend/maxwell/program.cpp +++ b/src/shader_recompiler/frontend/maxwell/program.cpp | |||
| @@ -27,6 +27,40 @@ static void RemoveUnreachableBlocks(IR::Program& program) { | |||
| 27 | }); | 27 | }); |
| 28 | } | 28 | } |
| 29 | 29 | ||
| 30 | static void CollectInterpolationInfo(Environment& env, IR::Program& program) { | ||
| 31 | if (program.stage != Stage::Fragment) { | ||
| 32 | return; | ||
| 33 | } | ||
| 34 | const ProgramHeader& sph{env.SPH()}; | ||
| 35 | for (size_t index = 0; index < program.info.input_generics.size(); ++index) { | ||
| 36 | std::optional<PixelImap> imap; | ||
| 37 | for (const PixelImap value : sph.ps.GenericInputMap(static_cast<u32>(index))) { | ||
| 38 | if (value == PixelImap::Unused) { | ||
| 39 | continue; | ||
| 40 | } | ||
| 41 | if (imap && imap != value) { | ||
| 42 | throw NotImplementedException("Per component interpolation"); | ||
| 43 | } | ||
| 44 | imap = value; | ||
| 45 | } | ||
| 46 | if (!imap) { | ||
| 47 | continue; | ||
| 48 | } | ||
| 49 | program.info.input_generics[index].interpolation = [&] { | ||
| 50 | switch (*imap) { | ||
| 51 | case PixelImap::Unused: | ||
| 52 | case PixelImap::Perspective: | ||
| 53 | return Interpolation::Smooth; | ||
| 54 | case PixelImap::Constant: | ||
| 55 | return Interpolation::Flat; | ||
| 56 | case PixelImap::ScreenLinear: | ||
| 57 | return Interpolation::NoPerspective; | ||
| 58 | } | ||
| 59 | throw NotImplementedException("Unknown interpolation {}", *imap); | ||
| 60 | }(); | ||
| 61 | } | ||
| 62 | } | ||
| 63 | |||
| 30 | IR::Program TranslateProgram(ObjectPool<IR::Inst>& inst_pool, ObjectPool<IR::Block>& block_pool, | 64 | IR::Program TranslateProgram(ObjectPool<IR::Inst>& inst_pool, ObjectPool<IR::Block>& block_pool, |
| 31 | Environment& env, Flow::CFG& cfg) { | 65 | Environment& env, Flow::CFG& cfg) { |
| 32 | IR::Program program; | 66 | IR::Program program; |
| @@ -51,6 +85,7 @@ IR::Program TranslateProgram(ObjectPool<IR::Inst>& inst_pool, ObjectPool<IR::Blo | |||
| 51 | Optimization::IdentityRemovalPass(program); | 85 | Optimization::IdentityRemovalPass(program); |
| 52 | Optimization::VerificationPass(program); | 86 | Optimization::VerificationPass(program); |
| 53 | Optimization::CollectShaderInfoPass(program); | 87 | Optimization::CollectShaderInfoPass(program); |
| 88 | CollectInterpolationInfo(env, program); | ||
| 54 | return program; | 89 | return program; |
| 55 | } | 90 | } |
| 56 | 91 | ||
diff --git a/src/shader_recompiler/frontend/maxwell/translate/impl/load_store_attribute.cpp b/src/shader_recompiler/frontend/maxwell/translate/impl/load_store_attribute.cpp index 516ffec2d..54bc1e34c 100644 --- a/src/shader_recompiler/frontend/maxwell/translate/impl/load_store_attribute.cpp +++ b/src/shader_recompiler/frontend/maxwell/translate/impl/load_store_attribute.cpp | |||
| @@ -151,16 +151,8 @@ void TranslatorVisitor::IPA(u64 insn) { | |||
| 151 | value = ir.FPMul(value, position_w); | 151 | value = ir.FPMul(value, position_w); |
| 152 | } | 152 | } |
| 153 | } | 153 | } |
| 154 | switch (ipa.interpolation_mode) { | 154 | if (ipa.interpolation_mode == InterpolationMode::Multiply) { |
| 155 | case InterpolationMode::Pass: | ||
| 156 | break; | ||
| 157 | case InterpolationMode::Multiply: | ||
| 158 | value = ir.FPMul(value, F(ipa.multiplier)); | 155 | value = ir.FPMul(value, F(ipa.multiplier)); |
| 159 | break; | ||
| 160 | case InterpolationMode::Constant: | ||
| 161 | throw NotImplementedException("IPA.CONSTANT"); | ||
| 162 | case InterpolationMode::Sc: | ||
| 163 | throw NotImplementedException("IPA.SC"); | ||
| 164 | } | 156 | } |
| 165 | 157 | ||
| 166 | // Saturated IPAs are generally generated out of clamped varyings. | 158 | // Saturated IPAs are generally generated out of clamped varyings. |