From 3656a1aa6696b3eea76f163d5d98fb73f0055168 Mon Sep 17 00:00:00 2001 From: Andrey Pavlenko Date: Tue, 25 Aug 2015 17:25:03 +0300 Subject: [PATCH] fixing 'map_unmap_counting' --- modules/core/src/ocl.cpp | 18 +++++------------- modules/core/test/test_umat.cpp | 5 +++-- 2 files changed, 8 insertions(+), 15 deletions(-) diff --git a/modules/core/src/ocl.cpp b/modules/core/src/ocl.cpp index c51f90ad69..2144431df4 100644 --- a/modules/core/src/ocl.cpp +++ b/modules/core/src/ocl.cpp @@ -4683,8 +4683,6 @@ public: cl_command_queue q = (cl_command_queue)Queue::getDefault().ptr(); - // FIXIT Workaround for UMat synchronization issue - // if( u->refcount == 0 ) { if( !u->copyOnMap() ) { @@ -4717,11 +4715,6 @@ public: return; } #endif - if (!u->hostCopyObsolete()) // FIXIT Workaround for UMat synchronization issue - { - CV_Assert(u->data); - return; - } cl_int retval = 0; u->data = (uchar*)clEnqueueMapBuffer(q, (cl_mem)u->handle, CL_TRUE, @@ -4768,10 +4761,6 @@ public: UMatDataAutoLock autolock(u); - // FIXIT Workaround for UMat synchronization issue - if(u->refcount > 0) - return; - cl_command_queue q = (cl_command_queue)Queue::getDefault().ptr(); cl_int retval = 0; if( !u->copyOnMap() && u->deviceMemMapped() ) @@ -4797,7 +4786,8 @@ public: u->allocatorFlags_ &= ~svm::OPENCL_SVM_BUFFER_MAP; } } - u->data = 0; + if (u->refcount == 0) + u->data = 0; u->markDeviceCopyObsolete(false); u->markHostCopyObsolete(true); return; @@ -4810,7 +4800,9 @@ public: // required for multithreaded applications (see stitching test) CV_OclDbgAssert(clFinish(q) == CL_SUCCESS); } - u->data = 0; + + if (u->refcount == 0) + u->data = 0; } else if( u->copyOnMap() && u->deviceCopyObsolete() ) { diff --git a/modules/core/test/test_umat.cpp b/modules/core/test/test_umat.cpp index 9060624827..1d073e63a9 100644 --- a/modules/core/test/test_umat.cpp +++ b/modules/core/test/test_umat.cpp @@ -1035,8 +1035,9 @@ TEST(UMat, map_unmap_counting) Mat m(Size(10, 10), CV_8UC1); UMat um = m.getUMat(ACCESS_RW); { - Mat d = um.getMat(ACCESS_RW); - d.release(); + Mat d1 = um.getMat(ACCESS_RW); + //Mat d2 = um.getMat(ACCESS_RW); + d1.release(); } void* h = NULL; EXPECT_NO_THROW(h = um.handle(ACCESS_RW));