All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/2] rcar-du, vsp1: rcar-gen3: Add support for colorkey alpha blending
@ 2017-05-04 10:53 ` agheorghe
  0 siblings, 0 replies; 12+ messages in thread
From: agheorghe @ 2017-05-04 10:53 UTC (permalink / raw)
  To: Alexandru_Gheorghe, laurent.pinchart, linux-renesas-soc,
	dri-devel, linux-media

Currently, rcar-du supports colorkeying  only for rcar-gen2 and it uses 
some hw capability of the display unit(DU) which is not available on gen3.
In order to implement colorkeying for gen3 we need to use the colorkey
capability of the VSPD, hence the need to change both drivers rcar-du and
vsp1.

This patchset had been developed and tested on top of v4.9/rcar-3.5.1 from
git://git.kernel.org/pub/scm/linux/kernel/git/horms/renesas-bsp.git

agheorghe (2):
  v4l: vsp1: Add support for colorkey alpha blending
  drm: rcar-du: Add support for colorkey alpha blending

 drivers/gpu/drm/rcar-du/rcar_du_drv.h   |  1 +
 drivers/gpu/drm/rcar-du/rcar_du_kms.c   |  8 ++++++++
 drivers/gpu/drm/rcar-du/rcar_du_plane.c |  3 ---
 drivers/gpu/drm/rcar-du/rcar_du_plane.h |  6 ++++++
 drivers/gpu/drm/rcar-du/rcar_du_vsp.c   | 22 ++++++++++++++++++++++
 drivers/gpu/drm/rcar-du/rcar_du_vsp.h   |  5 +++++
 drivers/media/platform/vsp1/vsp1_drm.c  |  3 +++
 drivers/media/platform/vsp1/vsp1_rpf.c  | 10 ++++++++--
 drivers/media/platform/vsp1/vsp1_rwpf.h |  3 +++
 include/media/vsp1.h                    |  3 +++
 10 files changed, 59 insertions(+), 5 deletions(-)

-- 
1.9.1

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

* [PATCH 0/2] rcar-du, vsp1: rcar-gen3: Add support for colorkey alpha blending
@ 2017-05-04 10:53 ` agheorghe
  0 siblings, 0 replies; 12+ messages in thread
From: agheorghe @ 2017-05-04 10:53 UTC (permalink / raw)
  To: Alexandru_Gheorghe, laurent.pinchart, linux-renesas-soc,
	dri-devel, linux-media

Currently, rcar-du supports colorkeying  only for rcar-gen2 and it uses 
some hw capability of the display unit(DU) which is not available on gen3.
In order to implement colorkeying for gen3 we need to use the colorkey
capability of the VSPD, hence the need to change both drivers rcar-du and
vsp1.

This patchset had been developed and tested on top of v4.9/rcar-3.5.1 from
git://git.kernel.org/pub/scm/linux/kernel/git/horms/renesas-bsp.git

agheorghe (2):
  v4l: vsp1: Add support for colorkey alpha blending
  drm: rcar-du: Add support for colorkey alpha blending

 drivers/gpu/drm/rcar-du/rcar_du_drv.h   |  1 +
 drivers/gpu/drm/rcar-du/rcar_du_kms.c   |  8 ++++++++
 drivers/gpu/drm/rcar-du/rcar_du_plane.c |  3 ---
 drivers/gpu/drm/rcar-du/rcar_du_plane.h |  6 ++++++
 drivers/gpu/drm/rcar-du/rcar_du_vsp.c   | 22 ++++++++++++++++++++++
 drivers/gpu/drm/rcar-du/rcar_du_vsp.h   |  5 +++++
 drivers/media/platform/vsp1/vsp1_drm.c  |  3 +++
 drivers/media/platform/vsp1/vsp1_rpf.c  | 10 ++++++++--
 drivers/media/platform/vsp1/vsp1_rwpf.h |  3 +++
 include/media/vsp1.h                    |  3 +++
 10 files changed, 59 insertions(+), 5 deletions(-)

-- 
1.9.1

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

* [PATCH 1/2] v4l: vsp1: Add support for colorkey alpha blending
  2017-05-04 10:53 ` agheorghe
@ 2017-05-04 10:53   ` agheorghe
  -1 siblings, 0 replies; 12+ messages in thread
From: agheorghe @ 2017-05-04 10:53 UTC (permalink / raw)
  To: Alexandru_Gheorghe, laurent.pinchart, linux-renesas-soc,
	dri-devel, linux-media

The vsp2 hw supports changing of the alpha of pixels that match a color
key, this patch adds support for this feature in order to be used by
the rcar-du driver.
The colorkey is interpreted different depending of the pixel format:
	* RGB   - all color components have to match.
	* YCbCr - only the Y component has to match.

Signed-off-by: agheorghe <Alexandru_Gheorghe@mentor.com>
---
 drivers/media/platform/vsp1/vsp1_drm.c  |  3 +++
 drivers/media/platform/vsp1/vsp1_rpf.c  | 10 ++++++++--
 drivers/media/platform/vsp1/vsp1_rwpf.h |  3 +++
 include/media/vsp1.h                    |  3 +++
 4 files changed, 17 insertions(+), 2 deletions(-)

diff --git a/drivers/media/platform/vsp1/vsp1_drm.c b/drivers/media/platform/vsp1/vsp1_drm.c
index 3627f08..a4d0aee 100644
--- a/drivers/media/platform/vsp1/vsp1_drm.c
+++ b/drivers/media/platform/vsp1/vsp1_drm.c
@@ -393,6 +393,9 @@ int vsp1_du_atomic_update(struct device *dev, unsigned int rpf_index,
 	else
 		rpf->format.plane_fmt[1].bytesperline = cfg->pitch;
 	rpf->alpha = cfg->alpha;
+	rpf->colorkey = cfg->colorkey;
+	rpf->colorkey_en = cfg->colorkey_en;
+	rpf->colorkey_alpha = cfg->colorkey_alpha;
 	rpf->interlaced = cfg->interlaced;
 
 	if (soc_device_match(r8a7795es1) && rpf->interlaced) {
diff --git a/drivers/media/platform/vsp1/vsp1_rpf.c b/drivers/media/platform/vsp1/vsp1_rpf.c
index a12d6f9..91f2a9f 100644
--- a/drivers/media/platform/vsp1/vsp1_rpf.c
+++ b/drivers/media/platform/vsp1/vsp1_rpf.c
@@ -356,8 +356,14 @@ static void rpf_configure(struct vsp1_entity *entity,
 	}
 
 	vsp1_rpf_write(rpf, dl, VI6_RPF_MSK_CTRL, 0);
-	vsp1_rpf_write(rpf, dl, VI6_RPF_CKEY_CTRL, 0);
-
+	if (rpf->colorkey_en) {
+		vsp1_rpf_write(rpf, dl, VI6_RPF_CKEY_SET0,
+			       (rpf->colorkey_alpha << 24) | rpf->colorkey);
+		vsp1_rpf_write(rpf, dl, VI6_RPF_CKEY_CTRL,
+			       VI6_RPF_CKEY_CTRL_SAPE0);
+	} else {
+		vsp1_rpf_write(rpf, dl, VI6_RPF_CKEY_CTRL, 0);
+	}
 }
 
 static const struct vsp1_entity_operations rpf_entity_ops = {
diff --git a/drivers/media/platform/vsp1/vsp1_rwpf.h b/drivers/media/platform/vsp1/vsp1_rwpf.h
index fbe6aa6..2d7f4b9 100644
--- a/drivers/media/platform/vsp1/vsp1_rwpf.h
+++ b/drivers/media/platform/vsp1/vsp1_rwpf.h
@@ -51,6 +51,9 @@ struct vsp1_rwpf {
 	unsigned int brs_input;
 
 	unsigned int alpha;
+	u32 colorkey;
+	bool colorkey_en;
+	u32 colorkey_alpha;
 
 	u32 mult_alpha;
 	u32 outfmt;
diff --git a/include/media/vsp1.h b/include/media/vsp1.h
index 97265f7..879f464 100644
--- a/include/media/vsp1.h
+++ b/include/media/vsp1.h
@@ -32,6 +32,9 @@ struct vsp1_du_atomic_config {
 	struct v4l2_rect dst;
 	unsigned int alpha;
 	unsigned int zpos;
+	u32 colorkey;
+	bool colorkey_en;
+	u32 colorkey_alpha;
 	bool interlaced;
 };
 
-- 
1.9.1

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

* [PATCH 1/2] v4l: vsp1: Add support for colorkey alpha blending
@ 2017-05-04 10:53   ` agheorghe
  0 siblings, 0 replies; 12+ messages in thread
From: agheorghe @ 2017-05-04 10:53 UTC (permalink / raw)
  To: Alexandru_Gheorghe, laurent.pinchart, linux-renesas-soc,
	dri-devel, linux-media

The vsp2 hw supports changing of the alpha of pixels that match a color
key, this patch adds support for this feature in order to be used by
the rcar-du driver.
The colorkey is interpreted different depending of the pixel format:
	* RGB   - all color components have to match.
	* YCbCr - only the Y component has to match.

Signed-off-by: agheorghe <Alexandru_Gheorghe@mentor.com>
---
 drivers/media/platform/vsp1/vsp1_drm.c  |  3 +++
 drivers/media/platform/vsp1/vsp1_rpf.c  | 10 ++++++++--
 drivers/media/platform/vsp1/vsp1_rwpf.h |  3 +++
 include/media/vsp1.h                    |  3 +++
 4 files changed, 17 insertions(+), 2 deletions(-)

diff --git a/drivers/media/platform/vsp1/vsp1_drm.c b/drivers/media/platform/vsp1/vsp1_drm.c
index 3627f08..a4d0aee 100644
--- a/drivers/media/platform/vsp1/vsp1_drm.c
+++ b/drivers/media/platform/vsp1/vsp1_drm.c
@@ -393,6 +393,9 @@ int vsp1_du_atomic_update(struct device *dev, unsigned int rpf_index,
 	else
 		rpf->format.plane_fmt[1].bytesperline = cfg->pitch;
 	rpf->alpha = cfg->alpha;
+	rpf->colorkey = cfg->colorkey;
+	rpf->colorkey_en = cfg->colorkey_en;
+	rpf->colorkey_alpha = cfg->colorkey_alpha;
 	rpf->interlaced = cfg->interlaced;
 
 	if (soc_device_match(r8a7795es1) && rpf->interlaced) {
diff --git a/drivers/media/platform/vsp1/vsp1_rpf.c b/drivers/media/platform/vsp1/vsp1_rpf.c
index a12d6f9..91f2a9f 100644
--- a/drivers/media/platform/vsp1/vsp1_rpf.c
+++ b/drivers/media/platform/vsp1/vsp1_rpf.c
@@ -356,8 +356,14 @@ static void rpf_configure(struct vsp1_entity *entity,
 	}
 
 	vsp1_rpf_write(rpf, dl, VI6_RPF_MSK_CTRL, 0);
-	vsp1_rpf_write(rpf, dl, VI6_RPF_CKEY_CTRL, 0);
-
+	if (rpf->colorkey_en) {
+		vsp1_rpf_write(rpf, dl, VI6_RPF_CKEY_SET0,
+			       (rpf->colorkey_alpha << 24) | rpf->colorkey);
+		vsp1_rpf_write(rpf, dl, VI6_RPF_CKEY_CTRL,
+			       VI6_RPF_CKEY_CTRL_SAPE0);
+	} else {
+		vsp1_rpf_write(rpf, dl, VI6_RPF_CKEY_CTRL, 0);
+	}
 }
 
 static const struct vsp1_entity_operations rpf_entity_ops = {
diff --git a/drivers/media/platform/vsp1/vsp1_rwpf.h b/drivers/media/platform/vsp1/vsp1_rwpf.h
index fbe6aa6..2d7f4b9 100644
--- a/drivers/media/platform/vsp1/vsp1_rwpf.h
+++ b/drivers/media/platform/vsp1/vsp1_rwpf.h
@@ -51,6 +51,9 @@ struct vsp1_rwpf {
 	unsigned int brs_input;
 
 	unsigned int alpha;
+	u32 colorkey;
+	bool colorkey_en;
+	u32 colorkey_alpha;
 
 	u32 mult_alpha;
 	u32 outfmt;
diff --git a/include/media/vsp1.h b/include/media/vsp1.h
index 97265f7..879f464 100644
--- a/include/media/vsp1.h
+++ b/include/media/vsp1.h
@@ -32,6 +32,9 @@ struct vsp1_du_atomic_config {
 	struct v4l2_rect dst;
 	unsigned int alpha;
 	unsigned int zpos;
+	u32 colorkey;
+	bool colorkey_en;
+	u32 colorkey_alpha;
 	bool interlaced;
 };
 
-- 
1.9.1

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

* [PATCH 2/2] drm: rcar-du: Add support for colorkey alpha blending
  2017-05-04 10:53 ` agheorghe
@ 2017-05-04 10:53   ` agheorghe
  -1 siblings, 0 replies; 12+ messages in thread
From: agheorghe @ 2017-05-04 10:53 UTC (permalink / raw)
  To: Alexandru_Gheorghe, laurent.pinchart, linux-renesas-soc,
	dri-devel, linux-media

Add two new plane properties colorkey and colorkey_alpha for rcar gen3.
* colorkey:
	- used for specifying the color on which the filtering is done.
	- bits 0 to 23 are interpreted as RGB888 format, in case we are
	  dealing with an YCbCr format, only the Y componenet is
	  compared and it is represented by the G bits from RGB888
	  format.
	- bit 24 tells if it is enabled or not.
* colorkey_alpha:
	- the alpha to be set for matching pixels, in case it is
	  missing the pixels will be made transparent

Signed-off-by: agheorghe <Alexandru_Gheorghe@mentor.com>
---
 drivers/gpu/drm/rcar-du/rcar_du_drv.h   |  1 +
 drivers/gpu/drm/rcar-du/rcar_du_kms.c   |  8 ++++++++
 drivers/gpu/drm/rcar-du/rcar_du_plane.c |  3 ---
 drivers/gpu/drm/rcar-du/rcar_du_plane.h |  6 ++++++
 drivers/gpu/drm/rcar-du/rcar_du_vsp.c   | 22 ++++++++++++++++++++++
 drivers/gpu/drm/rcar-du/rcar_du_vsp.h   |  5 +++++
 6 files changed, 42 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/rcar-du/rcar_du_drv.h b/drivers/gpu/drm/rcar-du/rcar_du_drv.h
index 91e8fc5..1cb92e3 100644
--- a/drivers/gpu/drm/rcar-du/rcar_du_drv.h
+++ b/drivers/gpu/drm/rcar-du/rcar_du_drv.h
@@ -98,6 +98,7 @@ struct rcar_du_device {
 	struct {
 		struct drm_property *alpha;
 		struct drm_property *colorkey;
+		struct drm_property *colorkey_alpha;
 	} props;
 
 	unsigned int dpad0_source;
diff --git a/drivers/gpu/drm/rcar-du/rcar_du_kms.c b/drivers/gpu/drm/rcar-du/rcar_du_kms.c
index 1cc88ed..a733fa2 100644
--- a/drivers/gpu/drm/rcar-du/rcar_du_kms.c
+++ b/drivers/gpu/drm/rcar-du/rcar_du_kms.c
@@ -630,6 +630,14 @@ static int rcar_du_properties_init(struct rcar_du_device *rcdu)
 	if (rcdu->props.colorkey == NULL)
 		return -ENOMEM;
 
+	if (rcdu->info->gen == 3) {
+		rcdu->props.colorkey_alpha =
+			drm_property_create_range(rcdu->ddev, 0,
+						  "colorkey_alpha", 0, 255);
+		if (!rcdu->props.colorkey_alpha)
+			return -ENOMEM;
+	}
+
 	return 0;
 }
 
diff --git a/drivers/gpu/drm/rcar-du/rcar_du_plane.c b/drivers/gpu/drm/rcar-du/rcar_du_plane.c
index e408aa3..df689c4 100644
--- a/drivers/gpu/drm/rcar-du/rcar_du_plane.c
+++ b/drivers/gpu/drm/rcar-du/rcar_du_plane.c
@@ -307,9 +307,6 @@ int rcar_du_atomic_check_planes(struct drm_device *dev,
  * Plane Setup
  */
 
-#define RCAR_DU_COLORKEY_NONE		(0 << 24)
-#define RCAR_DU_COLORKEY_SOURCE		(1 << 24)
-#define RCAR_DU_COLORKEY_MASK		(1 << 24)
 
 static void rcar_du_plane_write(struct rcar_du_group *rgrp,
 				unsigned int index, u32 reg, u32 data)
diff --git a/drivers/gpu/drm/rcar-du/rcar_du_plane.h b/drivers/gpu/drm/rcar-du/rcar_du_plane.h
index c1de338..9e7c3b6 100644
--- a/drivers/gpu/drm/rcar-du/rcar_du_plane.h
+++ b/drivers/gpu/drm/rcar-du/rcar_du_plane.h
@@ -49,6 +49,12 @@ static inline struct rcar_du_plane *to_rcar_plane(struct drm_plane *plane)
 	return container_of(plane, struct rcar_du_plane, plane);
 }
 
+#define RCAR_DU_COLORKEY_NONE		(0 << 24)
+#define RCAR_DU_COLORKEY_MASK		BIT(24)
+#define RCAR_DU_COLORKEY_EN_MASK	RCAR_DU_COLORKEY_MASK
+#define RCAR_DU_COLORKEY_COLOR_MASK	0xFFFFFF
+#define RCAR_DU_COLORKEY_ALPHA_MASK	0xFF
+
 /**
  * struct rcar_du_plane_state - Driver-specific plane state
  * @state: base DRM plane state
diff --git a/drivers/gpu/drm/rcar-du/rcar_du_vsp.c b/drivers/gpu/drm/rcar-du/rcar_du_vsp.c
index 4b460d4..b223be1 100644
--- a/drivers/gpu/drm/rcar-du/rcar_du_vsp.c
+++ b/drivers/gpu/drm/rcar-du/rcar_du_vsp.c
@@ -180,6 +180,11 @@ static void rcar_du_vsp_plane_setup(struct rcar_du_vsp_plane *plane)
 		.pitch = fb->pitches[0],
 		.alpha = state->alpha,
 		.zpos = state->state.zpos,
+		.colorkey = state->colorkey & RCAR_DU_COLORKEY_COLOR_MASK,
+		.colorkey_en =
+			((state->colorkey & RCAR_DU_COLORKEY_EN_MASK) != 0),
+		.colorkey_alpha =
+			(state->colorkey_alpha & RCAR_DU_COLORKEY_ALPHA_MASK),
 	};
 	unsigned int i;
 
@@ -379,6 +384,8 @@ static void rcar_du_vsp_plane_reset(struct drm_plane *plane)
 		return;
 
 	state->alpha = 255;
+	state->colorkey = RCAR_DU_COLORKEY_NONE;
+	state->colorkey_alpha = 0;
 	state->state.zpos = plane->type == DRM_PLANE_TYPE_PRIMARY ? 0 : 1;
 
 	plane->state = &state->state;
@@ -394,6 +401,10 @@ static int rcar_du_vsp_plane_atomic_set_property(struct drm_plane *plane,
 
 	if (property == rcdu->props.alpha)
 		rstate->alpha = val;
+	else if (property == rcdu->props.colorkey)
+		rstate->colorkey = val;
+	else if (property == rcdu->props.colorkey_alpha)
+		rstate->colorkey_alpha = val;
 	else
 		return -EINVAL;
 
@@ -410,6 +421,10 @@ static int rcar_du_vsp_plane_atomic_get_property(struct drm_plane *plane,
 
 	if (property == rcdu->props.alpha)
 		*val = rstate->alpha;
+	else if (property == rcdu->props.colorkey)
+		*val = rstate->colorkey;
+	else if (property == rcdu->props.colorkey_alpha)
+		*val = rstate->colorkey_alpha;
 	else
 		return -EINVAL;
 
@@ -633,6 +648,13 @@ int rcar_du_vsp_init(struct rcar_du_vsp *vsp)
 
 		drm_object_attach_property(&plane->plane.base,
 					   rcdu->props.alpha, 255);
+		drm_object_attach_property(&plane->plane.base,
+					   rcdu->props.colorkey,
+					   RCAR_DU_COLORKEY_NONE);
+		if (rcdu->props.colorkey_alpha)
+			drm_object_attach_property(&plane->plane.base,
+						   rcdu->props.colorkey_alpha,
+						   0);
 		drm_plane_create_zpos_property(&plane->plane, 1, 1,
 					       vsp->num_planes - 1);
 	}
diff --git a/drivers/gpu/drm/rcar-du/rcar_du_vsp.h b/drivers/gpu/drm/rcar-du/rcar_du_vsp.h
index 3fd9cef..1543503 100644
--- a/drivers/gpu/drm/rcar-du/rcar_du_vsp.h
+++ b/drivers/gpu/drm/rcar-du/rcar_du_vsp.h
@@ -47,6 +47,9 @@ static inline struct rcar_du_vsp_plane *to_rcar_vsp_plane(struct drm_plane *p)
  * @sg_tables: scatter-gather tables for the frame buffer memory
  * @alpha: value of the plane alpha property
  * @zpos: value of the plane zpos property
+ * @colorkey: value of the color for which to apply colorkey_alpha, bit 24
+ * tells if it is enabled or not
+ * @colorkey_alpha: alpha to be used for pixels with color equal to colorkey
  */
 struct rcar_du_vsp_plane_state {
 	struct drm_plane_state state;
@@ -56,6 +59,8 @@ struct rcar_du_vsp_plane_state {
 
 	unsigned int alpha;
 	unsigned int zpos;
+	u32 colorkey;
+	u32 colorkey_alpha;
 };
 
 static inline struct rcar_du_vsp_plane_state *
-- 
1.9.1

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

* [PATCH 2/2] drm: rcar-du: Add support for colorkey alpha blending
@ 2017-05-04 10:53   ` agheorghe
  0 siblings, 0 replies; 12+ messages in thread
From: agheorghe @ 2017-05-04 10:53 UTC (permalink / raw)
  To: Alexandru_Gheorghe, laurent.pinchart, linux-renesas-soc,
	dri-devel, linux-media

Add two new plane properties colorkey and colorkey_alpha for rcar gen3.
* colorkey:
	- used for specifying the color on which the filtering is done.
	- bits 0 to 23 are interpreted as RGB888 format, in case we are
	  dealing with an YCbCr format, only the Y componenet is
	  compared and it is represented by the G bits from RGB888
	  format.
	- bit 24 tells if it is enabled or not.
* colorkey_alpha:
	- the alpha to be set for matching pixels, in case it is
	  missing the pixels will be made transparent

Signed-off-by: agheorghe <Alexandru_Gheorghe@mentor.com>
---
 drivers/gpu/drm/rcar-du/rcar_du_drv.h   |  1 +
 drivers/gpu/drm/rcar-du/rcar_du_kms.c   |  8 ++++++++
 drivers/gpu/drm/rcar-du/rcar_du_plane.c |  3 ---
 drivers/gpu/drm/rcar-du/rcar_du_plane.h |  6 ++++++
 drivers/gpu/drm/rcar-du/rcar_du_vsp.c   | 22 ++++++++++++++++++++++
 drivers/gpu/drm/rcar-du/rcar_du_vsp.h   |  5 +++++
 6 files changed, 42 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/rcar-du/rcar_du_drv.h b/drivers/gpu/drm/rcar-du/rcar_du_drv.h
index 91e8fc5..1cb92e3 100644
--- a/drivers/gpu/drm/rcar-du/rcar_du_drv.h
+++ b/drivers/gpu/drm/rcar-du/rcar_du_drv.h
@@ -98,6 +98,7 @@ struct rcar_du_device {
 	struct {
 		struct drm_property *alpha;
 		struct drm_property *colorkey;
+		struct drm_property *colorkey_alpha;
 	} props;
 
 	unsigned int dpad0_source;
diff --git a/drivers/gpu/drm/rcar-du/rcar_du_kms.c b/drivers/gpu/drm/rcar-du/rcar_du_kms.c
index 1cc88ed..a733fa2 100644
--- a/drivers/gpu/drm/rcar-du/rcar_du_kms.c
+++ b/drivers/gpu/drm/rcar-du/rcar_du_kms.c
@@ -630,6 +630,14 @@ static int rcar_du_properties_init(struct rcar_du_device *rcdu)
 	if (rcdu->props.colorkey == NULL)
 		return -ENOMEM;
 
+	if (rcdu->info->gen == 3) {
+		rcdu->props.colorkey_alpha =
+			drm_property_create_range(rcdu->ddev, 0,
+						  "colorkey_alpha", 0, 255);
+		if (!rcdu->props.colorkey_alpha)
+			return -ENOMEM;
+	}
+
 	return 0;
 }
 
diff --git a/drivers/gpu/drm/rcar-du/rcar_du_plane.c b/drivers/gpu/drm/rcar-du/rcar_du_plane.c
index e408aa3..df689c4 100644
--- a/drivers/gpu/drm/rcar-du/rcar_du_plane.c
+++ b/drivers/gpu/drm/rcar-du/rcar_du_plane.c
@@ -307,9 +307,6 @@ int rcar_du_atomic_check_planes(struct drm_device *dev,
  * Plane Setup
  */
 
-#define RCAR_DU_COLORKEY_NONE		(0 << 24)
-#define RCAR_DU_COLORKEY_SOURCE		(1 << 24)
-#define RCAR_DU_COLORKEY_MASK		(1 << 24)
 
 static void rcar_du_plane_write(struct rcar_du_group *rgrp,
 				unsigned int index, u32 reg, u32 data)
diff --git a/drivers/gpu/drm/rcar-du/rcar_du_plane.h b/drivers/gpu/drm/rcar-du/rcar_du_plane.h
index c1de338..9e7c3b6 100644
--- a/drivers/gpu/drm/rcar-du/rcar_du_plane.h
+++ b/drivers/gpu/drm/rcar-du/rcar_du_plane.h
@@ -49,6 +49,12 @@ static inline struct rcar_du_plane *to_rcar_plane(struct drm_plane *plane)
 	return container_of(plane, struct rcar_du_plane, plane);
 }
 
+#define RCAR_DU_COLORKEY_NONE		(0 << 24)
+#define RCAR_DU_COLORKEY_MASK		BIT(24)
+#define RCAR_DU_COLORKEY_EN_MASK	RCAR_DU_COLORKEY_MASK
+#define RCAR_DU_COLORKEY_COLOR_MASK	0xFFFFFF
+#define RCAR_DU_COLORKEY_ALPHA_MASK	0xFF
+
 /**
  * struct rcar_du_plane_state - Driver-specific plane state
  * @state: base DRM plane state
diff --git a/drivers/gpu/drm/rcar-du/rcar_du_vsp.c b/drivers/gpu/drm/rcar-du/rcar_du_vsp.c
index 4b460d4..b223be1 100644
--- a/drivers/gpu/drm/rcar-du/rcar_du_vsp.c
+++ b/drivers/gpu/drm/rcar-du/rcar_du_vsp.c
@@ -180,6 +180,11 @@ static void rcar_du_vsp_plane_setup(struct rcar_du_vsp_plane *plane)
 		.pitch = fb->pitches[0],
 		.alpha = state->alpha,
 		.zpos = state->state.zpos,
+		.colorkey = state->colorkey & RCAR_DU_COLORKEY_COLOR_MASK,
+		.colorkey_en =
+			((state->colorkey & RCAR_DU_COLORKEY_EN_MASK) != 0),
+		.colorkey_alpha =
+			(state->colorkey_alpha & RCAR_DU_COLORKEY_ALPHA_MASK),
 	};
 	unsigned int i;
 
@@ -379,6 +384,8 @@ static void rcar_du_vsp_plane_reset(struct drm_plane *plane)
 		return;
 
 	state->alpha = 255;
+	state->colorkey = RCAR_DU_COLORKEY_NONE;
+	state->colorkey_alpha = 0;
 	state->state.zpos = plane->type == DRM_PLANE_TYPE_PRIMARY ? 0 : 1;
 
 	plane->state = &state->state;
@@ -394,6 +401,10 @@ static int rcar_du_vsp_plane_atomic_set_property(struct drm_plane *plane,
 
 	if (property == rcdu->props.alpha)
 		rstate->alpha = val;
+	else if (property == rcdu->props.colorkey)
+		rstate->colorkey = val;
+	else if (property == rcdu->props.colorkey_alpha)
+		rstate->colorkey_alpha = val;
 	else
 		return -EINVAL;
 
@@ -410,6 +421,10 @@ static int rcar_du_vsp_plane_atomic_get_property(struct drm_plane *plane,
 
 	if (property == rcdu->props.alpha)
 		*val = rstate->alpha;
+	else if (property == rcdu->props.colorkey)
+		*val = rstate->colorkey;
+	else if (property == rcdu->props.colorkey_alpha)
+		*val = rstate->colorkey_alpha;
 	else
 		return -EINVAL;
 
@@ -633,6 +648,13 @@ int rcar_du_vsp_init(struct rcar_du_vsp *vsp)
 
 		drm_object_attach_property(&plane->plane.base,
 					   rcdu->props.alpha, 255);
+		drm_object_attach_property(&plane->plane.base,
+					   rcdu->props.colorkey,
+					   RCAR_DU_COLORKEY_NONE);
+		if (rcdu->props.colorkey_alpha)
+			drm_object_attach_property(&plane->plane.base,
+						   rcdu->props.colorkey_alpha,
+						   0);
 		drm_plane_create_zpos_property(&plane->plane, 1, 1,
 					       vsp->num_planes - 1);
 	}
diff --git a/drivers/gpu/drm/rcar-du/rcar_du_vsp.h b/drivers/gpu/drm/rcar-du/rcar_du_vsp.h
index 3fd9cef..1543503 100644
--- a/drivers/gpu/drm/rcar-du/rcar_du_vsp.h
+++ b/drivers/gpu/drm/rcar-du/rcar_du_vsp.h
@@ -47,6 +47,9 @@ static inline struct rcar_du_vsp_plane *to_rcar_vsp_plane(struct drm_plane *p)
  * @sg_tables: scatter-gather tables for the frame buffer memory
  * @alpha: value of the plane alpha property
  * @zpos: value of the plane zpos property
+ * @colorkey: value of the color for which to apply colorkey_alpha, bit 24
+ * tells if it is enabled or not
+ * @colorkey_alpha: alpha to be used for pixels with color equal to colorkey
  */
 struct rcar_du_vsp_plane_state {
 	struct drm_plane_state state;
@@ -56,6 +59,8 @@ struct rcar_du_vsp_plane_state {
 
 	unsigned int alpha;
 	unsigned int zpos;
+	u32 colorkey;
+	u32 colorkey_alpha;
 };
 
 static inline struct rcar_du_vsp_plane_state *
-- 
1.9.1

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

* Re: [PATCH 1/2] v4l: vsp1: Add support for colorkey alpha blending
  2017-05-04 10:53   ` agheorghe
  (?)
@ 2017-05-04 11:21   ` Sergei Shtylyov
  -1 siblings, 0 replies; 12+ messages in thread
From: Sergei Shtylyov @ 2017-05-04 11:21 UTC (permalink / raw)
  To: agheorghe, laurent.pinchart, linux-renesas-soc, dri-devel, linux-media

On 05/04/2017 01:53 PM, agheorghe wrote:

> The vsp2 hw supports changing of the alpha of pixels that match a color
> key, this patch adds support for this feature in order to be used by
> the rcar-du driver.
> The colorkey is interpreted different depending of the pixel format:
> 	* RGB   - all color components have to match.
> 	* YCbCr - only the Y component has to match.
>
> Signed-off-by: agheorghe <Alexandru_Gheorghe@mentor.com>

   Your full name is absolutely necessary here.

MBR, Sergei

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

* Re: [PATCH 1/2] v4l: vsp1: Add support for colorkey alpha blending
  2017-05-04 10:53   ` agheorghe
@ 2017-05-04 11:22     ` Geert Uytterhoeven
  -1 siblings, 0 replies; 12+ messages in thread
From: Geert Uytterhoeven @ 2017-05-04 11:22 UTC (permalink / raw)
  To: agheorghe
  Cc: Laurent Pinchart, Linux-Renesas, DRI Development,
	Linux Media Mailing List

On Thu, May 4, 2017 at 12:53 PM, agheorghe
<Alexandru_Gheorghe@mentor.com> wrote:
> --- a/include/media/vsp1.h
> +++ b/include/media/vsp1.h
> @@ -32,6 +32,9 @@ struct vsp1_du_atomic_config {
>         struct v4l2_rect dst;
>         unsigned int alpha;
>         unsigned int zpos;
> +       u32 colorkey;
> +       bool colorkey_en;

Please move this bool down, together with the other bool, to reduce
object size due to alignment.

> +       u32 colorkey_alpha;
>         bool interlaced;
>  };

Gr{oetje,eeting}s,

                        Geert

--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org

In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
                                -- Linus Torvalds

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

* Re: [PATCH 1/2] v4l: vsp1: Add support for colorkey alpha blending
@ 2017-05-04 11:22     ` Geert Uytterhoeven
  0 siblings, 0 replies; 12+ messages in thread
From: Geert Uytterhoeven @ 2017-05-04 11:22 UTC (permalink / raw)
  To: agheorghe
  Cc: Laurent Pinchart, Linux-Renesas, DRI Development,
	Linux Media Mailing List

On Thu, May 4, 2017 at 12:53 PM, agheorghe
<Alexandru_Gheorghe@mentor.com> wrote:
> --- a/include/media/vsp1.h
> +++ b/include/media/vsp1.h
> @@ -32,6 +32,9 @@ struct vsp1_du_atomic_config {
>         struct v4l2_rect dst;
>         unsigned int alpha;
>         unsigned int zpos;
> +       u32 colorkey;
> +       bool colorkey_en;

Please move this bool down, together with the other bool, to reduce
object size due to alignment.

> +       u32 colorkey_alpha;
>         bool interlaced;
>  };

Gr{oetje,eeting}s,

                        Geert

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

* Re: [PATCH 2/2] drm: rcar-du: Add support for colorkey alpha blending
  2017-05-04 10:53   ` agheorghe
  (?)
@ 2017-05-04 12:44   ` Laurent Pinchart
  2017-05-07 10:07       ` Gheorghe, Alexandru
  -1 siblings, 1 reply; 12+ messages in thread
From: Laurent Pinchart @ 2017-05-04 12:44 UTC (permalink / raw)
  To: agheorghe; +Cc: linux-renesas-soc, dri-devel, linux-media

Hi Alexandru,

On Thursday 04 May 2017 13:53:33 agheorghe wrote:
> Add two new plane properties colorkey and colorkey_alpha for rcar gen3.
> * colorkey:
> 	- used for specifying the color on which the filtering is done.
> 	- bits 0 to 23 are interpreted as RGB888 format, in case we are
> 	  dealing with an YCbCr format, only the Y componenet is
> 	  compared and it is represented by the G bits from RGB888
> 	  format.
> 	- bit 24 tells if it is enabled or not.
> * colorkey_alpha:
> 	- the alpha to be set for matching pixels, in case it is
> 	  missing the pixels will be made transparent

Colour keying is a feature found in most display engines, and would thus 
benefit from standardizing the properties. Instead of adding another colorkey 
property specific to rcar-du, could you make a proposal to standardize it ?

> Signed-off-by: agheorghe <Alexandru_Gheorghe@mentor.com>
> ---
>  drivers/gpu/drm/rcar-du/rcar_du_drv.h   |  1 +
>  drivers/gpu/drm/rcar-du/rcar_du_kms.c   |  8 ++++++++
>  drivers/gpu/drm/rcar-du/rcar_du_plane.c |  3 ---
>  drivers/gpu/drm/rcar-du/rcar_du_plane.h |  6 ++++++
>  drivers/gpu/drm/rcar-du/rcar_du_vsp.c   | 22 ++++++++++++++++++++++
>  drivers/gpu/drm/rcar-du/rcar_du_vsp.h   |  5 +++++
>  6 files changed, 42 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/gpu/drm/rcar-du/rcar_du_drv.h
> b/drivers/gpu/drm/rcar-du/rcar_du_drv.h index 91e8fc5..1cb92e3 100644
> --- a/drivers/gpu/drm/rcar-du/rcar_du_drv.h
> +++ b/drivers/gpu/drm/rcar-du/rcar_du_drv.h
> @@ -98,6 +98,7 @@ struct rcar_du_device {
>  	struct {
>  		struct drm_property *alpha;
>  		struct drm_property *colorkey;
> +		struct drm_property *colorkey_alpha;
>  	} props;
> 
>  	unsigned int dpad0_source;
> diff --git a/drivers/gpu/drm/rcar-du/rcar_du_kms.c
> b/drivers/gpu/drm/rcar-du/rcar_du_kms.c index 1cc88ed..a733fa2 100644
> --- a/drivers/gpu/drm/rcar-du/rcar_du_kms.c
> +++ b/drivers/gpu/drm/rcar-du/rcar_du_kms.c
> @@ -630,6 +630,14 @@ static int rcar_du_properties_init(struct
> rcar_du_device *rcdu) if (rcdu->props.colorkey == NULL)
>  		return -ENOMEM;
> 
> +	if (rcdu->info->gen == 3) {
> +		rcdu->props.colorkey_alpha =
> +			drm_property_create_range(rcdu->ddev, 0,
> +						  "colorkey_alpha", 0, 255);
> +		if (!rcdu->props.colorkey_alpha)
> +			return -ENOMEM;
> +	}
> +
>  	return 0;
>  }
> 
> diff --git a/drivers/gpu/drm/rcar-du/rcar_du_plane.c
> b/drivers/gpu/drm/rcar-du/rcar_du_plane.c index e408aa3..df689c4 100644
> --- a/drivers/gpu/drm/rcar-du/rcar_du_plane.c
> +++ b/drivers/gpu/drm/rcar-du/rcar_du_plane.c
> @@ -307,9 +307,6 @@ int rcar_du_atomic_check_planes(struct drm_device *dev,
>   * Plane Setup
>   */
> 
> -#define RCAR_DU_COLORKEY_NONE		(0 << 24)
> -#define RCAR_DU_COLORKEY_SOURCE		(1 << 24)
> -#define RCAR_DU_COLORKEY_MASK		(1 << 24)
> 
>  static void rcar_du_plane_write(struct rcar_du_group *rgrp,
>  				unsigned int index, u32 reg, u32 data)
> diff --git a/drivers/gpu/drm/rcar-du/rcar_du_plane.h
> b/drivers/gpu/drm/rcar-du/rcar_du_plane.h index c1de338..9e7c3b6 100644
> --- a/drivers/gpu/drm/rcar-du/rcar_du_plane.h
> +++ b/drivers/gpu/drm/rcar-du/rcar_du_plane.h
> @@ -49,6 +49,12 @@ static inline struct rcar_du_plane *to_rcar_plane(struct
> drm_plane *plane) return container_of(plane, struct rcar_du_plane, plane);
>  }
> 
> +#define RCAR_DU_COLORKEY_NONE		(0 << 24)
> +#define RCAR_DU_COLORKEY_MASK		BIT(24)
> +#define RCAR_DU_COLORKEY_EN_MASK	RCAR_DU_COLORKEY_MASK
> +#define RCAR_DU_COLORKEY_COLOR_MASK	0xFFFFFF
> +#define RCAR_DU_COLORKEY_ALPHA_MASK	0xFF
> +
>  /**
>   * struct rcar_du_plane_state - Driver-specific plane state
>   * @state: base DRM plane state
> diff --git a/drivers/gpu/drm/rcar-du/rcar_du_vsp.c
> b/drivers/gpu/drm/rcar-du/rcar_du_vsp.c index 4b460d4..b223be1 100644
> --- a/drivers/gpu/drm/rcar-du/rcar_du_vsp.c
> +++ b/drivers/gpu/drm/rcar-du/rcar_du_vsp.c
> @@ -180,6 +180,11 @@ static void rcar_du_vsp_plane_setup(struct
> rcar_du_vsp_plane *plane) .pitch = fb->pitches[0],
>  		.alpha = state->alpha,
>  		.zpos = state->state.zpos,
> +		.colorkey = state->colorkey & RCAR_DU_COLORKEY_COLOR_MASK,
> +		.colorkey_en =
> +			((state->colorkey & RCAR_DU_COLORKEY_EN_MASK) != 0),
> +		.colorkey_alpha =
> +			(state->colorkey_alpha & RCAR_DU_COLORKEY_ALPHA_MASK),
>  	};
>  	unsigned int i;
> 
> @@ -379,6 +384,8 @@ static void rcar_du_vsp_plane_reset(struct drm_plane
> *plane) return;
> 
>  	state->alpha = 255;
> +	state->colorkey = RCAR_DU_COLORKEY_NONE;
> +	state->colorkey_alpha = 0;
>  	state->state.zpos = plane->type == DRM_PLANE_TYPE_PRIMARY ? 0 : 1;
> 
>  	plane->state = &state->state;
> @@ -394,6 +401,10 @@ static int rcar_du_vsp_plane_atomic_set_property(struct
> drm_plane *plane,
> 
>  	if (property == rcdu->props.alpha)
>  		rstate->alpha = val;
> +	else if (property == rcdu->props.colorkey)
> +		rstate->colorkey = val;
> +	else if (property == rcdu->props.colorkey_alpha)
> +		rstate->colorkey_alpha = val;
>  	else
>  		return -EINVAL;
> 
> @@ -410,6 +421,10 @@ static int rcar_du_vsp_plane_atomic_get_property(struct
> drm_plane *plane,
> 
>  	if (property == rcdu->props.alpha)
>  		*val = rstate->alpha;
> +	else if (property == rcdu->props.colorkey)
> +		*val = rstate->colorkey;
> +	else if (property == rcdu->props.colorkey_alpha)
> +		*val = rstate->colorkey_alpha;
>  	else
>  		return -EINVAL;
> 
> @@ -633,6 +648,13 @@ int rcar_du_vsp_init(struct rcar_du_vsp *vsp)
> 
>  		drm_object_attach_property(&plane->plane.base,
>  					   rcdu->props.alpha, 255);
> +		drm_object_attach_property(&plane->plane.base,
> +					   rcdu->props.colorkey,
> +					   RCAR_DU_COLORKEY_NONE);
> +		if (rcdu->props.colorkey_alpha)
> +			drm_object_attach_property(&plane->plane.base,
> +						   rcdu->props.colorkey_alpha,
> +						   0);
>  		drm_plane_create_zpos_property(&plane->plane, 1, 1,
>  					       vsp->num_planes - 1);
>  	}
> diff --git a/drivers/gpu/drm/rcar-du/rcar_du_vsp.h
> b/drivers/gpu/drm/rcar-du/rcar_du_vsp.h index 3fd9cef..1543503 100644
> --- a/drivers/gpu/drm/rcar-du/rcar_du_vsp.h
> +++ b/drivers/gpu/drm/rcar-du/rcar_du_vsp.h
> @@ -47,6 +47,9 @@ static inline struct rcar_du_vsp_plane
> *to_rcar_vsp_plane(struct drm_plane *p) * @sg_tables: scatter-gather tables
> for the frame buffer memory
>   * @alpha: value of the plane alpha property
>   * @zpos: value of the plane zpos property
> + * @colorkey: value of the color for which to apply colorkey_alpha, bit 24
> + * tells if it is enabled or not
> + * @colorkey_alpha: alpha to be used for pixels with color equal to
> colorkey */
>  struct rcar_du_vsp_plane_state {
>  	struct drm_plane_state state;
> @@ -56,6 +59,8 @@ struct rcar_du_vsp_plane_state {
> 
>  	unsigned int alpha;
>  	unsigned int zpos;
> +	u32 colorkey;
> +	u32 colorkey_alpha;
>  };
> 
>  static inline struct rcar_du_vsp_plane_state *

-- 
Regards,

Laurent Pinchart

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

* Re: [PATCH 2/2] drm: rcar-du: Add support for colorkey alpha blending
  2017-05-04 12:44   ` Laurent Pinchart
@ 2017-05-07 10:07       ` Gheorghe, Alexandru
  0 siblings, 0 replies; 12+ messages in thread
From: Gheorghe, Alexandru @ 2017-05-07 10:07 UTC (permalink / raw)
  To: Laurent Pinchart; +Cc: linux-renesas-soc, dri-devel, linux-media

Hi Laurent,

On Thursday, May 4, 2017 3:44 PM Laurent Pinchart wrote: 
> Hi Alexandru,
>
> On Thursday 04 May 2017 13:53:33 agheorghe wrote:
>> Add two new plane properties colorkey and colorkey_alpha for rcar gen3.
>> * colorkey:
>>       - used for specifying the color on which the filtering is done.
>>       - bits 0 to 23 are interpreted as RGB888 format, in case we are
>>         dealing with an YCbCr format, only the Y componenet is
>>         compared and it is represented by the G bits from RGB888
>>         format.
>>       - bit 24 tells if it is enabled or not.
>> * colorkey_alpha:
>>       - the alpha to be set for matching pixels, in case it is
>>         missing the pixels will be made transparent
>
> Colour keying is a feature found in most display engines, and would thus
> benefit from standardizing the properties. Instead of adding another colorkey
> property specific to rcar-du, could you make a proposal to standardize it ?

Yeah sure, I could give it a try and comeback with a RFC. By standardizing it
I'm assuming you mean something similar with what we have now in drm_blend,
with zpos and rotate properties, right? Or do you think it should get its own IOCTL? 

>> Signed-off-by: agheorghe <Alexandru_Gheorghe@mentor.com>
>> ---
>>  drivers/gpu/drm/rcar-du/rcar_du_drv.h   |  1 +
>>  drivers/gpu/drm/rcar-du/rcar_du_kms.c   |  8 ++++++++
>>  drivers/gpu/drm/rcar-du/rcar_du_plane.c |  3 ---
>>  drivers/gpu/drm/rcar-du/rcar_du_plane.h |  6 ++++++
>>  drivers/gpu/drm/rcar-du/rcar_du_vsp.c   | 22 ++++++++++++++++++++++
>>  drivers/gpu/drm/rcar-du/rcar_du_vsp.h   |  5 +++++
>>  6 files changed, 42 insertions(+), 3 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/rcar-du/rcar_du_drv.h
>> b/drivers/gpu/drm/rcar-du/rcar_du_drv.h index 91e8fc5..1cb92e3 100644
>> --- a/drivers/gpu/drm/rcar-du/rcar_du_drv.h
>> +++ b/drivers/gpu/drm/rcar-du/rcar_du_drv.h
>> @@ -98,6 +98,7 @@ struct rcar_du_device {
>>       struct {
>>               struct drm_property *alpha;
>>               struct drm_property *colorkey;
>> +             struct drm_property *colorkey_alpha;
>>       } props;
>>
>>       unsigned int dpad0_source;
>> diff --git a/drivers/gpu/drm/rcar-du/rcar_du_kms.c
>> b/drivers/gpu/drm/rcar-du/rcar_du_kms.c index 1cc88ed..a733fa2 100644
>> --- a/drivers/gpu/drm/rcar-du/rcar_du_kms.c
>> +++ b/drivers/gpu/drm/rcar-du/rcar_du_kms.c
>> @@ -630,6 +630,14 @@ static int rcar_du_properties_init(struct
>> rcar_du_device *rcdu) if (rcdu->props.colorkey == NULL)
>>               return -ENOMEM;
>>
>> +     if (rcdu->info->gen == 3) {
>> +             rcdu->props.colorkey_alpha =
>> +                     drm_property_create_range(rcdu->ddev, 0,
>> +                                               "colorkey_alpha", 0, 255);
>> +             if (!rcdu->props.colorkey_alpha)
>> +                     return -ENOMEM;
>> +     }
>> +
>>       return 0;
>>  }
>>
>> diff --git a/drivers/gpu/drm/rcar-du/rcar_du_plane.c
>> b/drivers/gpu/drm/rcar-du/rcar_du_plane.c index e408aa3..df689c4 100644
>> --- a/drivers/gpu/drm/rcar-du/rcar_du_plane.c
>> +++ b/drivers/gpu/drm/rcar-du/rcar_du_plane.c
>> @@ -307,9 +307,6 @@ int rcar_du_atomic_check_planes(struct drm_device *dev,
>>   * Plane Setup
>>   */
>>
>> -#define RCAR_DU_COLORKEY_NONE                (0 << 24)
>> -#define RCAR_DU_COLORKEY_SOURCE              (1 << 24)
>> -#define RCAR_DU_COLORKEY_MASK                (1 << 24)
>>
>>  static void rcar_du_plane_write(struct rcar_du_group *rgrp,
>>                               unsigned int index, u32 reg, u32 data)
>> diff --git a/drivers/gpu/drm/rcar-du/rcar_du_plane.h
>> b/drivers/gpu/drm/rcar-du/rcar_du_plane.h index c1de338..9e7c3b6 100644
>> --- a/drivers/gpu/drm/rcar-du/rcar_du_plane.h
>> +++ b/drivers/gpu/drm/rcar-du/rcar_du_plane.h
>> @@ -49,6 +49,12 @@ static inline struct rcar_du_plane *to_rcar_plane(struct
>> drm_plane *plane) return container_of(plane, struct rcar_du_plane, plane);
>>  }
>>
>> +#define RCAR_DU_COLORKEY_NONE                (0 << 24)
>> +#define RCAR_DU_COLORKEY_MASK                BIT(24)
>> +#define RCAR_DU_COLORKEY_EN_MASK     RCAR_DU_COLORKEY_MASK
>> +#define RCAR_DU_COLORKEY_COLOR_MASK  0xFFFFFF
>> +#define RCAR_DU_COLORKEY_ALPHA_MASK  0xFF
>> +
>>  /**
>>   * struct rcar_du_plane_state - Driver-specific plane state
>>   * @state: base DRM plane state
>> diff --git a/drivers/gpu/drm/rcar-du/rcar_du_vsp.c
>> b/drivers/gpu/drm/rcar-du/rcar_du_vsp.c index 4b460d4..b223be1 100644
>> --- a/drivers/gpu/drm/rcar-du/rcar_du_vsp.c
>> +++ b/drivers/gpu/drm/rcar-du/rcar_du_vsp.c
>> @@ -180,6 +180,11 @@ static void rcar_du_vsp_plane_setup(struct
>> rcar_du_vsp_plane *plane) .pitch = fb->pitches[0],
>>               .alpha = state->alpha,
>>               .zpos = state->state.zpos,
>> +             .colorkey = state->colorkey & RCAR_DU_COLORKEY_COLOR_MASK,
>> +             .colorkey_en =
>> +                     ((state->colorkey & RCAR_DU_COLORKEY_EN_MASK) != 0),
>> +             .colorkey_alpha =
>> +                     (state->colorkey_alpha & RCAR_DU_COLORKEY_ALPHA_MASK),
>>       };
>>       unsigned int i;
>>
>> @@ -379,6 +384,8 @@ static void rcar_du_vsp_plane_reset(struct drm_plane
>> *plane) return;
>>
>>       state->alpha = 255;
>> +     state->colorkey = RCAR_DU_COLORKEY_NONE;
>> +     state->colorkey_alpha = 0;
>>       state->state.zpos = plane->type == DRM_PLANE_TYPE_PRIMARY ? 0 : 1;
>>
>>       plane->state = &state->state;
>> @@ -394,6 +401,10 @@ static int rcar_du_vsp_plane_atomic_set_property(struct
>> drm_plane *plane,
>>
>>       if (property == rcdu->props.alpha)
>>               rstate->alpha = val;
>> +     else if (property == rcdu->props.colorkey)
>> +             rstate->colorkey = val;
>> +     else if (property == rcdu->props.colorkey_alpha)
>> +             rstate->colorkey_alpha = val;
>>       else
>>               return -EINVAL;
>>
>> @@ -410,6 +421,10 @@ static int rcar_du_vsp_plane_atomic_get_property(struct
>> drm_plane *plane,
>>
>>       if (property == rcdu->props.alpha)
>>               *val = rstate->alpha;
>> +     else if (property == rcdu->props.colorkey)
>> +             *val = rstate->colorkey;
>> +     else if (property == rcdu->props.colorkey_alpha)
>> +             *val = rstate->colorkey_alpha;
>>       else
>>               return -EINVAL;
>>
>> @@ -633,6 +648,13 @@ int rcar_du_vsp_init(struct rcar_du_vsp *vsp)
>>
>>               drm_object_attach_property(&plane->plane.base,
>>                                          rcdu->props.alpha, 255);
>> +             drm_object_attach_property(&plane->plane.base,
>> +                                        rcdu->props.colorkey,
>> +                                        RCAR_DU_COLORKEY_NONE);
>> +             if (rcdu->props.colorkey_alpha)
>> +                     drm_object_attach_property(&plane->plane.base,
>> +                                                rcdu->props.colorkey_alpha,
>> +                                                0);
>>               drm_plane_create_zpos_property(&plane->plane, 1, 1,
>>                                              vsp->num_planes - 1);
>>       }
>> diff --git a/drivers/gpu/drm/rcar-du/rcar_du_vsp.h
>> b/drivers/gpu/drm/rcar-du/rcar_du_vsp.h index 3fd9cef..1543503 100644
>> --- a/drivers/gpu/drm/rcar-du/rcar_du_vsp.h
>> +++ b/drivers/gpu/drm/rcar-du/rcar_du_vsp.h
>> @@ -47,6 +47,9 @@ static inline struct rcar_du_vsp_plane
>> *to_rcar_vsp_plane(struct drm_plane *p) * @sg_tables: scatter-gather tables
>> for the frame buffer memory
>>   * @alpha: value of the plane alpha property
>>   * @zpos: value of the plane zpos property
>> + * @colorkey: value of the color for which to apply colorkey_alpha, bit 24
>> + * tells if it is enabled or not
>> + * @colorkey_alpha: alpha to be used for pixels with color equal to
>> colorkey */
>>  struct rcar_du_vsp_plane_state {
>>       struct drm_plane_state state;
>> @@ -56,6 +59,8 @@ struct rcar_du_vsp_plane_state {
>>
>>       unsigned int alpha;
>>       unsigned int zpos;
>> +     u32 colorkey;
>> +     u32 colorkey_alpha;
>>  };
>>
>>  static inline struct rcar_du_vsp_plane_state *
>
> --
> Regards,
>
> Laurent Pinchart

Best Regards,
Alex Gheorghe

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

* Re: [PATCH 2/2] drm: rcar-du: Add support for colorkey alpha blending
@ 2017-05-07 10:07       ` Gheorghe, Alexandru
  0 siblings, 0 replies; 12+ messages in thread
From: Gheorghe, Alexandru @ 2017-05-07 10:07 UTC (permalink / raw)
  To: Laurent Pinchart; +Cc: linux-renesas-soc, dri-devel, linux-media

Hi Laurent,

On Thursday, May 4, 2017 3:44 PM Laurent Pinchart wrote: 
> Hi Alexandru,
>
> On Thursday 04 May 2017 13:53:33 agheorghe wrote:
>> Add two new plane properties colorkey and colorkey_alpha for rcar gen3.
>> * colorkey:
>>       - used for specifying the color on which the filtering is done.
>>       - bits 0 to 23 are interpreted as RGB888 format, in case we are
>>         dealing with an YCbCr format, only the Y componenet is
>>         compared and it is represented by the G bits from RGB888
>>         format.
>>       - bit 24 tells if it is enabled or not.
>> * colorkey_alpha:
>>       - the alpha to be set for matching pixels, in case it is
>>         missing the pixels will be made transparent
>
> Colour keying is a feature found in most display engines, and would thus
> benefit from standardizing the properties. Instead of adding another colorkey
> property specific to rcar-du, could you make a proposal to standardize it ?

Yeah sure, I could give it a try and comeback with a RFC. By standardizing it
I'm assuming you mean something similar with what we have now in drm_blend,
with zpos and rotate properties, right? Or do you think it should get its own IOCTL? 

>> Signed-off-by: agheorghe <Alexandru_Gheorghe@mentor.com>
>> ---
>>  drivers/gpu/drm/rcar-du/rcar_du_drv.h   |  1 +
>>  drivers/gpu/drm/rcar-du/rcar_du_kms.c   |  8 ++++++++
>>  drivers/gpu/drm/rcar-du/rcar_du_plane.c |  3 ---
>>  drivers/gpu/drm/rcar-du/rcar_du_plane.h |  6 ++++++
>>  drivers/gpu/drm/rcar-du/rcar_du_vsp.c   | 22 ++++++++++++++++++++++
>>  drivers/gpu/drm/rcar-du/rcar_du_vsp.h   |  5 +++++
>>  6 files changed, 42 insertions(+), 3 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/rcar-du/rcar_du_drv.h
>> b/drivers/gpu/drm/rcar-du/rcar_du_drv.h index 91e8fc5..1cb92e3 100644
>> --- a/drivers/gpu/drm/rcar-du/rcar_du_drv.h
>> +++ b/drivers/gpu/drm/rcar-du/rcar_du_drv.h
>> @@ -98,6 +98,7 @@ struct rcar_du_device {
>>       struct {
>>               struct drm_property *alpha;
>>               struct drm_property *colorkey;
>> +             struct drm_property *colorkey_alpha;
>>       } props;
>>
>>       unsigned int dpad0_source;
>> diff --git a/drivers/gpu/drm/rcar-du/rcar_du_kms.c
>> b/drivers/gpu/drm/rcar-du/rcar_du_kms.c index 1cc88ed..a733fa2 100644
>> --- a/drivers/gpu/drm/rcar-du/rcar_du_kms.c
>> +++ b/drivers/gpu/drm/rcar-du/rcar_du_kms.c
>> @@ -630,6 +630,14 @@ static int rcar_du_properties_init(struct
>> rcar_du_device *rcdu) if (rcdu->props.colorkey == NULL)
>>               return -ENOMEM;
>>
>> +     if (rcdu->info->gen == 3) {
>> +             rcdu->props.colorkey_alpha =
>> +                     drm_property_create_range(rcdu->ddev, 0,
>> +                                               "colorkey_alpha", 0, 255);
>> +             if (!rcdu->props.colorkey_alpha)
>> +                     return -ENOMEM;
>> +     }
>> +
>>       return 0;
>>  }
>>
>> diff --git a/drivers/gpu/drm/rcar-du/rcar_du_plane.c
>> b/drivers/gpu/drm/rcar-du/rcar_du_plane.c index e408aa3..df689c4 100644
>> --- a/drivers/gpu/drm/rcar-du/rcar_du_plane.c
>> +++ b/drivers/gpu/drm/rcar-du/rcar_du_plane.c
>> @@ -307,9 +307,6 @@ int rcar_du_atomic_check_planes(struct drm_device *dev,
>>   * Plane Setup
>>   */
>>
>> -#define RCAR_DU_COLORKEY_NONE                (0 << 24)
>> -#define RCAR_DU_COLORKEY_SOURCE              (1 << 24)
>> -#define RCAR_DU_COLORKEY_MASK                (1 << 24)
>>
>>  static void rcar_du_plane_write(struct rcar_du_group *rgrp,
>>                               unsigned int index, u32 reg, u32 data)
>> diff --git a/drivers/gpu/drm/rcar-du/rcar_du_plane.h
>> b/drivers/gpu/drm/rcar-du/rcar_du_plane.h index c1de338..9e7c3b6 100644
>> --- a/drivers/gpu/drm/rcar-du/rcar_du_plane.h
>> +++ b/drivers/gpu/drm/rcar-du/rcar_du_plane.h
>> @@ -49,6 +49,12 @@ static inline struct rcar_du_plane *to_rcar_plane(struct
>> drm_plane *plane) return container_of(plane, struct rcar_du_plane, plane);
>>  }
>>
>> +#define RCAR_DU_COLORKEY_NONE                (0 << 24)
>> +#define RCAR_DU_COLORKEY_MASK                BIT(24)
>> +#define RCAR_DU_COLORKEY_EN_MASK     RCAR_DU_COLORKEY_MASK
>> +#define RCAR_DU_COLORKEY_COLOR_MASK  0xFFFFFF
>> +#define RCAR_DU_COLORKEY_ALPHA_MASK  0xFF
>> +
>>  /**
>>   * struct rcar_du_plane_state - Driver-specific plane state
>>   * @state: base DRM plane state
>> diff --git a/drivers/gpu/drm/rcar-du/rcar_du_vsp.c
>> b/drivers/gpu/drm/rcar-du/rcar_du_vsp.c index 4b460d4..b223be1 100644
>> --- a/drivers/gpu/drm/rcar-du/rcar_du_vsp.c
>> +++ b/drivers/gpu/drm/rcar-du/rcar_du_vsp.c
>> @@ -180,6 +180,11 @@ static void rcar_du_vsp_plane_setup(struct
>> rcar_du_vsp_plane *plane) .pitch = fb->pitches[0],
>>               .alpha = state->alpha,
>>               .zpos = state->state.zpos,
>> +             .colorkey = state->colorkey & RCAR_DU_COLORKEY_COLOR_MASK,
>> +             .colorkey_en =
>> +                     ((state->colorkey & RCAR_DU_COLORKEY_EN_MASK) != 0),
>> +             .colorkey_alpha =
>> +                     (state->colorkey_alpha & RCAR_DU_COLORKEY_ALPHA_MASK),
>>       };
>>       unsigned int i;
>>
>> @@ -379,6 +384,8 @@ static void rcar_du_vsp_plane_reset(struct drm_plane
>> *plane) return;
>>
>>       state->alpha = 255;
>> +     state->colorkey = RCAR_DU_COLORKEY_NONE;
>> +     state->colorkey_alpha = 0;
>>       state->state.zpos = plane->type == DRM_PLANE_TYPE_PRIMARY ? 0 : 1;
>>
>>       plane->state = &state->state;
>> @@ -394,6 +401,10 @@ static int rcar_du_vsp_plane_atomic_set_property(struct
>> drm_plane *plane,
>>
>>       if (property == rcdu->props.alpha)
>>               rstate->alpha = val;
>> +     else if (property == rcdu->props.colorkey)
>> +             rstate->colorkey = val;
>> +     else if (property == rcdu->props.colorkey_alpha)
>> +             rstate->colorkey_alpha = val;
>>       else
>>               return -EINVAL;
>>
>> @@ -410,6 +421,10 @@ static int rcar_du_vsp_plane_atomic_get_property(struct
>> drm_plane *plane,
>>
>>       if (property == rcdu->props.alpha)
>>               *val = rstate->alpha;
>> +     else if (property == rcdu->props.colorkey)
>> +             *val = rstate->colorkey;
>> +     else if (property == rcdu->props.colorkey_alpha)
>> +             *val = rstate->colorkey_alpha;
>>       else
>>               return -EINVAL;
>>
>> @@ -633,6 +648,13 @@ int rcar_du_vsp_init(struct rcar_du_vsp *vsp)
>>
>>               drm_object_attach_property(&plane->plane.base,
>>                                          rcdu->props.alpha, 255);
>> +             drm_object_attach_property(&plane->plane.base,
>> +                                        rcdu->props.colorkey,
>> +                                        RCAR_DU_COLORKEY_NONE);
>> +             if (rcdu->props.colorkey_alpha)
>> +                     drm_object_attach_property(&plane->plane.base,
>> +                                                rcdu->props.colorkey_alpha,
>> +                                                0);
>>               drm_plane_create_zpos_property(&plane->plane, 1, 1,
>>                                              vsp->num_planes - 1);
>>       }
>> diff --git a/drivers/gpu/drm/rcar-du/rcar_du_vsp.h
>> b/drivers/gpu/drm/rcar-du/rcar_du_vsp.h index 3fd9cef..1543503 100644
>> --- a/drivers/gpu/drm/rcar-du/rcar_du_vsp.h
>> +++ b/drivers/gpu/drm/rcar-du/rcar_du_vsp.h
>> @@ -47,6 +47,9 @@ static inline struct rcar_du_vsp_plane
>> *to_rcar_vsp_plane(struct drm_plane *p) * @sg_tables: scatter-gather tables
>> for the frame buffer memory
>>   * @alpha: value of the plane alpha property
>>   * @zpos: value of the plane zpos property
>> + * @colorkey: value of the color for which to apply colorkey_alpha, bit 24
>> + * tells if it is enabled or not
>> + * @colorkey_alpha: alpha to be used for pixels with color equal to
>> colorkey */
>>  struct rcar_du_vsp_plane_state {
>>       struct drm_plane_state state;
>> @@ -56,6 +59,8 @@ struct rcar_du_vsp_plane_state {
>>
>>       unsigned int alpha;
>>       unsigned int zpos;
>> +     u32 colorkey;
>> +     u32 colorkey_alpha;
>>  };
>>
>>  static inline struct rcar_du_vsp_plane_state *
>
> --
> Regards,
>
> Laurent Pinchart

Best Regards,
Alex Gheorghe
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

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

end of thread, other threads:[~2017-05-07 23:36 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-05-04 10:53 [PATCH 0/2] rcar-du, vsp1: rcar-gen3: Add support for colorkey alpha blending agheorghe
2017-05-04 10:53 ` agheorghe
2017-05-04 10:53 ` [PATCH 1/2] v4l: vsp1: " agheorghe
2017-05-04 10:53   ` agheorghe
2017-05-04 11:21   ` Sergei Shtylyov
2017-05-04 11:22   ` Geert Uytterhoeven
2017-05-04 11:22     ` Geert Uytterhoeven
2017-05-04 10:53 ` [PATCH 2/2] drm: rcar-du: " agheorghe
2017-05-04 10:53   ` agheorghe
2017-05-04 12:44   ` Laurent Pinchart
2017-05-07 10:07     ` Gheorghe, Alexandru
2017-05-07 10:07       ` Gheorghe, Alexandru

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.