Browse Source

shader_ir: Add predicate combiner helper

ReinUsesLisp 7 years ago
parent
commit
a58abbcfc4
2 changed files with 15 additions and 0 deletions
  1. 12 0
      src/video_core/shader/shader_ir.cpp
  2. 3 0
      src/video_core/shader/shader_ir.h

+ 12 - 0
src/video_core/shader/shader_ir.cpp

@@ -309,6 +309,18 @@ Node ShaderIR::GetPredicateComparisonHalf(Tegra::Shader::PredCondition condition
     return predicate;
 }
 
+OperationCode ShaderIR::GetPredicateCombiner(PredOperation operation) {
+    static const std::unordered_map<PredOperation, OperationCode> PredicateOperationTable = {
+        {PredOperation::And, OperationCode::LogicalAnd},
+        {PredOperation::Or, OperationCode::LogicalOr},
+        {PredOperation::Xor, OperationCode::LogicalXor},
+    };
+
+    const auto op = PredicateOperationTable.find(operation);
+    UNIMPLEMENTED_IF_MSG(op == PredicateOperationTable.end(), "Unknown predicate operation");
+    return op->second;
+}
+
 void ShaderIR::SetRegister(BasicBlock& bb, Register dest, Node src) {
     bb.push_back(Operation(OperationCode::Assign, GetRegister(dest), src));
 }

+ 3 - 0
src/video_core/shader/shader_ir.h

@@ -669,6 +669,9 @@ private:
     Node GetPredicateComparisonHalf(Tegra::Shader::PredCondition condition,
                                     const MetaHalfArithmetic& meta, Node op_a, Node op_b);
 
+    /// Returns a predicate combiner operation
+    OperationCode GetPredicateCombiner(Tegra::Shader::PredOperation operation);
+
     template <typename... T>
     inline Node Operation(OperationCode code, const T*... operands) {
         return StoreNode(OperationNode(code, operands...));