testOpenCLKernel(k);
}
+TEST(OpenCL, image2Dcount_regression_19334)
+{
+ cv::ocl::Context ctx = cv::ocl::Context::getDefault();
+ if (!ctx.ptr())
+ {
+ throw cvtest::SkipTestException("OpenCL is not available");
+ }
+ cv::ocl::Device device = cv::ocl::Device::getDefault();
+ if (!device.compilerAvailable())
+ {
+ throw cvtest::SkipTestException("OpenCL compiler is not available");
+ }
+
+ std::string module_name; // empty to disable OpenCL cache
+
+ static const char* opencl_kernel_src =
+"__kernel void test_kernel(int a,\n"
+" __global const uchar* src0, int src0_step, int src0_offset, int src0_rows, int src0_cols,\n"
+" __global const uchar* src1, int src1_step, int src1_offset, int src1_rows, int src1_cols,\n"
+" __global const uchar* src2, int src2_step, int src2_offset, int src2_rows, int src2_cols,\n"
+" __read_only image2d_t image)\n"
+"{\n"
+"}";
+ cv::ocl::ProgramSource src(module_name, "test_opencl_image_arg", opencl_kernel_src, "");
+ cv::String errmsg;
+ cv::ocl::Program program(src, "", errmsg);
+ ASSERT_TRUE(program.ptr() != NULL);
+ cv::ocl::Kernel k("test_kernel", program);
+ ASSERT_FALSE(k.empty());
+
+ std::vector<UMat> images(4);
+ for (size_t i = 0; i < images.size(); ++i)
+ images[i] = UMat(10, 10, CV_8UC1);
+ cv::ocl::Image2D image;
+ try
+ {
+ cv::ocl::Image2D image_(images.back());
+ image = image_;
+ }
+ catch (const cv::Exception&)
+ {
+ throw cvtest::SkipTestException("OpenCL images are not supported");
+ }
+
+ int nargs = 0;
+ int a = 0;
+ nargs = k.set(nargs, a);
+ ASSERT_EQ(1, nargs);
+ nargs = k.set(nargs, images[0]);
+ ASSERT_EQ(6, nargs);
+ nargs = k.set(nargs, images[1]);
+ ASSERT_EQ(11, nargs);
+ nargs = k.set(nargs, images[2]);
+ ASSERT_EQ(16, nargs);
+
+ // do not throw (issue of #19334)
+ ASSERT_NO_THROW(nargs = k.set(nargs, image));
+ ASSERT_EQ(17, nargs);
+
+ // allow to replace image argument if kernel is not running
+ UMat image2(10, 10, CV_8UC1);
+ ASSERT_NO_THROW(nargs = k.set(16, cv::ocl::Image2D(image2)));
+ ASSERT_EQ(17, nargs);
+}
+
}} // namespace