IVGCVSW-3639 Add 5d tensor support

* Increased MaxNumOfTensorDimensions and fixed issues related to its use
* Fixed issues caused by assuming 5d tensors are invalid
* Updated ArmComputeTensorUtils for 5d tensors
* Added 5d tensor unit tests for add, mul, stack and reshape (needed by IVGCVSW-3527)

Signed-off-by: Matthew Jackson <matthew.jackson@arm.com>
Change-Id: I5bcd64942d0d04efcc6c5acb240ad4b88e010743
diff --git a/src/backends/backendsCommon/WorkloadUtils.hpp b/src/backends/backendsCommon/WorkloadUtils.hpp
index a1a8d2a..7e3ac39 100644
--- a/src/backends/backendsCommon/WorkloadUtils.hpp
+++ b/src/backends/backendsCommon/WorkloadUtils.hpp
@@ -46,13 +46,14 @@
 template<typename CopyFunc>
 void CopyTensorContentsGeneric(const ITensorHandle* srcTensor, ITensorHandle* dstTensor, CopyFunc copy)
 {
-    static_assert(MaxNumOfTensorDimensions == 4, "Please update CopyTensorContents");
+    static_assert(MaxNumOfTensorDimensions == 5, "Please update CopyTensorContents");
 
     TensorShape srcStrides = srcTensor->GetStrides();
     const TensorShape& srcShape = srcTensor->GetShape();
     TensorShape dstStrides = dstTensor->GetStrides();
     const TensorShape& dstShape = dstTensor->GetShape();
 
+    size_t srcDepth = 1;
     size_t srcBatches = 1;
     size_t srcChannels = 1;
     size_t srcHeight = 1;
@@ -61,8 +62,10 @@
                  srcWidth,
                  srcHeight,
                  srcChannels,
-                 srcBatches);
+                 srcBatches,
+                 srcDepth);
 
+    size_t srcDepthStride = 0;
     size_t srcBatchStride = 0;
     size_t srcChannelStride = 0;
     size_t srcHeightStride = 0;
@@ -71,8 +74,10 @@
                  srcWidthStride,
                  srcHeightStride,
                  srcChannelStride,
-                 srcBatchStride);
+                 srcBatchStride,
+                 srcDepthStride);
 
+    size_t dstDepth = 1;
     size_t dstBatches = 1;
     size_t dstChannels = 1;
     size_t dstHeight = 1;
@@ -81,8 +86,10 @@
                  dstWidth,
                  dstHeight,
                  dstChannels,
-                 dstBatches);
+                 dstBatches,
+                 dstDepth);
 
+    size_t dstDepthStride = 0;
     size_t dstBatchStride = 0;
     size_t dstChannelStride = 0;
     size_t dstHeightStride = 0;
@@ -91,7 +98,8 @@
                  dstWidthStride,
                  dstHeightStride,
                  dstChannelStride,
-                 dstBatchStride);
+                 dstBatchStride,
+                 dstDepthStride);
 
     const unsigned char* srcData;
     unsigned char* dstData;
@@ -105,26 +113,34 @@
     size_t copyHeight = std::min(srcHeight, dstHeight);
     size_t copyChannels = std::min(srcChannels, dstChannels);
     size_t copyBatches = std::min(srcBatches, dstBatches);
+    size_t copyDepth = std::min(srcDepth, dstDepth);
 
-    for(unsigned int b=0; b < copyBatches; ++b)
+    for (unsigned int d=0; d < copyDepth; ++d)
     {
-        auto srcPtrBatch = srcData;
-        auto dstPtrBatch = dstData;
-        for (unsigned int c=0; c< copyChannels; ++c)
+        auto srcPtrDepth = srcData;
+        auto dstPtrDepth = dstData;
+        for (unsigned int b=0; b < copyBatches; ++b)
         {
-            auto srcPtrChannel = srcData;
-            auto dstPtrChannel = dstData;
-            for (unsigned int h=0; h < copyHeight; ++h)
+            auto srcPtrBatch = srcData;
+            auto dstPtrBatch = dstData;
+            for (unsigned int c=0; c< copyChannels; ++c)
             {
-                copy(dstData, srcData, copyLength);
-                dstData += dstHeightStride;
-                srcData += srcHeightStride;
+                auto srcPtrChannel = srcData;
+                auto dstPtrChannel = dstData;
+                for (unsigned int h=0; h < copyHeight; ++h)
+                {
+                    copy(dstData, srcData, copyLength);
+                    dstData += dstHeightStride;
+                    srcData += srcHeightStride;
+                }
+                dstData += (static_cast<long>(dstChannelStride) - (dstData - dstPtrChannel));
+                srcData += (static_cast<long>(srcChannelStride) - (srcData - srcPtrChannel));
             }
-            dstData += (static_cast<long>(dstChannelStride) - (dstData - dstPtrChannel));
-            srcData += (static_cast<long>(srcChannelStride) - (srcData - srcPtrChannel));
+            dstData += (static_cast<long>(dstBatchStride)-(dstData - dstPtrBatch));
+            srcData += (static_cast<long>(srcBatchStride)-(srcData - srcPtrBatch));
         }
-        dstData += (static_cast<long>(dstBatchStride)-(dstData - dstPtrBatch));
-        srcData += (static_cast<long>(srcBatchStride)-(srcData - srcPtrBatch));
+        dstData += (static_cast<long>(dstDepthStride)-(dstData - dstPtrDepth));
+        srcData += (static_cast<long>(srcDepthStride)-(srcData - srcPtrDepth));
     }
 
     srcTensor->Unmap();