From f6b758699be92a7d1c8433a509ecbb213dfbac55 Mon Sep 17 00:00:00 2001 From: Andrey Pavlenko Date: Mon, 24 Aug 2015 19:21:37 +0300 Subject: [PATCH 1/4] Revert merging of pull request #5176 from vladimir-dudnik:master (reverted from commit 5ee00ec5c6b21debd461808f584accbe7c42c869) --- modules/core/src/ocl.cpp | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/modules/core/src/ocl.cpp b/modules/core/src/ocl.cpp index f3bdf1682..c51f90ad6 100644 --- a/modules/core/src/ocl.cpp +++ b/modules/core/src/ocl.cpp @@ -4572,16 +4572,13 @@ public: else { // CL_MEM_USE_HOST_PTR (nothing is required) and OTHER cases - if (u->flags & UMatData::USER_ALLOCATED) - { - cl_int retval = 0; - void* data = clEnqueueMapBuffer(q, (cl_mem)u->handle, CL_TRUE, - (CL_MAP_READ | CL_MAP_WRITE), - 0, u->size, 0, 0, 0, &retval); - CV_OclDbgAssert(retval == CL_SUCCESS); - CV_OclDbgAssert(clEnqueueUnmapMemObject(q, (cl_mem)u->handle, data, 0, 0, 0) == CL_SUCCESS); - CV_OclDbgAssert(clFinish(q) == CL_SUCCESS); - } + cl_int retval = 0; + void* data = clEnqueueMapBuffer(q, (cl_mem)u->handle, CL_TRUE, + (CL_MAP_READ | CL_MAP_WRITE), + 0, u->size, 0, 0, 0, &retval); + CV_OclDbgAssert(retval == CL_SUCCESS); + CV_OclDbgAssert(clEnqueueUnmapMemObject(q, (cl_mem)u->handle, data, 0, 0, 0) == CL_SUCCESS); + CV_OclDbgAssert(clFinish(q) == CL_SUCCESS); } } u->markHostCopyObsolete(false); From 3656a1aa6696b3eea76f163d5d98fb73f0055168 Mon Sep 17 00:00:00 2001 From: Andrey Pavlenko Date: Tue, 25 Aug 2015 17:25:03 +0300 Subject: [PATCH 2/4] 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 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)); From 4aefb9f2fc19df058ce13fe345454bd8a3c9cd74 Mon Sep 17 00:00:00 2001 From: Andrey Pavlenko Date: Wed, 26 Aug 2015 13:38:26 +0300 Subject: [PATCH 3/4] making the test deepper --- modules/core/test/test_umat.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/core/test/test_umat.cpp b/modules/core/test/test_umat.cpp index 1d073e63a..40ec2b8c6 100644 --- a/modules/core/test/test_umat.cpp +++ b/modules/core/test/test_umat.cpp @@ -1036,7 +1036,7 @@ TEST(UMat, map_unmap_counting) UMat um = m.getUMat(ACCESS_RW); { Mat d1 = um.getMat(ACCESS_RW); - //Mat d2 = um.getMat(ACCESS_RW); + Mat d2 = um.getMat(ACCESS_RW); d1.release(); } void* h = NULL; From b78eb49178d9d2b8e2fd41da96b38181ebb36475 Mon Sep 17 00:00:00 2001 From: Andrey Pavlenko Date: Wed, 26 Aug 2015 14:15:18 +0300 Subject: [PATCH 4/4] removing a garbage comment --- modules/core/src/ocl.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/core/src/ocl.cpp b/modules/core/src/ocl.cpp index 2144431df..1074f9b01 100644 --- a/modules/core/src/ocl.cpp +++ b/modules/core/src/ocl.cpp @@ -4571,7 +4571,6 @@ public: } else { - // CL_MEM_USE_HOST_PTR (nothing is required) and OTHER cases cl_int retval = 0; void* data = clEnqueueMapBuffer(q, (cl_mem)u->handle, CL_TRUE, (CL_MAP_READ | CL_MAP_WRITE),