From: Ilya Lavrenov Date: Tue, 17 Dec 2013 10:14:04 +0000 (+0400) Subject: fixed UMat::copyTo(UMat) X-Git-Tag: accepted/tizen/6.0/unified/20201030.111113~3620^2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=ac030c16f1bc36c53322c867509e4b7b2c56296a;p=platform%2Fupstream%2Fopencv.git fixed UMat::copyTo(UMat) --- diff --git a/modules/core/src/matrix.cpp b/modules/core/src/matrix.cpp index 871fb38..17f8bcd 100644 --- a/modules/core/src/matrix.cpp +++ b/modules/core/src/matrix.cpp @@ -134,11 +134,11 @@ void MatAllocator::copy(UMatData* usrc, UMatData* udst, int dims, const size_t s { CV_Assert( sz[i] <= (size_t)INT_MAX ); if( sz[i] == 0 ) - return; + return; if( srcofs ) - srcptr += srcofs[i]*(i <= dims-2 ? srcstep[i] : 1); + srcptr += srcofs[i]*(i <= dims-2 ? srcstep[i] : 1); if( dstofs ) - dstptr += dstofs[i]*(i <= dims-2 ? dststep[i] : 1); + dstptr += dstofs[i]*(i <= dims-2 ? dststep[i] : 1); isz[i] = (int)sz[i]; } diff --git a/modules/core/src/umatrix.cpp b/modules/core/src/umatrix.cpp index 1248387..50522bd 100644 --- a/modules/core/src/umatrix.cpp +++ b/modules/core/src/umatrix.cpp @@ -643,11 +643,10 @@ void UMat::copyTo(OutputArray _dst) const if( _dst.kind() == _InputArray::UMAT ) { UMat dst = _dst.getUMat(); - void* srchandle = handle(ACCESS_READ); - void* dsthandle = dst.handle(ACCESS_WRITE); - if( srchandle == dsthandle && dst.offset == offset ) + if( u == dst.u && dst.offset == offset ) return; dst.ndoffset(dstofs); + dstofs[dims-1] *= esz; CV_Assert(u->currAllocator == dst.u->currAllocator); u->currAllocator->copy(u, dst.u, dims, sz, srcofs, step.p, dstofs, dst.step.p, false); } diff --git a/modules/core/test/ocl/test_matrix_operation.cpp b/modules/core/test/ocl/test_matrix_operation.cpp index 599eb06..aabbb3f 100644 --- a/modules/core/test/ocl/test_matrix_operation.cpp +++ b/modules/core/test/ocl/test_matrix_operation.cpp @@ -103,9 +103,27 @@ OCL_TEST_P(ConvertTo, Accuracy) } } +typedef MatrixTestBase CopyTo; + +OCL_TEST_P(CopyTo, Accuracy) +{ + for (int j = 0; j < test_loop_times; j++) + { + generateTestData(); + + OCL_OFF(src_roi.copyTo(dst_roi)); + OCL_ON(usrc_roi.copyTo(udst_roi)); + + OCL_EXPECT_MATS_NEAR(dst, 0); + } +} + OCL_INSTANTIATE_TEST_CASE_P(MatrixOperation, ConvertTo, Combine( OCL_ALL_DEPTHS, OCL_ALL_DEPTHS, OCL_ALL_CHANNELS, Bool())); +OCL_INSTANTIATE_TEST_CASE_P(MatrixOperation, CopyTo, Combine( + OCL_ALL_DEPTHS, Values((MatDepth)0), OCL_ALL_CHANNELS, Bool())); + } } // namespace cvtest::ocl #endif