All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/7] tests/exynos: fimg2d: add a checkerboard test
@ 2015-03-11 19:38 Tobias Jakobi
  2015-03-11 19:38 ` [PATCH 2/7] exynos: add g2d_scale_and_blend Tobias Jakobi
                   ` (6 more replies)
  0 siblings, 7 replies; 9+ messages in thread
From: Tobias Jakobi @ 2015-03-11 19:38 UTC (permalink / raw)
  To: linux-samsung-soc; +Cc: dri-devel, emil.l.velikov, Tobias Jakobi

This makes it easier to spot memory corruptions which don't become
visible when using a plain buffer filled with a solid color (so
corruptions that are just a permutation of the bytes in the buffer).

Signed-off-by: Tobias Jakobi <tjakobi@math.uni-bielefeld.de>
Reviewed-by: Inki Dae <inki.dae@samsung.com>
Tested-by: Joonyoung Shim <jy0922.shim@samsung.com>
---
 tests/exynos/exynos_fimg2d_test.c | 117 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 117 insertions(+)

diff --git a/tests/exynos/exynos_fimg2d_test.c b/tests/exynos/exynos_fimg2d_test.c
index 14b38a9..da23f58 100644
--- a/tests/exynos/exynos_fimg2d_test.c
+++ b/tests/exynos/exynos_fimg2d_test.c
@@ -57,6 +57,9 @@ struct fimg2d_test_case {
 	int (*blend)(struct exynos_device *dev,
 				struct exynos_bo *src, struct exynos_bo *dst,
 				enum e_g2d_buf_type);
+	int (*checkerboard)(struct exynos_device *dev,
+				struct exynos_bo *src, struct exynos_bo *dst,
+				enum e_g2d_buf_type);
 };
 
 struct connector {
@@ -209,6 +212,33 @@ static struct exynos_bo *exynos_create_buffer(struct exynos_device *dev,
 	return bo;
 }
 
+/* Allocate buffer and fill it with checkerboard pattern, where the tiles *
+ * have a random color. The caller has to free the buffer.                */
+void *create_checkerboard_pattern(unsigned int num_tiles_x,
+						unsigned int num_tiles_y, unsigned int tile_size)
+{
+	unsigned int *buf;
+	unsigned int x, y, i, j;
+	const unsigned int stride = num_tiles_x * tile_size;
+
+	if (posix_memalign((void*)&buf, 64, num_tiles_y * tile_size * stride * 4) != 0)
+		return NULL;
+
+	for (x = 0; x < num_tiles_x; ++x) {
+		for (y = 0; y < num_tiles_y; ++y) {
+			const unsigned int color = 0xff000000 + (random() & 0xffffff);
+
+			for (i = 0; i < tile_size; ++i) {
+				for (j = 0; j < tile_size; ++j) {
+					buf[x * tile_size + y * stride * tile_size + i + j * stride] = color;
+				}
+			}
+		}
+	}
+
+	return buf;
+}
+
 static void exynos_destroy_buffer(struct exynos_bo *bo)
 {
 	exynos_bo_destroy(bo);
@@ -540,11 +570,90 @@ err_free_userptr:
 	return 0;
 }
 
+static int g2d_checkerboard_test(struct exynos_device *dev,
+					struct exynos_bo *src,
+					struct exynos_bo *dst,
+					enum e_g2d_buf_type type)
+{
+	struct g2d_context *ctx;
+	struct g2d_image src_img = {0}, dst_img = {0};
+	unsigned int src_x, src_y, dst_x, dst_y, img_w, img_h;
+	void *checkerboard = NULL;
+	int ret;
+
+	ctx = g2d_init(dev->fd);
+	if (!ctx)
+		return -EFAULT;
+
+	dst_img.bo[0] = dst->handle;
+
+	src_x = 0;
+	src_y = 0;
+	dst_x = 0;
+	dst_y = 0;
+
+	checkerboard = create_checkerboard_pattern(screen_width / 32, screen_height / 32, 32);
+	if (checkerboard == NULL) {
+		ret = -1;
+		goto fail;
+	}
+
+	img_w = screen_width - (screen_width % 32);
+	img_h = screen_height - (screen_height % 32);
+
+	switch (type) {
+	case G2D_IMGBUF_GEM:
+		memcpy(src->vaddr, checkerboard, img_w * img_h * 4);
+		src_img.bo[0] = src->handle;
+		break;
+	case G2D_IMGBUF_USERPTR:
+		src_img.user_ptr[0].userptr = (unsigned long)checkerboard;
+		src_img.user_ptr[0].size = img_w * img_h * 4;
+		break;
+	default:
+		ret = -EFAULT;
+		goto fail;
+	}
+
+	printf("checkerboard test with %s.\n",
+			type == G2D_IMGBUF_GEM ? "gem" : "userptr");
+
+	src_img.width = img_w;
+	src_img.height = img_h;
+	src_img.stride = src_img.width * 4;
+	src_img.buf_type = type;
+	src_img.color_mode = G2D_COLOR_FMT_ARGB8888 | G2D_ORDER_AXRGB;
+
+	dst_img.width = screen_width;
+	dst_img.height = screen_height;
+	dst_img.stride = dst_img.width * 4;
+	dst_img.buf_type = G2D_IMGBUF_GEM;
+	dst_img.color_mode = G2D_COLOR_FMT_ARGB8888 | G2D_ORDER_AXRGB;
+	src_img.color = 0xff000000;
+	ret = g2d_solid_fill(ctx, &dst_img, src_x, src_y, screen_width, screen_height);
+	if (ret < 0)
+		goto fail;
+
+	ret = g2d_copy(ctx, &src_img, &dst_img, src_x, src_y, dst_x, dst_y,
+			img_w, img_h);
+	if (ret < 0)
+		goto fail;
+
+	g2d_exec(ctx);
+
+fail:
+	free(checkerboard);
+	g2d_fini(ctx);
+
+	return ret;
+}
+
 static struct fimg2d_test_case test_case = {
 	.solid_fill = &g2d_solid_fill_test,
 	.copy = &g2d_copy_test,
 	.copy_with_scale = &g2d_copy_with_scale_test,
 	.blend = &g2d_blend_test,
+	.checkerboard = &g2d_checkerboard_test,
 };
 
 static void usage(char *name)
@@ -686,6 +795,14 @@ int main(int argc, char **argv)
 		goto err_free_src;
 	}
 
+	wait_for_user_input(0);
+
+	ret = test_case.checkerboard(dev, src, bo, G2D_IMGBUF_GEM);
+	if (ret < 0) {
+		fprintf(stderr, "failed to issue checkerboard test.\n");
+		goto err_free_src;
+	}
+
 	wait_for_user_input(1);
 
 	/*
-- 
2.0.5

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH 2/7] exynos: add g2d_scale_and_blend
  2015-03-11 19:38 [PATCH 1/7] tests/exynos: fimg2d: add a checkerboard test Tobias Jakobi
@ 2015-03-11 19:38 ` Tobias Jakobi
  2015-03-11 19:38 ` [PATCH 3/7] exynos: honor the repeat mode in g2d_copy_with_scale Tobias Jakobi
                   ` (5 subsequent siblings)
  6 siblings, 0 replies; 9+ messages in thread
From: Tobias Jakobi @ 2015-03-11 19:38 UTC (permalink / raw)
  To: linux-samsung-soc; +Cc: dri-devel, emil.l.velikov, Tobias Jakobi

This is a combination of g2d_copy_with_scale and g2d_scale.
It is a pretty common operation to scale one buffer and then
blend it on top of another, so provide a direct way to that
operation.

Signed-off-by: Tobias Jakobi <tjakobi@math.uni-bielefeld.de>
Reviewed-by: Inki Dae <inki.dae@samsung.com>
Tested-by: Joonyoung Shim <jy0922.shim@samsung.com>
---
 exynos/exynos_fimg2d.c | 129 +++++++++++++++++++++++++++++++++++++++++++++++++
 exynos/fimg2d.h        |   5 ++
 2 files changed, 134 insertions(+)

diff --git a/exynos/exynos_fimg2d.c b/exynos/exynos_fimg2d.c
index 7a3da82..20c3179 100644
--- a/exynos/exynos_fimg2d.c
+++ b/exynos/exynos_fimg2d.c
@@ -638,3 +638,132 @@ g2d_blend(struct g2d_context *ctx, struct g2d_image *src,
 	return 0;
 }
 
+/**
+ * g2d_scale_and_blend - apply scaling to source buffer and then blend to destination buffer
+ *
+ * @ctx: a pointer to g2d_context structure.
+ * @src: a pointer to g2d_image structure including image and buffer
+ *	information to source.
+ * @dst: a pointer to g2d_image structure including image and buffer
+ *	information to destination.
+ * @src_x: x start position to source buffer.
+ * @src_y: y start position to source buffer.
+ * @src_w: width value to source buffer.
+ * @src_h: height value to source buffer.
+ * @dst_x: x start position to destination buffer.
+ * @dst_y: y start position to destination buffer.
+ * @dst_w: width value to destination buffer.
+ * @dst_h: height value to destination buffer.
+ * @op: blend operation type.
+ */
+drm_public int
+g2d_scale_and_blend(struct g2d_context *ctx, struct g2d_image *src,
+		struct g2d_image *dst, unsigned int src_x, unsigned int src_y,
+		unsigned int src_w, unsigned int src_h, unsigned int dst_x,
+		unsigned int dst_y, unsigned int dst_w, unsigned int dst_h,
+		enum e_g2d_op op)
+{
+	union g2d_point_val pt;
+	union g2d_bitblt_cmd_val bitblt;
+	union g2d_blend_func_val blend;
+	unsigned int scale;
+	unsigned int scale_x, scale_y;
+
+	bitblt.val = 0;
+	blend.val = 0;
+
+	if (op == G2D_OP_SRC || op == G2D_OP_CLEAR)
+		g2d_add_cmd(ctx, DST_SELECT_REG, G2D_SELECT_MODE_BGCOLOR);
+	else
+		g2d_add_cmd(ctx, DST_SELECT_REG, G2D_SELECT_MODE_NORMAL);
+
+	g2d_add_cmd(ctx, DST_COLOR_MODE_REG, dst->color_mode);
+	if (dst->buf_type == G2D_IMGBUF_USERPTR)
+		g2d_add_cmd(ctx, DST_BASE_ADDR_REG | G2D_BUF_USERPTR,
+				(unsigned long)&dst->user_ptr[0]);
+	else
+		g2d_add_cmd(ctx, DST_BASE_ADDR_REG, dst->bo[0]);
+
+	g2d_add_cmd(ctx, DST_STRIDE_REG, dst->stride);
+
+	g2d_add_cmd(ctx, SRC_SELECT_REG, src->select_mode);
+	g2d_add_cmd(ctx, SRC_COLOR_MODE_REG, src->color_mode);
+
+	switch (src->select_mode) {
+	case G2D_SELECT_MODE_NORMAL:
+		if (src->buf_type == G2D_IMGBUF_USERPTR)
+			g2d_add_cmd(ctx, SRC_BASE_ADDR_REG | G2D_BUF_USERPTR,
+					(unsigned long)&src->user_ptr[0]);
+		else
+			g2d_add_cmd(ctx, SRC_BASE_ADDR_REG, src->bo[0]);
+
+		g2d_add_cmd(ctx, SRC_STRIDE_REG, src->stride);
+		break;
+	case G2D_SELECT_MODE_FGCOLOR:
+		g2d_add_cmd(ctx, FG_COLOR_REG, src->color);
+		break;
+	case G2D_SELECT_MODE_BGCOLOR:
+		g2d_add_cmd(ctx, BG_COLOR_REG, src->color);
+		break;
+	default:
+		fprintf(stderr , "failed to set src.\n");
+		return -EINVAL;
+	}
+
+	if (src_w == dst_w && src_h == dst_h)
+		scale = 0;
+	else {
+		scale = 1;
+		scale_x = g2d_get_scaling(src_w, dst_w);
+		scale_y = g2d_get_scaling(src_h, dst_h);
+	}
+
+	if (src_x + src_w > src->width)
+		src_w = src->width - src_x;
+	if (src_y + src_h > src->height)
+		src_h = src->height - src_y;
+
+	if (dst_x + dst_w > dst->width)
+		dst_w = dst->width - dst_x;
+	if (dst_y + dst_h > dst->height)
+		dst_h = dst->height - dst_y;
+
+	if (src_w <= 0 || src_h <= 0 || dst_w <= 0 || dst_h <= 0) {
+		fprintf(stderr, "invalid width or height.\n");
+		g2d_reset(ctx);
+		return -EINVAL;
+	}
+
+	if (scale) {
+		g2d_add_cmd(ctx, SRC_SCALE_CTRL_REG, G2D_SCALE_MODE_BILINEAR);
+		g2d_add_cmd(ctx, SRC_XSCALE_REG, scale_x);
+		g2d_add_cmd(ctx, SRC_YSCALE_REG, scale_y);
+	}
+
+	bitblt.data.alpha_blend_mode = G2D_ALPHA_BLEND_MODE_ENABLE;
+	blend.val = g2d_get_blend_op(op);
+	g2d_add_cmd(ctx, BITBLT_COMMAND_REG, bitblt.val);
+	g2d_add_cmd(ctx, BLEND_FUNCTION_REG, blend.val);
+
+	pt.val = 0;
+	pt.data.x = src_x;
+	pt.data.y = src_y;
+	g2d_add_cmd(ctx, SRC_LEFT_TOP_REG, pt.val);
+	pt.val = 0;
+	pt.data.x = src_x + src_w;
+	pt.data.y = src_y + src_h;
+	g2d_add_cmd(ctx, SRC_RIGHT_BOTTOM_REG, pt.val);
+
+	pt.val = 0;
+	pt.data.x = dst_x;
+	pt.data.y = dst_y;
+	g2d_add_cmd(ctx, DST_LEFT_TOP_REG, pt.val);
+	pt.val = 0;
+	pt.data.x = dst_x + dst_w;
+	pt.data.y = dst_y + dst_h;
+	g2d_add_cmd(ctx, DST_RIGHT_BOTTOM_REG, pt.val);
+
+	g2d_flush(ctx);
+
+	return 0;
+}
diff --git a/exynos/fimg2d.h b/exynos/fimg2d.h
index c6d67ca..f76f2a9 100644
--- a/exynos/fimg2d.h
+++ b/exynos/fimg2d.h
@@ -314,4 +314,9 @@ int g2d_blend(struct g2d_context *ctx, struct g2d_image *src,
 		struct g2d_image *dst, unsigned int src_x,
 		unsigned int src_y, unsigned int dst_x, unsigned int dst_y,
 		unsigned int w, unsigned int h, enum e_g2d_op op);
+int g2d_scale_and_blend(struct g2d_context *ctx, struct g2d_image *src,
+		struct g2d_image *dst, unsigned int src_x, unsigned int src_y,
+		unsigned int src_w, unsigned int src_h, unsigned int dst_x,
+		unsigned int dst_y, unsigned int dst_w, unsigned int dst_h,
+		enum e_g2d_op op);
 #endif /* _FIMG2D_H_ */
-- 
2.0.5

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH 3/7] exynos: honor the repeat mode in g2d_copy_with_scale
  2015-03-11 19:38 [PATCH 1/7] tests/exynos: fimg2d: add a checkerboard test Tobias Jakobi
  2015-03-11 19:38 ` [PATCH 2/7] exynos: add g2d_scale_and_blend Tobias Jakobi
@ 2015-03-11 19:38 ` Tobias Jakobi
  2015-03-11 19:38 ` [PATCH 4/7] exynos: use structure initialization instead of memset Tobias Jakobi
                   ` (4 subsequent siblings)
  6 siblings, 0 replies; 9+ messages in thread
From: Tobias Jakobi @ 2015-03-11 19:38 UTC (permalink / raw)
  To: linux-samsung-soc; +Cc: dri-devel, emil.l.velikov, Tobias Jakobi

This is useful when the default repeat mode, which is 'repeat'
produces artifacts at the borders of the copied image.
Choose the 'pad' mode to make use of the color of the destination
image.

In my usage case the destination is the framebuffer, which is
solid filled with a background color. Scaling with 'pad' mode
would then just do the right thing and also produces nice
borders on the output.

Signed-off-by: Tobias Jakobi <tjakobi@math.uni-bielefeld.de>
Reviewed-by: Inki Dae <inki.dae@samsung.com>
Tested-by: Joonyoung Shim <jy0922.shim@samsung.com>
---
 exynos/exynos_fimg2d.c | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/exynos/exynos_fimg2d.c b/exynos/exynos_fimg2d.c
index 20c3179..5f9e9a7 100644
--- a/exynos/exynos_fimg2d.c
+++ b/exynos/exynos_fimg2d.c
@@ -462,6 +462,11 @@ g2d_copy_with_scale(struct g2d_context *ctx, struct g2d_image *src,
 
 	g2d_add_cmd(ctx, SRC_SELECT_REG, G2D_SELECT_MODE_NORMAL);
 	g2d_add_cmd(ctx, SRC_COLOR_MODE_REG, src->color_mode);
+
+	g2d_add_cmd(ctx, SRC_REPEAT_MODE_REG, src->repeat_mode);
+	if (src->repeat_mode == G2D_REPEAT_MODE_PAD)
+		g2d_add_cmd(ctx, SRC_PAD_VALUE_REG, dst->color);
+
 	g2d_add_base_addr(ctx, src, g2d_src);
 	g2d_add_cmd(ctx, SRC_STRIDE_REG, src->stride);
 
-- 
2.0.5

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH 4/7] exynos: use structure initialization instead of memset
  2015-03-11 19:38 [PATCH 1/7] tests/exynos: fimg2d: add a checkerboard test Tobias Jakobi
  2015-03-11 19:38 ` [PATCH 2/7] exynos: add g2d_scale_and_blend Tobias Jakobi
  2015-03-11 19:38 ` [PATCH 3/7] exynos: honor the repeat mode in g2d_copy_with_scale Tobias Jakobi
@ 2015-03-11 19:38 ` Tobias Jakobi
  2015-03-11 19:38 ` [PATCH 5/7] exynos: add exynos prefix to fimg2d header Tobias Jakobi
                   ` (3 subsequent siblings)
  6 siblings, 0 replies; 9+ messages in thread
From: Tobias Jakobi @ 2015-03-11 19:38 UTC (permalink / raw)
  To: linux-samsung-soc; +Cc: dri-devel, emil.l.velikov, Tobias Jakobi

Keeps the code cleaner, since the structs have to be initialized
once anyway.

Signed-off-by: Tobias Jakobi <tjakobi@math.uni-bielefeld.de>
Reviewed-by: Inki Dae <inki.dae@samsung.com>
Tested-by: Joonyoung Shim <jy0922.shim@samsung.com>
---
 exynos/exynos_fimg2d.c            |  4 +---
 tests/exynos/exynos_fimg2d_test.c | 15 ++++-----------
 2 files changed, 5 insertions(+), 14 deletions(-)

diff --git a/exynos/exynos_fimg2d.c b/exynos/exynos_fimg2d.c
index 5f9e9a7..aecd1c3 100644
--- a/exynos/exynos_fimg2d.c
+++ b/exynos/exynos_fimg2d.c
@@ -188,7 +188,7 @@ static void g2d_reset(struct g2d_context *ctx)
 static int g2d_flush(struct g2d_context *ctx)
 {
 	int ret;
-	struct drm_exynos_g2d_set_cmdlist cmdlist;
+	struct drm_exynos_g2d_set_cmdlist cmdlist = {0};
 
 	if (ctx->cmd_nr == 0 && ctx->cmd_buf_nr == 0)
 		return -1;
@@ -198,8 +198,6 @@ static int g2d_flush(struct g2d_context *ctx)
 		return -EINVAL;
 	}
 
-	memset(&cmdlist, 0, sizeof(struct drm_exynos_g2d_set_cmdlist));
-
 	cmdlist.cmd = (uint64_t)(uintptr_t)&ctx->cmd[0];
 	cmdlist.cmd_buf = (uint64_t)(uintptr_t)&ctx->cmd_buf[0];
 	cmdlist.cmd_nr = ctx->cmd_nr;
diff --git a/tests/exynos/exynos_fimg2d_test.c b/tests/exynos/exynos_fimg2d_test.c
index da23f58..b7003c4 100644
--- a/tests/exynos/exynos_fimg2d_test.c
+++ b/tests/exynos/exynos_fimg2d_test.c
@@ -255,7 +255,7 @@ static void wait_for_user_input(int last)
 static int g2d_solid_fill_test(struct exynos_device *dev, struct exynos_bo *dst)
 {
 	struct g2d_context *ctx;
-	struct g2d_image img;
+	struct g2d_image img = {0};
 	unsigned int count, img_w, img_h;
 	int ret = 0;
 
@@ -263,7 +263,6 @@ static int g2d_solid_fill_test(struct exynos_device *dev, struct exynos_bo *dst)
 	if (!ctx)
 		return -EFAULT;
 
-	memset(&img, 0, sizeof(struct g2d_image));
 	img.bo[0] = dst->handle;
 
 	printf("solid fill test.\n");
@@ -306,7 +305,7 @@ static int g2d_copy_test(struct exynos_device *dev, struct exynos_bo *src,
 				enum e_g2d_buf_type type)
 {
 	struct g2d_context *ctx;
-	struct g2d_image src_img, dst_img;
+	struct g2d_image src_img = {0}, dst_img = {0};
 	unsigned int src_x, src_y, dst_x, dst_y, img_w, img_h;
 	unsigned long userptr, size;
 	int ret;
@@ -315,8 +314,6 @@ static int g2d_copy_test(struct exynos_device *dev, struct exynos_bo *src,
 	if (!ctx)
 		return -EFAULT;
 
-	memset(&src_img, 0, sizeof(struct g2d_image));
-	memset(&dst_img, 0, sizeof(struct g2d_image));
 	dst_img.bo[0] = dst->handle;
 
 	src_x = 0;
@@ -389,7 +386,7 @@ static int g2d_copy_with_scale_test(struct exynos_device *dev,
 					enum e_g2d_buf_type type)
 {
 	struct g2d_context *ctx;
-	struct g2d_image src_img, dst_img;
+	struct g2d_image src_img = {0}, dst_img = {0};
 	unsigned int src_x, src_y, dst_x, dst_y, img_w, img_h;
 	unsigned long userptr, size;
 	int ret;
@@ -398,8 +395,6 @@ static int g2d_copy_with_scale_test(struct exynos_device *dev,
 	if (!ctx)
 		return -EFAULT;
 
-	memset(&src_img, 0, sizeof(struct g2d_image));
-	memset(&dst_img, 0, sizeof(struct g2d_image));
 	dst_img.bo[0] = dst->handle;
 
 	src_x = 0;
@@ -477,7 +472,7 @@ static int g2d_blend_test(struct exynos_device *dev,
 					enum e_g2d_buf_type type)
 {
 	struct g2d_context *ctx;
-	struct g2d_image src_img, dst_img;
+	struct g2d_image src_img = {0}, dst_img = {0};
 	unsigned int src_x, src_y, dst_x, dst_y, img_w, img_h;
 	unsigned long userptr, size;
 	int ret;
@@ -486,8 +481,6 @@ static int g2d_blend_test(struct exynos_device *dev,
 	if (!ctx)
 		return -EFAULT;
 
-	memset(&src_img, 0, sizeof(struct g2d_image));
-	memset(&dst_img, 0, sizeof(struct g2d_image));
 	dst_img.bo[0] = dst->handle;
 
 	src_x = 0;
-- 
2.0.5

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH 5/7] exynos: add exynos prefix to fimg2d header
  2015-03-11 19:38 [PATCH 1/7] tests/exynos: fimg2d: add a checkerboard test Tobias Jakobi
                   ` (2 preceding siblings ...)
  2015-03-11 19:38 ` [PATCH 4/7] exynos: use structure initialization instead of memset Tobias Jakobi
@ 2015-03-11 19:38 ` Tobias Jakobi
  2015-03-11 19:38 ` [PATCH 6/7] exynos: add fimg2d header to common includes Tobias Jakobi
                   ` (2 subsequent siblings)
  6 siblings, 0 replies; 9+ messages in thread
From: Tobias Jakobi @ 2015-03-11 19:38 UTC (permalink / raw)
  To: linux-samsung-soc; +Cc: dri-devel, emil.l.velikov, Tobias Jakobi

Signed-off-by: Tobias Jakobi <tjakobi@math.uni-bielefeld.de>
Reviewed-by: Inki Dae <inki.dae@samsung.com>
Tested-by: Joonyoung Shim <jy0922.shim@samsung.com>
---
 exynos/Makefile.am                |   2 +-
 exynos/exynos_fimg2d.c            |   2 +-
 exynos/exynos_fimg2d.h            | 322 ++++++++++++++++++++++++++++++++++++++
 exynos/fimg2d.h                   | 322 --------------------------------------
 tests/exynos/exynos_fimg2d_test.c |   2 +-
 5 files changed, 325 insertions(+), 325 deletions(-)
 create mode 100644 exynos/exynos_fimg2d.h
 delete mode 100644 exynos/fimg2d.h

diff --git a/exynos/Makefile.am b/exynos/Makefile.am
index 06bee00..1715a85 100644
--- a/exynos/Makefile.am
+++ b/exynos/Makefile.am
@@ -14,7 +14,7 @@ libdrm_exynos_la_LIBADD = ../libdrm.la @PTHREADSTUBS_LIBS@
 libdrm_exynos_la_SOURCES = \
 	exynos_drm.c \
 	exynos_fimg2d.c \
-	fimg2d.h \
+	exynos_fimg2d.h \
 	fimg2d_reg.h
 
 libdrm_exynoscommonincludedir = ${includedir}/exynos
diff --git a/exynos/exynos_fimg2d.c b/exynos/exynos_fimg2d.c
index aecd1c3..fc605ed 100644
--- a/exynos/exynos_fimg2d.c
+++ b/exynos/exynos_fimg2d.c
@@ -27,7 +27,7 @@
 #include "libdrm.h"
 #include "exynos_drm.h"
 #include "fimg2d_reg.h"
-#include "fimg2d.h"
+#include "exynos_fimg2d.h"
 
 #define		SET_BF(val, sc, si, scsa, scda, dc, di, dcsa, dcda) \
 			val.data.src_coeff = sc;		\
diff --git a/exynos/exynos_fimg2d.h b/exynos/exynos_fimg2d.h
new file mode 100644
index 0000000..f76f2a9
--- /dev/null
+++ b/exynos/exynos_fimg2d.h
@@ -0,0 +1,322 @@
+/*
+ * Copyright (C) 2013 Samsung Electronics Co.Ltd
+ * Authors:
+ *	Inki Dae <inki.dae@samsung.com>
+ *
+ * This program is free software; you can redistribute  it and/or modify it
+ * under  the terms of  the GNU General  Public License as published by the
+ * Free Software Foundation;  either version 2 of the  License, or (at your
+ * option) any later version.
+ *
+ */
+
+#ifndef _FIMG2D_H_
+#define _FIMG2D_H_
+
+#define G2D_MAX_CMD_NR		64
+#define G2D_MAX_GEM_CMD_NR	64
+#define G2D_MAX_CMD_LIST_NR	64
+#define G2D_PLANE_MAX_NR	2
+
+enum e_g2d_color_mode {
+	/* COLOR FORMAT */
+	G2D_COLOR_FMT_XRGB8888,
+	G2D_COLOR_FMT_ARGB8888,
+	G2D_COLOR_FMT_RGB565,
+	G2D_COLOR_FMT_XRGB1555,
+	G2D_COLOR_FMT_ARGB1555,
+	G2D_COLOR_FMT_XRGB4444,
+	G2D_COLOR_FMT_ARGB4444,
+	G2D_COLOR_FMT_PRGB888,
+	G2D_COLOR_FMT_YCbCr444,
+	G2D_COLOR_FMT_YCbCr422,
+	G2D_COLOR_FMT_YCbCr420,
+	/* alpha 8bit */
+	G2D_COLOR_FMT_A8,
+	/* Luminance 8bit: gray color */
+	G2D_COLOR_FMT_L8,
+	/* alpha 1bit */
+	G2D_COLOR_FMT_A1,
+	/* alpha 4bit */
+	G2D_COLOR_FMT_A4,
+	G2D_COLOR_FMT_MASK,				/* VER4.1 */
+
+	/* COLOR ORDER */
+	G2D_ORDER_AXRGB		= (0 << 4),		/* VER4.1 */
+	G2D_ORDER_RGBAX		= (1 << 4),		/* VER4.1 */
+	G2D_ORDER_AXBGR		= (2 << 4),		/* VER4.1 */
+	G2D_ORDER_BGRAX		= (3 << 4),		/* VER4.1 */
+	G2D_ORDER_MASK		= (3 << 4),		/* VER4.1 */
+
+	/* Number of YCbCr plane */
+	G2D_YCbCr_1PLANE	= (0 << 8),		/* VER4.1 */
+	G2D_YCbCr_2PLANE	= (1 << 8),		/* VER4.1 */
+	G2D_YCbCr_PLANE_MASK	= (3 << 8),		/* VER4.1 */
+
+	/* Order in YCbCr */
+	G2D_YCbCr_ORDER_CrY1CbY0 = (0 << 12),			/* VER4.1 */
+	G2D_YCbCr_ORDER_CbY1CrY0 = (1 << 12),			/* VER4.1 */
+	G2D_YCbCr_ORDER_Y1CrY0Cb = (2 << 12),			/* VER4.1 */
+	G2D_YCbCr_ORDER_Y1CbY0Cr = (3 << 12),			/* VER4.1 */
+	G2D_YCbCr_ORDER_CrCb = G2D_YCbCr_ORDER_CrY1CbY0,	/* VER4.1 */
+	G2D_YCbCr_ORDER_CbCr = G2D_YCbCr_ORDER_CbY1CrY0,	/* VER4.1 */
+	G2D_YCbCr_ORDER_MASK = (3 < 12),			/* VER4.1 */
+
+	/* CSC */
+	G2D_CSC_601 = (0 << 16),		/* VER4.1 */
+	G2D_CSC_709 = (1 << 16),		/* VER4.1 */
+	G2D_CSC_MASK = (1 << 16),		/* VER4.1 */
+
+	/* Valid value range of YCbCr */
+	G2D_YCbCr_RANGE_NARROW = (0 << 17),	/* VER4.1 */
+	G2D_YCbCr_RANGE_WIDE = (1 << 17),	/* VER4.1 */
+	G2D_YCbCr_RANGE_MASK = (1 << 17),	/* VER4.1 */
+
+	G2D_COLOR_MODE_MASK = 0xFFFFFFFF,
+};
+
+enum e_g2d_select_mode {
+	G2D_SELECT_MODE_NORMAL	= (0 << 0),
+	G2D_SELECT_MODE_FGCOLOR = (1 << 0),
+	G2D_SELECT_MODE_BGCOLOR = (2 << 0),
+};
+
+enum e_g2d_repeat_mode {
+	G2D_REPEAT_MODE_REPEAT,
+	G2D_REPEAT_MODE_PAD,
+	G2D_REPEAT_MODE_REFLECT,
+	G2D_REPEAT_MODE_CLAMP,
+	G2D_REPEAT_MODE_NONE,
+};
+
+enum e_g2d_scale_mode {
+	G2D_SCALE_MODE_NONE = 0,
+	G2D_SCALE_MODE_NEAREST,
+	G2D_SCALE_MODE_BILINEAR,
+	G2D_SCALE_MODE_MAX,
+};
+
+enum e_g2d_buf_type {
+	G2D_IMGBUF_COLOR,
+	G2D_IMGBUF_GEM,
+	G2D_IMGBUF_USERPTR,
+};
+
+enum e_g2d_rop3_type {
+	G2D_ROP3_DST = 0xAA,
+	G2D_ROP3_SRC = 0xCC,
+	G2D_ROP3_3RD = 0xF0,
+	G2D_ROP3_MASK = 0xFF,
+};
+
+enum e_g2d_select_alpha_src {
+	G2D_SELECT_SRC_FOR_ALPHA_BLEND,	/* VER4.1 */
+	G2D_SELECT_ROP_FOR_ALPHA_BLEND,	/* VER4.1 */
+};
+
+enum e_g2d_transparent_mode {
+	G2D_TRANSPARENT_MODE_OPAQUE,
+	G2D_TRANSPARENT_MODE_TRANSPARENT,
+	G2D_TRANSPARENT_MODE_BLUESCREEN,
+	G2D_TRANSPARENT_MODE_MAX,
+};
+
+enum e_g2d_color_key_mode {
+	G2D_COLORKEY_MODE_DISABLE	= 0,
+	G2D_COLORKEY_MODE_SRC_RGBA	= (1<<0),
+	G2D_COLORKEY_MODE_DST_RGBA	= (1<<1),
+	G2D_COLORKEY_MODE_SRC_YCbCr	= (1<<2),		/* VER4.1 */
+	G2D_COLORKEY_MODE_DST_YCbCr	= (1<<3),		/* VER4.1 */
+	G2D_COLORKEY_MODE_MASK		= 15,
+};
+
+enum e_g2d_alpha_blend_mode {
+	G2D_ALPHA_BLEND_MODE_DISABLE,
+	G2D_ALPHA_BLEND_MODE_ENABLE,
+	G2D_ALPHA_BLEND_MODE_FADING,				/* VER3.0 */
+	G2D_ALPHA_BLEND_MODE_MAX,
+};
+
+enum e_g2d_op {
+	G2D_OP_CLEAR			= 0x00,
+	G2D_OP_SRC			= 0x01,
+	G2D_OP_DST			= 0x02,
+	G2D_OP_OVER			= 0x03,
+	G2D_OP_INTERPOLATE		= 0x04,
+	G2D_OP_DISJOINT_CLEAR		= 0x10,
+	G2D_OP_DISJOINT_SRC		= 0x11,
+	G2D_OP_DISJOINT_DST		= 0x12,
+	G2D_OP_CONJOINT_CLEAR		= 0x20,
+	G2D_OP_CONJOINT_SRC		= 0x21,
+	G2D_OP_CONJOINT_DST		= 0x22,
+};
+
+enum e_g2d_coeff_mode {
+	G2D_COEFF_MODE_ONE,
+	G2D_COEFF_MODE_ZERO,
+	G2D_COEFF_MODE_SRC_ALPHA,
+	G2D_COEFF_MODE_SRC_COLOR,
+	G2D_COEFF_MODE_DST_ALPHA,
+	G2D_COEFF_MODE_DST_COLOR,
+	/* Global Alpha : Set by ALPHA_REG(0x618) */
+	G2D_COEFF_MODE_GB_ALPHA,
+	/* Global Color : Set by ALPHA_REG(0x618) */
+	G2D_COEFF_MODE_GB_COLOR,
+	/* (1-SRC alpha)/DST Alpha */
+	G2D_COEFF_MODE_DISJOINT_S,
+	/* (1-DST alpha)/SRC Alpha */
+	G2D_COEFF_MODE_DISJOINT_D,
+	/* SRC alpha/DST alpha */
+	G2D_COEFF_MODE_CONJOINT_S,
+	/* DST alpha/SRC alpha */
+	G2D_COEFF_MODE_CONJOINT_D,
+	/* DST alpha/SRC alpha */
+	G2D_COEFF_MODE_MASK
+};
+
+enum e_g2d_acoeff_mode {
+	G2D_ACOEFF_MODE_A,          /* alpha */
+	G2D_ACOEFF_MODE_APGA,	/* alpha + global alpha */
+	G2D_ACOEFF_MODE_AMGA,	/* alpha * global alpha */
+	G2D_ACOEFF_MODE_MASK
+};
+
+union g2d_point_val {
+	unsigned int val;
+	struct {
+		/*
+		 * Coordinate of Source Image
+		 * Range: 0 ~ 8000 (Requirement: SrcLeftX < SrcRightX)
+		 * In YCbCr 422 and YCbCr 420 format with even number.
+		 */
+		unsigned int x:16;
+		/*
+		 * Y Coordinate of Source Image
+		 * Range: 0 ~ 8000 (Requirement: SrcTopY < SrcBottomY)
+		 * In YCbCr 420 format with even number.
+		 */
+		unsigned int y:16;
+	} data;
+};
+
+union g2d_rop4_val {
+	unsigned int val;
+	struct {
+		enum e_g2d_rop3_type	unmasked_rop3:8;
+		enum e_g2d_rop3_type	masked_rop3:8;
+		unsigned int		reserved:16;
+	} data;
+};
+
+union g2d_bitblt_cmd_val {
+	unsigned int val;
+	struct {
+		/* [0:3] */
+		unsigned int			mask_rop4_en:1;
+		unsigned int			masking_en:1;
+		enum e_g2d_select_alpha_src	rop4_alpha_en:1;
+		unsigned int			dither_en:1;
+		/* [4:7] */
+		unsigned int			resolved1:4;
+		/* [8:11] */
+		unsigned int			cw_en:4;
+		/* [12:15] */
+		enum e_g2d_transparent_mode	transparent_mode:4;
+		/* [16:19] */
+		enum e_g2d_color_key_mode	color_key_mode:4;
+		/* [20:23] */
+		enum e_g2d_alpha_blend_mode	alpha_blend_mode:4;
+		/* [24:27] */
+		unsigned int src_pre_multiply:1;
+		unsigned int pat_pre_multiply:1;
+		unsigned int dst_pre_multiply:1;
+		unsigned int dst_depre_multiply:1;
+		/* [28:31] */
+		unsigned int fast_solid_color_fill_en:1;
+		unsigned int reserved:3;
+	} data;
+};
+
+union g2d_blend_func_val {
+	unsigned int val;
+	struct {
+		/* [0:15] */
+		enum e_g2d_coeff_mode src_coeff:4;
+		enum e_g2d_acoeff_mode src_coeff_src_a:2;
+		enum e_g2d_acoeff_mode src_coeff_dst_a:2;
+		enum e_g2d_coeff_mode dst_coeff:4;
+		enum e_g2d_acoeff_mode dst_coeff_src_a:2;
+		enum e_g2d_acoeff_mode dst_coeff_dst_a:2;
+		/* [16:19] */
+		unsigned int inv_src_color_coeff:1;
+		unsigned int resoled1:1;
+		unsigned int inv_dst_color_coeff:1;
+		unsigned int resoled2:1;
+		/* [20:23] */
+		unsigned int lighten_en:1;
+		unsigned int darken_en:1;
+		unsigned int win_ce_src_over_en:2;
+		/* [24:31] */
+		unsigned int reserved:8;
+	} data;
+};
+
+struct g2d_image {
+	enum e_g2d_select_mode		select_mode;
+	enum e_g2d_color_mode		color_mode;
+	enum e_g2d_repeat_mode		repeat_mode;
+	enum e_g2d_scale_mode		scale_mode;
+	unsigned int			xscale;
+	unsigned int			yscale;
+	unsigned char			rotate_90;
+	unsigned char			x_dir;
+	unsigned char			y_dir;
+	unsigned char			component_alpha;
+	unsigned int			width;
+	unsigned int			height;
+	unsigned int			stride;
+	unsigned int			need_free;
+	unsigned int			color;
+	enum e_g2d_buf_type		buf_type;
+	unsigned int			bo[G2D_PLANE_MAX_NR];
+	struct drm_exynos_g2d_userptr	user_ptr[G2D_PLANE_MAX_NR];
+	void				*mapped_ptr[G2D_PLANE_MAX_NR];
+};
+
+struct g2d_context {
+	int				fd;
+	unsigned int			major;
+	unsigned int			minor;
+	struct drm_exynos_g2d_cmd	cmd[G2D_MAX_CMD_NR];
+	struct drm_exynos_g2d_cmd	cmd_buf[G2D_MAX_GEM_CMD_NR];
+	unsigned int			cmd_nr;
+	unsigned int			cmd_buf_nr;
+	unsigned int			cmdlist_nr;
+};
+
+struct g2d_context *g2d_init(int fd);
+void g2d_fini(struct g2d_context *ctx);
+int g2d_exec(struct g2d_context *ctx);
+int g2d_solid_fill(struct g2d_context *ctx, struct g2d_image *img,
+			unsigned int x, unsigned int y, unsigned int w,
+			unsigned int h);
+int g2d_copy(struct g2d_context *ctx, struct g2d_image *src,
+		struct g2d_image *dst, unsigned int src_x,
+		unsigned int src_y, unsigned int dst_x, unsigned int dst_y,
+		unsigned int w, unsigned int h);
+int g2d_copy_with_scale(struct g2d_context *ctx, struct g2d_image *src,
+				struct g2d_image *dst, unsigned int src_x,
+				unsigned int src_y, unsigned int src_w,
+				unsigned int src_h, unsigned int dst_x,
+				unsigned int dst_y, unsigned int dst_w,
+				unsigned int dst_h, unsigned int negative);
+int g2d_blend(struct g2d_context *ctx, struct g2d_image *src,
+		struct g2d_image *dst, unsigned int src_x,
+		unsigned int src_y, unsigned int dst_x, unsigned int dst_y,
+		unsigned int w, unsigned int h, enum e_g2d_op op);
+int g2d_scale_and_blend(struct g2d_context *ctx, struct g2d_image *src,
+		struct g2d_image *dst, unsigned int src_x, unsigned int src_y,
+		unsigned int src_w, unsigned int src_h, unsigned int dst_x,
+		unsigned int dst_y, unsigned int dst_w, unsigned int dst_h,
+		enum e_g2d_op op);
+#endif /* _FIMG2D_H_ */
diff --git a/exynos/fimg2d.h b/exynos/fimg2d.h
deleted file mode 100644
index f76f2a9..0000000
--- a/exynos/fimg2d.h
+++ /dev/null
@@ -1,322 +0,0 @@
-/*
- * Copyright (C) 2013 Samsung Electronics Co.Ltd
- * Authors:
- *	Inki Dae <inki.dae@samsung.com>
- *
- * This program is free software; you can redistribute  it and/or modify it
- * under  the terms of  the GNU General  Public License as published by the
- * Free Software Foundation;  either version 2 of the  License, or (at your
- * option) any later version.
- *
- */
-
-#ifndef _FIMG2D_H_
-#define _FIMG2D_H_
-
-#define G2D_MAX_CMD_NR		64
-#define G2D_MAX_GEM_CMD_NR	64
-#define G2D_MAX_CMD_LIST_NR	64
-#define G2D_PLANE_MAX_NR	2
-
-enum e_g2d_color_mode {
-	/* COLOR FORMAT */
-	G2D_COLOR_FMT_XRGB8888,
-	G2D_COLOR_FMT_ARGB8888,
-	G2D_COLOR_FMT_RGB565,
-	G2D_COLOR_FMT_XRGB1555,
-	G2D_COLOR_FMT_ARGB1555,
-	G2D_COLOR_FMT_XRGB4444,
-	G2D_COLOR_FMT_ARGB4444,
-	G2D_COLOR_FMT_PRGB888,
-	G2D_COLOR_FMT_YCbCr444,
-	G2D_COLOR_FMT_YCbCr422,
-	G2D_COLOR_FMT_YCbCr420,
-	/* alpha 8bit */
-	G2D_COLOR_FMT_A8,
-	/* Luminance 8bit: gray color */
-	G2D_COLOR_FMT_L8,
-	/* alpha 1bit */
-	G2D_COLOR_FMT_A1,
-	/* alpha 4bit */
-	G2D_COLOR_FMT_A4,
-	G2D_COLOR_FMT_MASK,				/* VER4.1 */
-
-	/* COLOR ORDER */
-	G2D_ORDER_AXRGB		= (0 << 4),		/* VER4.1 */
-	G2D_ORDER_RGBAX		= (1 << 4),		/* VER4.1 */
-	G2D_ORDER_AXBGR		= (2 << 4),		/* VER4.1 */
-	G2D_ORDER_BGRAX		= (3 << 4),		/* VER4.1 */
-	G2D_ORDER_MASK		= (3 << 4),		/* VER4.1 */
-
-	/* Number of YCbCr plane */
-	G2D_YCbCr_1PLANE	= (0 << 8),		/* VER4.1 */
-	G2D_YCbCr_2PLANE	= (1 << 8),		/* VER4.1 */
-	G2D_YCbCr_PLANE_MASK	= (3 << 8),		/* VER4.1 */
-
-	/* Order in YCbCr */
-	G2D_YCbCr_ORDER_CrY1CbY0 = (0 << 12),			/* VER4.1 */
-	G2D_YCbCr_ORDER_CbY1CrY0 = (1 << 12),			/* VER4.1 */
-	G2D_YCbCr_ORDER_Y1CrY0Cb = (2 << 12),			/* VER4.1 */
-	G2D_YCbCr_ORDER_Y1CbY0Cr = (3 << 12),			/* VER4.1 */
-	G2D_YCbCr_ORDER_CrCb = G2D_YCbCr_ORDER_CrY1CbY0,	/* VER4.1 */
-	G2D_YCbCr_ORDER_CbCr = G2D_YCbCr_ORDER_CbY1CrY0,	/* VER4.1 */
-	G2D_YCbCr_ORDER_MASK = (3 < 12),			/* VER4.1 */
-
-	/* CSC */
-	G2D_CSC_601 = (0 << 16),		/* VER4.1 */
-	G2D_CSC_709 = (1 << 16),		/* VER4.1 */
-	G2D_CSC_MASK = (1 << 16),		/* VER4.1 */
-
-	/* Valid value range of YCbCr */
-	G2D_YCbCr_RANGE_NARROW = (0 << 17),	/* VER4.1 */
-	G2D_YCbCr_RANGE_WIDE = (1 << 17),	/* VER4.1 */
-	G2D_YCbCr_RANGE_MASK = (1 << 17),	/* VER4.1 */
-
-	G2D_COLOR_MODE_MASK = 0xFFFFFFFF,
-};
-
-enum e_g2d_select_mode {
-	G2D_SELECT_MODE_NORMAL	= (0 << 0),
-	G2D_SELECT_MODE_FGCOLOR = (1 << 0),
-	G2D_SELECT_MODE_BGCOLOR = (2 << 0),
-};
-
-enum e_g2d_repeat_mode {
-	G2D_REPEAT_MODE_REPEAT,
-	G2D_REPEAT_MODE_PAD,
-	G2D_REPEAT_MODE_REFLECT,
-	G2D_REPEAT_MODE_CLAMP,
-	G2D_REPEAT_MODE_NONE,
-};
-
-enum e_g2d_scale_mode {
-	G2D_SCALE_MODE_NONE = 0,
-	G2D_SCALE_MODE_NEAREST,
-	G2D_SCALE_MODE_BILINEAR,
-	G2D_SCALE_MODE_MAX,
-};
-
-enum e_g2d_buf_type {
-	G2D_IMGBUF_COLOR,
-	G2D_IMGBUF_GEM,
-	G2D_IMGBUF_USERPTR,
-};
-
-enum e_g2d_rop3_type {
-	G2D_ROP3_DST = 0xAA,
-	G2D_ROP3_SRC = 0xCC,
-	G2D_ROP3_3RD = 0xF0,
-	G2D_ROP3_MASK = 0xFF,
-};
-
-enum e_g2d_select_alpha_src {
-	G2D_SELECT_SRC_FOR_ALPHA_BLEND,	/* VER4.1 */
-	G2D_SELECT_ROP_FOR_ALPHA_BLEND,	/* VER4.1 */
-};
-
-enum e_g2d_transparent_mode {
-	G2D_TRANSPARENT_MODE_OPAQUE,
-	G2D_TRANSPARENT_MODE_TRANSPARENT,
-	G2D_TRANSPARENT_MODE_BLUESCREEN,
-	G2D_TRANSPARENT_MODE_MAX,
-};
-
-enum e_g2d_color_key_mode {
-	G2D_COLORKEY_MODE_DISABLE	= 0,
-	G2D_COLORKEY_MODE_SRC_RGBA	= (1<<0),
-	G2D_COLORKEY_MODE_DST_RGBA	= (1<<1),
-	G2D_COLORKEY_MODE_SRC_YCbCr	= (1<<2),		/* VER4.1 */
-	G2D_COLORKEY_MODE_DST_YCbCr	= (1<<3),		/* VER4.1 */
-	G2D_COLORKEY_MODE_MASK		= 15,
-};
-
-enum e_g2d_alpha_blend_mode {
-	G2D_ALPHA_BLEND_MODE_DISABLE,
-	G2D_ALPHA_BLEND_MODE_ENABLE,
-	G2D_ALPHA_BLEND_MODE_FADING,				/* VER3.0 */
-	G2D_ALPHA_BLEND_MODE_MAX,
-};
-
-enum e_g2d_op {
-	G2D_OP_CLEAR			= 0x00,
-	G2D_OP_SRC			= 0x01,
-	G2D_OP_DST			= 0x02,
-	G2D_OP_OVER			= 0x03,
-	G2D_OP_INTERPOLATE		= 0x04,
-	G2D_OP_DISJOINT_CLEAR		= 0x10,
-	G2D_OP_DISJOINT_SRC		= 0x11,
-	G2D_OP_DISJOINT_DST		= 0x12,
-	G2D_OP_CONJOINT_CLEAR		= 0x20,
-	G2D_OP_CONJOINT_SRC		= 0x21,
-	G2D_OP_CONJOINT_DST		= 0x22,
-};
-
-enum e_g2d_coeff_mode {
-	G2D_COEFF_MODE_ONE,
-	G2D_COEFF_MODE_ZERO,
-	G2D_COEFF_MODE_SRC_ALPHA,
-	G2D_COEFF_MODE_SRC_COLOR,
-	G2D_COEFF_MODE_DST_ALPHA,
-	G2D_COEFF_MODE_DST_COLOR,
-	/* Global Alpha : Set by ALPHA_REG(0x618) */
-	G2D_COEFF_MODE_GB_ALPHA,
-	/* Global Color : Set by ALPHA_REG(0x618) */
-	G2D_COEFF_MODE_GB_COLOR,
-	/* (1-SRC alpha)/DST Alpha */
-	G2D_COEFF_MODE_DISJOINT_S,
-	/* (1-DST alpha)/SRC Alpha */
-	G2D_COEFF_MODE_DISJOINT_D,
-	/* SRC alpha/DST alpha */
-	G2D_COEFF_MODE_CONJOINT_S,
-	/* DST alpha/SRC alpha */
-	G2D_COEFF_MODE_CONJOINT_D,
-	/* DST alpha/SRC alpha */
-	G2D_COEFF_MODE_MASK
-};
-
-enum e_g2d_acoeff_mode {
-	G2D_ACOEFF_MODE_A,          /* alpha */
-	G2D_ACOEFF_MODE_APGA,	/* alpha + global alpha */
-	G2D_ACOEFF_MODE_AMGA,	/* alpha * global alpha */
-	G2D_ACOEFF_MODE_MASK
-};
-
-union g2d_point_val {
-	unsigned int val;
-	struct {
-		/*
-		 * Coordinate of Source Image
-		 * Range: 0 ~ 8000 (Requirement: SrcLeftX < SrcRightX)
-		 * In YCbCr 422 and YCbCr 420 format with even number.
-		 */
-		unsigned int x:16;
-		/*
-		 * Y Coordinate of Source Image
-		 * Range: 0 ~ 8000 (Requirement: SrcTopY < SrcBottomY)
-		 * In YCbCr 420 format with even number.
-		 */
-		unsigned int y:16;
-	} data;
-};
-
-union g2d_rop4_val {
-	unsigned int val;
-	struct {
-		enum e_g2d_rop3_type	unmasked_rop3:8;
-		enum e_g2d_rop3_type	masked_rop3:8;
-		unsigned int		reserved:16;
-	} data;
-};
-
-union g2d_bitblt_cmd_val {
-	unsigned int val;
-	struct {
-		/* [0:3] */
-		unsigned int			mask_rop4_en:1;
-		unsigned int			masking_en:1;
-		enum e_g2d_select_alpha_src	rop4_alpha_en:1;
-		unsigned int			dither_en:1;
-		/* [4:7] */
-		unsigned int			resolved1:4;
-		/* [8:11] */
-		unsigned int			cw_en:4;
-		/* [12:15] */
-		enum e_g2d_transparent_mode	transparent_mode:4;
-		/* [16:19] */
-		enum e_g2d_color_key_mode	color_key_mode:4;
-		/* [20:23] */
-		enum e_g2d_alpha_blend_mode	alpha_blend_mode:4;
-		/* [24:27] */
-		unsigned int src_pre_multiply:1;
-		unsigned int pat_pre_multiply:1;
-		unsigned int dst_pre_multiply:1;
-		unsigned int dst_depre_multiply:1;
-		/* [28:31] */
-		unsigned int fast_solid_color_fill_en:1;
-		unsigned int reserved:3;
-	} data;
-};
-
-union g2d_blend_func_val {
-	unsigned int val;
-	struct {
-		/* [0:15] */
-		enum e_g2d_coeff_mode src_coeff:4;
-		enum e_g2d_acoeff_mode src_coeff_src_a:2;
-		enum e_g2d_acoeff_mode src_coeff_dst_a:2;
-		enum e_g2d_coeff_mode dst_coeff:4;
-		enum e_g2d_acoeff_mode dst_coeff_src_a:2;
-		enum e_g2d_acoeff_mode dst_coeff_dst_a:2;
-		/* [16:19] */
-		unsigned int inv_src_color_coeff:1;
-		unsigned int resoled1:1;
-		unsigned int inv_dst_color_coeff:1;
-		unsigned int resoled2:1;
-		/* [20:23] */
-		unsigned int lighten_en:1;
-		unsigned int darken_en:1;
-		unsigned int win_ce_src_over_en:2;
-		/* [24:31] */
-		unsigned int reserved:8;
-	} data;
-};
-
-struct g2d_image {
-	enum e_g2d_select_mode		select_mode;
-	enum e_g2d_color_mode		color_mode;
-	enum e_g2d_repeat_mode		repeat_mode;
-	enum e_g2d_scale_mode		scale_mode;
-	unsigned int			xscale;
-	unsigned int			yscale;
-	unsigned char			rotate_90;
-	unsigned char			x_dir;
-	unsigned char			y_dir;
-	unsigned char			component_alpha;
-	unsigned int			width;
-	unsigned int			height;
-	unsigned int			stride;
-	unsigned int			need_free;
-	unsigned int			color;
-	enum e_g2d_buf_type		buf_type;
-	unsigned int			bo[G2D_PLANE_MAX_NR];
-	struct drm_exynos_g2d_userptr	user_ptr[G2D_PLANE_MAX_NR];
-	void				*mapped_ptr[G2D_PLANE_MAX_NR];
-};
-
-struct g2d_context {
-	int				fd;
-	unsigned int			major;
-	unsigned int			minor;
-	struct drm_exynos_g2d_cmd	cmd[G2D_MAX_CMD_NR];
-	struct drm_exynos_g2d_cmd	cmd_buf[G2D_MAX_GEM_CMD_NR];
-	unsigned int			cmd_nr;
-	unsigned int			cmd_buf_nr;
-	unsigned int			cmdlist_nr;
-};
-
-struct g2d_context *g2d_init(int fd);
-void g2d_fini(struct g2d_context *ctx);
-int g2d_exec(struct g2d_context *ctx);
-int g2d_solid_fill(struct g2d_context *ctx, struct g2d_image *img,
-			unsigned int x, unsigned int y, unsigned int w,
-			unsigned int h);
-int g2d_copy(struct g2d_context *ctx, struct g2d_image *src,
-		struct g2d_image *dst, unsigned int src_x,
-		unsigned int src_y, unsigned int dst_x, unsigned int dst_y,
-		unsigned int w, unsigned int h);
-int g2d_copy_with_scale(struct g2d_context *ctx, struct g2d_image *src,
-				struct g2d_image *dst, unsigned int src_x,
-				unsigned int src_y, unsigned int src_w,
-				unsigned int src_h, unsigned int dst_x,
-				unsigned int dst_y, unsigned int dst_w,
-				unsigned int dst_h, unsigned int negative);
-int g2d_blend(struct g2d_context *ctx, struct g2d_image *src,
-		struct g2d_image *dst, unsigned int src_x,
-		unsigned int src_y, unsigned int dst_x, unsigned int dst_y,
-		unsigned int w, unsigned int h, enum e_g2d_op op);
-int g2d_scale_and_blend(struct g2d_context *ctx, struct g2d_image *src,
-		struct g2d_image *dst, unsigned int src_x, unsigned int src_y,
-		unsigned int src_w, unsigned int src_h, unsigned int dst_x,
-		unsigned int dst_y, unsigned int dst_w, unsigned int dst_h,
-		enum e_g2d_op op);
-#endif /* _FIMG2D_H_ */
diff --git a/tests/exynos/exynos_fimg2d_test.c b/tests/exynos/exynos_fimg2d_test.c
index b7003c4..d4ea6fa 100644
--- a/tests/exynos/exynos_fimg2d_test.c
+++ b/tests/exynos/exynos_fimg2d_test.c
@@ -31,7 +31,7 @@
 
 #include "exynos_drm.h"
 #include "exynos_drmif.h"
-#include "fimg2d.h"
+#include "exynos_fimg2d.h"
 
 #define DRM_MODULE_NAME		"exynos"
 #define MAX_TEST_CASE		8
-- 
2.0.5

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH 6/7] exynos: add fimg2d header to common includes
  2015-03-11 19:38 [PATCH 1/7] tests/exynos: fimg2d: add a checkerboard test Tobias Jakobi
                   ` (3 preceding siblings ...)
  2015-03-11 19:38 ` [PATCH 5/7] exynos: add exynos prefix to fimg2d header Tobias Jakobi
@ 2015-03-11 19:38 ` Tobias Jakobi
  2015-03-11 19:38 ` [PATCH 7/7] exynos: fimg2d: follow-up fix for G2D_COEFF_MODE_GB_COLOR Tobias Jakobi
  2015-03-17 11:23 ` [PATCH 1/7] tests/exynos: fimg2d: add a checkerboard test Emil Velikov
  6 siblings, 0 replies; 9+ messages in thread
From: Tobias Jakobi @ 2015-03-11 19:38 UTC (permalink / raw)
  To: linux-samsung-soc; +Cc: dri-devel, emil.l.velikov, Tobias Jakobi

The reason for this change is to let userspace use the header.
Currently 'make install' does not install it.

Signed-off-by: Tobias Jakobi <tjakobi@math.uni-bielefeld.de>
Reviewed-by: Inki Dae <inki.dae@samsung.com>
Tested-by: Joonyoung Shim <jy0922.shim@samsung.com>
---
 exynos/Makefile.am | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/exynos/Makefile.am b/exynos/Makefile.am
index 1715a85..35bc71f 100644
--- a/exynos/Makefile.am
+++ b/exynos/Makefile.am
@@ -14,11 +14,10 @@ libdrm_exynos_la_LIBADD = ../libdrm.la @PTHREADSTUBS_LIBS@
 libdrm_exynos_la_SOURCES = \
 	exynos_drm.c \
 	exynos_fimg2d.c \
-	exynos_fimg2d.h \
 	fimg2d_reg.h
 
 libdrm_exynoscommonincludedir = ${includedir}/exynos
-libdrm_exynoscommoninclude_HEADERS = exynos_drm.h
+libdrm_exynoscommoninclude_HEADERS = exynos_drm.h exynos_fimg2d.h
 
 libdrm_exynosincludedir = ${includedir}/libdrm
 libdrm_exynosinclude_HEADERS = exynos_drmif.h
-- 
2.0.5

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH 7/7] exynos: fimg2d: follow-up fix for G2D_COEFF_MODE_GB_COLOR
  2015-03-11 19:38 [PATCH 1/7] tests/exynos: fimg2d: add a checkerboard test Tobias Jakobi
                   ` (4 preceding siblings ...)
  2015-03-11 19:38 ` [PATCH 6/7] exynos: add fimg2d header to common includes Tobias Jakobi
@ 2015-03-11 19:38 ` Tobias Jakobi
  2015-03-17 11:23 ` [PATCH 1/7] tests/exynos: fimg2d: add a checkerboard test Emil Velikov
  6 siblings, 0 replies; 9+ messages in thread
From: Tobias Jakobi @ 2015-03-11 19:38 UTC (permalink / raw)
  To: linux-samsung-soc; +Cc: dri-devel, emil.l.velikov, Tobias Jakobi

Also add the register field formatting info provided by
Inki Dae <inki.dae@samsung.com>.

Signed-off-by: Tobias Jakobi <tjakobi@math.uni-bielefeld.de>
Reviewed-by: Inki Dae <inki.dae@samsung.com>
Tested-by: Joonyoung Shim <jy0922.shim@samsung.com>
---
 exynos/exynos_fimg2d.h | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/exynos/exynos_fimg2d.h b/exynos/exynos_fimg2d.h
index f76f2a9..9db0c88 100644
--- a/exynos/exynos_fimg2d.h
+++ b/exynos/exynos_fimg2d.h
@@ -151,6 +151,12 @@ enum e_g2d_op {
 	G2D_OP_CONJOINT_DST		= 0x22,
 };
 
+/*
+ * The G2D_COEFF_MODE_DST_{COLOR,ALPHA} modes both use the ALPHA_REG(0x618)
+ * register. The registers fields are as follows:
+ * bits 31:8 = color value (RGB order)
+ * bits 7:0 = alpha value
+ */
 enum e_g2d_coeff_mode {
 	G2D_COEFF_MODE_ONE,
 	G2D_COEFF_MODE_ZERO,
@@ -160,7 +166,7 @@ enum e_g2d_coeff_mode {
 	G2D_COEFF_MODE_DST_COLOR,
 	/* Global Alpha : Set by ALPHA_REG(0x618) */
 	G2D_COEFF_MODE_GB_ALPHA,
-	/* Global Color : Set by ALPHA_REG(0x618) */
+	/* Global Color and Alpha : Set by ALPHA_REG(0x618) */
 	G2D_COEFF_MODE_GB_COLOR,
 	/* (1-SRC alpha)/DST Alpha */
 	G2D_COEFF_MODE_DISJOINT_S,
-- 
2.0.5

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* Re: [PATCH 1/7] tests/exynos: fimg2d: add a checkerboard test
  2015-03-11 19:38 [PATCH 1/7] tests/exynos: fimg2d: add a checkerboard test Tobias Jakobi
                   ` (5 preceding siblings ...)
  2015-03-11 19:38 ` [PATCH 7/7] exynos: fimg2d: follow-up fix for G2D_COEFF_MODE_GB_COLOR Tobias Jakobi
@ 2015-03-17 11:23 ` Emil Velikov
  2015-03-17 13:04   ` Tobias Jakobi
  6 siblings, 1 reply; 9+ messages in thread
From: Emil Velikov @ 2015-03-17 11:23 UTC (permalink / raw)
  To: Tobias Jakobi, linux-samsung-soc; +Cc: emil.l.velikov, dri-devel

On 11/03/15 19:38, Tobias Jakobi wrote:
> This makes it easier to spot memory corruptions which don't become
> visible when using a plain buffer filled with a solid color (so
> corruptions that are just a permutation of the bytes in the buffer).
> 
> Signed-off-by: Tobias Jakobi <tjakobi@math.uni-bielefeld.de>
> Reviewed-by: Inki Dae <inki.dae@samsung.com>
> Tested-by: Joonyoung Shim <jy0922.shim@samsung.com>
Thank you Tobias.
The series is in master now.

-Emil


_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 1/7] tests/exynos: fimg2d: add a checkerboard test
  2015-03-17 11:23 ` [PATCH 1/7] tests/exynos: fimg2d: add a checkerboard test Emil Velikov
@ 2015-03-17 13:04   ` Tobias Jakobi
  0 siblings, 0 replies; 9+ messages in thread
From: Tobias Jakobi @ 2015-03-17 13:04 UTC (permalink / raw)
  To: Emil Velikov; +Cc: linux-samsung-soc, dri-devel

> Thank you Tobias.
> The series is in master now.
> 
> -Emil

Thanks Emil!

Going to prepare the next series now.

With best wishes,
Tobias

^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2015-03-17 13:04 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-03-11 19:38 [PATCH 1/7] tests/exynos: fimg2d: add a checkerboard test Tobias Jakobi
2015-03-11 19:38 ` [PATCH 2/7] exynos: add g2d_scale_and_blend Tobias Jakobi
2015-03-11 19:38 ` [PATCH 3/7] exynos: honor the repeat mode in g2d_copy_with_scale Tobias Jakobi
2015-03-11 19:38 ` [PATCH 4/7] exynos: use structure initialization instead of memset Tobias Jakobi
2015-03-11 19:38 ` [PATCH 5/7] exynos: add exynos prefix to fimg2d header Tobias Jakobi
2015-03-11 19:38 ` [PATCH 6/7] exynos: add fimg2d header to common includes Tobias Jakobi
2015-03-11 19:38 ` [PATCH 7/7] exynos: fimg2d: follow-up fix for G2D_COEFF_MODE_GB_COLOR Tobias Jakobi
2015-03-17 11:23 ` [PATCH 1/7] tests/exynos: fimg2d: add a checkerboard test Emil Velikov
2015-03-17 13:04   ` Tobias Jakobi

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.