IVGCVSW-3454 Fix VTS convolution test failures where output shape is incorrect

 * Changed calculation when calculating implicit padding to take dilation into account.
 * Added CalcPadding function that takes dilation as a parameter.

Signed-off-by: Mike Kelly <mike.kelly@arm.com>
Change-Id: I38981d9b2cfe8ef36cd0a14d090b541111e7bf34
diff --git a/1.2/HalPolicy.cpp b/1.2/HalPolicy.cpp
index 5a940be..d7452c6 100644
--- a/1.2/HalPolicy.cpp
+++ b/1.2/HalPolicy.cpp
@@ -243,8 +243,8 @@
         const uint32_t inputX  = inputInfo.GetShape()[widthIndex];
         const uint32_t inputY  = inputInfo.GetShape()[heightIndex];
 
-        CalcPadding(inputX, kernelX, desc.m_StrideX, desc.m_PadLeft, desc.m_PadRight, paddingScheme);
-        CalcPadding(inputY, kernelY, desc.m_StrideY, desc.m_PadTop, desc.m_PadBottom, paddingScheme);
+        CalcPadding(inputX, kernelX, desc.m_StrideX, desc.m_DilationX, desc.m_PadLeft, desc.m_PadRight, paddingScheme);
+        CalcPadding(inputY, kernelY, desc.m_StrideY, desc.m_DilationY, desc.m_PadTop, desc.m_PadBottom, paddingScheme);
 
     }
     else if (operation.inputs.size() >= 10)
@@ -400,8 +400,8 @@
         const uint32_t inputX  = inputInfo.GetShape()[widthIndex];
         const uint32_t inputY  = inputInfo.GetShape()[heightIndex];
 
-        CalcPadding(inputX, kernelX, desc.m_StrideX, desc.m_PadLeft, desc.m_PadRight, paddingScheme);
-        CalcPadding(inputY, kernelY, desc.m_StrideY, desc.m_PadTop, desc.m_PadBottom, paddingScheme);
+        CalcPadding(inputX, kernelX, desc.m_StrideX, desc.m_DilationX, desc.m_PadLeft, desc.m_PadRight, paddingScheme);
+        CalcPadding(inputY, kernelY, desc.m_StrideY, desc.m_DilationY, desc.m_PadTop, desc.m_PadBottom, paddingScheme);
     }
     else if (operation.inputs.size() >= 11)
     {
diff --git a/ConversionUtils.hpp b/ConversionUtils.hpp
index c9be000..c59da1d 100644
--- a/ConversionUtils.hpp
+++ b/ConversionUtils.hpp
@@ -300,6 +300,20 @@
     outPadTail = boost::numeric_cast<uint32_t>(padTail);
 }
 
+#ifdef ARMNN_ANDROID_NN_V1_2
+
+void CalcPadding(uint32_t input, uint32_t kernel, uint32_t stride, uint32_t dilation, uint32_t& outPadHead,
+                 uint32_t& outPadTail, android::nn::PaddingScheme scheme)
+{
+    int32_t padHead;
+    int32_t padTail;
+    calculateExplicitPadding(input, stride, dilation, kernel, scheme, &padHead, &padTail);
+    outPadHead = boost::numeric_cast<uint32_t>(padHead);
+    outPadTail = boost::numeric_cast<uint32_t>(padTail);
+}
+
+#endif
+
 Shape GetOperandShape(const V1_0::Operand& operand)
 {
     Shape shape;