Merge remote-tracking branch 'upstream/3.4' into merge-3.4
This commit is contained in:
@@ -0,0 +1,160 @@
|
||||
// This file is part of OpenCV project.
|
||||
// It is subject to the license terms in the LICENSE file found in the top-level directory
|
||||
// of this distribution and at http://opencv.org/license.html.
|
||||
|
||||
#include "precomp.hpp"
|
||||
|
||||
#include "opencv2/core/check.hpp"
|
||||
|
||||
namespace cv {
|
||||
|
||||
const char* depthToString(int depth)
|
||||
{
|
||||
const char* s = detail::depthToString_(depth);
|
||||
return s ? s : "<invalid depth>";
|
||||
}
|
||||
|
||||
const cv::String typeToString(int type)
|
||||
{
|
||||
cv::String s = detail::typeToString_(type);
|
||||
if (s.empty())
|
||||
{
|
||||
static cv::String invalidType("<invalid type>");
|
||||
return invalidType;
|
||||
}
|
||||
return s;
|
||||
}
|
||||
|
||||
|
||||
namespace detail {
|
||||
|
||||
static const char* getTestOpPhraseStr(unsigned testOp)
|
||||
{
|
||||
static const char* _names[] = { "{custom check}", "equal to", "not equal to", "less than or equal to", "less than", "greater than or equal to", "greater than" };
|
||||
CV_DbgAssert(testOp < CV__LAST_TEST_OP);
|
||||
return testOp < CV__LAST_TEST_OP ? _names[testOp] : "???";
|
||||
}
|
||||
static const char* getTestOpMath(unsigned testOp)
|
||||
{
|
||||
static const char* _names[] = { "???", "==", "!=", "<=", "<", ">=", ">" };
|
||||
CV_DbgAssert(testOp < CV__LAST_TEST_OP);
|
||||
return testOp < CV__LAST_TEST_OP ? _names[testOp] : "???";
|
||||
}
|
||||
|
||||
const char* depthToString_(int depth)
|
||||
{
|
||||
static const char* depthNames[] = { "CV_8U", "CV_8S", "CV_16U", "CV_16S", "CV_32S", "CV_32F", "CV_64F", "CV_USRTYPE1" };
|
||||
return depth <= CV_USRTYPE1 ? depthNames[depth] : NULL;
|
||||
}
|
||||
|
||||
const cv::String typeToString_(int type)
|
||||
{
|
||||
int depth = CV_MAT_DEPTH(type);
|
||||
int cn = CV_MAT_CN(type);
|
||||
if (depth >= 0 && depth <= CV_USRTYPE1)
|
||||
return cv::format("%sC%d", depthToString_(depth), cn);
|
||||
return cv::String();
|
||||
}
|
||||
|
||||
template<typename T> static CV_NORETURN
|
||||
void check_failed_auto_(const T& v1, const T& v2, const CheckContext& ctx)
|
||||
{
|
||||
std::stringstream ss;
|
||||
ss << ctx.message << " (expected: '" << ctx.p1_str << " " << getTestOpMath(ctx.testOp) << " " << ctx.p2_str << "'), where" << std::endl
|
||||
<< " '" << ctx.p1_str << "' is " << v1 << std::endl;
|
||||
if (ctx.testOp != TEST_CUSTOM && ctx.testOp < CV__LAST_TEST_OP)
|
||||
{
|
||||
ss << "must be " << getTestOpPhraseStr(ctx.testOp) << std::endl;
|
||||
}
|
||||
ss << " '" << ctx.p2_str << "' is " << v2;
|
||||
cv::errorNoReturn(cv::Error::StsError, ss.str(), ctx.func, ctx.file, ctx.line);
|
||||
}
|
||||
void check_failed_MatDepth(const int v1, const int v2, const CheckContext& ctx)
|
||||
{
|
||||
std::stringstream ss;
|
||||
ss << ctx.message << " (expected: '" << ctx.p1_str << " " << getTestOpMath(ctx.testOp) << " " << ctx.p2_str << "'), where" << std::endl
|
||||
<< " '" << ctx.p1_str << "' is " << v1 << " (" << depthToString(v1) << ")" << std::endl;
|
||||
if (ctx.testOp != TEST_CUSTOM && ctx.testOp < CV__LAST_TEST_OP)
|
||||
{
|
||||
ss << "must be " << getTestOpPhraseStr(ctx.testOp) << std::endl;
|
||||
}
|
||||
ss << " '" << ctx.p2_str << "' is " << v2 << " (" << depthToString(v2) << ")";
|
||||
cv::errorNoReturn(cv::Error::StsError, ss.str(), ctx.func, ctx.file, ctx.line);
|
||||
}
|
||||
void check_failed_MatType(const int v1, const int v2, const CheckContext& ctx)
|
||||
{
|
||||
std::stringstream ss;
|
||||
ss << ctx.message << " (expected: '" << ctx.p1_str << " " << getTestOpMath(ctx.testOp) << " " << ctx.p2_str << "'), where" << std::endl
|
||||
<< " '" << ctx.p1_str << "' is " << v1 << " (" << typeToString(v1) << ")" << std::endl;
|
||||
if (ctx.testOp != TEST_CUSTOM && ctx.testOp < CV__LAST_TEST_OP)
|
||||
{
|
||||
ss << "must be " << getTestOpPhraseStr(ctx.testOp) << std::endl;
|
||||
}
|
||||
ss << " '" << ctx.p2_str << "' is " << v2 << " (" << typeToString(v2) << ")";
|
||||
cv::errorNoReturn(cv::Error::StsError, ss.str(), ctx.func, ctx.file, ctx.line);
|
||||
}
|
||||
void check_failed_MatChannels(const int v1, const int v2, const CheckContext& ctx)
|
||||
{
|
||||
check_failed_auto_<int>(v1, v2, ctx);
|
||||
}
|
||||
void check_failed_auto(const int v1, const int v2, const CheckContext& ctx)
|
||||
{
|
||||
check_failed_auto_<int>(v1, v2, ctx);
|
||||
}
|
||||
void check_failed_auto(const float v1, const float v2, const CheckContext& ctx)
|
||||
{
|
||||
check_failed_auto_<float>(v1, v2, ctx);
|
||||
}
|
||||
void check_failed_auto(const double v1, const double v2, const CheckContext& ctx)
|
||||
{
|
||||
check_failed_auto_<double>(v1, v2, ctx);
|
||||
}
|
||||
|
||||
|
||||
template<typename T> static CV_NORETURN
|
||||
void check_failed_auto_(const T& v, const CheckContext& ctx)
|
||||
{
|
||||
std::stringstream ss;
|
||||
ss << ctx.message << ":" << std::endl
|
||||
<< " '" << ctx.p2_str << "'" << std::endl
|
||||
<< "where" << std::endl
|
||||
<< " '" << ctx.p1_str << "' is " << v;
|
||||
cv::errorNoReturn(cv::Error::StsError, ss.str(), ctx.func, ctx.file, ctx.line);
|
||||
}
|
||||
void check_failed_MatDepth(const int v, const CheckContext& ctx)
|
||||
{
|
||||
std::stringstream ss;
|
||||
ss << ctx.message << ":" << std::endl
|
||||
<< " '" << ctx.p2_str << "'" << std::endl
|
||||
<< "where" << std::endl
|
||||
<< " '" << ctx.p1_str << "' is " << v << " (" << depthToString(v) << ")";
|
||||
cv::errorNoReturn(cv::Error::StsError, ss.str(), ctx.func, ctx.file, ctx.line);
|
||||
}
|
||||
void check_failed_MatType(const int v, const CheckContext& ctx)
|
||||
{
|
||||
std::stringstream ss;
|
||||
ss << ctx.message << ":" << std::endl
|
||||
<< " '" << ctx.p2_str << "'" << std::endl
|
||||
<< "where" << std::endl
|
||||
<< " '" << ctx.p1_str << "' is " << v << " (" << typeToString(v) << ")";
|
||||
cv::errorNoReturn(cv::Error::StsError, ss.str(), ctx.func, ctx.file, ctx.line);
|
||||
}
|
||||
void check_failed_MatChannels(const int v, const CheckContext& ctx)
|
||||
{
|
||||
check_failed_auto_<int>(v, ctx);
|
||||
}
|
||||
void check_failed_auto(const int v, const CheckContext& ctx)
|
||||
{
|
||||
check_failed_auto_<int>(v, ctx);
|
||||
}
|
||||
void check_failed_auto(const float v, const CheckContext& ctx)
|
||||
{
|
||||
check_failed_auto_<float>(v, ctx);
|
||||
}
|
||||
void check_failed_auto(const double v, const CheckContext& ctx)
|
||||
{
|
||||
check_failed_auto_<double>(v, ctx);
|
||||
}
|
||||
|
||||
|
||||
}} // namespace
|
||||
+34
-16
@@ -4275,7 +4275,8 @@ public:
|
||||
entry.capacity_ = alignSize(size, (int)_allocationGranularity(size));
|
||||
Context& ctx = Context::getDefault();
|
||||
cl_int retval = CL_SUCCESS;
|
||||
CV_OCL_CHECK_(entry.clBuffer_ = clCreateBuffer((cl_context)ctx.ptr(), CL_MEM_READ_WRITE|createFlags_, entry.capacity_, 0, &retval), retval);
|
||||
entry.clBuffer_ = clCreateBuffer((cl_context)ctx.ptr(), CL_MEM_READ_WRITE|createFlags_, entry.capacity_, 0, &retval);
|
||||
CV_OCL_CHECK_RESULT(retval, cv::format("clCreateBuffer(capacity=%lld) => %p", (long long int)entry.capacity_, (void*)entry.clBuffer_).c_str());
|
||||
CV_Assert(entry.clBuffer_ != NULL);
|
||||
if(retval == CL_SUCCESS)
|
||||
{
|
||||
@@ -4669,15 +4670,19 @@ public:
|
||||
{
|
||||
handle = clCreateBuffer(ctx_handle, CL_MEM_USE_HOST_PTR|createFlags,
|
||||
u->size, u->origdata, &retval);
|
||||
CV_OCL_DBG_CHECK_RESULT(retval, cv::format("clCreateBuffer(CL_MEM_USE_HOST_PTR|createFlags, sz=%lld, origdata=%p) => %p",
|
||||
(long long int)u->size, u->origdata, (void*)handle).c_str());
|
||||
}
|
||||
if((!handle || retval < 0) && !(accessFlags & ACCESS_FAST))
|
||||
{
|
||||
handle = clCreateBuffer(ctx_handle, CL_MEM_COPY_HOST_PTR|CL_MEM_READ_WRITE|createFlags,
|
||||
u->size, u->origdata, &retval);
|
||||
CV_OCL_DBG_CHECK_RESULT(retval, cv::format("clCreateBuffer(CL_MEM_COPY_HOST_PTR|CL_MEM_READ_WRITE|createFlags, sz=%lld, origdata=%p) => %p",
|
||||
(long long int)u->size, u->origdata, (void*)handle).c_str());
|
||||
tempUMatFlags |= UMatData::TEMP_COPIED_UMAT;
|
||||
}
|
||||
}
|
||||
CV_OCL_DBG_CHECK_RESULT(retval, "clCreateBuffer()");
|
||||
CV_OCL_DBG_CHECK_RESULT(retval, cv::format("clCreateBuffer() => %p", (void*)handle).c_str());
|
||||
if(!handle || retval != CL_SUCCESS)
|
||||
return false;
|
||||
u->handle = handle;
|
||||
@@ -4805,13 +4810,14 @@ public:
|
||||
void* data = clEnqueueMapBuffer(q, (cl_mem)u->handle, CL_TRUE,
|
||||
(CL_MAP_READ | CL_MAP_WRITE),
|
||||
0, u->size, 0, 0, 0, &retval);
|
||||
CV_OCL_CHECK_RESULT(retval, "clEnqueueMapBuffer()");
|
||||
CV_OCL_CHECK_RESULT(retval, cv::format("clEnqueueMapBuffer(handle=%p, sz=%lld) => %p", (void*)u->handle, (long long int)u->size, data).c_str());
|
||||
CV_Assert(u->origdata == data);
|
||||
if (u->originalUMatData)
|
||||
{
|
||||
CV_Assert(u->originalUMatData->data == data);
|
||||
}
|
||||
CV_OCL_CHECK(clEnqueueUnmapMemObject(q, (cl_mem)u->handle, data, 0, 0, 0));
|
||||
retval = clEnqueueUnmapMemObject(q, (cl_mem)u->handle, data, 0, 0, 0);
|
||||
CV_OCL_CHECK_RESULT(retval, cv::format("clEnqueueUnmapMemObject(handle=%p, data=%p, [sz=%lld])", (void*)u->handle, data, (long long int)u->size).c_str());
|
||||
CV_OCL_DBG_CHECK(clFinish(q));
|
||||
}
|
||||
}
|
||||
@@ -4838,7 +4844,8 @@ public:
|
||||
else
|
||||
#endif
|
||||
{
|
||||
CV_OCL_DBG_CHECK(clReleaseMemObject((cl_mem)u->handle));
|
||||
cl_int retval = clReleaseMemObject((cl_mem)u->handle);
|
||||
CV_OCL_DBG_CHECK_RESULT(retval, cv::format("clReleaseMemObject(ptr=%p)", (void*)u->handle).c_str());
|
||||
}
|
||||
u->handle = 0;
|
||||
u->markDeviceCopyObsolete(true);
|
||||
@@ -4955,7 +4962,7 @@ public:
|
||||
u->data = (uchar*)clEnqueueMapBuffer(q, (cl_mem)u->handle, CL_TRUE,
|
||||
(CL_MAP_READ | CL_MAP_WRITE),
|
||||
0, u->size, 0, 0, 0, &retval);
|
||||
CV_OCL_DBG_CHECK_RESULT(retval, cv::format("clEnqueueMapBuffer(sz=%lld)", (int64)u->size).c_str());
|
||||
CV_OCL_DBG_CHECK_RESULT(retval, cv::format("clEnqueueMapBuffer(handle=%p, sz=%lld) => %p", (void*)u->handle, (long long int)u->size, u->data).c_str());
|
||||
}
|
||||
if (u->data && retval == CL_SUCCESS)
|
||||
{
|
||||
@@ -4982,8 +4989,10 @@ public:
|
||||
#ifdef HAVE_OPENCL_SVM
|
||||
CV_DbgAssert((u->allocatorFlags_ & svm::OPENCL_SVM_BUFFER_MASK) == 0);
|
||||
#endif
|
||||
CV_OCL_CHECK(clEnqueueReadBuffer(q, (cl_mem)u->handle, CL_TRUE,
|
||||
0, u->size, alignedPtr.getAlignedPtr(), 0, 0, 0));
|
||||
cl_int retval = clEnqueueReadBuffer(q, (cl_mem)u->handle, CL_TRUE,
|
||||
0, u->size, alignedPtr.getAlignedPtr(), 0, 0, 0);
|
||||
CV_OCL_CHECK_RESULT(retval, cv::format("clEnqueueReadBuffer(q, handle=%p, CL_TRUE, 0, sz=%lld, data=%p, 0, 0, 0)",
|
||||
(void*)u->handle, (long long int)u->size, alignedPtr.getAlignedPtr()).c_str());
|
||||
u->markHostCopyObsolete(false);
|
||||
}
|
||||
}
|
||||
@@ -5032,7 +5041,8 @@ public:
|
||||
if (u->refcount == 0)
|
||||
{
|
||||
CV_Assert(u->mapcount-- == 1);
|
||||
CV_OCL_CHECK(retval = clEnqueueUnmapMemObject(q, (cl_mem)u->handle, u->data, 0, 0, 0));
|
||||
retval = clEnqueueUnmapMemObject(q, (cl_mem)u->handle, u->data, 0, 0, 0);
|
||||
CV_OCL_CHECK_RESULT(retval, cv::format("clEnqueueUnmapMemObject(handle=%p, data=%p, [sz=%lld])", (void*)u->handle, u->data, (long long int)u->size).c_str());
|
||||
if (Device::getDefault().isAMD())
|
||||
{
|
||||
// required for multithreaded applications (see stitching test)
|
||||
@@ -5050,8 +5060,10 @@ public:
|
||||
#ifdef HAVE_OPENCL_SVM
|
||||
CV_DbgAssert((u->allocatorFlags_ & svm::OPENCL_SVM_BUFFER_MASK) == 0);
|
||||
#endif
|
||||
CV_OCL_CHECK(retval = clEnqueueWriteBuffer(q, (cl_mem)u->handle, CL_TRUE,
|
||||
0, u->size, alignedPtr.getAlignedPtr(), 0, 0, 0));
|
||||
retval = clEnqueueWriteBuffer(q, (cl_mem)u->handle, CL_TRUE,
|
||||
0, u->size, alignedPtr.getAlignedPtr(), 0, 0, 0);
|
||||
CV_OCL_CHECK_RESULT(retval, cv::format("clEnqueueWriteBuffer(q, handle=%p, CL_TRUE, 0, sz=%lld, data=%p, 0, 0, 0)",
|
||||
(void*)u->handle, (long long int)u->size, alignedPtr.getAlignedPtr()).c_str());
|
||||
u->markDeviceCopyObsolete(false);
|
||||
u->markHostCopyObsolete(true);
|
||||
}
|
||||
@@ -5354,8 +5366,10 @@ public:
|
||||
if( iscontinuous )
|
||||
{
|
||||
AlignedDataPtr<true, false> alignedPtr((uchar*)srcptr, total, CV_OPENCL_DATA_PTR_ALIGNMENT);
|
||||
CV_OCL_CHECK(clEnqueueWriteBuffer(q, (cl_mem)u->handle, CL_TRUE,
|
||||
dstrawofs, total, alignedPtr.getAlignedPtr(), 0, 0, 0));
|
||||
cl_int retval = clEnqueueWriteBuffer(q, (cl_mem)u->handle, CL_TRUE,
|
||||
dstrawofs, total, alignedPtr.getAlignedPtr(), 0, 0, 0);
|
||||
CV_OCL_CHECK_RESULT(retval, cv::format("clEnqueueWriteBuffer(q, handle=%p, CL_TRUE, offset=%lld, sz=%lld, data=%p, 0, 0, 0)",
|
||||
(void*)u->handle, (long long int)dstrawofs, (long long int)u->size, alignedPtr.getAlignedPtr()).c_str());
|
||||
}
|
||||
else if (CV_OPENCL_DISABLE_BUFFER_RECT_OPERATIONS)
|
||||
{
|
||||
@@ -5527,8 +5541,10 @@ public:
|
||||
{
|
||||
if( iscontinuous )
|
||||
{
|
||||
CV_OCL_CHECK(retval = clEnqueueCopyBuffer(q, (cl_mem)src->handle, (cl_mem)dst->handle,
|
||||
srcrawofs, dstrawofs, total, 0, 0, 0));
|
||||
retval = clEnqueueCopyBuffer(q, (cl_mem)src->handle, (cl_mem)dst->handle,
|
||||
srcrawofs, dstrawofs, total, 0, 0, 0);
|
||||
CV_OCL_CHECK_RESULT(retval, cv::format("clEnqueueCopyBuffer(q, src=%p, dst=%p, src_offset=%lld, dst_offset=%lld, sz=%lld, 0, 0, 0)",
|
||||
(void*)src->handle, (void*)dst->handle, (long long int)srcrawofs, (long long int)dstrawofs, (long long int)total).c_str());
|
||||
}
|
||||
else if (CV_OPENCL_DISABLE_BUFFER_RECT_OPERATIONS)
|
||||
{
|
||||
@@ -6373,7 +6389,9 @@ struct Image2D::Impl
|
||||
if (!alias && !src.isContinuous())
|
||||
{
|
||||
devData = clCreateBuffer(context, CL_MEM_READ_ONLY, src.cols * src.rows * src.elemSize(), NULL, &err);
|
||||
CV_OCL_CHECK_RESULT(err, "clCreateBuffer()");
|
||||
CV_OCL_CHECK_RESULT(err, cv::format("clCreateBuffer(CL_MEM_READ_ONLY, sz=%lld) => %p",
|
||||
(long long int)(src.cols * src.rows * src.elemSize()), (void*)devData
|
||||
).c_str());
|
||||
|
||||
const size_t roi[3] = {static_cast<size_t>(src.cols) * src.elemSize(), static_cast<size_t>(src.rows), 1};
|
||||
CV_OCL_CHECK(clEnqueueCopyBufferRect(queue, (cl_mem)src.handle(ACCESS_READ), devData, origin, origin,
|
||||
|
||||
@@ -249,10 +249,34 @@ const char* Exception::what() const throw() { return msg.c_str(); }
|
||||
|
||||
void Exception::formatMessage()
|
||||
{
|
||||
if( func.size() > 0 )
|
||||
msg = format("OpenCV(%s) %s:%d: error: (%d) %s: %s in function %s\n", CV_VERSION, file.c_str(), line, code, cvErrorStr(code), err.c_str(), func.c_str());
|
||||
size_t pos = err.find('\n');
|
||||
bool multiline = pos != cv::String::npos;
|
||||
if (multiline)
|
||||
{
|
||||
std::stringstream ss;
|
||||
size_t prev_pos = 0;
|
||||
while (pos != cv::String::npos)
|
||||
{
|
||||
ss << "> " << err.substr(prev_pos, pos - prev_pos) << std::endl;
|
||||
prev_pos = pos + 1;
|
||||
pos = err.find('\n', prev_pos);
|
||||
}
|
||||
ss << "> " << err.substr(prev_pos);
|
||||
if (err[err.size() - 1] != '\n')
|
||||
ss << std::endl;
|
||||
err = ss.str();
|
||||
}
|
||||
if (func.size() > 0)
|
||||
{
|
||||
if (multiline)
|
||||
msg = format("OpenCV(%s) %s:%d: error: (%d:%s) in function '%s'\n%s", CV_VERSION, file.c_str(), line, code, cvErrorStr(code), func.c_str(), err.c_str());
|
||||
else
|
||||
msg = format("OpenCV(%s) %s:%d: error: (%d:%s) %s in function '%s'\n", CV_VERSION, file.c_str(), line, code, cvErrorStr(code), err.c_str(), func.c_str());
|
||||
}
|
||||
else
|
||||
msg = format("OpenCV(%s) %s:%d: error: (%d) %s: %s\n", CV_VERSION, file.c_str(), line, code, cvErrorStr(code), err.c_str());
|
||||
{
|
||||
msg = format("OpenCV(%s) %s:%d: error: (%d:%s) %s%s", CV_VERSION, file.c_str(), line, code, cvErrorStr(code), err.c_str(), multiline ? "" : "\n");
|
||||
}
|
||||
}
|
||||
|
||||
static const char* g_hwFeatureNames[CV_HARDWARE_MAX_FEATURE] = { NULL };
|
||||
|
||||
Reference in New Issue
Block a user