summaryrefslogtreecommitdiff
path: root/src/shader_recompiler/frontend/maxwell
diff options
context:
space:
mode:
authorGravatar ReinUsesLisp2021-03-27 04:59:58 -0300
committerGravatar ameerj2021-07-22 21:51:24 -0400
commitdbd882ddeb1a1a9233c0085d0b8ccb022db385b2 (patch)
tree5a8456364cc41a0a53acf93e22e3f9ce855bd413 /src/shader_recompiler/frontend/maxwell
parentspirv: Remove dependencies on Environment when generating SPIR-V (diff)
downloadyuzu-dbd882ddeb1a1a9233c0085d0b8ccb022db385b2.tar.gz
yuzu-dbd882ddeb1a1a9233c0085d0b8ccb022db385b2.tar.xz
yuzu-dbd882ddeb1a1a9233c0085d0b8ccb022db385b2.zip
shader: Better interpolation and disabled attributes support
Diffstat (limited to 'src/shader_recompiler/frontend/maxwell')
-rw-r--r--src/shader_recompiler/frontend/maxwell/program.cpp35
-rw-r--r--src/shader_recompiler/frontend/maxwell/translate/impl/load_store_attribute.cpp10
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
30static 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
30IR::Program TranslateProgram(ObjectPool<IR::Inst>& inst_pool, ObjectPool<IR::Block>& block_pool, 64IR::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.