diff options
| author | 2021-04-01 22:20:57 +0200 | |
|---|---|---|
| committer | 2021-07-22 21:51:25 -0400 | |
| commit | ecb30c907266921818d5b6b03e341028fa2ea082 (patch) | |
| tree | 8bf3f0097653fa11b6dae823f79fe671204ad55e /src/shader_recompiler/frontend | |
| parent | shader: Mark SSBOs as written when they are (diff) | |
| download | yuzu-ecb30c907266921818d5b6b03e341028fa2ea082.tar.gz yuzu-ecb30c907266921818d5b6b03e341028fa2ea082.tar.xz yuzu-ecb30c907266921818d5b6b03e341028fa2ea082.zip | |
shader: Improve VOTE.VTG stub
Diffstat (limited to 'src/shader_recompiler/frontend')
4 files changed, 57 insertions, 3 deletions
diff --git a/src/shader_recompiler/frontend/ir/ir_emitter.cpp b/src/shader_recompiler/frontend/ir/ir_emitter.cpp index 5258ede09..ddaa873f2 100644 --- a/src/shader_recompiler/frontend/ir/ir_emitter.cpp +++ b/src/shader_recompiler/frontend/ir/ir_emitter.cpp | |||
| @@ -198,6 +198,38 @@ void IREmitter::SetOFlag(const U1& value) { | |||
| 198 | Inst(Opcode::SetOFlag, value); | 198 | Inst(Opcode::SetOFlag, value); |
| 199 | } | 199 | } |
| 200 | 200 | ||
| 201 | U1 IREmitter::GetFCSMFlag() { | ||
| 202 | return Inst<U1>(Opcode::GetFCSMFlag); | ||
| 203 | } | ||
| 204 | |||
| 205 | U1 IREmitter::GetTAFlag() { | ||
| 206 | return Inst<U1>(Opcode::GetTAFlag); | ||
| 207 | } | ||
| 208 | |||
| 209 | U1 IREmitter::GetTRFlag() { | ||
| 210 | return Inst<U1>(Opcode::GetTRFlag); | ||
| 211 | } | ||
| 212 | |||
| 213 | U1 IREmitter::GetMXFlag() { | ||
| 214 | return Inst<U1>(Opcode::GetMXFlag); | ||
| 215 | } | ||
| 216 | |||
| 217 | void IREmitter::SetFCSMFlag(const U1& value) { | ||
| 218 | Inst(Opcode::SetFCSMFlag, value); | ||
| 219 | } | ||
| 220 | |||
| 221 | void IREmitter::SetTAFlag(const U1& value) { | ||
| 222 | Inst(Opcode::SetTAFlag, value); | ||
| 223 | } | ||
| 224 | |||
| 225 | void IREmitter::SetTRFlag(const U1& value) { | ||
| 226 | Inst(Opcode::SetTRFlag, value); | ||
| 227 | } | ||
| 228 | |||
| 229 | void IREmitter::SetMXFlag(const U1& value) { | ||
| 230 | Inst(Opcode::SetMXFlag, value); | ||
| 231 | } | ||
| 232 | |||
| 201 | static U1 GetFlowTest(IREmitter& ir, FlowTest flow_test) { | 233 | static U1 GetFlowTest(IREmitter& ir, FlowTest flow_test) { |
| 202 | switch (flow_test) { | 234 | switch (flow_test) { |
| 203 | case FlowTest::F: | 235 | case FlowTest::F: |
| @@ -256,13 +288,14 @@ static U1 GetFlowTest(IREmitter& ir, FlowTest flow_test) { | |||
| 256 | return ir.LogicalOr(ir.GetSFlag(), ir.GetZFlag()); | 288 | return ir.LogicalOr(ir.GetSFlag(), ir.GetZFlag()); |
| 257 | case FlowTest::RGT: | 289 | case FlowTest::RGT: |
| 258 | return ir.LogicalAnd(ir.LogicalNot(ir.GetSFlag()), ir.LogicalNot(ir.GetZFlag())); | 290 | return ir.LogicalAnd(ir.LogicalNot(ir.GetSFlag()), ir.LogicalNot(ir.GetZFlag())); |
| 291 | |||
| 292 | case FlowTest::FCSM_TR: | ||
| 293 | return ir.LogicalAnd(ir.GetFCSMFlag(), ir.GetTRFlag()); | ||
| 259 | case FlowTest::CSM_TA: | 294 | case FlowTest::CSM_TA: |
| 260 | case FlowTest::CSM_TR: | 295 | case FlowTest::CSM_TR: |
| 261 | case FlowTest::CSM_MX: | 296 | case FlowTest::CSM_MX: |
| 262 | case FlowTest::FCSM_TA: | 297 | case FlowTest::FCSM_TA: |
| 263 | case FlowTest::FCSM_TR: | ||
| 264 | case FlowTest::FCSM_MX: | 298 | case FlowTest::FCSM_MX: |
| 265 | return ir.Imm1(false); | ||
| 266 | default: | 299 | default: |
| 267 | throw NotImplementedException("Flow test {}", flow_test); | 300 | throw NotImplementedException("Flow test {}", flow_test); |
| 268 | } | 301 | } |
diff --git a/src/shader_recompiler/frontend/ir/ir_emitter.h b/src/shader_recompiler/frontend/ir/ir_emitter.h index a4616e247..6e04eec7f 100644 --- a/src/shader_recompiler/frontend/ir/ir_emitter.h +++ b/src/shader_recompiler/frontend/ir/ir_emitter.h | |||
| @@ -70,6 +70,16 @@ public: | |||
| 70 | void SetCFlag(const U1& value); | 70 | void SetCFlag(const U1& value); |
| 71 | void SetOFlag(const U1& value); | 71 | void SetOFlag(const U1& value); |
| 72 | 72 | ||
| 73 | [[nodiscard]] U1 GetFCSMFlag(); | ||
| 74 | [[nodiscard]] U1 GetTAFlag(); | ||
| 75 | [[nodiscard]] U1 GetTRFlag(); | ||
| 76 | [[nodiscard]] U1 GetMXFlag(); | ||
| 77 | |||
| 78 | void SetFCSMFlag(const U1& value); | ||
| 79 | void SetTAFlag(const U1& value); | ||
| 80 | void SetTRFlag(const U1& value); | ||
| 81 | void SetMXFlag(const U1& value); | ||
| 82 | |||
| 73 | [[nodiscard]] U1 Condition(IR::Condition cond); | 83 | [[nodiscard]] U1 Condition(IR::Condition cond); |
| 74 | [[nodiscard]] U1 GetFlowTestResult(FlowTest test); | 84 | [[nodiscard]] U1 GetFlowTestResult(FlowTest test); |
| 75 | 85 | ||
diff --git a/src/shader_recompiler/frontend/ir/opcodes.inc b/src/shader_recompiler/frontend/ir/opcodes.inc index ffd0cc690..702372775 100644 --- a/src/shader_recompiler/frontend/ir/opcodes.inc +++ b/src/shader_recompiler/frontend/ir/opcodes.inc | |||
| @@ -46,10 +46,18 @@ OPCODE(GetZFlag, U1, Void | |||
| 46 | OPCODE(GetSFlag, U1, Void, ) | 46 | OPCODE(GetSFlag, U1, Void, ) |
| 47 | OPCODE(GetCFlag, U1, Void, ) | 47 | OPCODE(GetCFlag, U1, Void, ) |
| 48 | OPCODE(GetOFlag, U1, Void, ) | 48 | OPCODE(GetOFlag, U1, Void, ) |
| 49 | OPCODE(GetFCSMFlag, U1, Void, ) | ||
| 50 | OPCODE(GetTAFlag, U1, Void, ) | ||
| 51 | OPCODE(GetTRFlag, U1, Void, ) | ||
| 52 | OPCODE(GetMXFlag, U1, Void, ) | ||
| 49 | OPCODE(SetZFlag, Void, U1, ) | 53 | OPCODE(SetZFlag, Void, U1, ) |
| 50 | OPCODE(SetSFlag, Void, U1, ) | 54 | OPCODE(SetSFlag, Void, U1, ) |
| 51 | OPCODE(SetCFlag, Void, U1, ) | 55 | OPCODE(SetCFlag, Void, U1, ) |
| 52 | OPCODE(SetOFlag, Void, U1, ) | 56 | OPCODE(SetOFlag, Void, U1, ) |
| 57 | OPCODE(SetFCSMFlag, Void, U1, ) | ||
| 58 | OPCODE(SetTAFlag, Void, U1, ) | ||
| 59 | OPCODE(SetTRFlag, Void, U1, ) | ||
| 60 | OPCODE(SetMXFlag, Void, U1, ) | ||
| 53 | OPCODE(WorkgroupId, U32x3, ) | 61 | OPCODE(WorkgroupId, U32x3, ) |
| 54 | OPCODE(LocalInvocationId, U32x3, ) | 62 | OPCODE(LocalInvocationId, U32x3, ) |
| 55 | 63 | ||
diff --git a/src/shader_recompiler/frontend/maxwell/translate/impl/vote.cpp b/src/shader_recompiler/frontend/maxwell/translate/impl/vote.cpp index 391520a18..2acabb662 100644 --- a/src/shader_recompiler/frontend/maxwell/translate/impl/vote.cpp +++ b/src/shader_recompiler/frontend/maxwell/translate/impl/vote.cpp | |||
| @@ -50,7 +50,10 @@ void TranslatorVisitor::VOTE(u64 insn) { | |||
| 50 | } | 50 | } |
| 51 | 51 | ||
| 52 | void TranslatorVisitor::VOTE_vtg(u64) { | 52 | void TranslatorVisitor::VOTE_vtg(u64) { |
| 53 | // Stub | 53 | // LOG_WARNING("VOTE.VTG: Stubbed!"); |
| 54 | auto imm = ir.Imm1(false); | ||
| 55 | ir.SetFCSMFlag(imm); | ||
| 56 | ir.SetTRFlag(imm); | ||
| 54 | } | 57 | } |
| 55 | 58 | ||
| 56 | } // namespace Shader::Maxwell | 59 | } // namespace Shader::Maxwell |