diff mbox

[10/13] tests/exynos: add test for g2d_move

Message ID 1442937302-8211-11-git-send-email-tjakobi@math.uni-bielefeld.de (mailing list archive)
State New, archived
Headers show

Commit Message

Tobias Jakobi Sept. 22, 2015, 3:54 p.m. UTC
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.

Signed-off-by: Tobias Jakobi <tjakobi@math.uni-bielefeld.de>
---
 tests/exynos/exynos_fimg2d_test.c | 132 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 132 insertions(+)

Comments

Hyungwon Hwang Nov. 9, 2015, 7:36 a.m. UTC | #1
Hello,

I think this patch should update .gitignore, not for adding the built
binary to untracked file list.

But without it, it looks good to me, and I tested it on my Odroid U3
board.

Tested-by: Hyungwon Hwang <human.hwang@samsung.com>
Reviewed-by: Hyungwon Hwang <human.hwang@samsung.com>

Best regards,
Hyungwon Hwang


On Tue, 22 Sep 2015 17:54:59 +0200
Tobias Jakobi <tjakobi@math.uni-bielefeld.de> wrote:

> 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.
> 
> Signed-off-by: Tobias Jakobi <tjakobi@math.uni-bielefeld.de>
> ---
>  tests/exynos/exynos_fimg2d_test.c | 132
> ++++++++++++++++++++++++++++++++++++++ 1 file changed, 132
> insertions(+)
> 
> diff --git a/tests/exynos/exynos_fimg2d_test.c
> b/tests/exynos/exynos_fimg2d_test.c index dfb00a0..797fb6e 100644
> --- a/tests/exynos/exynos_fimg2d_test.c
> +++ b/tests/exynos/exynos_fimg2d_test.c
> @@ -313,6 +313,130 @@ fail:
>  	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,
>  					struct exynos_bo *src,
>  					struct exynos_bo *dst,
> @@ -708,6 +832,14 @@ int main(int argc, char **argv)
>  
>  	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);
>  	if (ret < 0) {
>  		fprintf(stderr, "failed to test copy and scale
> operation.\n");
Tobias Jakobi Nov. 9, 2015, 9:47 a.m. UTC | #2
Hello Hyungwon,


Hyungwon Hwang wrote:
> Hello,
> 
> I think this patch should update .gitignore, not for adding the built
> binary to untracked file list.
good point. I should do this for the event test as well I guess.

Going to respin the series.


With best wishes,
Tobias


> But without it, it looks good to me, and I tested it on my Odroid U3
> board.
> 
> Tested-by: Hyungwon Hwang <human.hwang@samsung.com>
> Reviewed-by: Hyungwon Hwang <human.hwang@samsung.com>
> 
> Best regards,
> Hyungwon Hwang
> 
> 
> On Tue, 22 Sep 2015 17:54:59 +0200
> Tobias Jakobi <tjakobi@math.uni-bielefeld.de> wrote:
> 
>> 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.
>>
>> Signed-off-by: Tobias Jakobi <tjakobi@math.uni-bielefeld.de>
>> ---
>>  tests/exynos/exynos_fimg2d_test.c | 132
>> ++++++++++++++++++++++++++++++++++++++ 1 file changed, 132
>> insertions(+)
>>
>> diff --git a/tests/exynos/exynos_fimg2d_test.c
>> b/tests/exynos/exynos_fimg2d_test.c index dfb00a0..797fb6e 100644
>> --- a/tests/exynos/exynos_fimg2d_test.c
>> +++ b/tests/exynos/exynos_fimg2d_test.c
>> @@ -313,6 +313,130 @@ fail:
>>  	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,
>>  					struct exynos_bo *src,
>>  					struct exynos_bo *dst,
>> @@ -708,6 +832,14 @@ int main(int argc, char **argv)
>>  
>>  	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);
>>  	if (ret < 0) {
>>  		fprintf(stderr, "failed to test copy and scale
>> operation.\n");
>
Emil Velikov Nov. 9, 2015, 11:33 a.m. UTC | #3
On 9 November 2015 at 09:47, Tobias Jakobi
<tjakobi@math.uni-bielefeld.de> wrote:
> Hello Hyungwon,
>
> Hyungwon Hwang wrote:
>> Hello,
>>
>> I think this patch should update .gitignore, not for adding the built
>> binary to untracked file list.
> good point. I should do this for the event test as well I guess.
>
> Going to respin the series.
>
Imho you can do that as a single patch on top. There is no problem if
git status prints out a binary name for a couple of commits.

Regards,
Emil
diff mbox

Patch

diff --git a/tests/exynos/exynos_fimg2d_test.c b/tests/exynos/exynos_fimg2d_test.c
index dfb00a0..797fb6e 100644
--- a/tests/exynos/exynos_fimg2d_test.c
+++ b/tests/exynos/exynos_fimg2d_test.c
@@ -313,6 +313,130 @@  fail:
 	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,
 					struct exynos_bo *src,
 					struct exynos_bo *dst,
@@ -708,6 +832,14 @@  int main(int argc, char **argv)
 
 	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);
 	if (ret < 0) {
 		fprintf(stderr, "failed to test copy and scale operation.\n");