diff options
Diffstat (limited to 'src/video_core/shader/decode.cpp')
| -rw-r--r-- | src/video_core/shader/decode.cpp | 65 |
1 files changed, 33 insertions, 32 deletions
diff --git a/src/video_core/shader/decode.cpp b/src/video_core/shader/decode.cpp index 3265de869..6fdcac784 100644 --- a/src/video_core/shader/decode.cpp +++ b/src/video_core/shader/decode.cpp | |||
| @@ -151,38 +151,39 @@ u32 ShaderIR::DecodeInstr(BasicBlock& bb, u32 pc) { | |||
| 151 | UNIMPLEMENTED_IF_MSG(instr.pred.full_pred == Pred::NeverExecute, | 151 | UNIMPLEMENTED_IF_MSG(instr.pred.full_pred == Pred::NeverExecute, |
| 152 | "NeverExecute predicate not implemented"); | 152 | "NeverExecute predicate not implemented"); |
| 153 | 153 | ||
| 154 | static const std::map<OpCode::Type, u32 (ShaderIR::*)(BasicBlock & code, u32 pc)> decoders = { | 154 | static const std::map<OpCode::Type, u32 (ShaderIR::*)(BasicBlock&, const BasicBlock&, u32)> |
| 155 | {OpCode::Type::Arithmetic, &ShaderIR::DecodeArithmetic}, | 155 | decoders = { |
| 156 | {OpCode::Type::ArithmeticImmediate, &ShaderIR::DecodeArithmeticImmediate}, | 156 | {OpCode::Type::Arithmetic, &ShaderIR::DecodeArithmetic}, |
| 157 | {OpCode::Type::Bfe, &ShaderIR::DecodeBfe}, | 157 | {OpCode::Type::ArithmeticImmediate, &ShaderIR::DecodeArithmeticImmediate}, |
| 158 | {OpCode::Type::Bfi, &ShaderIR::DecodeBfi}, | 158 | {OpCode::Type::Bfe, &ShaderIR::DecodeBfe}, |
| 159 | {OpCode::Type::Shift, &ShaderIR::DecodeShift}, | 159 | {OpCode::Type::Bfi, &ShaderIR::DecodeBfi}, |
| 160 | {OpCode::Type::ArithmeticInteger, &ShaderIR::DecodeArithmeticInteger}, | 160 | {OpCode::Type::Shift, &ShaderIR::DecodeShift}, |
| 161 | {OpCode::Type::ArithmeticIntegerImmediate, &ShaderIR::DecodeArithmeticIntegerImmediate}, | 161 | {OpCode::Type::ArithmeticInteger, &ShaderIR::DecodeArithmeticInteger}, |
| 162 | {OpCode::Type::ArithmeticHalf, &ShaderIR::DecodeArithmeticHalf}, | 162 | {OpCode::Type::ArithmeticIntegerImmediate, &ShaderIR::DecodeArithmeticIntegerImmediate}, |
| 163 | {OpCode::Type::ArithmeticHalfImmediate, &ShaderIR::DecodeArithmeticHalfImmediate}, | 163 | {OpCode::Type::ArithmeticHalf, &ShaderIR::DecodeArithmeticHalf}, |
| 164 | {OpCode::Type::Ffma, &ShaderIR::DecodeFfma}, | 164 | {OpCode::Type::ArithmeticHalfImmediate, &ShaderIR::DecodeArithmeticHalfImmediate}, |
| 165 | {OpCode::Type::Hfma2, &ShaderIR::DecodeHfma2}, | 165 | {OpCode::Type::Ffma, &ShaderIR::DecodeFfma}, |
| 166 | {OpCode::Type::Conversion, &ShaderIR::DecodeConversion}, | 166 | {OpCode::Type::Hfma2, &ShaderIR::DecodeHfma2}, |
| 167 | {OpCode::Type::Memory, &ShaderIR::DecodeMemory}, | 167 | {OpCode::Type::Conversion, &ShaderIR::DecodeConversion}, |
| 168 | {OpCode::Type::FloatSetPredicate, &ShaderIR::DecodeFloatSetPredicate}, | 168 | {OpCode::Type::Memory, &ShaderIR::DecodeMemory}, |
| 169 | {OpCode::Type::IntegerSetPredicate, &ShaderIR::DecodeIntegerSetPredicate}, | 169 | {OpCode::Type::FloatSetPredicate, &ShaderIR::DecodeFloatSetPredicate}, |
| 170 | {OpCode::Type::HalfSetPredicate, &ShaderIR::DecodeHalfSetPredicate}, | 170 | {OpCode::Type::IntegerSetPredicate, &ShaderIR::DecodeIntegerSetPredicate}, |
| 171 | {OpCode::Type::PredicateSetRegister, &ShaderIR::DecodePredicateSetRegister}, | 171 | {OpCode::Type::HalfSetPredicate, &ShaderIR::DecodeHalfSetPredicate}, |
| 172 | {OpCode::Type::PredicateSetPredicate, &ShaderIR::DecodePredicateSetPredicate}, | 172 | {OpCode::Type::PredicateSetRegister, &ShaderIR::DecodePredicateSetRegister}, |
| 173 | {OpCode::Type::RegisterSetPredicate, &ShaderIR::DecodeRegisterSetPredicate}, | 173 | {OpCode::Type::PredicateSetPredicate, &ShaderIR::DecodePredicateSetPredicate}, |
| 174 | {OpCode::Type::FloatSet, &ShaderIR::DecodeFloatSet}, | 174 | {OpCode::Type::RegisterSetPredicate, &ShaderIR::DecodeRegisterSetPredicate}, |
| 175 | {OpCode::Type::IntegerSet, &ShaderIR::DecodeIntegerSet}, | 175 | {OpCode::Type::FloatSet, &ShaderIR::DecodeFloatSet}, |
| 176 | {OpCode::Type::HalfSet, &ShaderIR::DecodeHalfSet}, | 176 | {OpCode::Type::IntegerSet, &ShaderIR::DecodeIntegerSet}, |
| 177 | {OpCode::Type::Video, &ShaderIR::DecodeVideo}, | 177 | {OpCode::Type::HalfSet, &ShaderIR::DecodeHalfSet}, |
| 178 | {OpCode::Type::Xmad, &ShaderIR::DecodeXmad}, | 178 | {OpCode::Type::Video, &ShaderIR::DecodeVideo}, |
| 179 | }; | 179 | {OpCode::Type::Xmad, &ShaderIR::DecodeXmad}, |
| 180 | 180 | }; | |
| 181 | std::vector<Node> code; | 181 | |
| 182 | std::vector<Node> tmp_block; | ||
| 182 | if (const auto decoder = decoders.find(opcode->get().GetType()); decoder != decoders.end()) { | 183 | if (const auto decoder = decoders.find(opcode->get().GetType()); decoder != decoders.end()) { |
| 183 | pc = (this->*decoder->second)(code, pc); | 184 | pc = (this->*decoder->second)(tmp_block, bb, pc); |
| 184 | } else { | 185 | } else { |
| 185 | pc = DecodeOther(code, pc); | 186 | pc = DecodeOther(tmp_block, bb, pc); |
| 186 | } | 187 | } |
| 187 | 188 | ||
| 188 | // Some instructions (like SSY) don't have a predicate field, they are always unconditionally | 189 | // Some instructions (like SSY) don't have a predicate field, they are always unconditionally |
| @@ -192,9 +193,9 @@ u32 ShaderIR::DecodeInstr(BasicBlock& bb, u32 pc) { | |||
| 192 | 193 | ||
| 193 | if (can_be_predicated && pred_index != static_cast<u32>(Pred::UnusedIndex)) { | 194 | if (can_be_predicated && pred_index != static_cast<u32>(Pred::UnusedIndex)) { |
| 194 | bb.push_back( | 195 | bb.push_back( |
| 195 | Conditional(GetPredicate(pred_index, instr.negate_pred != 0), std::move(code))); | 196 | Conditional(GetPredicate(pred_index, instr.negate_pred != 0), std::move(tmp_block))); |
| 196 | } else { | 197 | } else { |
| 197 | for (auto& node : code) { | 198 | for (auto& node : tmp_block) { |
| 198 | bb.push_back(std::move(node)); | 199 | bb.push_back(std::move(node)); |
| 199 | } | 200 | } |
| 200 | } | 201 | } |