Home | History | Annotate | Download | only in tests
      1 /*
      2  * Copyright 2016 The Chromium OS Authors. All rights reserved.
      3  * Use of this source code is governed by a BSD-style license that can be
      4  * found in the LICENSE file.
      5  */
      6 
      7 /*
      8  * Please run clang-format on this file after making changes:
      9  *
     10  * clang-format -style=file -i gralloctest.c
     11  *
     12  */
     13 
     14 #define _GNU_SOURCE
     15 #include <stdio.h>
     16 #include <stdlib.h>
     17 #include <string.h>
     18 #include <unistd.h>
     19 
     20 #include <cutils/native_handle.h>
     21 #include <hardware/gralloc.h>
     22 #include <sync/sync.h>
     23 #include <system/graphics.h>
     24 
     25 #define ALIGN(A, B) (((A) + (B)-1) / (B) * (B))
     26 #define ARRAY_SIZE(A) (sizeof(A) / sizeof(*(A)))
     27 
     28 #define CHECK(cond)                                                                                \
     29 	do {                                                                                       \
     30 		if (!(cond)) {                                                                     \
     31 			fprintf(stderr, "[  FAILED  ] check in %s() %s:%d\n", __func__, __FILE__,  \
     32 				__LINE__);                                                         \
     33 			return 0;                                                                  \
     34 		}                                                                                  \
     35 	} while (0)
     36 
     37 #define CHECK_NO_MSG(cond)                                                                         \
     38 	do {                                                                                       \
     39 		if (!(cond)) {                                                                     \
     40 			return 0;                                                                  \
     41 		}                                                                                  \
     42 	} while (0)
     43 
     44 /* Private API enumeration -- see <gralloc_drm.h> */
     45 enum { GRALLOC_DRM_GET_STRIDE,
     46        GRALLOC_DRM_GET_FORMAT,
     47        GRALLOC_DRM_GET_DIMENSIONS,
     48        GRALLOC_DRM_GET_BACKING_STORE,
     49 };
     50 
     51 struct gralloctest_context {
     52 	struct gralloc_module_t *module;
     53 	struct alloc_device_t *device;
     54 	int api;
     55 };
     56 
     57 struct gralloc_testcase {
     58 	const char *name;
     59 	int (*run_test)(struct gralloctest_context *ctx);
     60 	int required_api;
     61 };
     62 
     63 struct combinations {
     64 	int32_t format;
     65 	int32_t usage;
     66 };
     67 
     68 // clang-format off
     69 static struct combinations combos[] = {
     70 	{ HAL_PIXEL_FORMAT_RGBA_8888,
     71 	  GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN |
     72 	  GRALLOC_USAGE_HW_TEXTURE | GRALLOC_USAGE_HW_COMPOSER |
     73 	  GRALLOC_USAGE_HW_FB | GRALLOC_USAGE_CURSOR },
     74 	{ HAL_PIXEL_FORMAT_RGBA_8888,
     75 	  GRALLOC_USAGE_HW_FB | GRALLOC_USAGE_HW_RENDER |
     76 	  GRALLOC_USAGE_HW_COMPOSER },
     77 	{ HAL_PIXEL_FORMAT_RGBX_8888,
     78 	  GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN },
     79 	{ HAL_PIXEL_FORMAT_YCbCr_420_888,
     80 	  GRALLOC_USAGE_EXTERNAL_DISP | GRALLOC_USAGE_HW_COMPOSER |
     81 	  GRALLOC_USAGE_HW_TEXTURE },
     82 	{ HAL_PIXEL_FORMAT_YCbCr_420_888,
     83 	  GRALLOC_USAGE_RENDERSCRIPT | GRALLOC_USAGE_SW_READ_OFTEN |
     84 	  GRALLOC_USAGE_SW_WRITE_OFTEN },
     85 	{ HAL_PIXEL_FORMAT_YV12,
     86 	  GRALLOC_USAGE_SW_WRITE_OFTEN | GRALLOC_USAGE_HW_COMPOSER |
     87 	  GRALLOC_USAGE_HW_TEXTURE | GRALLOC_USAGE_EXTERNAL_DISP },
     88 	{ HAL_PIXEL_FORMAT_RGB_565,
     89 	  GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN },
     90 	{ HAL_PIXEL_FORMAT_BGRA_8888,
     91 	  GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN },
     92 	{ HAL_PIXEL_FORMAT_BLOB,
     93 	  GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN },
     94 };
     95 // clang-format on
     96 
     97 struct grallocinfo {
     98 	buffer_handle_t handle;     /* handle to the buffer */
     99 	int w;			    /* width  of buffer */
    100 	int h;			    /* height of buffer */
    101 	int format;		    /* format of the buffer */
    102 	int usage;		    /* bitfield indicating usage */
    103 	int fence_fd;		    /* fence file descriptor */
    104 	void *vaddr;		    /* buffer virtual memory address */
    105 	int stride;		    /* stride in pixels */
    106 	struct android_ycbcr ycbcr; /* sw access for yuv buffers */
    107 };
    108 
    109 /* This function is meant to initialize the test to commonly used defaults. */
    110 void grallocinfo_init(struct grallocinfo *info, int w, int h, int format, int usage)
    111 {
    112 	info->w = w;
    113 	info->h = h;
    114 	info->format = format;
    115 	info->usage = usage;
    116 	info->fence_fd = -1;
    117 	info->vaddr = NULL;
    118 	info->ycbcr.y = NULL;
    119 	info->ycbcr.cb = NULL;
    120 	info->ycbcr.cr = NULL;
    121 	info->stride = 0;
    122 }
    123 
    124 static native_handle_t *duplicate_buffer_handle(buffer_handle_t handle)
    125 {
    126 	native_handle_t *hnd = native_handle_create(handle->numFds, handle->numInts);
    127 
    128 	if (hnd == NULL)
    129 		return NULL;
    130 
    131 	const int *old_data = handle->data;
    132 	int *new_data = hnd->data;
    133 
    134 	int i;
    135 	for (i = 0; i < handle->numFds; i++) {
    136 		*new_data = dup(*old_data);
    137 		old_data++;
    138 		new_data++;
    139 	}
    140 
    141 	memcpy(new_data, old_data, sizeof(int) * handle->numInts);
    142 
    143 	return hnd;
    144 }
    145 
    146 /****************************************************************
    147  * Wrappers around gralloc_module_t and alloc_device_t functions.
    148  * GraphicBufferMapper/GraphicBufferAllocator could replace this
    149  * in theory.
    150  ***************************************************************/
    151 
    152 static int allocate(struct alloc_device_t *device, struct grallocinfo *info)
    153 {
    154 	int ret;
    155 
    156 	ret = device->alloc(device, info->w, info->h, info->format, info->usage, &info->handle,
    157 			    &info->stride);
    158 
    159 	CHECK_NO_MSG(ret == 0);
    160 	CHECK_NO_MSG(info->handle->version > 0);
    161 	CHECK_NO_MSG(info->handle->numInts >= 0);
    162 	CHECK_NO_MSG(info->handle->numFds >= 0);
    163 	CHECK_NO_MSG(info->stride >= 0);
    164 
    165 	return 1;
    166 }
    167 
    168 static int deallocate(struct alloc_device_t *device, struct grallocinfo *info)
    169 {
    170 	int ret;
    171 	ret = device->free(device, info->handle);
    172 	CHECK(ret == 0);
    173 	return 1;
    174 }
    175 
    176 static int register_buffer(struct gralloc_module_t *module, struct grallocinfo *info)
    177 {
    178 	int ret;
    179 	ret = module->registerBuffer(module, info->handle);
    180 	return (ret == 0);
    181 }
    182 
    183 static int unregister_buffer(struct gralloc_module_t *module, struct grallocinfo *info)
    184 {
    185 	int ret;
    186 	ret = module->unregisterBuffer(module, info->handle);
    187 	return (ret == 0);
    188 }
    189 
    190 static int lock(struct gralloc_module_t *module, struct grallocinfo *info)
    191 {
    192 	int ret;
    193 
    194 	ret = module->lock(module, info->handle, info->usage, 0, 0, (info->w) / 2, (info->h) / 2,
    195 			   &info->vaddr);
    196 
    197 	return (ret == 0);
    198 }
    199 
    200 static int unlock(struct gralloc_module_t *module, struct grallocinfo *info)
    201 {
    202 	int ret;
    203 	ret = module->unlock(module, info->handle);
    204 	return (ret == 0);
    205 }
    206 
    207 static int lock_ycbcr(struct gralloc_module_t *module, struct grallocinfo *info)
    208 {
    209 	int ret;
    210 
    211 	ret = module->lock_ycbcr(module, info->handle, info->usage, 0, 0, (info->w) / 2,
    212 				 (info->h) / 2, &info->ycbcr);
    213 
    214 	return (ret == 0);
    215 }
    216 
    217 static int lock_async(struct gralloc_module_t *module, struct grallocinfo *info)
    218 {
    219 	int ret;
    220 
    221 	ret = module->lockAsync(module, info->handle, info->usage, 0, 0, (info->w) / 2,
    222 				(info->h) / 2, &info->vaddr, info->fence_fd);
    223 
    224 	return (ret == 0);
    225 }
    226 
    227 static int unlock_async(struct gralloc_module_t *module, struct grallocinfo *info)
    228 {
    229 	int ret;
    230 
    231 	ret = module->unlockAsync(module, info->handle, &info->fence_fd);
    232 
    233 	return (ret == 0);
    234 }
    235 
    236 static int lock_async_ycbcr(struct gralloc_module_t *module, struct grallocinfo *info)
    237 {
    238 	int ret;
    239 
    240 	ret = module->lockAsync_ycbcr(module, info->handle, info->usage, 0, 0, (info->w) / 2,
    241 				      (info->h) / 2, &info->ycbcr, info->fence_fd);
    242 
    243 	return (ret == 0);
    244 }
    245 
    246 /**************************************************************
    247  * END WRAPPERS                                               *
    248  **************************************************************/
    249 
    250 /* This function tests initialization of gralloc module and allocator. */
    251 static struct gralloctest_context *test_init_gralloc()
    252 {
    253 	int err;
    254 	hw_module_t const *hw_module;
    255 	struct gralloctest_context *ctx = calloc(1, sizeof(*ctx));
    256 
    257 	err = hw_get_module(GRALLOC_HARDWARE_MODULE_ID, &hw_module);
    258 	if (err)
    259 		return NULL;
    260 
    261 	gralloc_open(hw_module, &ctx->device);
    262 	ctx->module = (gralloc_module_t *)hw_module;
    263 	if (!ctx->module || !ctx->device)
    264 		return NULL;
    265 
    266 	switch (ctx->module->common.module_api_version) {
    267 	case GRALLOC_MODULE_API_VERSION_0_3:
    268 		ctx->api = 3;
    269 		break;
    270 	case GRALLOC_MODULE_API_VERSION_0_2:
    271 		ctx->api = 2;
    272 		break;
    273 	default:
    274 		ctx->api = 1;
    275 	}
    276 
    277 	return ctx;
    278 }
    279 
    280 static int test_close_gralloc(struct gralloctest_context *ctx)
    281 {
    282 	CHECK(gralloc_close(ctx->device) == 0);
    283 	return 1;
    284 }
    285 
    286 /* This function tests allocation with varying buffer dimensions. */
    287 static int test_alloc_varying_sizes(struct gralloctest_context *ctx)
    288 {
    289 	struct grallocinfo info;
    290 	int i;
    291 
    292 	grallocinfo_init(&info, 0, 0, HAL_PIXEL_FORMAT_BGRA_8888, GRALLOC_USAGE_SW_READ_OFTEN);
    293 
    294 	for (i = 1; i < 1920; i++) {
    295 		info.w = i;
    296 		info.h = i;
    297 		CHECK(allocate(ctx->device, &info));
    298 		CHECK(deallocate(ctx->device, &info));
    299 	}
    300 
    301 	info.w = 1;
    302 	for (i = 1; i < 1920; i++) {
    303 		info.h = i;
    304 		CHECK(allocate(ctx->device, &info));
    305 		CHECK(deallocate(ctx->device, &info));
    306 	}
    307 
    308 	info.h = 1;
    309 	for (i = 1; i < 1920; i++) {
    310 		info.w = i;
    311 		CHECK(allocate(ctx->device, &info));
    312 		CHECK(deallocate(ctx->device, &info));
    313 	}
    314 
    315 	return 1;
    316 }
    317 
    318 /*
    319  * This function tests that we find at least one working format for each
    320  * combos which we consider important.
    321  */
    322 static int test_alloc_combinations(struct gralloctest_context *ctx)
    323 {
    324 	int i;
    325 
    326 	struct grallocinfo info;
    327 	grallocinfo_init(&info, 512, 512, 0, 0);
    328 
    329 	for (i = 0; i < ARRAY_SIZE(combos); i++) {
    330 		info.format = combos[i].format;
    331 		info.usage = combos[i].usage;
    332 		CHECK(allocate(ctx->device, &info));
    333 		CHECK(deallocate(ctx->device, &info));
    334 	}
    335 
    336 	return 1;
    337 }
    338 
    339 /*
    340  * This function tests the advertised API version.
    341  * Version_0_2 added (*lock_ycbcr)() method.
    342  * Version_0_3 added fence passing to/from lock/unlock.
    343  */
    344 static int test_api(struct gralloctest_context *ctx)
    345 {
    346 
    347 	CHECK(ctx->module->registerBuffer);
    348 	CHECK(ctx->module->unregisterBuffer);
    349 	CHECK(ctx->module->lock);
    350 	CHECK(ctx->module->unlock);
    351 
    352 	switch (ctx->module->common.module_api_version) {
    353 	case GRALLOC_MODULE_API_VERSION_0_3:
    354 		CHECK(ctx->module->lock_ycbcr);
    355 		CHECK(ctx->module->lockAsync);
    356 		CHECK(ctx->module->unlockAsync);
    357 		CHECK(ctx->module->lockAsync_ycbcr);
    358 		break;
    359 	case GRALLOC_MODULE_API_VERSION_0_2:
    360 		CHECK(ctx->module->lock_ycbcr);
    361 		CHECK(ctx->module->lockAsync == NULL);
    362 		CHECK(ctx->module->unlockAsync == NULL);
    363 		CHECK(ctx->module->lockAsync_ycbcr == NULL);
    364 		break;
    365 	case GRALLOC_MODULE_API_VERSION_0_1:
    366 		CHECK(ctx->module->lockAsync == NULL);
    367 		CHECK(ctx->module->unlockAsync == NULL);
    368 		CHECK(ctx->module->lockAsync_ycbcr == NULL);
    369 		CHECK(ctx->module->lock_ycbcr == NULL);
    370 		break;
    371 	default:
    372 		return 0;
    373 	}
    374 
    375 	return 1;
    376 }
    377 
    378 /*
    379  * This function registers, unregisters, locks and unlocks the buffer in
    380  * various orders.
    381  */
    382 static int test_gralloc_order(struct gralloctest_context *ctx)
    383 {
    384 	struct grallocinfo info, duplicate;
    385 
    386 	grallocinfo_init(&info, 512, 512, HAL_PIXEL_FORMAT_BGRA_8888, GRALLOC_USAGE_SW_READ_OFTEN);
    387 
    388 	grallocinfo_init(&duplicate, 512, 512, HAL_PIXEL_FORMAT_BGRA_8888,
    389 			 GRALLOC_USAGE_SW_READ_OFTEN);
    390 
    391 	CHECK(allocate(ctx->device, &info));
    392 
    393 	/*
    394 	 * Duplicate the buffer handle to simulate an additional reference
    395 	 * in same process.
    396 	 */
    397 	native_handle_t *native_handle = duplicate_buffer_handle(info.handle);
    398 	duplicate.handle = native_handle;
    399 
    400 	CHECK(unregister_buffer(ctx->module, &duplicate) == 0);
    401 	CHECK(register_buffer(ctx->module, &duplicate));
    402 
    403 	CHECK(unlock(ctx->module, &duplicate) == 0);
    404 
    405 	CHECK(lock(ctx->module, &duplicate));
    406 	CHECK(duplicate.vaddr);
    407 	CHECK(unlock(ctx->module, &duplicate));
    408 
    409 	CHECK(unregister_buffer(ctx->module, &duplicate));
    410 
    411 	CHECK(register_buffer(ctx->module, &duplicate));
    412 	CHECK(unregister_buffer(ctx->module, &duplicate));
    413 	CHECK(unregister_buffer(ctx->module, &duplicate) == 0);
    414 
    415 	CHECK(register_buffer(ctx->module, &duplicate));
    416 	CHECK(deallocate(ctx->device, &info));
    417 
    418 	CHECK(lock(ctx->module, &duplicate));
    419 	CHECK(lock(ctx->module, &duplicate));
    420 	CHECK(unlock(ctx->module, &duplicate));
    421 	CHECK(unlock(ctx->module, &duplicate));
    422 	CHECK(unlock(ctx->module, &duplicate) == 0);
    423 	CHECK(unregister_buffer(ctx->module, &duplicate));
    424 
    425 	CHECK(native_handle_close(duplicate.handle) == 0);
    426 	CHECK(native_handle_delete(native_handle) == 0);
    427 
    428 	return 1;
    429 }
    430 
    431 /* This function tests CPU reads and writes. */
    432 static int test_mapping(struct gralloctest_context *ctx)
    433 {
    434 	struct grallocinfo info;
    435 	uint32_t *ptr = NULL;
    436 	uint32_t magic_number = 0x000ABBA;
    437 
    438 	grallocinfo_init(&info, 512, 512, HAL_PIXEL_FORMAT_BGRA_8888,
    439 			 GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN);
    440 
    441 	CHECK(allocate(ctx->device, &info));
    442 	CHECK(lock(ctx->module, &info));
    443 
    444 	ptr = (uint32_t *)info.vaddr;
    445 	CHECK(ptr);
    446 	ptr[(info.w) / 2] = magic_number;
    447 
    448 	CHECK(unlock(ctx->module, &info));
    449 	info.vaddr = NULL;
    450 	ptr = NULL;
    451 
    452 	CHECK(lock(ctx->module, &info));
    453 	ptr = (uint32_t *)info.vaddr;
    454 	CHECK(ptr);
    455 	CHECK(ptr[info.w / 2] == magic_number);
    456 
    457 	CHECK(unlock(ctx->module, &info));
    458 	CHECK(deallocate(ctx->device, &info));
    459 
    460 	return 1;
    461 }
    462 
    463 /* This function tests the private API we use in ARC++ -- not part of official
    464  * gralloc. */
    465 static int test_perform(struct gralloctest_context *ctx)
    466 {
    467 	int32_t format;
    468 	uint64_t id1, id2;
    469 	uint32_t stride, width, height;
    470 	struct grallocinfo info, duplicate;
    471 	struct gralloc_module_t *mod = ctx->module;
    472 
    473 	grallocinfo_init(&info, 650, 408, HAL_PIXEL_FORMAT_BGRA_8888, GRALLOC_USAGE_SW_READ_OFTEN);
    474 
    475 	CHECK(allocate(ctx->device, &info));
    476 
    477 	CHECK(mod->perform(mod, GRALLOC_DRM_GET_STRIDE, info.handle, &stride) == 0);
    478 	CHECK(stride == info.stride);
    479 
    480 	CHECK(mod->perform(mod, GRALLOC_DRM_GET_FORMAT, info.handle, &format) == 0);
    481 	CHECK(format == info.format);
    482 
    483 	CHECK(mod->perform(mod, GRALLOC_DRM_GET_DIMENSIONS, info.handle, &width, &height) == 0);
    484 	CHECK(width == info.w);
    485 	CHECK(height == info.h);
    486 
    487 	native_handle_t *native_handle = duplicate_buffer_handle(info.handle);
    488 	duplicate.handle = native_handle;
    489 
    490 	CHECK(mod->perform(mod, GRALLOC_DRM_GET_BACKING_STORE, duplicate.handle, &id2));
    491 	CHECK(register_buffer(mod, &duplicate));
    492 
    493 	CHECK(mod->perform(mod, GRALLOC_DRM_GET_BACKING_STORE, info.handle, &id1) == 0);
    494 	CHECK(mod->perform(mod, GRALLOC_DRM_GET_BACKING_STORE, duplicate.handle, &id2) == 0);
    495 	CHECK(id1 == id2);
    496 
    497 	CHECK(unregister_buffer(mod, &duplicate));
    498 	CHECK(deallocate(ctx->device, &info));
    499 
    500 	return 1;
    501 }
    502 
    503 /* This function tests that only YUV buffers work with *lock_ycbcr. */
    504 static int test_ycbcr(struct gralloctest_context *ctx)
    505 
    506 {
    507 	struct grallocinfo info;
    508 	grallocinfo_init(&info, 512, 512, HAL_PIXEL_FORMAT_YCbCr_420_888,
    509 			 GRALLOC_USAGE_SW_READ_OFTEN);
    510 
    511 	CHECK(allocate(ctx->device, &info));
    512 
    513 	CHECK(lock(ctx->module, &info) == 0);
    514 	CHECK(lock_ycbcr(ctx->module, &info));
    515 	CHECK(info.ycbcr.y);
    516 	CHECK(info.ycbcr.cb);
    517 	CHECK(info.ycbcr.cr);
    518 	CHECK(unlock(ctx->module, &info));
    519 
    520 	CHECK(deallocate(ctx->device, &info));
    521 
    522 	info.format = HAL_PIXEL_FORMAT_BGRA_8888;
    523 	CHECK(allocate(ctx->device, &info));
    524 
    525 	CHECK(lock_ycbcr(ctx->module, &info) == 0);
    526 	CHECK(lock(ctx->module, &info));
    527 	CHECK(unlock(ctx->module, &info));
    528 
    529 	CHECK(deallocate(ctx->device, &info));
    530 
    531 	return 1;
    532 }
    533 
    534 /*
    535  * This function tests a method ARC++ uses to query YUV buffer
    536  * info -- not part of official gralloc API.  This is used in
    537  * Mali, Mesa, the ArcCodec and  wayland_service.
    538  */
    539 static int test_yuv_info(struct gralloctest_context *ctx)
    540 {
    541 	struct grallocinfo info;
    542 	uintptr_t y_size, c_stride, c_size, cr_offset, cb_offset;
    543 	uint32_t width, height;
    544 	width = height = 512;
    545 
    546 	/* <system/graphics.h> defines YV12 as having:
    547 	 * - an even width
    548 	 * - an even height
    549 	 * - a horizontal stride multiple of 16 pixels
    550 	 * - a vertical stride equal to the height
    551 	 *
    552 	 *   y_size = stride * height.
    553 	 *   c_stride = ALIGN(stride/2, 16).
    554 	 *   c_size = c_stride * height/2.
    555 	 *   size = y_size + c_size * 2.
    556 	 *   cr_offset = y_size.
    557 	 *   cb_offset = y_size + c_size.
    558 	 */
    559 
    560 	grallocinfo_init(&info, width, height, HAL_PIXEL_FORMAT_YV12, GRALLOC_USAGE_SW_READ_OFTEN);
    561 
    562 	CHECK(allocate(ctx->device, &info));
    563 
    564 	y_size = info.stride * height;
    565 	c_stride = ALIGN(info.stride / 2, 16);
    566 	c_size = c_stride * height / 2;
    567 	cr_offset = y_size;
    568 	cb_offset = y_size + c_size;
    569 
    570 	info.usage = 0;
    571 
    572 	/*
    573 	 * Check if the (*lock_ycbcr) with usage of zero returns the
    574 	 * offsets and strides of the YV12 buffer. This is unofficial
    575 	 * behavior we are testing here.
    576 	 */
    577 	CHECK(lock_ycbcr(ctx->module, &info));
    578 
    579 	CHECK(info.stride == info.ycbcr.ystride);
    580 	CHECK(c_stride == info.ycbcr.cstride);
    581 	CHECK(cr_offset == (uintptr_t)info.ycbcr.cr);
    582 	CHECK(cb_offset == (uintptr_t)info.ycbcr.cb);
    583 
    584 	CHECK(unlock(ctx->module, &info));
    585 
    586 	CHECK(deallocate(ctx->device, &info));
    587 
    588 	return 1;
    589 }
    590 
    591 /* This function tests asynchronous locking and unlocking of buffers. */
    592 static int test_async(struct gralloctest_context *ctx)
    593 
    594 {
    595 	struct grallocinfo rgba_info, ycbcr_info;
    596 	grallocinfo_init(&rgba_info, 512, 512, HAL_PIXEL_FORMAT_BGRA_8888,
    597 			 GRALLOC_USAGE_SW_READ_OFTEN);
    598 	grallocinfo_init(&ycbcr_info, 512, 512, HAL_PIXEL_FORMAT_YCbCr_420_888,
    599 			 GRALLOC_USAGE_SW_READ_OFTEN);
    600 
    601 	CHECK(allocate(ctx->device, &rgba_info));
    602 	CHECK(allocate(ctx->device, &ycbcr_info));
    603 
    604 	CHECK(lock_async(ctx->module, &rgba_info));
    605 	CHECK(lock_async_ycbcr(ctx->module, &ycbcr_info));
    606 
    607 	CHECK(rgba_info.vaddr);
    608 	CHECK(ycbcr_info.ycbcr.y);
    609 	CHECK(ycbcr_info.ycbcr.cb);
    610 	CHECK(ycbcr_info.ycbcr.cr);
    611 
    612 	/*
    613 	 * Wait on the fence returned from unlock_async and check it doesn't
    614 	 * return an error.
    615 	 */
    616 	CHECK(unlock_async(ctx->module, &rgba_info));
    617 	CHECK(unlock_async(ctx->module, &ycbcr_info));
    618 
    619 	if (rgba_info.fence_fd >= 0) {
    620 		CHECK(sync_wait(rgba_info.fence_fd, 10000) >= 0);
    621 		CHECK(close(rgba_info.fence_fd) == 0);
    622 	}
    623 
    624 	if (ycbcr_info.fence_fd >= 0) {
    625 		CHECK(sync_wait(ycbcr_info.fence_fd, 10000) >= 0);
    626 		CHECK(close(ycbcr_info.fence_fd) == 0);
    627 	}
    628 
    629 	CHECK(deallocate(ctx->device, &rgba_info));
    630 	CHECK(deallocate(ctx->device, &ycbcr_info));
    631 
    632 	return 1;
    633 }
    634 
    635 static const struct gralloc_testcase tests[] = {
    636 	{ "alloc_varying_sizes", test_alloc_varying_sizes, 1 },
    637 	{ "alloc_combinations", test_alloc_combinations, 1 },
    638 	{ "api", test_api, 1 },
    639 	{ "gralloc_order", test_gralloc_order, 1 },
    640 	{ "mapping", test_mapping, 1 },
    641 	{ "perform", test_perform, 1 },
    642 	{ "ycbcr", test_ycbcr, 2 },
    643 	{ "yuv_info", test_yuv_info, 2 },
    644 	{ "async", test_async, 3 },
    645 };
    646 
    647 static void print_help(const char *argv0)
    648 {
    649 	uint32_t i;
    650 	printf("usage: %s <test_name>\n\n", argv0);
    651 	printf("A valid name test is one the following:\n");
    652 	for (i = 0; i < ARRAY_SIZE(tests); i++)
    653 		printf("%s\n", tests[i].name);
    654 }
    655 
    656 int main(int argc, char *argv[])
    657 {
    658 	int ret = 0;
    659 	uint32_t num_run = 0;
    660 
    661 	setbuf(stdout, NULL);
    662 	if (argc == 2) {
    663 		uint32_t i;
    664 		char *name = argv[1];
    665 
    666 		struct gralloctest_context *ctx = test_init_gralloc();
    667 		if (!ctx) {
    668 			fprintf(stderr, "[  FAILED  ] to initialize gralloc.\n");
    669 			return 1;
    670 		}
    671 
    672 		for (i = 0; i < ARRAY_SIZE(tests); i++) {
    673 			if (strcmp(tests[i].name, name) && strcmp("all", name))
    674 				continue;
    675 
    676 			int success = 1;
    677 			if (ctx->api >= tests[i].required_api)
    678 				success = tests[i].run_test(ctx);
    679 
    680 			printf("[ RUN      ] gralloctest.%s\n", tests[i].name);
    681 			if (!success) {
    682 				fprintf(stderr, "[  FAILED  ] gralloctest.%s\n", tests[i].name);
    683 				ret |= 1;
    684 			} else {
    685 				printf("[  PASSED  ] gralloctest.%s\n", tests[i].name);
    686 			}
    687 
    688 			num_run++;
    689 		}
    690 
    691 		if (!test_close_gralloc(ctx)) {
    692 			fprintf(stderr, "[  FAILED  ] to close gralloc.\n");
    693 			return 1;
    694 		}
    695 
    696 		if (!num_run)
    697 			goto print_usage;
    698 
    699 		return ret;
    700 	}
    701 
    702 print_usage:
    703 	print_help(argv[0]);
    704 	return 0;
    705 }
    706