IVGCVSW-3219: Add QSymm16 support to the ResizeBilinear Reference workload

 * Adds CreateWorkload and LayerTests for QSymm16
 * Updated ResizeBilinearQueueDescriptor::Validate function
 * Reimplemented RefLayerSupport::IsResizeBilinearSupported

Signed-off-by: Ellen Norris-Thompson <ellen.norris-thompson@arm.com>
Change-Id: Id9d14d3b41d26ac3d51227ab248ce8cca9dc9969
diff --git a/src/backends/reference/RefLayerSupport.cpp b/src/backends/reference/RefLayerSupport.cpp
index a25338f..919dd5f 100644
--- a/src/backends/reference/RefLayerSupport.cpp
+++ b/src/backends/reference/RefLayerSupport.cpp
@@ -1183,11 +1183,24 @@
                                                 const TensorInfo& output,
                                                 Optional<std::string&> reasonIfUnsupported) const
 {
-    ignore_unused(output);
-    return IsSupportedForDataTypeRef(reasonIfUnsupported,
-                                     input.GetDataType(),
-                                     &TrueFunc<>,
-                                     &TrueFunc<>);
+    bool supported = true;
+    std::array<DataType,3> supportedTypes =
+            {
+                    DataType::Float32,
+                    DataType::QuantisedAsymm8,
+                    DataType::QuantisedSymm16
+            };
+
+    supported &= CheckSupportRule(TypeAnyOf(input, supportedTypes), reasonIfUnsupported,
+                                  "Reference ResizeBilinear: input type not supported");
+
+    supported &= CheckSupportRule(TypeAnyOf(output, supportedTypes), reasonIfUnsupported,
+                                  "Reference ResizeBilinear: output type not supported");
+
+    supported &= CheckSupportRule(TypesAreEqual(input, output), reasonIfUnsupported,
+                                  "Reference ResizeBilinear: input and output types not matching");
+
+    return supported;
 }
 
 bool RefLayerSupport::IsRsqrtSupported(const TensorInfo& input,
diff --git a/src/backends/reference/test/RefCreateWorkloadTests.cpp b/src/backends/reference/test/RefCreateWorkloadTests.cpp
index 7816d5b..e541692 100644
--- a/src/backends/reference/test/RefCreateWorkloadTests.cpp
+++ b/src/backends/reference/test/RefCreateWorkloadTests.cpp
@@ -651,6 +651,11 @@
     RefCreateResizeBilinearTest<RefResizeBilinearWorkload, armnn::DataType::QuantisedAsymm8>(DataLayout::NCHW);
 }
 
+BOOST_AUTO_TEST_CASE(CreateResizeBilinearQuantisedAsymm16)
+{
+    RefCreateResizeBilinearTest<RefResizeBilinearWorkload, armnn::DataType::QuantisedSymm16>(DataLayout::NCHW);
+}
+
 BOOST_AUTO_TEST_CASE(CreateResizeBilinearFloat32Nhwc)
 {
     RefCreateResizeBilinearTest<RefResizeBilinearWorkload, armnn::DataType::Float32>(DataLayout::NHWC);
diff --git a/src/backends/reference/test/RefLayerTests.cpp b/src/backends/reference/test/RefLayerTests.cpp
index 155da24..7540f1d 100644
--- a/src/backends/reference/test/RefLayerTests.cpp
+++ b/src/backends/reference/test/RefLayerTests.cpp
@@ -407,30 +407,45 @@
 ARMNN_AUTO_TEST_CASE(SimpleResizeBilinearUint8,
                      SimpleResizeBilinearTest<armnn::DataType::QuantisedAsymm8>,
                      armnn::DataLayout::NCHW)
+ARMNN_AUTO_TEST_CASE(SimpleResizeBilinearUint16,
+                     SimpleResizeBilinearTest<armnn::DataType::QuantisedSymm16>,
+                     armnn::DataLayout::NCHW)
 ARMNN_AUTO_TEST_CASE(ResizeBilinearNop,
                      ResizeBilinearNopTest<armnn::DataType::Float32>,
                      armnn::DataLayout::NCHW)
 ARMNN_AUTO_TEST_CASE(ResizeBilinearNopUint8,
                      ResizeBilinearNopTest<armnn::DataType::QuantisedAsymm8>,
                      armnn::DataLayout::NCHW)
+ARMNN_AUTO_TEST_CASE(esizeBilinearNopUint16,
+                     SimpleResizeBilinearTest<armnn::DataType::QuantisedSymm16>,
+                     armnn::DataLayout::NCHW)
 ARMNN_AUTO_TEST_CASE(ResizeBilinearSqMin,
                      ResizeBilinearSqMinTest<armnn::DataType::Float32>,
                      armnn::DataLayout::NCHW)
 ARMNN_AUTO_TEST_CASE(ResizeBilinearSqMinUint8,
                      ResizeBilinearSqMinTest<armnn::DataType::QuantisedAsymm8>,
                      armnn::DataLayout::NCHW)
+ARMNN_AUTO_TEST_CASE(ResizeBilinearSqMinUint16,
+                     SimpleResizeBilinearTest<armnn::DataType::QuantisedSymm16>,
+                     armnn::DataLayout::NCHW)
 ARMNN_AUTO_TEST_CASE(ResizeBilinearMin,
                      ResizeBilinearMinTest<armnn::DataType::Float32>,
                      armnn::DataLayout::NCHW)
 ARMNN_AUTO_TEST_CASE(ResizeBilinearMinUint8,
                      ResizeBilinearMinTest<armnn::DataType::QuantisedAsymm8>,
                      armnn::DataLayout::NCHW)
+ARMNN_AUTO_TEST_CASE(ResizeBilinearMinUint16,
+                     SimpleResizeBilinearTest<armnn::DataType::QuantisedSymm16>,
+                     armnn::DataLayout::NCHW)
 ARMNN_AUTO_TEST_CASE(ResizeBilinearMag,
                      ResizeBilinearMagTest<armnn::DataType::Float32>,
                      armnn::DataLayout::NCHW)
 ARMNN_AUTO_TEST_CASE(ResizeBilinearMagUint8,
                      ResizeBilinearMagTest<armnn::DataType::QuantisedAsymm8>,
                      armnn::DataLayout::NCHW)
+ARMNN_AUTO_TEST_CASE(ResizeBilinearMagUint16,
+                     SimpleResizeBilinearTest<armnn::DataType::QuantisedSymm16>,
+                     armnn::DataLayout::NCHW)
 
 // Resize Bilinear - NHWC
 ARMNN_AUTO_TEST_CASE(ResizeBilinearNopNhwc,
@@ -439,30 +454,45 @@
 ARMNN_AUTO_TEST_CASE(ResizeBilinearNopUint8Nhwc,
                      ResizeBilinearNopTest<armnn::DataType::QuantisedAsymm8>,
                      armnn::DataLayout::NHWC)
+ARMNN_AUTO_TEST_CASE(ResizeBilinearNopUint16Nhwc,
+                     ResizeBilinearNopTest<armnn::DataType::QuantisedSymm16>,
+                     armnn::DataLayout::NHWC)
 ARMNN_AUTO_TEST_CASE(SimpleResizeBilinearNhwc,
                      SimpleResizeBilinearTest<armnn::DataType::Float32>,
                      armnn::DataLayout::NHWC)
 ARMNN_AUTO_TEST_CASE(SimpleResizeBilinearUint8Nhwc,
                      SimpleResizeBilinearTest<armnn::DataType::QuantisedAsymm8>,
                      armnn::DataLayout::NHWC)
+ARMNN_AUTO_TEST_CASE(SimpleResizeBilinearUint16Nhwc,
+                     ResizeBilinearNopTest<armnn::DataType::QuantisedSymm16>,
+                     armnn::DataLayout::NHWC)
 ARMNN_AUTO_TEST_CASE(ResizeBilinearSqMinNhwc,
                      ResizeBilinearSqMinTest<armnn::DataType::Float32>,
                      armnn::DataLayout::NHWC)
 ARMNN_AUTO_TEST_CASE(ResizeBilinearSqMinUint8Nhwc,
                      ResizeBilinearSqMinTest<armnn::DataType::QuantisedAsymm8>,
                      armnn::DataLayout::NHWC)
+ARMNN_AUTO_TEST_CASE(ResizeBilinearSqMinUint16Nhwc,
+                     ResizeBilinearNopTest<armnn::DataType::QuantisedSymm16>,
+                     armnn::DataLayout::NHWC)
 ARMNN_AUTO_TEST_CASE(ResizeBilinearMinNhwc,
                      ResizeBilinearMinTest<armnn::DataType::Float32>,
                      armnn::DataLayout::NHWC)
 ARMNN_AUTO_TEST_CASE(ResizeBilinearMinUint8Nhwc,
                      ResizeBilinearMinTest<armnn::DataType::QuantisedAsymm8>,
                      armnn::DataLayout::NHWC)
+ARMNN_AUTO_TEST_CASE(ResizeBilinearMinUint16Nhwc,
+                     ResizeBilinearNopTest<armnn::DataType::QuantisedSymm16>,
+                     armnn::DataLayout::NHWC)
 ARMNN_AUTO_TEST_CASE(ResizeBilinearMagNhwc,
                      ResizeBilinearMagTest<armnn::DataType::Float32>,
                      armnn::DataLayout::NHWC)
 ARMNN_AUTO_TEST_CASE(ResizeBilinearMagUint8Nhwc,
                      ResizeBilinearMagTest<armnn::DataType::QuantisedAsymm8>,
                      armnn::DataLayout::NHWC)
+ARMNN_AUTO_TEST_CASE(ResizeBilinearMagUint16Nhwc,
+                     ResizeBilinearNopTest<armnn::DataType::QuantisedSymm16>,
+                     armnn::DataLayout::NHWC)
 
 // Fake Quantization
 ARMNN_AUTO_TEST_CASE(FakeQuantization, FakeQuantizationTest)