diff --git a/modules/core/src/ocl.cpp b/modules/core/src/ocl.cpp index 79a5367b3..721c38fe6 100644 --- a/modules/core/src/ocl.cpp +++ b/modules/core/src/ocl.cpp @@ -4629,6 +4629,9 @@ struct Image2D::Impl static bool isFormatSupported(cl_image_format format) { + if (!haveOpenCL()) + CV_Error(Error::OpenCLApiCallError, "OpenCL runtime not found!"); + cl_context context = (cl_context)Context::getDefault().ptr(); // Figure out how many formats are supported by this context. cl_uint numFormats = 0; @@ -4652,6 +4655,10 @@ struct Image2D::Impl 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()); int err, depth = src.depth(), cn = src.channels(); @@ -4661,6 +4668,9 @@ struct Image2D::Impl if (!isFormatSupported(format)) 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_command_queue queue = (cl_command_queue)Queue::getDefault().ptr(); @@ -4745,7 +4755,7 @@ bool Image2D::canCreateAlias(const UMat &m) { bool ret = false; const Device & d = ocl::Device::getDefault(); - if (d.imageFromBufferSupport()) + if (d.imageFromBufferSupport() && !m.empty()) { // This is the required pitch alignment in pixels uint pitchAlign = d.imagePitchAlignment(); diff --git a/modules/core/test/ocl/test_image2d.cpp b/modules/core/test/ocl/test_image2d.cpp new file mode 100644 index 000000000..dcfc701f1 --- /dev/null +++ b/modules/core/test/ocl/test_image2d.cpp @@ -0,0 +1,96 @@ +// 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. + +// Copyright (C) 2014, Itseez, Inc., all rights reserved. +// Third party copyrights are property of their respective owners. + +#include "../test_precomp.hpp" +#include "opencv2/ts/ocl_test.hpp" + +#ifdef HAVE_OPENCL + +namespace cvtest { +namespace ocl { + +TEST(Image2D, createAliasEmptyUMat) +{ + 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) +{ + if (cv::ocl::haveOpenCL()) + { + // save the current state + bool useOCL = cv::ocl::useOpenCL(); + bool isFormatSupported = false; + + cv::ocl::setUseOpenCL(true); + UMat um(128, 128, CV_8UC1); + + cv::ocl::setUseOpenCL(false); + 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 + cv::ocl::setUseOpenCL(useOCL); + } + else + std::cout << "OpenCL runtime not found. Test skipped." << std::endl; +} + +} } // namespace cvtest::ocl + +#endif // HAVE_OPENCL \ No newline at end of file