mirror of
https://github.com/opencv/opencv.git
synced 2025-06-19 08:54:45 +08:00
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
This commit is contained in:
parent
fc0f9da7a7
commit
b3755e617c
@ -80,6 +80,7 @@ UMatData::~UMatData()
|
|||||||
CV_Assert(mapcount == 0);
|
CV_Assert(mapcount == 0);
|
||||||
data = origdata = 0;
|
data = origdata = 0;
|
||||||
size = 0;
|
size = 0;
|
||||||
|
bool isAsyncCleanup = !!(flags & UMatData::ASYNC_CLEANUP);
|
||||||
flags = 0;
|
flags = 0;
|
||||||
handle = 0;
|
handle = 0;
|
||||||
userdata = 0;
|
userdata = 0;
|
||||||
@ -106,7 +107,7 @@ UMatData::~UMatData()
|
|||||||
showWarn = true;
|
showWarn = true;
|
||||||
if (zero_Ref && zero_URef) // oops, we need to free resources
|
if (zero_Ref && zero_URef) // oops, we need to free resources
|
||||||
{
|
{
|
||||||
showWarn = true;
|
showWarn = !isAsyncCleanup;
|
||||||
// simulate UMat::deallocate
|
// simulate UMat::deallocate
|
||||||
u->currAllocator->deallocate(u);
|
u->currAllocator->deallocate(u);
|
||||||
}
|
}
|
||||||
|
@ -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) /////////////////////
|
///////////// oclCleanupCallback threadsafe check (#5062) /////////////////////
|
||||||
|
|
||||||
// Case 1: reuse of old src Mat in OCL pipe. Hard to catch!
|
// Case 1: reuse of old src Mat in OCL pipe. Hard to catch!
|
||||||
|
Loading…
Reference in New Issue
Block a user