From d76b41b50e247a98cef9e7a0f04f79efa8641fa1 Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Fri, 20 Apr 2018 14:51:55 +0300 Subject: [PATCH] ocl: CL_MEM_USE_HOST_PTR workaround test --- modules/core/src/ocl.cpp | 4 +++- modules/core/src/umatrix.cpp | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/modules/core/src/ocl.cpp b/modules/core/src/ocl.cpp index 86ec6afacd..7d34580e6c 100644 --- a/modules/core/src/ocl.cpp +++ b/modules/core/src/ocl.cpp @@ -4666,7 +4666,9 @@ public: #endif { tempUMatFlags = UMatData::TEMP_UMAT; - if (u->origdata == cv::alignPtr(u->origdata, 4)) // There are OpenCL runtime issues for less aligned data + if (u->origdata == cv::alignPtr(u->origdata, 4) // There are OpenCL runtime issues for less aligned data + && !(u->originalUMatData && u->originalUMatData->handle) // Avoid sharing of host memory between OpenCL buffers + ) { handle = clCreateBuffer(ctx_handle, CL_MEM_USE_HOST_PTR|createFlags, u->size, u->origdata, &retval); diff --git a/modules/core/src/umatrix.cpp b/modules/core/src/umatrix.cpp index 31885d9301..2fd0ab96a5 100644 --- a/modules/core/src/umatrix.cpp +++ b/modules/core/src/umatrix.cpp @@ -381,6 +381,7 @@ UMat Mat::getUMat(int accessFlags, UMatUsageFlags usageFlags) const if(!a) a = a0; new_u = a->allocate(dims, size.p, type(), data, step.p, accessFlags, usageFlags); + new_u->originalUMatData = u; } bool allocated = false; CV_TRY @@ -404,7 +405,6 @@ UMat Mat::getUMat(int accessFlags, UMatUsageFlags usageFlags) const CV_Assert(new_u->tempUMat()); } #endif - new_u->originalUMatData = u; CV_XADD(&(u->refcount), 1); CV_XADD(&(u->urefcount), 1); }