diff options
Diffstat (limited to 'wiki/2017-09-periperi/0002-drm-rcar-du-Add-support-for-colorkey-alpha-blending.patch')
-rw-r--r-- | wiki/2017-09-periperi/0002-drm-rcar-du-Add-support-for-colorkey-alpha-blending.patch | 176 |
1 files changed, 176 insertions, 0 deletions
diff --git a/wiki/2017-09-periperi/0002-drm-rcar-du-Add-support-for-colorkey-alpha-blending.patch b/wiki/2017-09-periperi/0002-drm-rcar-du-Add-support-for-colorkey-alpha-blending.patch new file mode 100644 index 0000000..bda2fd1 --- /dev/null +++ b/wiki/2017-09-periperi/0002-drm-rcar-du-Add-support-for-colorkey-alpha-blending.patch @@ -0,0 +1,176 @@ +From 9baeb4544b5f03c118c89156555d956b250f6174 Mon Sep 17 00:00:00 2001 +From: Alexandru Gheorghe <Alexandru_Gheorghe@mentor.com> +Date: Wed, 15 Feb 2017 14:50:28 +0200 +Subject: [PATCH 2/2] drm: rcar-du: Add support for colorkey alpha blending + +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: Alexandru Gheorghe <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 + |