COMPMID-424 Add tests for Gaussian3x3

* Add reference implementation and NEON CL validation tests for gaussian3x3
* Add tests for different border modes
* Incoporate PaddingCalculator

Change-Id: Ia3cd5cb2cd0b4d870a217e6aedecc01369dc2541
Reviewed-on: http://mpd-gerrit.cambridge.arm.com/78125
Reviewed-by: Moritz Pflanzer <moritz.pflanzer@arm.com>
Tested-by: Kaizen <jeremy.johnson+kaizengerrit@arm.com>
diff --git a/tests/validation/TensorOperations.h b/tests/validation/TensorOperations.h
index 5695593..4905e05 100644
--- a/tests/validation/TensorOperations.h
+++ b/tests/validation/TensorOperations.h
@@ -606,6 +606,19 @@
     }
 }
 
+// Gaussian3x3 filter
+template <typename T, typename = typename std::enable_if<std::is_integral<T>::value>::type>
+void gaussian3x3(const Tensor<T> &in, Tensor<T> &out, BorderMode border_mode, T constant_border_value)
+{
+    const std::array<T, 9> filter{ { 1, 2, 1, 2, 4, 2, 1, 2, 1 } };
+    const float scale = 1.f / 16.f;
+    for(int element_idx = 0; element_idx < in.num_elements(); ++element_idx)
+    {
+        const Coordinates id = index2coord(in.shape(), element_idx);
+        apply_2d_spatial_filter(id, in, out, TensorShape(3U, 3U), filter.data(), scale, border_mode, constant_border_value);
+    }
+}
+
 // Matrix multiplication for floating point type
 template <typename T, typename std::enable_if<is_floating_point<T>::value, int>::type * = nullptr>
 void gemm(const Tensor<T> &in1, const Tensor<T> &in2, const Tensor<T> &in3, Tensor<T> &out, float alpha, float beta)