From patchwork Sat Apr 21 00:09:54 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stefan Schake X-Patchwork-Id: 10353885 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 5625C604D3 for ; Sat, 21 Apr 2018 00:10:26 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 4826726222 for ; Sat, 21 Apr 2018 00:10:26 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 3CBB1288DB; Sat, 21 Apr 2018 00:10:26 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-5.1 required=2.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED, FREEMAIL_FROM, MAILING_LIST_MULTI, RCVD_IN_DNSWL_MED, T_DKIM_INVALID autolearn=ham version=3.3.1 Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id AFE0F26222 for ; Sat, 21 Apr 2018 00:10:25 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 6E8A86E2AC; Sat, 21 Apr 2018 00:10:24 +0000 (UTC) X-Original-To: dri-devel@lists.freedesktop.org Delivered-To: dri-devel@lists.freedesktop.org Received: from mail-wr0-x244.google.com (mail-wr0-x244.google.com [IPv6:2a00:1450:400c:c0c::244]) by gabe.freedesktop.org (Postfix) with ESMTPS id EB6216E2AC for ; Sat, 21 Apr 2018 00:10:22 +0000 (UTC) Received: by mail-wr0-x244.google.com with SMTP id w3-v6so26896795wrg.2 for ; Fri, 20 Apr 2018 17:10:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id; bh=kx7pNL8QUswU4zmdDw9ikZfdMQg9DXY4TcwklsbVK5A=; b=O90ux3GKNJiWUd+0SDMTu/FP64+aHX+7xZ5D34aCfUU61lE/ErAZHArShN58xgKMlq QdERIs0bAK1TKNf2U3FpyY3OSjwrrA2UJOmSbSqCAyY7MG5FOOUg7bT41EgUhnQ8N5I3 UpJUVjiTNPeRWY1xkWf1fkyAsAddX/HyLUoPgqporWmRgwg46EImWm2E+MUGKJ1ZGdGv yWUiBB/rIT/jvWWhJllaKnpaTCi2eePRya13dUncJFSba2H5tbS6Det1AkIK1mYsyzz8 ygHBMF0bqjvF5ayPEedQ5vXDjqqYD0Z6JpnX1OxokdKKAndOoPF8+o3AQUN0BbASmdDq OI6Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=kx7pNL8QUswU4zmdDw9ikZfdMQg9DXY4TcwklsbVK5A=; b=ENz6Yw/SX3ui1j9z1YDoY7dqkiE0rmJV2Wm60Gjd8ItruK89sZBTWqB+6WQ9EnV6pt amGV9OAgznYgNHsE+zm513VOeXW8VWd82BX/kDrmnMP1Oq2BEr5pZCmtNzKJ24VX79pR diXEhOy22RAYvTfwDLDOn3/5LjvNlx2uCQSL7uVvcur5V/CwmAQ3hlwtqwoN1c/8Pg2p f3UjVg1OY+r5eIVuHx1UfEZbedq8hKc7W8sjzAxIaMY35cMANwxJIZb4sgv1le76mk3K fjdxvx9PAJH3JFUE0yRBFMk+YS53P1VrSCChLX/hu2FoAzNUoBz+AhmqKvf1xz8RrVlV CTyw== X-Gm-Message-State: ALQs6tBvjLQkQCZMqzyMWqOeHB1KZ549jd1Jc+924CnL38Ztm1zDNH2i Xbf0vWl0DDDEXiVYAwYr5EQ= X-Google-Smtp-Source: AIpwx4+UUczrEoNwkLOVTUs9P/Dg8qZ1e6B82HqFBJkczkAckxu0zwl+L1Oz9Mcd9vCyzjsWsFX4IQ== X-Received: by 10.28.234.206 with SMTP id g75mr3089593wmi.76.1524269421485; Fri, 20 Apr 2018 17:10:21 -0700 (PDT) Received: from localhost.localdomain (ip-88-153-118-32.hsi04.unitymediagroup.de. [88.153.118.32]) by smtp.gmail.com with ESMTPSA id h133sm2589824wmf.47.2018.04.20.17.10.20 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 20 Apr 2018 17:10:20 -0700 (PDT) From: Stefan Schake To: eric@anholt.net Subject: [PATCH v2] drm/vc4: Add support for plane alpha Date: Fri, 20 Apr 2018 17:09:54 -0700 Message-Id: <20180421000954.18936-1-stschake@gmail.com> X-Mailer: git-send-email 2.14.1 X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: airlied@linux.ie, linux-rpi-kernel@lists.infradead.org, dri-devel@lists.freedesktop.org, Stefan Schake MIME-Version: 1.0 Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" X-Virus-Scanned: ClamAV using ClamSMTP The HVS supports mixing fixed alpha with per-pixel alpha or setting a fixed plane alpha in case there is no per-pixel information. This allows us to support the generic DRM plane alpha property. Signed-off-by: Stefan Schake --- v2: Non-opaque plane alpha can trigger the background blending issue and we need to hint the CRTC that background fill might be required. drivers/gpu/drm/vc4/vc4_plane.c | 21 +++++++++++++++++---- drivers/gpu/drm/vc4/vc4_regs.h | 1 + 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/drivers/gpu/drm/vc4/vc4_plane.c b/drivers/gpu/drm/vc4/vc4_plane.c index c3a37a99e601..3483c05cc3d6 100644 --- a/drivers/gpu/drm/vc4/vc4_plane.c +++ b/drivers/gpu/drm/vc4/vc4_plane.c @@ -201,6 +201,7 @@ static void vc4_plane_reset(struct drm_plane *plane) return; plane->state = &vc4_state->base; + plane->state->alpha = DRM_BLEND_ALPHA_OPAQUE; vc4_state->base.plane = plane; } @@ -467,6 +468,7 @@ static int vc4_plane_mode_set(struct drm_plane *plane, u32 ctl0_offset = vc4_state->dlist_count; const struct hvs_format *format = vc4_get_hvs_format(fb->format->format); int num_planes = drm_format_num_planes(format->drm); + bool mix_plane_alpha; bool covers_screen; u32 scl0, scl1, pitch0; u32 lbm_size, tiling; @@ -552,7 +554,7 @@ static int vc4_plane_mode_set(struct drm_plane *plane, /* Position Word 0: Image Positions and Alpha Value */ vc4_state->pos0_offset = vc4_state->dlist_count; vc4_dlist_write(vc4_state, - VC4_SET_FIELD(0xff, SCALER_POS0_FIXED_ALPHA) | + VC4_SET_FIELD(state->alpha >> 8, SCALER_POS0_FIXED_ALPHA) | VC4_SET_FIELD(vc4_state->crtc_x, SCALER_POS0_START_X) | VC4_SET_FIELD(vc4_state->crtc_y, SCALER_POS0_START_Y)); @@ -565,6 +567,13 @@ static int vc4_plane_mode_set(struct drm_plane *plane, SCALER_POS1_SCL_HEIGHT)); } + /* Don't waste cycles mixing with plane alpha if the set alpha + * is opaque or there is no per-pixel alpha information. + * In any case we use the alpha property value as the fixed alpha. + */ + mix_plane_alpha = state->alpha != DRM_BLEND_ALPHA_OPAQUE && + fb->format->has_alpha; + /* Position Word 2: Source Image Size, Alpha */ vc4_state->pos2_offset = vc4_state->dlist_count; vc4_dlist_write(vc4_state, @@ -572,6 +581,7 @@ static int vc4_plane_mode_set(struct drm_plane *plane, SCALER_POS2_ALPHA_MODE_PIPELINE : SCALER_POS2_ALPHA_MODE_FIXED, SCALER_POS2_ALPHA_MODE) | + (mix_plane_alpha ? SCALER_POS2_ALPHA_MIX : 0) | (fb->format->has_alpha ? SCALER_POS2_ALPHA_PREMULT : 0) | VC4_SET_FIELD(vc4_state->src_w[0], SCALER_POS2_WIDTH) | VC4_SET_FIELD(vc4_state->src_h[0], SCALER_POS2_HEIGHT)); @@ -653,10 +663,11 @@ static int vc4_plane_mode_set(struct drm_plane *plane, vc4_state->crtc_w == state->crtc->mode.hdisplay && vc4_state->crtc_h == state->crtc->mode.vdisplay; /* Background fill might be necessary when the plane has per-pixel - * alpha content and blends from the background or does not cover - * the entire screen. + * alpha content or a non-opaque plane alpha and could blend from the + * background or does not cover the entire screen. */ - vc4_state->needs_bg_fill = fb->format->has_alpha || !covers_screen; + vc4_state->needs_bg_fill = fb->format->has_alpha || !covers_screen || + state->alpha != DRM_BLEND_ALPHA_OPAQUE; return 0; } @@ -916,5 +927,7 @@ struct drm_plane *vc4_plane_init(struct drm_device *dev, drm_plane_helper_add(plane, &vc4_plane_helper_funcs); + drm_plane_create_alpha_property(plane); + return plane; } diff --git a/drivers/gpu/drm/vc4/vc4_regs.h b/drivers/gpu/drm/vc4/vc4_regs.h index 4af3e29d076a..d1fb6fec46eb 100644 --- a/drivers/gpu/drm/vc4/vc4_regs.h +++ b/drivers/gpu/drm/vc4/vc4_regs.h @@ -945,6 +945,7 @@ enum hvs_pixel_format { #define SCALER_POS2_ALPHA_MODE_FIXED_NONZERO 2 #define SCALER_POS2_ALPHA_MODE_FIXED_OVER_0x07 3 #define SCALER_POS2_ALPHA_PREMULT BIT(29) +#define SCALER_POS2_ALPHA_MIX BIT(28) #define SCALER_POS2_HEIGHT_MASK VC4_MASK(27, 16) #define SCALER_POS2_HEIGHT_SHIFT 16