From e30875bcef0a7738463fcb717c6fc1c96ae14d8b Mon Sep 17 00:00:00 2001 From: Ilya Lavrenov Date: Fri, 13 Dec 2013 17:59:53 +0400 Subject: [PATCH] fixed UMat sync problems --- modules/core/src/umatrix.cpp | 6 ++++-- modules/core/test/test_umat.cpp | 14 ++++++++++++++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/modules/core/src/umatrix.cpp b/modules/core/src/umatrix.cpp index e6d9c9e38b..2d97a04b4a 100644 --- a/modules/core/src/umatrix.cpp +++ b/modules/core/src/umatrix.cpp @@ -580,7 +580,6 @@ Mat UMat::getMat(int accessFlags) const Mat hdr(dims, size.p, type(), u->data + offset, step.p); hdr.flags = flags; hdr.u = u; - hdr.flags = flags; hdr.datastart = u->data; hdr.data = hdr.datastart + offset; hdr.datalimit = hdr.dataend = u->data + u->size; @@ -588,11 +587,14 @@ Mat UMat::getMat(int accessFlags) const return hdr; } -void* UMat::handle(int /*accessFlags*/) const +void* UMat::handle(int accessFlags) const { if( !u ) return 0; + if ((accessFlags & ACCESS_WRITE) != 0) + u->markHostCopyObsolete(true); + // check flags: if CPU copy is newer, copy it back to GPU. if( u->deviceCopyObsolete() ) { diff --git a/modules/core/test/test_umat.cpp b/modules/core/test/test_umat.cpp index 7cd523d85c..653dc49fb9 100644 --- a/modules/core/test/test_umat.cpp +++ b/modules/core/test/test_umat.cpp @@ -237,3 +237,17 @@ TEST(Core_UMat, getUMat) EXPECT_EQ(err, 0.); } } + +TEST(UMat, Sync) +{ + UMat um(10, 10, CV_8UC1); + + { + Mat m = um.getMat(ACCESS_WRITE); + m.setTo(cv::Scalar::all(17)); + } + + um.setTo(cv::Scalar::all(19)); + + EXPECT_EQ(0, cv::norm(um.getMat(ACCESS_READ), cv::Mat(um.size(), um.type(), 19), NORM_INF)); +}