diff --git a/modules/core/include/opencv2/core/mat.hpp b/modules/core/include/opencv2/core/mat.hpp index d399265b0b..945b450303 100644 --- a/modules/core/include/opencv2/core/mat.hpp +++ b/modules/core/include/opencv2/core/mat.hpp @@ -360,7 +360,7 @@ struct CV_EXPORTS UMatData { enum { COPY_ON_MAP=1, HOST_COPY_OBSOLETE=2, DEVICE_COPY_OBSOLETE=4, TEMP_UMAT=8, TEMP_COPIED_UMAT=24, - USER_ALLOCATED=32 }; + USER_ALLOCATED=32, DEVICE_MEM_MAPPED=64}; UMatData(const MatAllocator* allocator); ~UMatData(); @@ -370,11 +370,13 @@ struct CV_EXPORTS UMatData bool hostCopyObsolete() const; bool deviceCopyObsolete() const; + bool deviceMemMapped() const; bool copyOnMap() const; bool tempUMat() const; bool tempCopiedUMat() const; void markHostCopyObsolete(bool flag); void markDeviceCopyObsolete(bool flag); + void markDeviceMemMapped(bool flag); const MatAllocator* prevAllocator; const MatAllocator* currAllocator; diff --git a/modules/core/include/opencv2/core/mat.inl.hpp b/modules/core/include/opencv2/core/mat.inl.hpp index d463eec671..dae0e137a8 100644 --- a/modules/core/include/opencv2/core/mat.inl.hpp +++ b/modules/core/include/opencv2/core/mat.inl.hpp @@ -3350,10 +3350,19 @@ size_t UMat::total() const inline bool UMatData::hostCopyObsolete() const { return (flags & HOST_COPY_OBSOLETE) != 0; } inline bool UMatData::deviceCopyObsolete() const { return (flags & DEVICE_COPY_OBSOLETE) != 0; } +inline bool UMatData::deviceMemMapped() const { return (flags & DEVICE_MEM_MAPPED) != 0; } inline bool UMatData::copyOnMap() const { return (flags & COPY_ON_MAP) != 0; } inline bool UMatData::tempUMat() const { return (flags & TEMP_UMAT) != 0; } inline bool UMatData::tempCopiedUMat() const { return (flags & TEMP_COPIED_UMAT) == TEMP_COPIED_UMAT; } +inline void UMatData::markDeviceMemMapped(bool flag) +{ + if(flag) + flags |= DEVICE_MEM_MAPPED; + else + flags &= ~DEVICE_MEM_MAPPED; +} + inline void UMatData::markHostCopyObsolete(bool flag) { if(flag) diff --git a/modules/core/src/ocl.cpp b/modules/core/src/ocl.cpp index ed72ffc7f1..11b5f0c442 100644 --- a/modules/core/src/ocl.cpp +++ b/modules/core/src/ocl.cpp @@ -3739,6 +3739,7 @@ public: u->handle = clCreateBuffer(ctx_handle, CL_MEM_COPY_HOST_PTR|CL_MEM_READ_WRITE|createFlags, u->size, u->origdata, &retval); tempUMatFlags = UMatData::TEMP_COPIED_UMAT; + } if(!u->handle || retval != CL_SUCCESS) return false; @@ -3880,6 +3881,7 @@ public: if(u->data && retval == CL_SUCCESS) { u->markHostCopyObsolete(false); + u->markDeviceMemMapped(true); return; } @@ -3908,6 +3910,7 @@ public: if(!u) return; + CV_Assert(u->handle != 0); UMatDataAutoLock autolock(u); @@ -3918,8 +3921,10 @@ public: cl_command_queue q = (cl_command_queue)Queue::getDefault().ptr(); cl_int retval = 0; - if( !u->copyOnMap() && u->data ) + if( !u->copyOnMap() && u->deviceMemMapped() ) { + CV_Assert(u->data != NULL); + u->markDeviceMemMapped(false); CV_Assert( (retval = clEnqueueUnmapMemObject(q, (cl_mem)u->handle, u->data, 0, 0, 0)) == CL_SUCCESS ); CV_OclDbgAssert(clFinish(q) == CL_SUCCESS);