From b3755e617c65efd595c4ca033ae6f2d4e62d75ae Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Thu, 20 Aug 2020 19:05:50 +0000 Subject: [PATCH] ocl: silence warning in case of async cleanup - OpenCL kernel cleanup processing is asynchronous and can be called even after forced clFinish() - buffers are released later in asynchronous mode - silence these false positive cases for asynchronous cleanup --- modules/core/src/umatrix.cpp | 3 ++- modules/core/test/test_umat.cpp | 24 ++++++++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/modules/core/src/umatrix.cpp b/modules/core/src/umatrix.cpp index 58f1f909d5..9fe8122d22 100644 --- a/modules/core/src/umatrix.cpp +++ b/modules/core/src/umatrix.cpp @@ -80,6 +80,7 @@ UMatData::~UMatData() CV_Assert(mapcount == 0); data = origdata = 0; size = 0; + bool isAsyncCleanup = !!(flags & UMatData::ASYNC_CLEANUP); flags = 0; handle = 0; userdata = 0; @@ -106,7 +107,7 @@ UMatData::~UMatData() showWarn = true; if (zero_Ref && zero_URef) // oops, we need to free resources { - showWarn = true; + showWarn = !isAsyncCleanup; // simulate UMat::deallocate u->currAllocator->deallocate(u); } diff --git a/modules/core/test/test_umat.cpp b/modules/core/test/test_umat.cpp index d25916c18a..c2bd6eceba 100644 --- a/modules/core/test/test_umat.cpp +++ b/modules/core/test/test_umat.cpp @@ -1154,6 +1154,30 @@ TEST(UMat, map_unmap_counting) } +static void process_with_async_cleanup(Mat& frame) +{ + UMat blurResult; + { + UMat umat_buffer = frame.getUMat(ACCESS_READ); + cv::blur(umat_buffer, blurResult, Size(3, 3)); // UMat doesn't support inplace, this call is not synchronized + } + Mat result; + blurResult.copyTo(result); + swap(result, frame); + // umat_buffer cleanup is done asynchronously, silence warning about original 'frame' cleanup here (through 'result') + // - release input 'frame' (as 'result') + // - release 'umat_buffer' asynchronously and silence warning about "parent" buffer (in debug builds) +} +TEST(UMat, async_cleanup_without_call_chain_warning) +{ + Mat frame(Size(640, 480), CV_8UC1, Scalar::all(128)); + for (int i = 0; i < 10; i++) + { + process_with_async_cleanup(frame); + } +} + + ///////////// oclCleanupCallback threadsafe check (#5062) ///////////////////// // Case 1: reuse of old src Mat in OCL pipe. Hard to catch!