Skip to content

Commit a78da45

Browse files
committed
Merge pull request opencv#5242 from apavlenko:fix_releasing_temp_umat
2 parents 4b0f3bf + b78eb49 commit a78da45

File tree

2 files changed

+15
-26
lines changed

2 files changed

+15
-26
lines changed

modules/core/src/ocl.cpp

Lines changed: 12 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -4571,17 +4571,13 @@ class OpenCLAllocator : public MatAllocator
45714571
}
45724572
else
45734573
{
4574-
// CL_MEM_USE_HOST_PTR (nothing is required) and OTHER cases
4575-
if (u->flags & UMatData::USER_ALLOCATED)
4576-
{
4577-
cl_int retval = 0;
4578-
void* data = clEnqueueMapBuffer(q, (cl_mem)u->handle, CL_TRUE,
4579-
(CL_MAP_READ | CL_MAP_WRITE),
4580-
0, u->size, 0, 0, 0, &retval);
4581-
CV_OclDbgAssert(retval == CL_SUCCESS);
4582-
CV_OclDbgAssert(clEnqueueUnmapMemObject(q, (cl_mem)u->handle, data, 0, 0, 0) == CL_SUCCESS);
4583-
CV_OclDbgAssert(clFinish(q) == CL_SUCCESS);
4584-
}
4574+
cl_int retval = 0;
4575+
void* data = clEnqueueMapBuffer(q, (cl_mem)u->handle, CL_TRUE,
4576+
(CL_MAP_READ | CL_MAP_WRITE),
4577+
0, u->size, 0, 0, 0, &retval);
4578+
CV_OclDbgAssert(retval == CL_SUCCESS);
4579+
CV_OclDbgAssert(clEnqueueUnmapMemObject(q, (cl_mem)u->handle, data, 0, 0, 0) == CL_SUCCESS);
4580+
CV_OclDbgAssert(clFinish(q) == CL_SUCCESS);
45854581
}
45864582
}
45874583
u->markHostCopyObsolete(false);
@@ -4686,8 +4682,6 @@ class OpenCLAllocator : public MatAllocator
46864682

46874683
cl_command_queue q = (cl_command_queue)Queue::getDefault().ptr();
46884684

4689-
// FIXIT Workaround for UMat synchronization issue
4690-
// if( u->refcount == 0 )
46914685
{
46924686
if( !u->copyOnMap() )
46934687
{
@@ -4720,11 +4714,6 @@ class OpenCLAllocator : public MatAllocator
47204714
return;
47214715
}
47224716
#endif
4723-
if (!u->hostCopyObsolete()) // FIXIT Workaround for UMat synchronization issue
4724-
{
4725-
CV_Assert(u->data);
4726-
return;
4727-
}
47284717

47294718
cl_int retval = 0;
47304719
u->data = (uchar*)clEnqueueMapBuffer(q, (cl_mem)u->handle, CL_TRUE,
@@ -4771,10 +4760,6 @@ class OpenCLAllocator : public MatAllocator
47714760

47724761
UMatDataAutoLock autolock(u);
47734762

4774-
// FIXIT Workaround for UMat synchronization issue
4775-
if(u->refcount > 0)
4776-
return;
4777-
47784763
cl_command_queue q = (cl_command_queue)Queue::getDefault().ptr();
47794764
cl_int retval = 0;
47804765
if( !u->copyOnMap() && u->deviceMemMapped() )
@@ -4800,7 +4785,8 @@ class OpenCLAllocator : public MatAllocator
48004785
u->allocatorFlags_ &= ~svm::OPENCL_SVM_BUFFER_MAP;
48014786
}
48024787
}
4803-
u->data = 0;
4788+
if (u->refcount == 0)
4789+
u->data = 0;
48044790
u->markDeviceCopyObsolete(false);
48054791
u->markHostCopyObsolete(true);
48064792
return;
@@ -4813,7 +4799,9 @@ class OpenCLAllocator : public MatAllocator
48134799
// required for multithreaded applications (see stitching test)
48144800
CV_OclDbgAssert(clFinish(q) == CL_SUCCESS);
48154801
}
4816-
u->data = 0;
4802+
4803+
if (u->refcount == 0)
4804+
u->data = 0;
48174805
}
48184806
else if( u->copyOnMap() && u->deviceCopyObsolete() )
48194807
{

modules/core/test/test_umat.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1102,8 +1102,9 @@ TEST(UMat, map_unmap_counting)
11021102
Mat m(Size(10, 10), CV_8UC1);
11031103
UMat um = m.getUMat(ACCESS_RW);
11041104
{
1105-
Mat d = um.getMat(ACCESS_RW);
1106-
d.release();
1105+
Mat d1 = um.getMat(ACCESS_RW);
1106+
Mat d2 = um.getMat(ACCESS_RW);
1107+
d1.release();
11071108
}
11081109
void* h = NULL;
11091110
EXPECT_NO_THROW(h = um.handle(ACCESS_RW));

0 commit comments

Comments
 (0)