提交 237cb931 编写于 作者: A Alexander Karsakov

Added extra checks to ocl::Image2D

上级 3a263c63
...@@ -4650,6 +4650,10 @@ struct Image2D::Impl ...@@ -4650,6 +4650,10 @@ struct Image2D::Impl
void init(const UMat &src, bool norm, bool alias) void init(const UMat &src, bool norm, bool alias)
{ {
if (!haveOpenCL())
CV_Error(Error::OpenCLApiCallError, "OpenCL runtime not found!");
CV_Assert(!src.empty());
CV_Assert(ocl::Device::getDefault().imageSupport()); CV_Assert(ocl::Device::getDefault().imageSupport());
int err, depth = src.depth(), cn = src.channels(); int err, depth = src.depth(), cn = src.channels();
...@@ -4659,6 +4663,9 @@ struct Image2D::Impl ...@@ -4659,6 +4663,9 @@ struct Image2D::Impl
if (!isFormatSupported(format)) if (!isFormatSupported(format))
CV_Error(Error::OpenCLApiCallError, "Image format is not supported"); CV_Error(Error::OpenCLApiCallError, "Image format is not supported");
if (alias && !src.handle(ACCESS_RW))
CV_Error(Error::OpenCLApiCallError, "Incorrect UMat, handle is null");
cl_context context = (cl_context)Context::getDefault().ptr(); cl_context context = (cl_context)Context::getDefault().ptr();
cl_command_queue queue = (cl_command_queue)Queue::getDefault().ptr(); cl_command_queue queue = (cl_command_queue)Queue::getDefault().ptr();
...@@ -4743,7 +4750,7 @@ bool Image2D::canCreateAlias(const UMat &m) ...@@ -4743,7 +4750,7 @@ bool Image2D::canCreateAlias(const UMat &m)
{ {
bool ret = false; bool ret = false;
const Device & d = ocl::Device::getDefault(); const Device & d = ocl::Device::getDefault();
if (d.imageFromBufferSupport()) if (d.imageFromBufferSupport() && !m.empty())
{ {
// This is the required pitch alignment in pixels // This is the required pitch alignment in pixels
uint pitchAlign = d.imagePitchAlignment(); uint pitchAlign = d.imagePitchAlignment();
......
...@@ -13,12 +13,55 @@ ...@@ -13,12 +13,55 @@
namespace cvtest { namespace cvtest {
namespace ocl { namespace ocl {
PARAM_TEST_CASE(Image2DBasicTest, int, int) TEST(Image2D, createAliasEmptyUMat)
{ {
int depth, ch; if (cv::ocl::haveOpenCL())
{
UMat um;
EXPECT_FALSE(cv::ocl::Image2D::canCreateAlias(um));
}
else
std::cout << "OpenCL runtime not found. Test skipped." << std::endl;
}
TEST(Image2D, createImage2DWithEmptyUMat)
{
if (cv::ocl::haveOpenCL())
{
UMat um;
EXPECT_ANY_THROW(cv::ocl::Image2D image(um));
}
else
std::cout << "OpenCL runtime not found. Test skipped." << std::endl;
}
TEST(Image2D, createAlias)
{
if (cv::ocl::haveOpenCL())
{
const cv::ocl::Device & d = cv::ocl::Device::getDefault();
int minor = d.deviceVersionMinor(), major = d.deviceVersionMajor();
// aliases is OpenCL 1.2 extension
if (1 < major || (1 == major && 2 <= minor))
{
UMat um(128, 128, CV_8UC1);
bool isFormatSupported = false, canCreateAlias = false;
}; EXPECT_NO_THROW(isFormatSupported = cv::ocl::Image2D::isFormatSupported(CV_8U, 1, false));
EXPECT_NO_THROW(canCreateAlias = cv::ocl::Image2D::canCreateAlias(um));
if (isFormatSupported && canCreateAlias)
{
EXPECT_NO_THROW(cv::ocl::Image2D image(um, false, true));
}
else
std::cout << "Impossible to create alias for selected image. Test skipped." << std::endl;
}
}
else
std::cout << "OpenCL runtime not found. Test skipped" << std::endl;
}
TEST(Image2D, turnOffOpenCL) TEST(Image2D, turnOffOpenCL)
{ {
...@@ -26,16 +69,26 @@ TEST(Image2D, turnOffOpenCL) ...@@ -26,16 +69,26 @@ TEST(Image2D, turnOffOpenCL)
{ {
// save the current state // save the current state
bool useOCL = cv::ocl::useOpenCL(); bool useOCL = cv::ocl::useOpenCL();
bool isFormatSupported = false;
cv::ocl::setUseOpenCL(true); cv::ocl::setUseOpenCL(true);
UMat um(128, 128, CV_8UC1); UMat um(128, 128, CV_8UC1);
cv::ocl::setUseOpenCL(false); cv::ocl::setUseOpenCL(false);
cv::ocl::Image2D image(um); EXPECT_NO_THROW(isFormatSupported = cv::ocl::Image2D::isFormatSupported(CV_8U, 1, true));
if (isFormatSupported)
{
EXPECT_NO_THROW(cv::ocl::Image2D image(um));
}
else
std::cout << "CV_8UC1 is not supported for OpenCL images. Test skipped." << std::endl;
// reset state to the previous one // reset state to the previous one
cv::ocl::setUseOpenCL(useOCL); cv::ocl::setUseOpenCL(useOCL);
} }
else
std::cout << "OpenCL runtime not found. Test skipped." << std::endl;
} }
} } // namespace cvtest::ocl } } // namespace cvtest::ocl
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册