diff options
| author | 2021-06-04 00:11:16 +0200 | |
|---|---|---|
| committer | 2021-07-22 21:51:34 -0400 | |
| commit | 562af301819227d65a251a2c29c997bf798da7ba (patch) | |
| tree | 00199eb2c9c34d78430d88e40bd5b27f585daeec /src/shader_recompiler | |
| parent | shader: Add 2D and 3D variants to SUATOM and SURED (diff) | |
| download | yuzu-562af301819227d65a251a2c29c997bf798da7ba.tar.gz yuzu-562af301819227d65a251a2c29c997bf798da7ba.tar.xz yuzu-562af301819227d65a251a2c29c997bf798da7ba.zip | |
shader: Fix VertexA Shaders.
Diffstat (limited to '')
| -rw-r--r-- | src/shader_recompiler/frontend/maxwell/program.cpp | 19 | ||||
| -rw-r--r-- | src/shader_recompiler/ir_opt/dual_vertex_pass.cpp | 24 | ||||
| -rw-r--r-- | src/shader_recompiler/ir_opt/passes.h | 1 |
3 files changed, 30 insertions, 14 deletions
diff --git a/src/shader_recompiler/frontend/maxwell/program.cpp b/src/shader_recompiler/frontend/maxwell/program.cpp index 900fc7ab1..8489f9a5f 100644 --- a/src/shader_recompiler/frontend/maxwell/program.cpp +++ b/src/shader_recompiler/frontend/maxwell/program.cpp | |||
| @@ -171,20 +171,29 @@ IR::Program MergeDualVertexPrograms(IR::Program& vertex_a, IR::Program& vertex_b | |||
| 171 | IR::Program result{}; | 171 | IR::Program result{}; |
| 172 | Optimization::VertexATransformPass(vertex_a); | 172 | Optimization::VertexATransformPass(vertex_a); |
| 173 | Optimization::VertexBTransformPass(vertex_b); | 173 | Optimization::VertexBTransformPass(vertex_b); |
| 174 | std::swap(result.blocks, vertex_a.blocks); | 174 | for (const auto& term : vertex_a.syntax_list) { |
| 175 | result.blocks.insert(result.blocks.end(), vertex_b.blocks.begin(), vertex_b.blocks.end()); | 175 | if (term.type == IR::AbstractSyntaxNode::Type::Return) { |
| 176 | continue; | ||
| 177 | } | ||
| 178 | result.syntax_list.push_back(term); | ||
| 179 | } | ||
| 180 | for (const auto& term : vertex_b.syntax_list) { | ||
| 181 | result.syntax_list.push_back(term); | ||
| 182 | } | ||
| 183 | result.blocks = GenerateBlocks(result.syntax_list); | ||
| 184 | result.post_order_blocks = vertex_b.post_order_blocks; | ||
| 185 | for (const auto& block : vertex_a.post_order_blocks) { | ||
| 186 | result.post_order_blocks.push_back(block); | ||
| 187 | } | ||
| 176 | result.stage = Stage::VertexB; | 188 | result.stage = Stage::VertexB; |
| 177 | result.info = vertex_a.info; | 189 | result.info = vertex_a.info; |
| 178 | result.local_memory_size = std::max(vertex_a.local_memory_size, vertex_b.local_memory_size); | 190 | result.local_memory_size = std::max(vertex_a.local_memory_size, vertex_b.local_memory_size); |
| 179 | |||
| 180 | for (size_t index = 0; index < 32; ++index) { | 191 | for (size_t index = 0; index < 32; ++index) { |
| 181 | result.info.input_generics[index].used |= vertex_b.info.input_generics[index].used; | 192 | result.info.input_generics[index].used |= vertex_b.info.input_generics[index].used; |
| 182 | result.info.stores_generics[index] |= vertex_b.info.stores_generics[index]; | 193 | result.info.stores_generics[index] |= vertex_b.info.stores_generics[index]; |
| 183 | } | 194 | } |
| 184 | Optimization::JoinTextureInfo(result.info, vertex_b.info); | 195 | Optimization::JoinTextureInfo(result.info, vertex_b.info); |
| 185 | Optimization::JoinStorageInfo(result.info, vertex_b.info); | 196 | Optimization::JoinStorageInfo(result.info, vertex_b.info); |
| 186 | Optimization::DualVertexJoinPass(result); | ||
| 187 | result.post_order_blocks = PostOrder(result.syntax_list.front()); | ||
| 188 | Optimization::DeadCodeEliminationPass(result); | 197 | Optimization::DeadCodeEliminationPass(result); |
| 189 | Optimization::VerificationPass(result); | 198 | Optimization::VerificationPass(result); |
| 190 | Optimization::CollectShaderInfoPass(env_vertex_b, result); | 199 | Optimization::CollectShaderInfoPass(env_vertex_b, result); |
diff --git a/src/shader_recompiler/ir_opt/dual_vertex_pass.cpp b/src/shader_recompiler/ir_opt/dual_vertex_pass.cpp index b0a9f5258..a926123f2 100644 --- a/src/shader_recompiler/ir_opt/dual_vertex_pass.cpp +++ b/src/shader_recompiler/ir_opt/dual_vertex_pass.cpp | |||
| @@ -13,16 +13,24 @@ | |||
| 13 | 13 | ||
| 14 | namespace Shader::Optimization { | 14 | namespace Shader::Optimization { |
| 15 | 15 | ||
| 16 | void VertexATransformPass(IR::Program&) { | 16 | void VertexATransformPass(IR::Program& program) { |
| 17 | throw NotImplementedException("VertexA pass"); | 17 | for (IR::Block* const block : program.blocks) { |
| 18 | for (IR::Inst& inst : block->Instructions()) { | ||
| 19 | if (inst.GetOpcode() == IR::Opcode::Epilogue) { | ||
| 20 | return inst.Invalidate(); | ||
| 21 | } | ||
| 22 | } | ||
| 23 | } | ||
| 18 | } | 24 | } |
| 19 | 25 | ||
| 20 | void VertexBTransformPass(IR::Program&) { | 26 | void VertexBTransformPass(IR::Program& program) { |
| 21 | throw NotImplementedException("VertexA pass"); | 27 | for (IR::Block* const block : program.blocks) { |
| 22 | } | 28 | for (IR::Inst& inst : block->Instructions()) { |
| 23 | 29 | if (inst.GetOpcode() == IR::Opcode::Prologue) { | |
| 24 | void DualVertexJoinPass(IR::Program&) { | 30 | return inst.Invalidate(); |
| 25 | throw NotImplementedException("VertexA pass"); | 31 | } |
| 32 | } | ||
| 33 | } | ||
| 26 | } | 34 | } |
| 27 | 35 | ||
| 28 | } // namespace Shader::Optimization | 36 | } // namespace Shader::Optimization |
diff --git a/src/shader_recompiler/ir_opt/passes.h b/src/shader_recompiler/ir_opt/passes.h index e9cb8546a..5ebde49ea 100644 --- a/src/shader_recompiler/ir_opt/passes.h +++ b/src/shader_recompiler/ir_opt/passes.h | |||
| @@ -25,7 +25,6 @@ void VerificationPass(const IR::Program& program); | |||
| 25 | // Dual Vertex | 25 | // Dual Vertex |
| 26 | void VertexATransformPass(IR::Program& program); | 26 | void VertexATransformPass(IR::Program& program); |
| 27 | void VertexBTransformPass(IR::Program& program); | 27 | void VertexBTransformPass(IR::Program& program); |
| 28 | void DualVertexJoinPass(IR::Program& program); | ||
| 29 | void JoinTextureInfo(Info& base, Info& source); | 28 | void JoinTextureInfo(Info& base, Info& source); |
| 30 | void JoinStorageInfo(Info& base, Info& source); | 29 | void JoinStorageInfo(Info& base, Info& source); |
| 31 | 30 | ||