|
@@ -131,14 +131,16 @@ static const struct exynos_drm_plane_config plane_configs[MIXER_WIN_NR] = {
|
|
|
.pixel_formats = mixer_formats,
|
|
|
.num_pixel_formats = ARRAY_SIZE(mixer_formats),
|
|
|
.capabilities = EXYNOS_DRM_PLANE_CAP_DOUBLE |
|
|
|
- EXYNOS_DRM_PLANE_CAP_ZPOS,
|
|
|
+ EXYNOS_DRM_PLANE_CAP_ZPOS |
|
|
|
+ EXYNOS_DRM_PLANE_CAP_PIX_BLEND,
|
|
|
}, {
|
|
|
.zpos = 1,
|
|
|
.type = DRM_PLANE_TYPE_CURSOR,
|
|
|
.pixel_formats = mixer_formats,
|
|
|
.num_pixel_formats = ARRAY_SIZE(mixer_formats),
|
|
|
.capabilities = EXYNOS_DRM_PLANE_CAP_DOUBLE |
|
|
|
- EXYNOS_DRM_PLANE_CAP_ZPOS,
|
|
|
+ EXYNOS_DRM_PLANE_CAP_ZPOS |
|
|
|
+ EXYNOS_DRM_PLANE_CAP_PIX_BLEND,
|
|
|
}, {
|
|
|
.zpos = 2,
|
|
|
.type = DRM_PLANE_TYPE_OVERLAY,
|
|
@@ -309,15 +311,22 @@ static void vp_default_filter(struct mixer_context *ctx)
|
|
|
}
|
|
|
|
|
|
static void mixer_cfg_gfx_blend(struct mixer_context *ctx, unsigned int win,
|
|
|
- bool alpha)
|
|
|
+ unsigned int pixel_alpha)
|
|
|
{
|
|
|
u32 val;
|
|
|
|
|
|
val = MXR_GRP_CFG_COLOR_KEY_DISABLE; /* no blank key */
|
|
|
- if (alpha) {
|
|
|
- /* blending based on pixel alpha */
|
|
|
+ switch (pixel_alpha) {
|
|
|
+ case DRM_MODE_BLEND_PIXEL_NONE:
|
|
|
+ break;
|
|
|
+ case DRM_MODE_BLEND_COVERAGE:
|
|
|
+ val |= MXR_GRP_CFG_PIXEL_BLEND_EN;
|
|
|
+ break;
|
|
|
+ case DRM_MODE_BLEND_PREMULTI:
|
|
|
+ default:
|
|
|
val |= MXR_GRP_CFG_BLEND_PRE_MUL;
|
|
|
val |= MXR_GRP_CFG_PIXEL_BLEND_EN;
|
|
|
+ break;
|
|
|
}
|
|
|
mixer_reg_writemask(ctx, MXR_GRAPHIC_CFG(win),
|
|
|
val, MXR_GRP_CFG_MISC_MASK);
|
|
@@ -553,10 +562,16 @@ static void mixer_graph_buffer(struct mixer_context *ctx,
|
|
|
unsigned int win = plane->index;
|
|
|
unsigned int x_ratio = 0, y_ratio = 0;
|
|
|
unsigned int dst_x_offset, dst_y_offset;
|
|
|
+ unsigned int pixel_alpha;
|
|
|
dma_addr_t dma_addr;
|
|
|
unsigned int fmt;
|
|
|
u32 val;
|
|
|
|
|
|
+ if (fb->format->has_alpha)
|
|
|
+ pixel_alpha = state->base.pixel_blend_mode;
|
|
|
+ else
|
|
|
+ pixel_alpha = DRM_MODE_BLEND_PIXEL_NONE;
|
|
|
+
|
|
|
switch (fb->format->format) {
|
|
|
case DRM_FORMAT_XRGB4444:
|
|
|
case DRM_FORMAT_ARGB4444:
|
|
@@ -616,7 +631,7 @@ static void mixer_graph_buffer(struct mixer_context *ctx,
|
|
|
mixer_reg_write(ctx, MXR_GRAPHIC_BASE(win), dma_addr);
|
|
|
|
|
|
mixer_cfg_layer(ctx, win, priority, true);
|
|
|
- mixer_cfg_gfx_blend(ctx, win, fb->format->has_alpha);
|
|
|
+ mixer_cfg_gfx_blend(ctx, win, pixel_alpha);
|
|
|
|
|
|
/* layer update mandatory for mixer 16.0.33.0 */
|
|
|
if (ctx->mxr_ver == MXR_VER_16_0_33_0 ||
|