diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/video_core/shader/decode/other.cpp | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/src/video_core/shader/decode/other.cpp b/src/video_core/shader/decode/other.cpp index 5b3f9aa30..9200b5da9 100644 --- a/src/video_core/shader/decode/other.cpp +++ b/src/video_core/shader/decode/other.cpp | |||
| @@ -46,6 +46,33 @@ u32 ShaderIR::DecodeOther(BasicBlock& bb, u32 pc) { | |||
| 46 | } | 46 | } |
| 47 | break; | 47 | break; |
| 48 | } | 48 | } |
| 49 | case OpCode::Id::KIL: { | ||
| 50 | UNIMPLEMENTED_IF(instr.flow.cond != Tegra::Shader::FlowCondition::Always); | ||
| 51 | |||
| 52 | const Tegra::Shader::ConditionCode cc = instr.flow_condition_code; | ||
| 53 | UNIMPLEMENTED_IF_MSG(cc != Tegra::Shader::ConditionCode::T, "KIL condition code used: {}", | ||
| 54 | static_cast<u32>(cc)); | ||
| 55 | |||
| 56 | bb.push_back(Operation(OperationCode::Kil)); | ||
| 57 | break; | ||
| 58 | } | ||
| 59 | case OpCode::Id::MOV_SYS: { | ||
| 60 | switch (instr.sys20) { | ||
| 61 | case Tegra::Shader::SystemVariable::InvocationInfo: { | ||
| 62 | LOG_WARNING(HW_GPU, "MOV_SYS instruction with InvocationInfo is incomplete"); | ||
| 63 | SetRegister(bb, instr.gpr0, Immediate(0u)); | ||
| 64 | break; | ||
| 65 | } | ||
| 66 | case Tegra::Shader::SystemVariable::Ydirection: { | ||
| 67 | // Config pack's third value is Y_NEGATE's state. | ||
| 68 | SetRegister(bb, instr.gpr0, Operation(OperationCode::YNegate)); | ||
| 69 | break; | ||
| 70 | } | ||
| 71 | default: | ||
| 72 | UNIMPLEMENTED_MSG("Unhandled system move: {}", static_cast<u32>(instr.sys20.Value())); | ||
| 73 | } | ||
| 74 | break; | ||
| 75 | } | ||
| 49 | case OpCode::Id::BRA: { | 76 | case OpCode::Id::BRA: { |
| 50 | UNIMPLEMENTED_IF_MSG(instr.bra.constant_buffer != 0, | 77 | UNIMPLEMENTED_IF_MSG(instr.bra.constant_buffer != 0, |
| 51 | "BRA with constant buffers are not implemented"); | 78 | "BRA with constant buffers are not implemented"); |