tests/exynos: add test for g2d_move
To check if g2d_move() works properly we create a small checkerboard pattern in the center of the screen and then shift this pattern around with g2d_move(). The pattern should be properly preserved by the operation (but not the surrounding area). Tested-by: Hyungwon Hwang <human.hwang@samsung.com> Reviewed-by: Hyungwon Hwang <human.hwang@samsung.com> Signed-off-by: Tobias Jakobi <tjakobi@math.uni-bielefeld.de> [Emil Velikov: add g2d_move to the symbol check] Signed-off-by: Emil Velikov <emil.l.velikov@gmail.com>main
parent
676462c43e
commit
6689e4ee14
|
@ -30,6 +30,7 @@ g2d_exec
|
||||||
g2d_config_event
|
g2d_config_event
|
||||||
g2d_fini
|
g2d_fini
|
||||||
g2d_init
|
g2d_init
|
||||||
|
g2d_move
|
||||||
g2d_scale_and_blend
|
g2d_scale_and_blend
|
||||||
g2d_solid_fill
|
g2d_solid_fill
|
||||||
EOF
|
EOF
|
||||||
|
|
|
@ -313,6 +313,130 @@ fail:
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int g2d_move_test(struct exynos_device *dev,
|
||||||
|
struct exynos_bo *tmp,
|
||||||
|
struct exynos_bo *buf,
|
||||||
|
enum e_g2d_buf_type type)
|
||||||
|
{
|
||||||
|
struct g2d_context *ctx;
|
||||||
|
struct g2d_image img = {0}, tmp_img = {0};
|
||||||
|
unsigned int img_w, img_h, count;
|
||||||
|
int cur_x, cur_y;
|
||||||
|
void *checkerboard;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
static const struct g2d_step {
|
||||||
|
int x, y;
|
||||||
|
} steps[] = {
|
||||||
|
{ 1, 0}, { 0, 1},
|
||||||
|
{-1, 0}, { 0, -1},
|
||||||
|
{ 1, 1}, {-1, -1},
|
||||||
|
{ 1, -1}, {-1, 1},
|
||||||
|
{ 2, 1}, { 1, 2},
|
||||||
|
{-2, -1}, {-1, -2},
|
||||||
|
{ 2, -1}, { 1, -2},
|
||||||
|
{-2, 1}, {-1, 2}
|
||||||
|
};
|
||||||
|
static const unsigned int num_steps =
|
||||||
|
sizeof(steps) / sizeof(struct g2d_step);
|
||||||
|
|
||||||
|
ctx = g2d_init(dev->fd);
|
||||||
|
if (!ctx)
|
||||||
|
return -EFAULT;
|
||||||
|
|
||||||
|
img.bo[0] = buf->handle;
|
||||||
|
|
||||||
|
/* create pattern of half the screen size */
|
||||||
|
checkerboard = create_checkerboard_pattern(screen_width / 64, screen_height / 64, 32);
|
||||||
|
if (!checkerboard) {
|
||||||
|
ret = -EFAULT;
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
|
||||||
|
img_w = (screen_width / 64) * 32;
|
||||||
|
img_h = (screen_height / 64) * 32;
|
||||||
|
|
||||||
|
switch (type) {
|
||||||
|
case G2D_IMGBUF_GEM:
|
||||||
|
memcpy(tmp->vaddr, checkerboard, img_w * img_h * 4);
|
||||||
|
tmp_img.bo[0] = tmp->handle;
|
||||||
|
break;
|
||||||
|
case G2D_IMGBUF_USERPTR:
|
||||||
|
tmp_img.user_ptr[0].userptr = (unsigned long)checkerboard;
|
||||||
|
tmp_img.user_ptr[0].size = img_w * img_h * 4;
|
||||||
|
break;
|
||||||
|
case G2D_IMGBUF_COLOR:
|
||||||
|
default:
|
||||||
|
ret = -EFAULT;
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* solid fill framebuffer with white color */
|
||||||
|
img.width = screen_width;
|
||||||
|
img.height = screen_height;
|
||||||
|
img.stride = screen_width * 4;
|
||||||
|
img.buf_type = G2D_IMGBUF_GEM;
|
||||||
|
img.color_mode = G2D_COLOR_FMT_ARGB8888 | G2D_ORDER_AXRGB;
|
||||||
|
img.color = 0xffffffff;
|
||||||
|
|
||||||
|
/* put checkerboard pattern in the center of the framebuffer */
|
||||||
|
cur_x = (screen_width - img_w) / 2;
|
||||||
|
cur_y = (screen_height - img_h) / 2;
|
||||||
|
tmp_img.width = img_w;
|
||||||
|
tmp_img.height = img_h;
|
||||||
|
tmp_img.stride = img_w * 4;
|
||||||
|
tmp_img.buf_type = type;
|
||||||
|
tmp_img.color_mode = G2D_COLOR_FMT_ARGB8888 | G2D_ORDER_AXRGB;
|
||||||
|
|
||||||
|
ret = g2d_solid_fill(ctx, &img, 0, 0, screen_width, screen_height) ||
|
||||||
|
g2d_copy(ctx, &tmp_img, &img, 0, 0, cur_x, cur_y, img_w, img_h);
|
||||||
|
|
||||||
|
if (!ret)
|
||||||
|
ret = g2d_exec(ctx);
|
||||||
|
if (ret < 0)
|
||||||
|
goto fail;
|
||||||
|
|
||||||
|
printf("move test with %s.\n",
|
||||||
|
type == G2D_IMGBUF_GEM ? "gem" : "userptr");
|
||||||
|
|
||||||
|
srand(time(NULL));
|
||||||
|
for (count = 0; count < 256; ++count) {
|
||||||
|
const struct g2d_step *s;
|
||||||
|
|
||||||
|
/* select step and validate it */
|
||||||
|
while (1) {
|
||||||
|
s = &steps[random() % num_steps];
|
||||||
|
|
||||||
|
if (cur_x + s->x < 0 || cur_y + s->y < 0 ||
|
||||||
|
cur_x + img_w + s->x >= screen_width ||
|
||||||
|
cur_y + img_h + s->y >= screen_height)
|
||||||
|
continue;
|
||||||
|
else
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = g2d_move(ctx, &img, cur_x, cur_y, cur_x + s->x, cur_y + s->y,
|
||||||
|
img_w, img_h);
|
||||||
|
if (!ret)
|
||||||
|
ret = g2d_exec(ctx);
|
||||||
|
|
||||||
|
if (ret < 0)
|
||||||
|
goto fail;
|
||||||
|
|
||||||
|
cur_x += s->x;
|
||||||
|
cur_y += s->y;
|
||||||
|
|
||||||
|
usleep(100000);
|
||||||
|
}
|
||||||
|
|
||||||
|
fail:
|
||||||
|
g2d_fini(ctx);
|
||||||
|
|
||||||
|
free(checkerboard);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
static int g2d_copy_with_scale_test(struct exynos_device *dev,
|
static int g2d_copy_with_scale_test(struct exynos_device *dev,
|
||||||
struct exynos_bo *src,
|
struct exynos_bo *src,
|
||||||
struct exynos_bo *dst,
|
struct exynos_bo *dst,
|
||||||
|
@ -708,6 +832,14 @@ int main(int argc, char **argv)
|
||||||
|
|
||||||
wait_for_user_input(0);
|
wait_for_user_input(0);
|
||||||
|
|
||||||
|
ret = g2d_move_test(dev, src, bo, G2D_IMGBUF_GEM);
|
||||||
|
if (ret < 0) {
|
||||||
|
fprintf(stderr, "failed to test move operation.\n");
|
||||||
|
goto err_free_src;
|
||||||
|
}
|
||||||
|
|
||||||
|
wait_for_user_input(0);
|
||||||
|
|
||||||
ret = g2d_copy_with_scale_test(dev, src, bo, G2D_IMGBUF_GEM);
|
ret = g2d_copy_with_scale_test(dev, src, bo, G2D_IMGBUF_GEM);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
fprintf(stderr, "failed to test copy and scale operation.\n");
|
fprintf(stderr, "failed to test copy and scale operation.\n");
|
||||||
|
|
Loading…
Reference in New Issue