1 /*M/////////////////////////////////////////////////////////////////////////////////////// 2 // 3 // IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. 4 // 5 // By downloading, copying, installing or using the software you agree to this license. 6 // If you do not agree to this license, do not download, install, 7 // copy or use the software. 8 // 9 // 10 // License Agreement 11 // For Open Source Computer Vision Library 12 // 13 // Copyright (C) 2000-2008, Intel Corporation, all rights reserved. 14 // Copyright (C) 2009, Willow Garage Inc., all rights reserved. 15 // Third party copyrights are property of their respective owners. 16 // 17 // Redistribution and use in source and binary forms, with or without modification, 18 // are permitted provided that the following conditions are met: 19 // 20 // * Redistribution's of source code must retain the above copyright notice, 21 // this list of conditions and the following disclaimer. 22 // 23 // * Redistribution's in binary form must reproduce the above copyright notice, 24 // this list of conditions and the following disclaimer in the documentation 25 // and/or other materials provided with the distribution. 26 // 27 // * The name of the copyright holders may not be used to endorse or promote products 28 // derived from this software without specific prior written permission. 29 // 30 // This software is provided by the copyright holders and contributors "as is" and 31 // any express or implied warranties, including, but not limited to, the implied 32 // warranties of merchantability and fitness for a particular purpose are disclaimed. 33 // In no event shall the Intel Corporation or contributors be liable for any direct, 34 // indirect, incidental, special, exemplary, or consequential damages 35 // (including, but not limited to, procurement of substitute goods or services; 36 // loss of use, data, or profits; or business interruption) however caused 37 // and on any theory of liability, whether in contract, strict liability, 38 // or tort (including negligence or otherwise) arising in any way out of 39 // the use of this software, even if advised of the possibility of such damage. 40 // 41 //M*/ 42 43 #include "test_precomp.hpp" 44 45 #if defined(HAVE_CUDA) && defined(HAVE_OPENGL) 46 47 #include "opencv2/core/cuda.hpp" 48 #include "opencv2/core/opengl.hpp" 49 #include "opencv2/ts/cuda_test.hpp" 50 51 using namespace cvtest; 52 53 ///////////////////////////////////////////// 54 // Buffer 55 56 PARAM_TEST_CASE(Buffer, cv::Size, MatType) 57 { 58 static void SetUpTestCase() 59 { 60 cv::namedWindow("test", cv::WINDOW_OPENGL); 61 } 62 63 static void TearDownTestCase() 64 { 65 cv::destroyAllWindows(); 66 } 67 68 cv::Size size; 69 int type; 70 71 virtual void SetUp() 72 { 73 size = GET_PARAM(0); 74 type = GET_PARAM(1); 75 } 76 }; 77 78 CUDA_TEST_P(Buffer, Constructor1) 79 { 80 cv::ogl::Buffer buf(size.height, size.width, type, cv::ogl::Buffer::ARRAY_BUFFER, true); 81 82 EXPECT_EQ(size.height, buf.rows()); 83 EXPECT_EQ(size.width, buf.cols()); 84 EXPECT_EQ(type, buf.type()); 85 } 86 87 CUDA_TEST_P(Buffer, Constructor2) 88 { 89 cv::ogl::Buffer buf(size, type, cv::ogl::Buffer::ARRAY_BUFFER, true); 90 91 EXPECT_EQ(size.height, buf.rows()); 92 EXPECT_EQ(size.width, buf.cols()); 93 EXPECT_EQ(type, buf.type()); 94 } 95 96 CUDA_TEST_P(Buffer, ConstructorFromMat) 97 { 98 cv::Mat gold = randomMat(size, type); 99 100 cv::ogl::Buffer buf(gold, cv::ogl::Buffer::ARRAY_BUFFER, true); 101 102 cv::Mat bufData; 103 buf.copyTo(bufData); 104 105 EXPECT_MAT_NEAR(gold, bufData, 0); 106 } 107 108 CUDA_TEST_P(Buffer, ConstructorFromGpuMat) 109 { 110 cv::Mat gold = randomMat(size, type); 111 cv::cuda::GpuMat d_gold(gold); 112 113 cv::ogl::Buffer buf(d_gold, cv::ogl::Buffer::ARRAY_BUFFER); 114 115 cv::Mat bufData; 116 buf.copyTo(bufData); 117 118 EXPECT_MAT_NEAR(gold, bufData, 0); 119 } 120 121 CUDA_TEST_P(Buffer, ConstructorFromBuffer) 122 { 123 cv::ogl::Buffer buf_gold(size, type, cv::ogl::Buffer::ARRAY_BUFFER, true); 124 125 cv::ogl::Buffer buf(buf_gold); 126 127 EXPECT_EQ(buf_gold.bufId(), buf.bufId()); 128 EXPECT_EQ(buf_gold.rows(), buf.rows()); 129 EXPECT_EQ(buf_gold.cols(), buf.cols()); 130 EXPECT_EQ(buf_gold.type(), buf.type()); 131 } 132 133 CUDA_TEST_P(Buffer, Create) 134 { 135 cv::ogl::Buffer buf; 136 buf.create(size.height, size.width, type, cv::ogl::Buffer::ARRAY_BUFFER, true); 137 138 EXPECT_EQ(size.height, buf.rows()); 139 EXPECT_EQ(size.width, buf.cols()); 140 EXPECT_EQ(type, buf.type()); 141 } 142 143 CUDA_TEST_P(Buffer, CopyFromMat) 144 { 145 cv::Mat gold = randomMat(size, type); 146 147 cv::ogl::Buffer buf; 148 buf.copyFrom(gold, cv::ogl::Buffer::ARRAY_BUFFER, true); 149 150 cv::Mat bufData; 151 buf.copyTo(bufData); 152 153 EXPECT_MAT_NEAR(gold, bufData, 0); 154 } 155 156 CUDA_TEST_P(Buffer, CopyFromGpuMat) 157 { 158 cv::Mat gold = randomMat(size, type); 159 cv::cuda::GpuMat d_gold(gold); 160 161 cv::ogl::Buffer buf; 162 buf.copyFrom(d_gold, cv::ogl::Buffer::ARRAY_BUFFER, true); 163 164 cv::Mat bufData; 165 buf.copyTo(bufData); 166 167 EXPECT_MAT_NEAR(gold, bufData, 0); 168 } 169 170 CUDA_TEST_P(Buffer, CopyFromBuffer) 171 { 172 cv::Mat gold = randomMat(size, type); 173 cv::ogl::Buffer buf_gold(gold, cv::ogl::Buffer::ARRAY_BUFFER, true); 174 175 cv::ogl::Buffer buf; 176 buf.copyFrom(buf_gold, cv::ogl::Buffer::ARRAY_BUFFER, true); 177 178 EXPECT_NE(buf_gold.bufId(), buf.bufId()); 179 180 cv::Mat bufData; 181 buf.copyTo(bufData); 182 183 EXPECT_MAT_NEAR(gold, bufData, 0); 184 } 185 186 CUDA_TEST_P(Buffer, CopyToGpuMat) 187 { 188 cv::Mat gold = randomMat(size, type); 189 190 cv::ogl::Buffer buf(gold, cv::ogl::Buffer::ARRAY_BUFFER, true); 191 192 cv::cuda::GpuMat dst; 193 buf.copyTo(dst); 194 195 EXPECT_MAT_NEAR(gold, dst, 0); 196 } 197 198 CUDA_TEST_P(Buffer, CopyToBuffer) 199 { 200 cv::Mat gold = randomMat(size, type); 201 202 cv::ogl::Buffer buf(gold, cv::ogl::Buffer::ARRAY_BUFFER, true); 203 204 cv::ogl::Buffer dst; 205 buf.copyTo(dst); 206 dst.setAutoRelease(true); 207 208 EXPECT_NE(buf.bufId(), dst.bufId()); 209 210 cv::Mat bufData; 211 dst.copyTo(bufData); 212 213 EXPECT_MAT_NEAR(gold, bufData, 0); 214 } 215 216 CUDA_TEST_P(Buffer, Clone) 217 { 218 cv::Mat gold = randomMat(size, type); 219 220 cv::ogl::Buffer buf(gold, cv::ogl::Buffer::ARRAY_BUFFER, true); 221 222 cv::ogl::Buffer dst = buf.clone(cv::ogl::Buffer::ARRAY_BUFFER, true); 223 224 EXPECT_NE(buf.bufId(), dst.bufId()); 225 226 cv::Mat bufData; 227 dst.copyTo(bufData); 228 229 EXPECT_MAT_NEAR(gold, bufData, 0); 230 } 231 232 CUDA_TEST_P(Buffer, MapHostRead) 233 { 234 cv::Mat gold = randomMat(size, type); 235 236 cv::ogl::Buffer buf(gold, cv::ogl::Buffer::ARRAY_BUFFER, true); 237 238 cv::Mat dst = buf.mapHost(cv::ogl::Buffer::READ_ONLY); 239 240 EXPECT_MAT_NEAR(gold, dst, 0); 241 242 buf.unmapHost(); 243 } 244 245 CUDA_TEST_P(Buffer, MapHostWrite) 246 { 247 cv::Mat gold = randomMat(size, type); 248 249 cv::ogl::Buffer buf(size, type, cv::ogl::Buffer::ARRAY_BUFFER, true); 250 251 cv::Mat dst = buf.mapHost(cv::ogl::Buffer::WRITE_ONLY); 252 gold.copyTo(dst); 253 buf.unmapHost(); 254 dst.release(); 255 256 cv::Mat bufData; 257 buf.copyTo(bufData); 258 259 EXPECT_MAT_NEAR(gold, bufData, 0); 260 } 261 262 CUDA_TEST_P(Buffer, MapDevice) 263 { 264 cv::Mat gold = randomMat(size, type); 265 266 cv::ogl::Buffer buf(gold, cv::ogl::Buffer::ARRAY_BUFFER, true); 267 268 cv::cuda::GpuMat dst = buf.mapDevice(); 269 270 EXPECT_MAT_NEAR(gold, dst, 0); 271 272 buf.unmapDevice(); 273 } 274 275 INSTANTIATE_TEST_CASE_P(OpenGL, Buffer, testing::Combine(DIFFERENT_SIZES, ALL_TYPES)); 276 277 ///////////////////////////////////////////// 278 // Texture2D 279 280 PARAM_TEST_CASE(Texture2D, cv::Size, MatType) 281 { 282 static void SetUpTestCase() 283 { 284 cv::namedWindow("test", cv::WINDOW_OPENGL); 285 } 286 287 static void TearDownTestCase() 288 { 289 cv::destroyAllWindows(); 290 } 291 292 cv::Size size; 293 int type; 294 int depth; 295 int cn; 296 cv::ogl::Texture2D::Format format; 297 298 virtual void SetUp() 299 { 300 size = GET_PARAM(0); 301 type = GET_PARAM(1); 302 303 depth = CV_MAT_DEPTH(type); 304 cn = CV_MAT_CN(type); 305 format = cn == 1 ? cv::ogl::Texture2D::DEPTH_COMPONENT : cn == 3 ? cv::ogl::Texture2D::RGB : cn == 4 ? cv::ogl::Texture2D::RGBA : cv::ogl::Texture2D::NONE; 306 } 307 }; 308 309 CUDA_TEST_P(Texture2D, Constructor1) 310 { 311 cv::ogl::Texture2D tex(size.height, size.width, format, true); 312 313 EXPECT_EQ(size.height, tex.rows()); 314 EXPECT_EQ(size.width, tex.cols()); 315 EXPECT_EQ(format, tex.format()); 316 } 317 318 CUDA_TEST_P(Texture2D, Constructor2) 319 { 320 cv::ogl::Texture2D tex(size, format, true); 321 322 EXPECT_EQ(size.height, tex.rows()); 323 EXPECT_EQ(size.width, tex.cols()); 324 EXPECT_EQ(format, tex.format()); 325 } 326 327 CUDA_TEST_P(Texture2D, ConstructorFromMat) 328 { 329 cv::Mat gold = randomMat(size, type, 0, depth == CV_8U ? 255 : 1); 330 331 cv::ogl::Texture2D tex(gold, true); 332 333 cv::Mat texData; 334 tex.copyTo(texData, depth); 335 336 EXPECT_MAT_NEAR(gold, texData, 1e-2); 337 } 338 339 CUDA_TEST_P(Texture2D, ConstructorFromGpuMat) 340 { 341 cv::Mat gold = randomMat(size, type, 0, depth == CV_8U ? 255 : 1); 342 cv::cuda::GpuMat d_gold(gold); 343 344 cv::ogl::Texture2D tex(d_gold, true); 345 346 cv::Mat texData; 347 tex.copyTo(texData, depth); 348 349 EXPECT_MAT_NEAR(gold, texData, 1e-2); 350 } 351 352 CUDA_TEST_P(Texture2D, ConstructorFromBuffer) 353 { 354 cv::Mat gold = randomMat(size, type, 0, depth == CV_8U ? 255 : 1); 355 cv::ogl::Buffer buf_gold(gold, cv::ogl::Buffer::PIXEL_UNPACK_BUFFER, true); 356 357 cv::ogl::Texture2D tex(buf_gold, true); 358 359 cv::Mat texData; 360 tex.copyTo(texData, depth); 361 362 EXPECT_MAT_NEAR(gold, texData, 1e-2); 363 } 364 365 CUDA_TEST_P(Texture2D, ConstructorFromTexture2D) 366 { 367 cv::ogl::Texture2D tex_gold(size, format, true); 368 cv::ogl::Texture2D tex(tex_gold); 369 370 EXPECT_EQ(tex_gold.texId(), tex.texId()); 371 EXPECT_EQ(tex_gold.rows(), tex.rows()); 372 EXPECT_EQ(tex_gold.cols(), tex.cols()); 373 EXPECT_EQ(tex_gold.format(), tex.format()); 374 } 375 376 CUDA_TEST_P(Texture2D, Create) 377 { 378 cv::ogl::Texture2D tex; 379 tex.create(size.height, size.width, format, true); 380 381 EXPECT_EQ(size.height, tex.rows()); 382 EXPECT_EQ(size.width, tex.cols()); 383 EXPECT_EQ(format, tex.format()); 384 } 385 386 CUDA_TEST_P(Texture2D, CopyFromMat) 387 { 388 cv::Mat gold = randomMat(size, type, 0, depth == CV_8U ? 255 : 1); 389 390 cv::ogl::Texture2D tex; 391 tex.copyFrom(gold, true); 392 393 cv::Mat texData; 394 tex.copyTo(texData, depth); 395 396 EXPECT_MAT_NEAR(gold, texData, 1e-2); 397 } 398 399 CUDA_TEST_P(Texture2D, CopyFromGpuMat) 400 { 401 cv::Mat gold = randomMat(size, type, 0, depth == CV_8U ? 255 : 1); 402 cv::cuda::GpuMat d_gold(gold); 403 404 cv::ogl::Texture2D tex; 405 tex.copyFrom(d_gold, true); 406 407 cv::Mat texData; 408 tex.copyTo(texData, depth); 409 410 EXPECT_MAT_NEAR(gold, texData, 1e-2); 411 } 412 413 CUDA_TEST_P(Texture2D, CopyFromBuffer) 414 { 415 cv::Mat gold = randomMat(size, type, 0, depth == CV_8U ? 255 : 1); 416 cv::ogl::Buffer buf_gold(gold, cv::ogl::Buffer::PIXEL_UNPACK_BUFFER, true); 417 418 cv::ogl::Texture2D tex; 419 tex.copyFrom(buf_gold, true); 420 421 cv::Mat texData; 422 tex.copyTo(texData, depth); 423 424 EXPECT_MAT_NEAR(gold, texData, 1e-2); 425 } 426 427 CUDA_TEST_P(Texture2D, CopyToGpuMat) 428 { 429 cv::Mat gold = randomMat(size, type, 0, depth == CV_8U ? 255 : 1); 430 431 cv::ogl::Texture2D tex(gold, true); 432 433 cv::cuda::GpuMat dst; 434 tex.copyTo(dst, depth); 435 436 EXPECT_MAT_NEAR(gold, dst, 1e-2); 437 } 438 439 CUDA_TEST_P(Texture2D, CopyToBuffer) 440 { 441 cv::Mat gold = randomMat(size, type, 0, depth == CV_8U ? 255 : 1); 442 443 cv::ogl::Texture2D tex(gold, true); 444 445 cv::ogl::Buffer dst; 446 tex.copyTo(dst, depth, true); 447 448 cv::Mat bufData; 449 dst.copyTo(bufData); 450 451 EXPECT_MAT_NEAR(gold, bufData, 1e-2); 452 } 453 454 INSTANTIATE_TEST_CASE_P(OpenGL, Texture2D, testing::Combine(DIFFERENT_SIZES, testing::Values(CV_8UC1, CV_8UC3, CV_8UC4, CV_32FC1, CV_32FC3, CV_32FC4))); 455 456 #endif 457