IVGCVSW-4565 TENSOR_BOOL8 data type not supported in AndroidNN Driver

* Enabled Boolean and Int32 data types in Reference Comparison inputs
* Added decoder for Boolean data type
* Refactored ClGreaterWorkload to work with any data type
* Refactored NeonGreaterWorkload to work with any data type

!android-nn-driver:2902

Signed-off-by: Sadik Armagan <sadik.armagan@arm.com>
Change-Id: I92772810b744b388831c9dca0119ebf8cb7a447e
diff --git a/src/backends/cl/ClWorkloadFactory.cpp b/src/backends/cl/ClWorkloadFactory.cpp
index e7e4fa7..4f707be 100644
--- a/src/backends/cl/ClWorkloadFactory.cpp
+++ b/src/backends/cl/ClWorkloadFactory.cpp
@@ -178,8 +178,7 @@
         GreaterQueueDescriptor greaterQueueDescriptor;
         greaterQueueDescriptor.m_Inputs  = descriptor.m_Inputs;
         greaterQueueDescriptor.m_Outputs = descriptor.m_Outputs;
-
-        return MakeWorkload<ClGreaterFloat32Workload, ClGreaterUint8Workload>(greaterQueueDescriptor, info);
+        return MakeWorkload<ClGreaterWorkload>(greaterQueueDescriptor, info);
     }
     return MakeWorkload<NullWorkload, NullWorkload>(descriptor, info);
 }
diff --git a/src/backends/cl/workloads/ClGreaterWorkload.cpp b/src/backends/cl/workloads/ClGreaterWorkload.cpp
index b086122..2051cc3 100644
--- a/src/backends/cl/workloads/ClGreaterWorkload.cpp
+++ b/src/backends/cl/workloads/ClGreaterWorkload.cpp
@@ -38,10 +38,8 @@
     return aclStatus;
 }
 
-template<DataType T>
-ClGreaterWorkload<T>::ClGreaterWorkload(const GreaterQueueDescriptor& descriptor,
-                                        const WorkloadInfo& info)
-    : MultiTypedWorkload<GreaterQueueDescriptor, T, DataType::Boolean>(descriptor, info)
+ClGreaterWorkload::ClGreaterWorkload(const GreaterQueueDescriptor& descriptor, const WorkloadInfo& info)
+    : BaseWorkload<GreaterQueueDescriptor>(descriptor, info)
 {
     m_Data.ValidateInputsOutputs("ClGreaterWorkload", 2, 1);
 
@@ -52,14 +50,10 @@
     m_GreaterLayer.configure(&input0, &input1, &output, arm_compute::ComparisonOperation::Greater);
 }
 
-template<DataType T>
-void ClGreaterWorkload<T>::Execute() const
+void ClGreaterWorkload::Execute() const
 {
     ARMNN_SCOPED_PROFILING_EVENT_CL("ClGreaterWorkload_Execute");
     RunClFunction(m_GreaterLayer, CHECK_LOCATION());
 }
 
-template class ClGreaterWorkload<DataType::Float32>;
-template class ClGreaterWorkload<DataType::QAsymmU8>;
-
 } //namespace armnn
diff --git a/src/backends/cl/workloads/ClGreaterWorkload.hpp b/src/backends/cl/workloads/ClGreaterWorkload.hpp
index 862e168..9b2a171 100644
--- a/src/backends/cl/workloads/ClGreaterWorkload.hpp
+++ b/src/backends/cl/workloads/ClGreaterWorkload.hpp
@@ -16,19 +16,14 @@
                                               const TensorInfo& input1,
                                               const TensorInfo& output);
 
-template<DataType T>
-class ClGreaterWorkload : public MultiTypedWorkload<GreaterQueueDescriptor, T, DataType::Boolean>
+class ClGreaterWorkload : public BaseWorkload<GreaterQueueDescriptor>
 {
 public:
     ClGreaterWorkload(const GreaterQueueDescriptor& descriptor, const WorkloadInfo& info);
     void Execute() const override;
 
 private:
-    using MultiTypedWorkload<GreaterQueueDescriptor, T, DataType::Boolean>::m_Data;
     mutable arm_compute::CLComparison m_GreaterLayer;
 };
 
-using ClGreaterFloat32Workload = ClGreaterWorkload<DataType::Float32>;
-using ClGreaterUint8Workload = ClGreaterWorkload<DataType::QAsymmU8>;
-
 } //namespace armnn
diff --git a/src/backends/neon/NeonWorkloadFactory.cpp b/src/backends/neon/NeonWorkloadFactory.cpp
index cf9999f..cc7dca0 100644
--- a/src/backends/neon/NeonWorkloadFactory.cpp
+++ b/src/backends/neon/NeonWorkloadFactory.cpp
@@ -144,8 +144,7 @@
         GreaterQueueDescriptor greaterQueueDescriptor;
         greaterQueueDescriptor.m_Inputs  = descriptor.m_Inputs;
         greaterQueueDescriptor.m_Outputs = descriptor.m_Outputs;
-
-        return MakeWorkloadHelper<NeonGreaterFloat32Workload, NeonGreaterUint8Workload>(greaterQueueDescriptor, info);
+        return std::make_unique<NeonGreaterWorkload>(greaterQueueDescriptor, info);
     }
     return MakeWorkloadHelper<NullWorkload, NullWorkload>(descriptor, info);
 }
diff --git a/src/backends/neon/workloads/NeonGreaterWorkload.cpp b/src/backends/neon/workloads/NeonGreaterWorkload.cpp
index 6380dfa..1ec5ac4 100644
--- a/src/backends/neon/workloads/NeonGreaterWorkload.cpp
+++ b/src/backends/neon/workloads/NeonGreaterWorkload.cpp
@@ -23,9 +23,8 @@
                                             &aclOutput);
 }
 
-template <DataType T>
-NeonGreaterWorkload<T>::NeonGreaterWorkload(const GreaterQueueDescriptor& descriptor, const WorkloadInfo& info)
-    : MultiTypedWorkload<GreaterQueueDescriptor, T, DataType::Boolean>(descriptor, info)
+NeonGreaterWorkload::NeonGreaterWorkload(const GreaterQueueDescriptor& descriptor, const WorkloadInfo& info)
+    : BaseWorkload<GreaterQueueDescriptor>(descriptor, info)
 {
     m_Data.ValidateInputsOutputs("NeonGreaterWorkload", 2, 1);
 
@@ -36,14 +35,10 @@
     m_GreaterLayer.configure(&input0, &input1, &output);
 }
 
-template <DataType T>
-void NeonGreaterWorkload<T>::Execute() const
+void NeonGreaterWorkload::Execute() const
 {
     ARMNN_SCOPED_PROFILING_EVENT_NEON("NeonGreaterWorkload_Execute");
     m_GreaterLayer.run();
 }
 
-template class NeonGreaterWorkload<DataType::Float32>;
-template class NeonGreaterWorkload<DataType::QAsymmU8>;
-
 } //namespace armnn
\ No newline at end of file
diff --git a/src/backends/neon/workloads/NeonGreaterWorkload.hpp b/src/backends/neon/workloads/NeonGreaterWorkload.hpp
index bcab27e..503e60e 100644
--- a/src/backends/neon/workloads/NeonGreaterWorkload.hpp
+++ b/src/backends/neon/workloads/NeonGreaterWorkload.hpp
@@ -16,12 +16,9 @@
                                                 const TensorInfo& input1,
                                                 const TensorInfo& output);
 
-template <DataType T>
-class NeonGreaterWorkload : public MultiTypedWorkload<GreaterQueueDescriptor, T, DataType::Boolean>
+class NeonGreaterWorkload : public BaseWorkload<GreaterQueueDescriptor>
 {
 public:
-    using MultiTypedWorkload<GreaterQueueDescriptor, T, DataType::Boolean>::m_Data;
-
     NeonGreaterWorkload(const GreaterQueueDescriptor& descriptor, const WorkloadInfo& info);
 
     virtual void Execute() const override;
@@ -30,7 +27,4 @@
     mutable arm_compute::NEGreater m_GreaterLayer;
 };
 
-using NeonGreaterFloat32Workload = NeonGreaterWorkload<DataType::Float32>;
-using NeonGreaterUint8Workload = NeonGreaterWorkload<DataType::QAsymmU8>;
-
 } //namespace armnn
\ No newline at end of file
diff --git a/src/backends/reference/RefLayerSupport.cpp b/src/backends/reference/RefLayerSupport.cpp
index 9f22b9e..7d3600c 100644
--- a/src/backends/reference/RefLayerSupport.cpp
+++ b/src/backends/reference/RefLayerSupport.cpp
@@ -302,14 +302,15 @@
                                             Optional<std::string&> reasonIfUnsupported) const
 {
     IgnoreUnused(descriptor);
-
-    std::array<DataType, 5> supportedInputTypes =
+    std::array<DataType, 7> supportedInputTypes =
     {
+        DataType::Boolean,
         DataType::BFloat16,
         DataType::Float32,
         DataType::Float16,
         DataType::QAsymmU8,
-        DataType::QSymmS16
+        DataType::QSymmS16,
+        DataType::Signed32
     };
 
     bool supported = true;
diff --git a/src/backends/reference/workloads/BaseIterator.hpp b/src/backends/reference/workloads/BaseIterator.hpp
index 5cae5bd..f43e8b6 100644
--- a/src/backends/reference/workloads/BaseIterator.hpp
+++ b/src/backends/reference/workloads/BaseIterator.hpp
@@ -275,6 +275,22 @@
     }
 };
 
+class BooleanDecoder : public TypedIterator<const uint8_t, Decoder<float>>
+{
+public:
+    BooleanDecoder(const uint8_t* data)
+            : TypedIterator(data) {}
+
+    BooleanDecoder()
+            : BooleanDecoder(nullptr) {}
+
+    float Get() const override
+    {
+        return *m_Iterator;
+    }
+
+};
+
 class QASymm8Encoder : public TypedIterator<uint8_t, Encoder<float>>
 {
 public:
diff --git a/src/backends/reference/workloads/Decoders.hpp b/src/backends/reference/workloads/Decoders.hpp
index 83c57c1..3434ccb 100644
--- a/src/backends/reference/workloads/Decoders.hpp
+++ b/src/backends/reference/workloads/Decoders.hpp
@@ -136,6 +136,10 @@
                     info.GetQuantizationOffset());
             }
         }
+        case armnn::DataType::Boolean:
+        {
+            return std::make_unique<BooleanDecoder>(static_cast<const uint8_t*>(data));
+        }
         default:
         {
             BOOST_ASSERT_MSG(false, "Unsupported Data Type!");