diff --git a/modules/core/src/ocl.cpp b/modules/core/src/ocl.cpp index c51f90ad6..2144431df 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 906062482..1d073e63a 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));