1 /************************************************************************** 2 * 3 * Copyright (C) 2014 Red Hat Inc. 4 * 5 * Permission is hereby granted, free of charge, to any person obtaining a 6 * copy of this software and associated documentation files (the "Software"), 7 * to deal in the Software without restriction, including without limitation 8 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 9 * and/or sell copies of the Software, and to permit persons to whom the 10 * Software is furnished to do so, subject to the following conditions: 11 * 12 * The above copyright notice and this permission notice shall be included 13 * in all copies or substantial portions of the Software. 14 * 15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 16 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR 19 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 20 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 21 * OTHER DEALINGS IN THE SOFTWARE. 22 * 23 **************************************************************************/ 24 25 /* 26 * basic library initialisation, teardown, reset 27 * and context creation tests. 28 */ 29 30 #include <check.h> 31 #include <stdlib.h> 32 #include <errno.h> 33 #include <virglrenderer.h> 34 #include <gbm.h> 35 #include <sys/uio.h> 36 #include "testvirgl.h" 37 #include "virgl_hw.h" 38 struct myinfo_struct { 39 uint32_t test; 40 }; 41 42 struct myinfo_struct mystruct; 43 44 static struct virgl_renderer_callbacks test_cbs; 45 46 START_TEST(virgl_init_no_cbs) 47 { 48 int ret; 49 ret = virgl_renderer_init(&mystruct, 0, NULL); 50 ck_assert_int_eq(ret, -1); 51 } 52 END_TEST 53 54 START_TEST(virgl_init_no_cookie) 55 { 56 int ret; 57 ret = virgl_renderer_init(NULL, 0, &test_cbs); 58 ck_assert_int_eq(ret, -1); 59 } 60 END_TEST 61 62 START_TEST(virgl_init_cbs_wrong_ver) 63 { 64 int ret; 65 struct virgl_renderer_callbacks testcbs; 66 memset(&testcbs, 0, sizeof(testcbs)); 67 testcbs.version = VIRGL_RENDERER_CALLBACKS_VERSION + 1; 68 ret = virgl_renderer_init(&mystruct, 0, &testcbs); 69 ck_assert_int_eq(ret, -1); 70 } 71 END_TEST 72 73 START_TEST(virgl_init_egl) 74 { 75 int ret; 76 test_cbs.version = 1; 77 ret = virgl_renderer_init(&mystruct, VIRGL_RENDERER_USE_EGL, &test_cbs); 78 ck_assert_int_eq(ret, 0); 79 virgl_renderer_cleanup(&mystruct); 80 } 81 82 END_TEST 83 84 START_TEST(virgl_init_egl_create_ctx) 85 { 86 int ret; 87 test_cbs.version = 1; 88 ret = virgl_renderer_init(&mystruct, VIRGL_RENDERER_USE_EGL, &test_cbs); 89 ck_assert_int_eq(ret, 0); 90 ret = virgl_renderer_context_create(1, strlen("test1"), "test1"); 91 ck_assert_int_eq(ret, 0); 92 93 virgl_renderer_context_destroy(1); 94 virgl_renderer_cleanup(&mystruct); 95 } 96 END_TEST 97 98 START_TEST(virgl_init_egl_create_ctx_0) 99 { 100 int ret; 101 102 test_cbs.version = 1; 103 ret = virgl_renderer_init(&mystruct, VIRGL_RENDERER_USE_EGL, &test_cbs); 104 ck_assert_int_eq(ret, 0); 105 ret = virgl_renderer_context_create(0, strlen("test1"), "test1"); 106 ck_assert_int_eq(ret, EINVAL); 107 108 virgl_renderer_cleanup(&mystruct); 109 } 110 END_TEST 111 112 START_TEST(virgl_init_egl_destroy_ctx_illegal) 113 { 114 int ret; 115 test_cbs.version = 1; 116 ret = virgl_renderer_init(&mystruct, VIRGL_RENDERER_USE_EGL, &test_cbs); 117 ck_assert_int_eq(ret, 0); 118 119 virgl_renderer_context_destroy(1); 120 virgl_renderer_cleanup(&mystruct); 121 } 122 END_TEST 123 124 START_TEST(virgl_init_egl_create_ctx_leak) 125 { 126 testvirgl_init_single_ctx(); 127 128 /* don't destroy the context - leak it make sure cleanup catches it */ 129 /*virgl_renderer_context_destroy(1);*/ 130 virgl_renderer_cleanup(&mystruct); 131 } 132 END_TEST 133 134 START_TEST(virgl_init_egl_create_ctx_create_bind_res) 135 { 136 int ret; 137 struct virgl_renderer_resource_create_args res; 138 139 testvirgl_init_simple_1d_resource(&res, 1); 140 141 ret = virgl_renderer_resource_create(&res, NULL, 0); 142 ck_assert_int_eq(ret, 0); 143 144 virgl_renderer_ctx_attach_resource(1, res.handle); 145 146 virgl_renderer_ctx_detach_resource(1, res.handle); 147 148 virgl_renderer_resource_unref(1); 149 } 150 END_TEST 151 152 START_TEST(virgl_init_egl_create_ctx_create_bind_res_illegal_ctx) 153 { 154 int ret; 155 struct virgl_renderer_resource_create_args res; 156 157 testvirgl_init_simple_1d_resource(&res, 1); 158 159 ret = virgl_renderer_resource_create(&res, NULL, 0); 160 ck_assert_int_eq(ret, 0); 161 162 virgl_renderer_ctx_attach_resource(2, res.handle); 163 164 virgl_renderer_resource_unref(1); 165 } 166 END_TEST 167 168 169 START_TEST(virgl_init_egl_create_ctx_create_bind_res_illegal_res) 170 { 171 int ret; 172 struct virgl_renderer_resource_create_args res; 173 174 testvirgl_init_simple_1d_resource(&res, 1); 175 176 ret = virgl_renderer_resource_create(&res, NULL, 0); 177 ck_assert_int_eq(ret, 0); 178 179 virgl_renderer_ctx_attach_resource(1, 2); 180 181 virgl_renderer_resource_unref(1); 182 } 183 END_TEST 184 185 START_TEST(virgl_init_egl_create_ctx_create_unbind_no_bind) 186 { 187 int ret; 188 struct virgl_renderer_resource_create_args res; 189 190 testvirgl_init_simple_1d_resource(&res, 1); 191 192 ret = virgl_renderer_resource_create(&res, NULL, 0); 193 ck_assert_int_eq(ret, 0); 194 195 virgl_renderer_ctx_detach_resource(1, res.handle); 196 197 virgl_renderer_resource_unref(1); 198 } 199 END_TEST 200 201 START_TEST(virgl_init_egl_create_ctx_create_unbind_illegal_ctx) 202 { 203 int ret; 204 struct virgl_renderer_resource_create_args res; 205 206 testvirgl_init_simple_1d_resource(&res, 1); 207 208 ret = virgl_renderer_resource_create(&res, NULL, 0); 209 ck_assert_int_eq(ret, 0); 210 211 virgl_renderer_ctx_detach_resource(2, res.handle); 212 213 virgl_renderer_resource_unref(1); 214 } 215 END_TEST 216 217 218 START_TEST(virgl_init_egl_create_ctx_create_bind_res_leak) 219 { 220 int ret; 221 struct virgl_renderer_resource_create_args res; 222 223 testvirgl_init_single_ctx_nr(); 224 225 testvirgl_init_simple_1d_resource(&res, 1); 226 227 ret = virgl_renderer_resource_create(&res, NULL, 0); 228 ck_assert_int_eq(ret, 0); 229 230 virgl_renderer_ctx_attach_resource(1, res.handle); 231 232 /*virgl_renderer_ctx_detach_resource(1, res.handle);*/ 233 234 /*virgl_renderer_resource_unref(1);*/ 235 /* don't detach or destroy resource - it should still get cleanedup */ 236 testvirgl_fini_single_ctx(); 237 } 238 END_TEST 239 240 START_TEST(virgl_init_egl_create_ctx_reset) 241 { 242 int ret; 243 244 ret = testvirgl_init_single_ctx(); 245 ck_assert_int_eq(ret, 0); 246 247 virgl_renderer_reset(); 248 249 /* reset should have destroyed the context */ 250 ret = virgl_renderer_context_create(1, strlen("test1"), "test1"); 251 ck_assert_int_eq(ret, 0); 252 virgl_renderer_cleanup(&mystruct); 253 } 254 END_TEST 255 256 START_TEST(virgl_init_get_caps_set0) 257 { 258 int ret; 259 uint32_t max_ver, max_size; 260 261 test_cbs.version = 1; 262 ret = virgl_renderer_init(&mystruct, VIRGL_RENDERER_USE_EGL, &test_cbs); 263 ck_assert_int_eq(ret, 0); 264 265 virgl_renderer_get_cap_set(0, &max_ver, &max_size); 266 ck_assert_int_eq(max_ver, 0); 267 ck_assert_int_eq(max_size, 0); 268 269 virgl_renderer_cleanup(&mystruct); 270 } 271 END_TEST 272 273 START_TEST(virgl_init_get_caps_set1) 274 { 275 int ret; 276 uint32_t max_ver, max_size; 277 void *caps; 278 test_cbs.version = 1; 279 ret = virgl_renderer_init(&mystruct, VIRGL_RENDERER_USE_EGL, &test_cbs); 280 ck_assert_int_eq(ret, 0); 281 282 virgl_renderer_get_cap_set(1, &max_ver, &max_size); 283 ck_assert_int_ge(max_ver, 1); 284 ck_assert_int_ne(max_size, 0); 285 ck_assert_int_ge(max_size, sizeof(struct virgl_caps_v1)); 286 287 caps = malloc(max_size); 288 289 virgl_renderer_fill_caps(0, 0, caps); 290 291 free(caps); 292 virgl_renderer_cleanup(&mystruct); 293 } 294 END_TEST 295 296 START_TEST(virgl_init_get_caps_null) 297 { 298 int ret; 299 uint32_t max_ver, max_size; 300 301 test_cbs.version = 1; 302 ret = virgl_renderer_init(&mystruct, VIRGL_RENDERER_USE_EGL, &test_cbs); 303 ck_assert_int_eq(ret, 0); 304 305 virgl_renderer_get_cap_set(1, &max_ver, &max_size); 306 ck_assert_int_ge(max_ver, 1); 307 ck_assert_int_ne(max_size, 0); 308 ck_assert_int_ge(max_size, sizeof(struct virgl_caps_v1)); 309 310 virgl_renderer_fill_caps(0, 0, NULL); 311 312 virgl_renderer_cleanup(&mystruct); 313 } 314 END_TEST 315 316 START_TEST(virgl_test_get_resource_info) 317 { 318 int ret; 319 struct virgl_renderer_resource_create_args res; 320 struct virgl_renderer_resource_info info; 321 322 testvirgl_init_simple_2d_resource(&res, 1); 323 res.format = VIRGL_FORMAT_B8G8R8X8_UNORM; 324 ret = virgl_renderer_resource_create(&res, NULL, 0); 325 ck_assert_int_eq(ret, 0); 326 327 virgl_renderer_ctx_attach_resource(1, res.handle); 328 329 ret = virgl_renderer_resource_get_info(res.handle, &info); 330 ck_assert_int_eq(ret, 0); 331 332 ck_assert(info.drm_fourcc == GBM_FORMAT_ABGR8888 || 333 info.drm_fourcc == GBM_FORMAT_ARGB8888); 334 ck_assert_int_eq(info.virgl_format, res.format); 335 ck_assert_int_eq(res.width, info.width); 336 ck_assert_int_eq(res.height, info.height); 337 ck_assert_int_eq(res.depth, info.depth); 338 ck_assert_int_eq(res.flags, info.flags); 339 virgl_renderer_ctx_detach_resource(1, res.handle); 340 341 virgl_renderer_resource_unref(1); 342 } 343 END_TEST 344 345 START_TEST(virgl_test_get_resource_info_no_info) 346 { 347 int ret; 348 struct virgl_renderer_resource_create_args res; 349 350 testvirgl_init_simple_1d_resource(&res, 1); 351 352 ret = virgl_renderer_resource_create(&res, NULL, 0); 353 ck_assert_int_eq(ret, 0); 354 355 virgl_renderer_ctx_attach_resource(1, res.handle); 356 357 ret = virgl_renderer_resource_get_info(1, NULL); 358 ck_assert_int_eq(ret, EINVAL); 359 360 virgl_renderer_ctx_detach_resource(1, res.handle); 361 virgl_renderer_resource_unref(1); 362 } 363 END_TEST 364 365 366 START_TEST(virgl_test_get_resource_info_no_res) 367 { 368 int ret; 369 struct virgl_renderer_resource_info info; 370 371 ret = virgl_renderer_resource_get_info(1, &info); 372 ck_assert_int_eq(ret, EINVAL); 373 374 virgl_renderer_resource_unref(1); 375 } 376 END_TEST 377 378 START_TEST(virgl_init_egl_create_ctx_create_attach_res) 379 { 380 int ret; 381 struct virgl_renderer_resource_create_args res; 382 struct iovec iovs[1]; 383 struct iovec *iovs_r; 384 int num_r; 385 386 testvirgl_init_simple_1d_resource(&res, 1); 387 388 ret = virgl_renderer_resource_create(&res, NULL, 0); 389 ck_assert_int_eq(ret, 0); 390 391 iovs[0].iov_base = malloc(4096); 392 iovs[0].iov_len = 4096; 393 394 ret = virgl_renderer_resource_attach_iov(1, iovs, 1); 395 ck_assert_int_eq(ret, 0); 396 397 virgl_renderer_resource_detach_iov(1, &iovs_r, &num_r); 398 399 free(iovs[0].iov_base); 400 virgl_renderer_resource_unref(1); 401 } 402 END_TEST 403 404 START_TEST(virgl_init_egl_create_ctx_create_attach_res_detach_no_iovs) 405 { 406 int ret; 407 struct virgl_renderer_resource_create_args res; 408 struct iovec iovs[1]; 409 int num_r; 410 411 testvirgl_init_simple_1d_resource(&res, 1); 412 413 ret = virgl_renderer_resource_create(&res, NULL, 0); 414 ck_assert_int_eq(ret, 0); 415 416 iovs[0].iov_base = malloc(4096); 417 iovs[0].iov_len = 4096; 418 419 ret = virgl_renderer_resource_attach_iov(1, iovs, 1); 420 ck_assert_int_eq(ret, 0); 421 422 virgl_renderer_resource_detach_iov(1, NULL, &num_r); 423 424 free(iovs[0].iov_base); 425 virgl_renderer_resource_unref(1); 426 } 427 END_TEST 428 429 START_TEST(virgl_init_egl_create_ctx_create_attach_res_illegal_res) 430 { 431 int ret; 432 struct iovec iovs[1]; 433 434 test_cbs.version = 1; 435 ret = virgl_renderer_init(&mystruct, VIRGL_RENDERER_USE_EGL, &test_cbs); 436 ck_assert_int_eq(ret, 0); 437 438 ret = virgl_renderer_resource_attach_iov(1, iovs, 1); 439 ck_assert_int_eq(ret, EINVAL); 440 441 virgl_renderer_resource_unref(1); 442 virgl_renderer_context_destroy(1); 443 virgl_renderer_cleanup(&mystruct); 444 } 445 END_TEST 446 447 static Suite *virgl_init_suite(void) 448 { 449 Suite *s; 450 TCase *tc_core; 451 452 s = suite_create("virgl_init"); 453 tc_core = tcase_create("init"); 454 455 tcase_add_test(tc_core, virgl_init_no_cbs); 456 tcase_add_test(tc_core, virgl_init_no_cookie); 457 tcase_add_test(tc_core, virgl_init_cbs_wrong_ver); 458 tcase_add_test(tc_core, virgl_init_egl); 459 tcase_add_test(tc_core, virgl_init_egl_create_ctx); 460 tcase_add_test(tc_core, virgl_init_egl_create_ctx_0); 461 tcase_add_test(tc_core, virgl_init_egl_destroy_ctx_illegal); 462 tcase_add_test(tc_core, virgl_init_egl_create_ctx_leak); 463 tcase_add_test(tc_core, virgl_init_egl_create_ctx_reset); 464 tcase_add_test(tc_core, virgl_init_get_caps_set0); 465 tcase_add_test(tc_core, virgl_init_get_caps_set1); 466 tcase_add_test(tc_core, virgl_init_get_caps_null); 467 tcase_add_test(tc_core, virgl_init_egl_create_ctx_create_attach_res_illegal_res); 468 tcase_add_test(tc_core, virgl_init_egl_create_ctx_create_bind_res_leak); 469 470 suite_add_tcase(s, tc_core); 471 472 tc_core = tcase_create("init_std"); 473 tcase_add_checked_fixture(tc_core, testvirgl_init_single_ctx_nr, testvirgl_fini_single_ctx); 474 tcase_add_test(tc_core, virgl_init_egl_create_ctx_create_bind_res); 475 tcase_add_test(tc_core, virgl_init_egl_create_ctx_create_bind_res_illegal_ctx); 476 tcase_add_test(tc_core, virgl_init_egl_create_ctx_create_bind_res_illegal_res); 477 tcase_add_test(tc_core, virgl_init_egl_create_ctx_create_unbind_no_bind); 478 tcase_add_test(tc_core, virgl_init_egl_create_ctx_create_unbind_illegal_ctx); 479 480 tcase_add_test(tc_core, virgl_test_get_resource_info); 481 tcase_add_test(tc_core, virgl_test_get_resource_info_no_info); 482 tcase_add_test(tc_core, virgl_test_get_resource_info_no_res); 483 tcase_add_test(tc_core, virgl_init_egl_create_ctx_create_attach_res); 484 tcase_add_test(tc_core, virgl_init_egl_create_ctx_create_attach_res_detach_no_iovs); 485 486 suite_add_tcase(s, tc_core); 487 return s; 488 489 } 490 491 492 int main(void) 493 { 494 Suite *s; 495 SRunner *sr; 496 int number_failed; 497 498 s = virgl_init_suite(); 499 sr = srunner_create(s); 500 501 srunner_run_all(sr, CK_NORMAL); 502 number_failed = srunner_ntests_failed(sr); 503 srunner_free(sr); 504 505 return number_failed == 0 ? EXIT_SUCCESS : EXIT_FAILURE; 506 } 507