From patchwork Mon Nov 22 19:43:52 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Igor Matheus Andrade Torrente X-Patchwork-Id: 12632729 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 6875CC433F5 for ; Mon, 22 Nov 2021 19:44:20 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 8A8C189CDD; Mon, 22 Nov 2021 19:44:19 +0000 (UTC) Received: from mail-ua1-x92f.google.com (mail-ua1-x92f.google.com [IPv6:2607:f8b0:4864:20::92f]) by gabe.freedesktop.org (Postfix) with ESMTPS id 8D38789CE2 for ; Mon, 22 Nov 2021 19:44:17 +0000 (UTC) Received: by mail-ua1-x92f.google.com with SMTP id ay21so38847883uab.12 for ; Mon, 22 Nov 2021 11:44:17 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=g8AjUosguFFwtSTTUN5QcdLFCu3iDK1fKV4GOcMHHcY=; b=pbFrqlUVzhnm5n6ITTPe9DCbZp2i5cNyTuiDngpN//1z4QbeoGsaDefKTFXO0FArQN 1rKFnY8w3H8mqSj1xkPl3UUZSokwKzSnLzKMt0Zpop/uLXpksw8mLlzpUT7rvDbN8yHY YRuJfpmo+MBXYor3ssXct7tplTlfgl76Mh5JnZdId+tiv9znl0MbdxPetZ96wKaGX3eu 4bF9r7Z6kU5tGkulOyKFzMlvIU48VNaJ/DxKTYiAhzB4dFIcoFQqtjENkz6MkDGcg9l4 jv+7NRCS39r2Oe2b0V6Vqg/RFB25/RM3500ZwpM24v/PBlxhjgvfvZKNasn9CWeaEU5l w2Kg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=g8AjUosguFFwtSTTUN5QcdLFCu3iDK1fKV4GOcMHHcY=; b=mpODUzVXHCR1tf8+ODAbaGK/mEw5ZnL1MF6263lPRRdzbcdVtiYLsPcToz2E5HSsXO 5xSZAkQAVazn19NGG9dJoYYhqekUFGOZ2Cyk0nDiaIfxKsqSejCp5JrOivHxuvhkoReA JgvFSE2BwMsM7vH8KaOi/E2LrbqdVJIbqxgrTBE6V04PxwOcNtB5EcuUR/YUGCKq6b3e 7Dk7XujUOFt5yHdgGfPCrjE77rS3nziGj5xAoZ6z++Ye26yEotWTM2x805vv2ivEDV2s R3B79pGVQDJpP46GPAyC60Ry64Y2wXS48NFeXqbqZN7bEfAvHyKhGrufRlo/vz9T0+tc s06w== X-Gm-Message-State: AOAM53236zUfW26K0W2nIK9YDCtOaB0Oq9Z8A0zxgwRDVMkUj5lsucwd /fj3A2Q/cDcw0lVB6Krqs9/eTjAjLNM= X-Google-Smtp-Source: ABdhPJwHZQP4Fjum3BGm4aecFilfgPGt8v6zOQj3aG+9E8GdQ5PtBDOiQ8DLQmDeILjB+q83Zk4SSw== X-Received: by 2002:a67:bc16:: with SMTP id t22mr123648366vsn.10.1637610256673; Mon, 22 Nov 2021 11:44:16 -0800 (PST) Received: from localhost.localdomain ([2804:431:c7f4:3a5b:14e9:b724:f63b:b22b]) by smtp.googlemail.com with ESMTPSA id i27sm5269373uab.8.2021.11.22.11.44.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 22 Nov 2021 11:44:16 -0800 (PST) From: Igor Torrente To: rodrigosiqueiramelo@gmail.com, melissa.srw@gmail.com, ppaalanen@gmail.com, tzimmermann@suse.de Subject: [PATCH v3 1/9] drm: vkms: Replace the deprecated drm_mode_config_init Date: Mon, 22 Nov 2021 16:43:52 -0300 Message-Id: <20211122194400.30836-2-igormtorrente@gmail.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20211122194400.30836-1-igormtorrente@gmail.com> References: <20211122194400.30836-1-igormtorrente@gmail.com> MIME-Version: 1.0 X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: hamohammed.sa@gmail.com, airlied@linux.ie, leandro.ribeiro@collabora.com, dri-devel@lists.freedesktop.org, ~lkcamp/patches@lists.sr.ht, Igor Torrente Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" The `drm_mode_config_init` was deprecated since c3b790e commit, and it's being replaced by the `drmm_mode_config_init`. Signed-off-by: Igor Torrente --- V2: Change the code style(Thomas Zimmermann). --- drivers/gpu/drm/vkms/vkms_drv.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/vkms/vkms_drv.c b/drivers/gpu/drm/vkms/vkms_drv.c index 0ffe5f0e33f7..ee4d96dabe19 100644 --- a/drivers/gpu/drm/vkms/vkms_drv.c +++ b/drivers/gpu/drm/vkms/vkms_drv.c @@ -140,8 +140,12 @@ static const struct drm_mode_config_helper_funcs vkms_mode_config_helpers = { static int vkms_modeset_init(struct vkms_device *vkmsdev) { struct drm_device *dev = &vkmsdev->drm; + int ret; + + ret = drmm_mode_config_init(dev); + if (ret < 0) + return ret; - drm_mode_config_init(dev); dev->mode_config.funcs = &vkms_mode_funcs; dev->mode_config.min_width = XRES_MIN; dev->mode_config.min_height = YRES_MIN; From patchwork Mon Nov 22 19:43:53 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Igor Matheus Andrade Torrente X-Patchwork-Id: 12632731 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id C4C05C433EF for ; Mon, 22 Nov 2021 19:44:24 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 1042389CF2; Mon, 22 Nov 2021 19:44:24 +0000 (UTC) Received: from mail-ua1-x930.google.com (mail-ua1-x930.google.com [IPv6:2607:f8b0:4864:20::930]) by gabe.freedesktop.org (Postfix) with ESMTPS id 28EF989CF2 for ; Mon, 22 Nov 2021 19:44:22 +0000 (UTC) Received: by mail-ua1-x930.google.com with SMTP id i6so38877752uae.6 for ; Mon, 22 Nov 2021 11:44:22 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=wqMc7i1j40Y6DJkM28XSTOEIlGNuQurfBNScJR7ESu8=; b=VnFcNLJBbH6XHNo3VtHbw/iSK1M9t1Ookz8ytRRwNF5m2v17alycBnWIrZHpzR9IrN HRWLtBkNdicGJVcJ3nuWAF4SuTe8vKqK94Ts4uMMGjSh2tWpPILNrtSZLWA93OV4y606 BeSiMlAp5SE9dEvhl/PhZ6WfCdZLIxpXU73D+R8ieweSHqvCJr7KYkKyRDOGUjyfmXq6 DY2oG3TETXEvVlFh4q6s7nSPtBLh4pXGL9fuaylsHFByGNdFv8a5ibwPn86Jk7k38y+b 0iGQZusUwU1AH51ZJwiCgxCil3v+uUMD03uLshmr4hqhBrEH/JVi14P18kdSedXCW1IK Bugw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=wqMc7i1j40Y6DJkM28XSTOEIlGNuQurfBNScJR7ESu8=; b=Dsv3dJPc/kh0U4fhiLpxuZVfluyePsScXgOf5HYmy1RLFljNhcGa2KT8DuqUz+vGmq l9Mql57GpbDe4z0bSohrOSQGWylpxglDkIKe1FUqDDEEtiuCvsCjZXiMpixjL7txMdlY 1b3kLbk7Qg+LGRRzprTf58Rp+1ZQX2kDe5lePwtPs0s4jqNudYMRdD9/MABjXxMAnMwA yCGBkZ9IuyetYNWhQ768Z9WupfHgwIQCq7YFuAmkeMRTPxGswQ+ECrbdhzcK2k3T+lC3 KsE4xHoZO0kw1ZV9Atnn6OQBP1l71YzkI4jYXZeRVkS6Wk9bRmkc6UhlsOI2dD0vciVl sb5w== X-Gm-Message-State: AOAM533eJ9RUO6lX8oNownwnHxVEzAsRdlC1sY4KDqL5GvS4cv0W+T+i QFtGKvxWJvgdcn3xhuM3ISGKY/VyiDw= X-Google-Smtp-Source: ABdhPJxok6kFcgwI0wg+Q4OaZpbeGfmEDCqdA7PCV/3t9+OEiW4Pz2fGxOAOrQm0Z3rH4IWPyXyD/A== X-Received: by 2002:ab0:6e92:: with SMTP id b18mr90394449uav.101.1637610261246; Mon, 22 Nov 2021 11:44:21 -0800 (PST) Received: from localhost.localdomain ([2804:431:c7f4:3a5b:14e9:b724:f63b:b22b]) by smtp.googlemail.com with ESMTPSA id i27sm5269373uab.8.2021.11.22.11.44.16 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 22 Nov 2021 11:44:19 -0800 (PST) From: Igor Torrente To: rodrigosiqueiramelo@gmail.com, melissa.srw@gmail.com, ppaalanen@gmail.com, tzimmermann@suse.de Subject: [PATCH v3 2/9] drm: vkms: Alloc the compose frame using vzalloc Date: Mon, 22 Nov 2021 16:43:53 -0300 Message-Id: <20211122194400.30836-3-igormtorrente@gmail.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20211122194400.30836-1-igormtorrente@gmail.com> References: <20211122194400.30836-1-igormtorrente@gmail.com> MIME-Version: 1.0 X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: hamohammed.sa@gmail.com, airlied@linux.ie, leandro.ribeiro@collabora.com, dri-devel@lists.freedesktop.org, ~lkcamp/patches@lists.sr.ht, Igor Torrente Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" Currently, the memory to the composition frame is being allocated using the kzmalloc. This comes with the limitation of maximum size of one page size(which in the x86_64 is 4Kb and 4MB for default and hugepage respectively). Somes test of igt (e.g. kms_plane@pixel-format) uses more than 4MB when testing some pixel formats like ARGB16161616. This problem is addessed by allocating the memory using kvzalloc that circunvents this limitation. Signed-off-by: Igor Torrente --- drivers/gpu/drm/vkms/vkms_composer.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/drm/vkms/vkms_composer.c b/drivers/gpu/drm/vkms/vkms_composer.c index 9e8204be9a14..82f79e508f81 100644 --- a/drivers/gpu/drm/vkms/vkms_composer.c +++ b/drivers/gpu/drm/vkms/vkms_composer.c @@ -180,7 +180,7 @@ static int compose_active_planes(void **vaddr_out, int i; if (!*vaddr_out) { - *vaddr_out = kzalloc(gem_obj->size, GFP_KERNEL); + *vaddr_out = kvzalloc(gem_obj->size, GFP_KERNEL); if (!*vaddr_out) { DRM_ERROR("Cannot allocate memory for output frame."); return -ENOMEM; @@ -263,7 +263,7 @@ void vkms_composer_worker(struct work_struct *work) crtc_state); if (ret) { if (ret == -EINVAL && !wb_pending) - kfree(vaddr_out); + kvfree(vaddr_out); return; } @@ -275,7 +275,7 @@ void vkms_composer_worker(struct work_struct *work) crtc_state->wb_pending = false; spin_unlock_irq(&out->composer_lock); } else { - kfree(vaddr_out); + kvfree(vaddr_out); } /* From patchwork Mon Nov 22 19:43:54 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Igor Matheus Andrade Torrente X-Patchwork-Id: 12632733 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 3EF0EC433FE for ; Mon, 22 Nov 2021 19:44:28 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 20BB589CF3; Mon, 22 Nov 2021 19:44:27 +0000 (UTC) Received: from mail-ua1-x929.google.com (mail-ua1-x929.google.com [IPv6:2607:f8b0:4864:20::929]) by gabe.freedesktop.org (Postfix) with ESMTPS id ACD7089CF8 for ; Mon, 22 Nov 2021 19:44:24 +0000 (UTC) Received: by mail-ua1-x929.google.com with SMTP id j14so29107521uan.10 for ; Mon, 22 Nov 2021 11:44:24 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=4h5zssoprQVwUD/a+0iu7NgShrwtvdhuvMV0VoWpIVI=; b=TA/ButnDcdAREK1hiNg40XyG/uz+bmZU4ZjZnN064r41beIoMh82WKv77itPl4f8pX 01XfGOasRlNNuMEGL0FFSQ/PEwHhX8au6VQI6BPse4ANM1+1sGwZeXUGVqwo5e2wtMn/ SGKc6sqpdxmeiFDSyUJ5Sn6U1VllDI2l+GDofpUKwUEjusCmwHeaPxZlHttJy4Q1kyAT EfWkMxMhP5O9OUfKLBCh8iWQu02E/IJIvptb5GIzCZ1HjxCwUqDttPH7iFLU53af/1Va xafvC1k+4Y6FaTnugyfbGaHPcQjk4vyLf/GZbNNvbrd2qnDWebQVzv+Mx2UcW6ZfgZug SvhQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=4h5zssoprQVwUD/a+0iu7NgShrwtvdhuvMV0VoWpIVI=; b=ROAdKQXLdxdrDax/gzqBIHkIHhT/KeuP/3vUyJtpfMs2L6lTTjVyk3xN2fhck5KoYI QSj+pk+8q/q4yjsHho0JyQZ3BtoCJ4u6sy4vQMZgp2CjsUIpeisakVHoV0V5mKEnlu3q PqQ1w0VswjWn4gkZzx9B7U2+79qW7UTPdqFZIuUG3RmVMMrAihBNpaIx/pY5pJtcQyF5 0xdSjkxMn2x2FA42QjuCa5o7fxTn+48ORg3jr/d49sigeJRAYg23hvzRXb3WIyFtKyK3 Ua8xrjlHALVKNlBRQmV9qyFgV9u5Ew1BkTyFaY9eqooRbCaes7prtnxgTBLt2MkKTwVe PORQ== X-Gm-Message-State: AOAM532AObAJbDawZxZIHu5hKm3bXdRQf2RowYGZYcnNyIzt/zpD+7FX vXi4Jy4Cdqm3nY/XFQLqJ0xfhqUv5SM= X-Google-Smtp-Source: ABdhPJyZ796R5Rb6F3jLDyHbr2AM65aVhCNJVEYupAjn02lQtpO7Wvqjv8PlSc1hBNQkv/rCh+oDEg== X-Received: by 2002:a05:6102:3ed4:: with SMTP id n20mr134961528vsv.57.1637610263831; Mon, 22 Nov 2021 11:44:23 -0800 (PST) Received: from localhost.localdomain ([2804:431:c7f4:3a5b:14e9:b724:f63b:b22b]) by smtp.googlemail.com with ESMTPSA id i27sm5269373uab.8.2021.11.22.11.44.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 22 Nov 2021 11:44:23 -0800 (PST) From: Igor Torrente To: rodrigosiqueiramelo@gmail.com, melissa.srw@gmail.com, ppaalanen@gmail.com, tzimmermann@suse.de Subject: [PATCH v3 3/9] drm: vkms: Replace hardcoded value of `vkms_composer.map` to DRM_FORMAT_MAX_PLANES Date: Mon, 22 Nov 2021 16:43:54 -0300 Message-Id: <20211122194400.30836-4-igormtorrente@gmail.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20211122194400.30836-1-igormtorrente@gmail.com> References: <20211122194400.30836-1-igormtorrente@gmail.com> MIME-Version: 1.0 X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: hamohammed.sa@gmail.com, airlied@linux.ie, leandro.ribeiro@collabora.com, dri-devel@lists.freedesktop.org, ~lkcamp/patches@lists.sr.ht, Igor Torrente Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" The `map` vector at `vkms_composer` uses a hardcoded value to define its size. If someday the maximum number of planes increases, this hardcoded value can be a problem. This value is being replaced with the DRM_FORMAT_MAX_PLANES macro. Signed-off-by: Igor Torrente --- drivers/gpu/drm/vkms/vkms_drv.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/gpu/drm/vkms/vkms_drv.h b/drivers/gpu/drm/vkms/vkms_drv.h index d48c23d40ce5..64e62993b06f 100644 --- a/drivers/gpu/drm/vkms/vkms_drv.h +++ b/drivers/gpu/drm/vkms/vkms_drv.h @@ -28,7 +28,7 @@ struct vkms_writeback_job { struct vkms_composer { struct drm_framebuffer fb; struct drm_rect src, dst; - struct dma_buf_map map[4]; + struct dma_buf_map map[DRM_FORMAT_MAX_PLANES]; unsigned int offset; unsigned int pitch; unsigned int cpp; From patchwork Mon Nov 22 19:43:55 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Igor Matheus Andrade Torrente X-Patchwork-Id: 12632735 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 96AF3C433EF for ; Mon, 22 Nov 2021 19:44:32 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 0870989CF7; Mon, 22 Nov 2021 19:44:31 +0000 (UTC) Received: from mail-vk1-xa29.google.com (mail-vk1-xa29.google.com [IPv6:2607:f8b0:4864:20::a29]) by gabe.freedesktop.org (Postfix) with ESMTPS id 6136D89CF8 for ; Mon, 22 Nov 2021 19:44:27 +0000 (UTC) Received: by mail-vk1-xa29.google.com with SMTP id m19so10943906vko.12 for ; Mon, 22 Nov 2021 11:44:27 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=HWzzzilNMyKqPSfNDbKQOXixTeIeRugyeL7eL336caA=; b=MMv2W0uUIvUe6Vk3GZew38lgyqYieUgwr6x1K2k8jPXaNbkvnrPVJqgO2c5w4ljgXR uI/JhI8mRPFBTGRkXhelVVG7UyzYXj8RrZILhdm2/6i+ZqPE48tkClcDEgjz5WIJj74B rT+axf5nrzc9vmHNV7BiiZY9QZbEmU5iLUtLRmz9BNE+RwuXuv4Abk3W9SAEQzuZgVA5 tkuRT1q3oiEK2sVkJRcvhQFH3/eeSbTZEtjCHmAI5VJiY7Dmn3zgzKAPxEJU8FX2RfPw wgE96SBDDu6Jz0MO+ipcZRbh7JD93+P/tTgD0ahTK01dp58QY5gm3rq0LYe8X+8xhU+R pojw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=HWzzzilNMyKqPSfNDbKQOXixTeIeRugyeL7eL336caA=; b=4YT7skba8yEYAH33gZtpY7dDYRM1+DF9/EszPKY662Q0iqlF3eDiHz/3XKfkkiDRyi X1VayJqpCar38cd7/q5cNcJD+yIrCOapnn/Q1vhm81AqEpnhE8cf6AzAm+ctBBaUmMQM ZktyYrtaPBNUIJNItbt0/fpRY4/1w5FZZ66OuDxOGyDg7cMQFEVCI+5IQjDp4sOwYt9h gVwtuNNFthiW7+V4WGFrWsMWJgC0wmOsAFJZ6G4V3YPtS5wmaa4uNsOTKTynO4SVbqC3 d+DKmgPnsLM4dnSBxrcBwpkWx1Xt+7MG0rcp2PX04yd7sy/2eBDhpD8wtrScOzAsd9lj MQlQ== X-Gm-Message-State: AOAM531w+yuFJQLaTL5DYjVc4iBwwKtzbwNXc9/KiW4JN+cCOU/pxSo1 aFeDLMS0XgJV+97SuDEModg= X-Google-Smtp-Source: ABdhPJx4MKkGEArL8WDN/eYfJDkvp0KYyU63F7Xu8LccCz07Xr8XeHAWqx+PUuJCgmGQLXc1t41HGw== X-Received: by 2002:a1f:c9c2:: with SMTP id z185mr114436271vkf.26.1637610266441; Mon, 22 Nov 2021 11:44:26 -0800 (PST) Received: from localhost.localdomain ([2804:431:c7f4:3a5b:14e9:b724:f63b:b22b]) by smtp.googlemail.com with ESMTPSA id i27sm5269373uab.8.2021.11.22.11.44.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 22 Nov 2021 11:44:26 -0800 (PST) From: Igor Torrente To: rodrigosiqueiramelo@gmail.com, melissa.srw@gmail.com, ppaalanen@gmail.com, tzimmermann@suse.de Subject: [PATCH v3 4/9] drm: vkms: Rename `vkms_composer` to `vkms_frame_info` Date: Mon, 22 Nov 2021 16:43:55 -0300 Message-Id: <20211122194400.30836-5-igormtorrente@gmail.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20211122194400.30836-1-igormtorrente@gmail.com> References: <20211122194400.30836-1-igormtorrente@gmail.com> MIME-Version: 1.0 X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: hamohammed.sa@gmail.com, airlied@linux.ie, leandro.ribeiro@collabora.com, dri-devel@lists.freedesktop.org, ~lkcamp/patches@lists.sr.ht, Igor Torrente Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" Changes the name of this struct to a more meaningful name. A name that represents better what this struct is about. Composer is the code that do the compositing of the planes. This struct is contains information of the frame that is being used in the output composition. Thus, vkms_frame_info is a better name to represent this. Signed-off-by: Igor Torrente --- drivers/gpu/drm/vkms/vkms_composer.c | 87 ++++++++++++++-------------- drivers/gpu/drm/vkms/vkms_drv.h | 6 +- drivers/gpu/drm/vkms/vkms_plane.c | 38 ++++++------ 3 files changed, 66 insertions(+), 65 deletions(-) diff --git a/drivers/gpu/drm/vkms/vkms_composer.c b/drivers/gpu/drm/vkms/vkms_composer.c index 82f79e508f81..2d946368a561 100644 --- a/drivers/gpu/drm/vkms/vkms_composer.c +++ b/drivers/gpu/drm/vkms/vkms_composer.c @@ -11,11 +11,11 @@ #include "vkms_drv.h" static u32 get_pixel_from_buffer(int x, int y, const u8 *buffer, - const struct vkms_composer *composer) + const struct vkms_frame_info *frame_info) { u32 pixel; - int src_offset = composer->offset + (y * composer->pitch) - + (x * composer->cpp); + int src_offset = frame_info->offset + (y * frame_info->pitch) + + (x * frame_info->cpp); pixel = *(u32 *)&buffer[src_offset]; @@ -26,24 +26,24 @@ static u32 get_pixel_from_buffer(int x, int y, const u8 *buffer, * compute_crc - Compute CRC value on output frame * * @vaddr: address to final framebuffer - * @composer: framebuffer's metadata + * @frame_info: framebuffer's metadata * * returns CRC value computed using crc32 on the visible portion of * the final framebuffer at vaddr_out */ static uint32_t compute_crc(const u8 *vaddr, - const struct vkms_composer *composer) + const struct vkms_frame_info *frame_info) { int x, y; u32 crc = 0, pixel = 0; - int x_src = composer->src.x1 >> 16; - int y_src = composer->src.y1 >> 16; - int h_src = drm_rect_height(&composer->src) >> 16; - int w_src = drm_rect_width(&composer->src) >> 16; + int x_src = frame_info->src.x1 >> 16; + int y_src = frame_info->src.y1 >> 16; + int h_src = drm_rect_height(&frame_info->src) >> 16; + int w_src = drm_rect_width(&frame_info->src) >> 16; for (y = y_src; y < y_src + h_src; ++y) { for (x = x_src; x < x_src + w_src; ++x) { - pixel = get_pixel_from_buffer(x, y, vaddr, composer); + pixel = get_pixel_from_buffer(x, y, vaddr, frame_info); crc = crc32_le(crc, (void *)&pixel, sizeof(u32)); } } @@ -98,8 +98,8 @@ static void x_blend(const u8 *xrgb_src, u8 *xrgb_dst) * blend - blend value at vaddr_src with value at vaddr_dst * @vaddr_dst: destination address * @vaddr_src: source address - * @dst_composer: destination framebuffer's metadata - * @src_composer: source framebuffer's metadata + * @dst_frame_info: destination framebuffer's metadata + * @src_frame_info: source framebuffer's metadata * @pixel_blend: blending equation based on plane format * * Blend the vaddr_src value with the vaddr_dst value using a pixel blend @@ -111,33 +111,33 @@ static void x_blend(const u8 *xrgb_src, u8 *xrgb_dst) * pixel color values */ static void blend(void *vaddr_dst, void *vaddr_src, - struct vkms_composer *dst_composer, - struct vkms_composer *src_composer, + struct vkms_frame_info *dst_frame_info, + struct vkms_frame_info *src_frame_info, void (*pixel_blend)(const u8 *, u8 *)) { int i, j, j_dst, i_dst; int offset_src, offset_dst; u8 *pixel_dst, *pixel_src; - int x_src = src_composer->src.x1 >> 16; - int y_src = src_composer->src.y1 >> 16; + int x_src = src_frame_info->src.x1 >> 16; + int y_src = src_frame_info->src.y1 >> 16; - int x_dst = src_composer->dst.x1; - int y_dst = src_composer->dst.y1; - int h_dst = drm_rect_height(&src_composer->dst); - int w_dst = drm_rect_width(&src_composer->dst); + int x_dst = src_frame_info->dst.x1; + int y_dst = src_frame_info->dst.y1; + int h_dst = drm_rect_height(&src_frame_info->dst); + int w_dst = drm_rect_width(&src_frame_info->dst); int y_limit = y_src + h_dst; int x_limit = x_src + w_dst; for (i = y_src, i_dst = y_dst; i < y_limit; ++i) { for (j = x_src, j_dst = x_dst; j < x_limit; ++j) { - offset_dst = dst_composer->offset - + (i_dst * dst_composer->pitch) - + (j_dst++ * dst_composer->cpp); - offset_src = src_composer->offset - + (i * src_composer->pitch) - + (j * src_composer->cpp); + offset_dst = dst_frame_info->offset + + (i_dst * dst_frame_info->pitch) + + (j_dst++ * dst_frame_info->cpp); + offset_src = src_frame_info->offset + + (i * src_frame_info->pitch) + + (j * src_frame_info->cpp); pixel_src = (u8 *)(vaddr_src + offset_src); pixel_dst = (u8 *)(vaddr_dst + offset_dst); @@ -149,32 +149,33 @@ static void blend(void *vaddr_dst, void *vaddr_src, } } -static void compose_plane(struct vkms_composer *primary_composer, - struct vkms_composer *plane_composer, +static void compose_plane(struct vkms_frame_info *primary_plane_info, + struct vkms_frame_info *plane_frame_info, void *vaddr_out) { - struct drm_framebuffer *fb = &plane_composer->fb; + struct drm_framebuffer *fb = &plane_frame_info->fb; void *vaddr; void (*pixel_blend)(const u8 *p_src, u8 *p_dst); - if (WARN_ON(dma_buf_map_is_null(&primary_composer->map[0]))) + if (WARN_ON(dma_buf_map_is_null(&primary_plane_info->map[0]))) return; - vaddr = plane_composer->map[0].vaddr; + vaddr = plane_frame_info->map[0].vaddr; if (fb->format->format == DRM_FORMAT_ARGB8888) pixel_blend = &alpha_blend; else pixel_blend = &x_blend; - blend(vaddr_out, vaddr, primary_composer, plane_composer, pixel_blend); + blend(vaddr_out, vaddr, primary_plane_info, + plane_frame_info, pixel_blend); } static int compose_active_planes(void **vaddr_out, - struct vkms_composer *primary_composer, + struct vkms_frame_info *primary_plane_info, struct vkms_crtc_state *crtc_state) { - struct drm_framebuffer *fb = &primary_composer->fb; + struct drm_framebuffer *fb = &primary_plane_info->fb; struct drm_gem_object *gem_obj = drm_gem_fb_get_obj(fb, 0); const void *vaddr; int i; @@ -187,10 +188,10 @@ static int compose_active_planes(void **vaddr_out, } } - if (WARN_ON(dma_buf_map_is_null(&primary_composer->map[0]))) + if (WARN_ON(dma_buf_map_is_null(&primary_plane_info->map[0]))) return -EINVAL; - vaddr = primary_composer->map[0].vaddr; + vaddr = primary_plane_info->map[0].vaddr; memcpy(*vaddr_out, vaddr, gem_obj->size); @@ -199,8 +200,8 @@ static int compose_active_planes(void **vaddr_out, * ((primary <- overlay) <- cursor) */ for (i = 1; i < crtc_state->num_active_planes; i++) - compose_plane(primary_composer, - crtc_state->active_planes[i]->composer, + compose_plane(primary_plane_info, + crtc_state->active_planes[i]->frame_info, *vaddr_out); return 0; @@ -222,7 +223,7 @@ void vkms_composer_worker(struct work_struct *work) composer_work); struct drm_crtc *crtc = crtc_state->base.crtc; struct vkms_output *out = drm_crtc_to_vkms_output(crtc); - struct vkms_composer *primary_composer = NULL; + struct vkms_frame_info *primary_plane_info = NULL; struct vkms_plane_state *act_plane = NULL; bool crc_pending, wb_pending; void *vaddr_out = NULL; @@ -250,16 +251,16 @@ void vkms_composer_worker(struct work_struct *work) if (crtc_state->num_active_planes >= 1) { act_plane = crtc_state->active_planes[0]; if (act_plane->base.base.plane->type == DRM_PLANE_TYPE_PRIMARY) - primary_composer = act_plane->composer; + primary_plane_info = act_plane->frame_info; } - if (!primary_composer) + if (!primary_plane_info) return; if (wb_pending) vaddr_out = crtc_state->active_writeback->data[0].vaddr; - ret = compose_active_planes(&vaddr_out, primary_composer, + ret = compose_active_planes(&vaddr_out, primary_plane_info, crtc_state); if (ret) { if (ret == -EINVAL && !wb_pending) @@ -267,7 +268,7 @@ void vkms_composer_worker(struct work_struct *work) return; } - crc32 = compute_crc(vaddr_out, primary_composer); + crc32 = compute_crc(vaddr_out, primary_plane_info); if (wb_pending) { drm_writeback_signal_completion(&out->wb_connector, 0); diff --git a/drivers/gpu/drm/vkms/vkms_drv.h b/drivers/gpu/drm/vkms/vkms_drv.h index 64e62993b06f..6f7a279a1ad7 100644 --- a/drivers/gpu/drm/vkms/vkms_drv.h +++ b/drivers/gpu/drm/vkms/vkms_drv.h @@ -25,7 +25,7 @@ struct vkms_writeback_job { struct dma_buf_map data[DRM_FORMAT_MAX_PLANES]; }; -struct vkms_composer { +struct vkms_frame_info { struct drm_framebuffer fb; struct drm_rect src, dst; struct dma_buf_map map[DRM_FORMAT_MAX_PLANES]; @@ -37,11 +37,11 @@ struct vkms_composer { /** * vkms_plane_state - Driver specific plane state * @base: base plane state - * @composer: data required for composing computation + * @frame_info: data required for composing computation */ struct vkms_plane_state { struct drm_shadow_plane_state base; - struct vkms_composer *composer; + struct vkms_frame_info *frame_info; }; struct vkms_plane { diff --git a/drivers/gpu/drm/vkms/vkms_plane.c b/drivers/gpu/drm/vkms/vkms_plane.c index 32409e15244b..a56b0f76eddd 100644 --- a/drivers/gpu/drm/vkms/vkms_plane.c +++ b/drivers/gpu/drm/vkms/vkms_plane.c @@ -24,20 +24,20 @@ static struct drm_plane_state * vkms_plane_duplicate_state(struct drm_plane *plane) { struct vkms_plane_state *vkms_state; - struct vkms_composer *composer; + struct vkms_frame_info *frame_info; vkms_state = kzalloc(sizeof(*vkms_state), GFP_KERNEL); if (!vkms_state) return NULL; - composer = kzalloc(sizeof(*composer), GFP_KERNEL); - if (!composer) { - DRM_DEBUG_KMS("Couldn't allocate composer\n"); + frame_info = kzalloc(sizeof(*frame_info), GFP_KERNEL); + if (!frame_info) { + DRM_DEBUG_KMS("Couldn't allocate frame_info\n"); kfree(vkms_state); return NULL; } - vkms_state->composer = composer; + vkms_state->frame_info = frame_info; __drm_gem_duplicate_shadow_plane_state(plane, &vkms_state->base); @@ -54,12 +54,12 @@ static void vkms_plane_destroy_state(struct drm_plane *plane, /* dropping the reference we acquired in * vkms_primary_plane_update() */ - if (drm_framebuffer_read_refcount(&vkms_state->composer->fb)) - drm_framebuffer_put(&vkms_state->composer->fb); + if (drm_framebuffer_read_refcount(&vkms_state->frame_info->fb)) + drm_framebuffer_put(&vkms_state->frame_info->fb); } - kfree(vkms_state->composer); - vkms_state->composer = NULL; + kfree(vkms_state->frame_info); + vkms_state->frame_info = NULL; __drm_gem_destroy_shadow_plane_state(&vkms_state->base); kfree(vkms_state); @@ -99,7 +99,7 @@ static void vkms_plane_atomic_update(struct drm_plane *plane, struct vkms_plane_state *vkms_plane_state; struct drm_shadow_plane_state *shadow_plane_state; struct drm_framebuffer *fb = new_state->fb; - struct vkms_composer *composer; + struct vkms_frame_info *frame_info; if (!new_state->crtc || !fb) return; @@ -107,15 +107,15 @@ static void vkms_plane_atomic_update(struct drm_plane *plane, vkms_plane_state = to_vkms_plane_state(new_state); shadow_plane_state = &vkms_plane_state->base; - composer = vkms_plane_state->composer; - memcpy(&composer->src, &new_state->src, sizeof(struct drm_rect)); - memcpy(&composer->dst, &new_state->dst, sizeof(struct drm_rect)); - memcpy(&composer->fb, fb, sizeof(struct drm_framebuffer)); - memcpy(&composer->map, &shadow_plane_state->data, sizeof(composer->map)); - drm_framebuffer_get(&composer->fb); - composer->offset = fb->offsets[0]; - composer->pitch = fb->pitches[0]; - composer->cpp = fb->format->cpp[0]; + frame_info = vkms_plane_state->frame_info; + memcpy(&frame_info->src, &new_state->src, sizeof(struct drm_rect)); + memcpy(&frame_info->dst, &new_state->dst, sizeof(struct drm_rect)); + memcpy(&frame_info->fb, fb, sizeof(struct drm_framebuffer)); + memcpy(&frame_info->map, &shadow_plane_state->data, sizeof(frame_info->map)); + drm_framebuffer_get(&frame_info->fb); + frame_info->offset = fb->offsets[0]; + frame_info->pitch = fb->pitches[0]; + frame_info->cpp = fb->format->cpp[0]; } static int vkms_plane_atomic_check(struct drm_plane *plane, From patchwork Mon Nov 22 19:43:56 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Igor Matheus Andrade Torrente X-Patchwork-Id: 12632737 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 5D200C433F5 for ; Mon, 22 Nov 2021 19:44:34 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 2121589D1D; Mon, 22 Nov 2021 19:44:31 +0000 (UTC) Received: from mail-ua1-x92e.google.com (mail-ua1-x92e.google.com [IPv6:2607:f8b0:4864:20::92e]) by gabe.freedesktop.org (Postfix) with ESMTPS id E7FD189D1D for ; Mon, 22 Nov 2021 19:44:29 +0000 (UTC) Received: by mail-ua1-x92e.google.com with SMTP id r15so38973170uao.3 for ; Mon, 22 Nov 2021 11:44:29 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=+H57AYERyA+sHaSgv5R2HWLmtnMV8kLItu1b/vTkNvA=; b=R22/ZphxHNLcLZehT0DjIFIZ5P+mnFbWaqhv9L95qn61iQo45JFWUDPtNRai7UjuYq 9XszZFMP3oFdLxLvTBNOIBc83rJEmAIMBBlyBd2UfGn7ZUtAFSIJams7IEHhY6PJ2i7u pb+Y+qVfE1aiij2yQvWU/5mVwcgd/3B639I7qWtiyvPZQUcXY/Z4tkqLIHCPvkSYCsUw o42bSGiJxu9gHHN/8lFkIhwb5EuUlJt/PlVz8ZXjmgpm6u5btd9BMF/ZFkEKKCdGkbZK dvsAb5P/GHAx+xSD7E9UzHzMGxgx8zOUVZky/eIOTc8cVyQo8432xH6erTtNEVYXnJgF al8g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=+H57AYERyA+sHaSgv5R2HWLmtnMV8kLItu1b/vTkNvA=; b=UuzjhNyNiHLCaPWQEhc4PGHfh4NB98s3+yqsd+TZPtIFN6BzRFnAg4TWlYrNUeCbij 99IjFEirwcw97e6YaqGA0YbnVA5hy10/CflA60qIyn+8/LJq4d9Aq56vXgl6tfYo0UCD U+kkoID9ydzqALxrmosp/lCuh9Pe/R1cdhAyX3ceaH6b8HX/e5iRmNuH3l7+f/rmy++g PmbldO8QziwmzLtBnq5R8cpMnCZhkyy06q5MuE0n68yrJJPzz/1AHC/7EYmgKEedORVJ ZY1l1JbMDeDsWPl/aCSNgDU/O7088PPXn8CP1ojY+XuTYPIz7szIK/84UREmtbLXxJmt w+GA== X-Gm-Message-State: AOAM53277c5/MwKXgWmfAmKfKqIlp9wIqyuA/C+Nc9lGIQd2UPkC7suC IMs0DFX+B8EFUXPE/nZLc1CEqEqQihI= X-Google-Smtp-Source: ABdhPJyoQHIpOfyvWH8nVXB4QLVHDlqiM61mqX+Rs7zgo2ri8MB74NwcB59+uWnkHejvSYdcmWIJNg== X-Received: by 2002:ab0:3813:: with SMTP id x19mr87772698uav.56.1637610269022; Mon, 22 Nov 2021 11:44:29 -0800 (PST) Received: from localhost.localdomain ([2804:431:c7f4:3a5b:14e9:b724:f63b:b22b]) by smtp.googlemail.com with ESMTPSA id i27sm5269373uab.8.2021.11.22.11.44.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 22 Nov 2021 11:44:28 -0800 (PST) From: Igor Torrente To: rodrigosiqueiramelo@gmail.com, melissa.srw@gmail.com, ppaalanen@gmail.com, tzimmermann@suse.de Subject: [PATCH v3 5/9] drm: vkms: Add fb information to `vkms_writeback_job` Date: Mon, 22 Nov 2021 16:43:56 -0300 Message-Id: <20211122194400.30836-6-igormtorrente@gmail.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20211122194400.30836-1-igormtorrente@gmail.com> References: <20211122194400.30836-1-igormtorrente@gmail.com> MIME-Version: 1.0 X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: hamohammed.sa@gmail.com, airlied@linux.ie, leandro.ribeiro@collabora.com, dri-devel@lists.freedesktop.org, ~lkcamp/patches@lists.sr.ht, Igor Torrente Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" This commit is the groundwork to introduce new formats to the planes and writeback buffer. As part of it, a new buffer metadata field is added to `vkms_writeback_job`, this metadata is represented by the `vkms_composer` struct. This will allow us, in the future, to have different compositing and wb format types. Signed-off-by: Igor Torrente --- V2: Change the code to get the drm_framebuffer reference and not copy its contents(Thomas Zimmermann). V3: Drop the refcount in the wb code(Thomas Zimmermann). --- drivers/gpu/drm/vkms/vkms_composer.c | 4 ++-- drivers/gpu/drm/vkms/vkms_drv.h | 12 ++++++------ drivers/gpu/drm/vkms/vkms_plane.c | 10 +++++----- drivers/gpu/drm/vkms/vkms_writeback.c | 20 +++++++++++++++++--- 4 files changed, 30 insertions(+), 16 deletions(-) diff --git a/drivers/gpu/drm/vkms/vkms_composer.c b/drivers/gpu/drm/vkms/vkms_composer.c index 2d946368a561..95029d2ebcac 100644 --- a/drivers/gpu/drm/vkms/vkms_composer.c +++ b/drivers/gpu/drm/vkms/vkms_composer.c @@ -153,7 +153,7 @@ static void compose_plane(struct vkms_frame_info *primary_plane_info, struct vkms_frame_info *plane_frame_info, void *vaddr_out) { - struct drm_framebuffer *fb = &plane_frame_info->fb; + struct drm_framebuffer *fb = plane_frame_info->fb; void *vaddr; void (*pixel_blend)(const u8 *p_src, u8 *p_dst); @@ -175,7 +175,7 @@ static int compose_active_planes(void **vaddr_out, struct vkms_frame_info *primary_plane_info, struct vkms_crtc_state *crtc_state) { - struct drm_framebuffer *fb = &primary_plane_info->fb; + struct drm_framebuffer *fb = primary_plane_info->fb; struct drm_gem_object *gem_obj = drm_gem_fb_get_obj(fb, 0); const void *vaddr; int i; diff --git a/drivers/gpu/drm/vkms/vkms_drv.h b/drivers/gpu/drm/vkms/vkms_drv.h index 6f7a279a1ad7..27ed464db7e6 100644 --- a/drivers/gpu/drm/vkms/vkms_drv.h +++ b/drivers/gpu/drm/vkms/vkms_drv.h @@ -20,13 +20,8 @@ #define XRES_MAX 8192 #define YRES_MAX 8192 -struct vkms_writeback_job { - struct dma_buf_map map[DRM_FORMAT_MAX_PLANES]; - struct dma_buf_map data[DRM_FORMAT_MAX_PLANES]; -}; - struct vkms_frame_info { - struct drm_framebuffer fb; + struct drm_framebuffer *fb; struct drm_rect src, dst; struct dma_buf_map map[DRM_FORMAT_MAX_PLANES]; unsigned int offset; @@ -34,6 +29,11 @@ struct vkms_frame_info { unsigned int cpp; }; +struct vkms_writeback_job { + struct dma_buf_map data[DRM_FORMAT_MAX_PLANES]; + struct vkms_frame_info frame_info; +}; + /** * vkms_plane_state - Driver specific plane state * @base: base plane state diff --git a/drivers/gpu/drm/vkms/vkms_plane.c b/drivers/gpu/drm/vkms/vkms_plane.c index a56b0f76eddd..28752af0118c 100644 --- a/drivers/gpu/drm/vkms/vkms_plane.c +++ b/drivers/gpu/drm/vkms/vkms_plane.c @@ -50,12 +50,12 @@ static void vkms_plane_destroy_state(struct drm_plane *plane, struct vkms_plane_state *vkms_state = to_vkms_plane_state(old_state); struct drm_crtc *crtc = vkms_state->base.base.crtc; - if (crtc) { + if (crtc && vkms_state->frame_info->fb) { /* dropping the reference we acquired in * vkms_primary_plane_update() */ - if (drm_framebuffer_read_refcount(&vkms_state->frame_info->fb)) - drm_framebuffer_put(&vkms_state->frame_info->fb); + if (drm_framebuffer_read_refcount(vkms_state->frame_info->fb)) + drm_framebuffer_put(vkms_state->frame_info->fb); } kfree(vkms_state->frame_info); @@ -110,9 +110,9 @@ static void vkms_plane_atomic_update(struct drm_plane *plane, frame_info = vkms_plane_state->frame_info; memcpy(&frame_info->src, &new_state->src, sizeof(struct drm_rect)); memcpy(&frame_info->dst, &new_state->dst, sizeof(struct drm_rect)); - memcpy(&frame_info->fb, fb, sizeof(struct drm_framebuffer)); + frame_info->fb = fb; memcpy(&frame_info->map, &shadow_plane_state->data, sizeof(frame_info->map)); - drm_framebuffer_get(&frame_info->fb); + drm_framebuffer_get(frame_info->fb); frame_info->offset = fb->offsets[0]; frame_info->pitch = fb->pitches[0]; frame_info->cpp = fb->format->cpp[0]; diff --git a/drivers/gpu/drm/vkms/vkms_writeback.c b/drivers/gpu/drm/vkms/vkms_writeback.c index 8694227f555f..de379331b236 100644 --- a/drivers/gpu/drm/vkms/vkms_writeback.c +++ b/drivers/gpu/drm/vkms/vkms_writeback.c @@ -75,12 +75,15 @@ static int vkms_wb_prepare_job(struct drm_writeback_connector *wb_connector, if (!vkmsjob) return -ENOMEM; - ret = drm_gem_fb_vmap(job->fb, vkmsjob->map, vkmsjob->data); + ret = drm_gem_fb_vmap(job->fb, vkmsjob->frame_info.map, vkmsjob->data); if (ret) { DRM_ERROR("vmap failed: %d\n", ret); goto err_kfree; } + vkmsjob->frame_info.fb = job->fb; + drm_framebuffer_get(vkmsjob->frame_info.fb); + job->priv = vkmsjob; return 0; @@ -99,7 +102,9 @@ static void vkms_wb_cleanup_job(struct drm_writeback_connector *connector, if (!job->fb) return; - drm_gem_fb_vunmap(job->fb, vkmsjob->map); + drm_gem_fb_vunmap(job->fb, vkmsjob->frame_info.map); + + drm_framebuffer_put(vkmsjob->frame_info.fb); vkmsdev = drm_device_to_vkms_device(job->fb->dev); vkms_set_composer(&vkmsdev->output, false); @@ -116,14 +121,23 @@ static void vkms_wb_atomic_commit(struct drm_connector *conn, struct drm_writeback_connector *wb_conn = &output->wb_connector; struct drm_connector_state *conn_state = wb_conn->base.state; struct vkms_crtc_state *crtc_state = output->composer_state; + struct drm_framebuffer *fb = connector_state->writeback_job->fb; + struct vkms_writeback_job *active_wb; + struct vkms_frame_info *wb_frame_info; if (!conn_state) return; vkms_set_composer(&vkmsdev->output, true); + active_wb = conn_state->writeback_job->priv; + wb_frame_info = &active_wb->frame_info; + spin_lock_irq(&output->composer_lock); - crtc_state->active_writeback = conn_state->writeback_job->priv; + crtc_state->active_writeback = active_wb; + wb_frame_info->offset = fb->offsets[0]; + wb_frame_info->pitch = fb->pitches[0]; + wb_frame_info->cpp = fb->format->cpp[0]; crtc_state->wb_pending = true; spin_unlock_irq(&output->composer_lock); drm_writeback_queue_job(wb_conn, connector_state); From patchwork Mon Nov 22 19:43:57 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Igor Matheus Andrade Torrente X-Patchwork-Id: 12632741 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id A9784C433F5 for ; Mon, 22 Nov 2021 19:44:40 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id ED65389D58; Mon, 22 Nov 2021 19:44:37 +0000 (UTC) Received: from mail-ua1-x933.google.com (mail-ua1-x933.google.com [IPv6:2607:f8b0:4864:20::933]) by gabe.freedesktop.org (Postfix) with ESMTPS id CDA7589D53 for ; Mon, 22 Nov 2021 19:44:32 +0000 (UTC) Received: by mail-ua1-x933.google.com with SMTP id i6so38878776uae.6 for ; Mon, 22 Nov 2021 11:44:32 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=UazbWUb/VssHqQU64dACGTpiAF4rqApFwLerWgv1Aec=; b=d3jIkH+wMkbghOSwmxOOx0l+RNiAbs7oWut1TrwL0DVPqcMT9MRWOWLKvlT0E2cyzm 08tXrau4kFVC8UGoZufEmWJZ3/bWqb/Mm+AZMqucbL9yp+x/6swAQJro7XhGwx745btF 9YCXbv6J7MTfUVrxcijf+4pnPB4FTZjIUv4vAq40zNfcMwjfqCxmwQCOwYKKwU8bT3Cp CLepe04UNkk8tD2wm43IqbNBMbN6jUkie3CV2EPzs7s/oD249kPQQ1ZwWhri9ovNOxId JEYMoxAJ3+Bi5l7C+WggSDgmfiI3OXpUxfmRODqixHLjjo7TMgR9bna7krDG2umq7KAO NfYg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=UazbWUb/VssHqQU64dACGTpiAF4rqApFwLerWgv1Aec=; b=r3nuhY4Rc2RLtRfRwj8SMkl/VchJlCI5ClBIbyvkqJfe9YToC5SwykkpEMl3g3grtR DGUC1dVHio1KmAMdIGv5KcJxIhGK7otxegttZB5tZbOP0tUB5zqzRyrdh89yKDTfJNBw vpYKkbRh2AxRkB/wsIkEBfaQDqeIVBAXkDkFKYjrNdj1pTRmt16Fkc5fARtW+vMchRB8 ukSYv/WyWO/0PgAwZsntWtzHstZ7OrfBO9N8Aq4dn5Cx2HweY4+WgO8tQXWPBDoAzGCl 3BGPd5dXKCW1SA1Dhr0Xu9ds+So+DaWVntiG/bwkyGHTBLPS0WfC2PvLzGh0sQm/XNOu Llkw== X-Gm-Message-State: AOAM5331p5p6Df1mV052h09AMxtfre/9IjGiVUwxmBBm3iXSZEuffBqm 29SecKWb0b434cIN2nfrfP0= X-Google-Smtp-Source: ABdhPJw3z0UGAmGdnOFDfm/JaDQORR1givCwvnhCnQlgNif1nC/uLhJruxGX07N9v8yHibEnFeMcaA== X-Received: by 2002:a67:fb05:: with SMTP id d5mr132878859vsr.41.1637610271567; Mon, 22 Nov 2021 11:44:31 -0800 (PST) Received: from localhost.localdomain ([2804:431:c7f4:3a5b:14e9:b724:f63b:b22b]) by smtp.googlemail.com with ESMTPSA id i27sm5269373uab.8.2021.11.22.11.44.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 22 Nov 2021 11:44:31 -0800 (PST) From: Igor Torrente To: rodrigosiqueiramelo@gmail.com, melissa.srw@gmail.com, ppaalanen@gmail.com, tzimmermann@suse.de Subject: [PATCH v3 6/9] drm: drm_atomic_helper: Add a new helper to deal with the writeback connector validation Date: Mon, 22 Nov 2021 16:43:57 -0300 Message-Id: <20211122194400.30836-7-igormtorrente@gmail.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20211122194400.30836-1-igormtorrente@gmail.com> References: <20211122194400.30836-1-igormtorrente@gmail.com> MIME-Version: 1.0 X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: hamohammed.sa@gmail.com, airlied@linux.ie, leandro.ribeiro@collabora.com, dri-devel@lists.freedesktop.org, ~lkcamp/patches@lists.sr.ht, Igor Torrente Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" Add a helper function to validate the connector configuration receive in the encoder atomic_check by the drivers. So the drivers don't need do these common validations themselves. Signed-off-by: Igor Torrente --- V2: Move the format verification to a new helper at the drm_atomic_helper.c (Thomas Zimmermann). V3: Format check improvements (Leandro Ribeiro). Minor improvements(Thomas Zimmermann). --- drivers/gpu/drm/drm_atomic_helper.c | 39 +++++++++++++++++++++++++++ drivers/gpu/drm/vkms/vkms_writeback.c | 9 +++---- include/drm/drm_atomic_helper.h | 3 +++ 3 files changed, 46 insertions(+), 5 deletions(-) diff --git a/drivers/gpu/drm/drm_atomic_helper.c b/drivers/gpu/drm/drm_atomic_helper.c index 2c0c6ec92820..394bf303ed6b 100644 --- a/drivers/gpu/drm/drm_atomic_helper.c +++ b/drivers/gpu/drm/drm_atomic_helper.c @@ -766,6 +766,45 @@ drm_atomic_helper_check_modeset(struct drm_device *dev, } EXPORT_SYMBOL(drm_atomic_helper_check_modeset); +/** + * drm_atomic_helper_check_wb_connector_state() - Check writeback encoder state + * @encoder: encoder state to check + * @conn_state: connector state to check + * + * Checks if the writeback connector state is valid, and returns an error if it + * isn't. + * + * RETURNS: + * Zero for success or -errno + */ +int +drm_atomic_helper_check_wb_encoder_state(struct drm_encoder *encoder, + struct drm_connector_state *conn_state) +{ + struct drm_writeback_job *wb_job = conn_state->writeback_job; + struct drm_property_blob *pixel_format_blob; + struct drm_framebuffer *fb; + size_t i, nformats; + u32 *formats; + + if (!wb_job || !wb_job->fb) + return 0; + + pixel_format_blob = wb_job->connector->pixel_formats_blob_ptr; + nformats = pixel_format_blob->length / sizeof(u32); + formats = pixel_format_blob->data; + fb = wb_job->fb; + + for (i = 0; i < nformats; i++) + if (fb->format->format == formats[i]) + return 0; + + drm_dbg_kms(encoder->dev, "Invalid pixel format %p4cc\n", &fb->format->format); + + return -EINVAL; +} +EXPORT_SYMBOL(drm_atomic_helper_check_wb_encoder_state); + /** * drm_atomic_helper_check_plane_state() - Check plane state for validity * @plane_state: plane state to check diff --git a/drivers/gpu/drm/vkms/vkms_writeback.c b/drivers/gpu/drm/vkms/vkms_writeback.c index de379331b236..ad4bb1fb37ca 100644 --- a/drivers/gpu/drm/vkms/vkms_writeback.c +++ b/drivers/gpu/drm/vkms/vkms_writeback.c @@ -30,6 +30,7 @@ static int vkms_wb_encoder_atomic_check(struct drm_encoder *encoder, { struct drm_framebuffer *fb; const struct drm_display_mode *mode = &crtc_state->mode; + int ret; if (!conn_state->writeback_job || !conn_state->writeback_job->fb) return 0; @@ -41,11 +42,9 @@ static int vkms_wb_encoder_atomic_check(struct drm_encoder *encoder, return -EINVAL; } - if (fb->format->format != vkms_wb_formats[0]) { - DRM_DEBUG_KMS("Invalid pixel format %p4cc\n", - &fb->format->format); - return -EINVAL; - } + ret = drm_atomic_helper_check_wb_encoder_state(encoder, conn_state); + if (ret < 0) + return ret; return 0; } diff --git a/include/drm/drm_atomic_helper.h b/include/drm/drm_atomic_helper.h index 4045e2507e11..3fbf695da60f 100644 --- a/include/drm/drm_atomic_helper.h +++ b/include/drm/drm_atomic_helper.h @@ -40,6 +40,9 @@ struct drm_private_state; int drm_atomic_helper_check_modeset(struct drm_device *dev, struct drm_atomic_state *state); +int +drm_atomic_helper_check_wb_encoder_state(struct drm_encoder *encoder, + struct drm_connector_state *conn_state); int drm_atomic_helper_check_plane_state(struct drm_plane_state *plane_state, const struct drm_crtc_state *crtc_state, int min_scale, From patchwork Mon Nov 22 19:43:58 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Igor Matheus Andrade Torrente X-Patchwork-Id: 12632739 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 6C6AAC433EF for ; Mon, 22 Nov 2021 19:44:38 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 5303589D30; Mon, 22 Nov 2021 19:44:37 +0000 (UTC) Received: from mail-vk1-xa2a.google.com (mail-vk1-xa2a.google.com [IPv6:2607:f8b0:4864:20::a2a]) by gabe.freedesktop.org (Postfix) with ESMTPS id 54BCA89D30 for ; Mon, 22 Nov 2021 19:44:35 +0000 (UTC) Received: by mail-vk1-xa2a.google.com with SMTP id s17so10970010vka.5 for ; Mon, 22 Nov 2021 11:44:35 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=+X2gifn9qFxltRlwIz1PyJXr7D7DhH6nYWpXoWuLDxQ=; b=ba9jNV8ms0j6+dkPyyMdlyW0RmMfuqGncBIMqfDx/wGx3gx3cgPHoLYACJoaRCDjki AUR0uk5xQgy5cKGWVpPh6zAYjhCo2jN9TaEEZrc92TpLgNHPaEw9sTrit4NbLZJ7A8fA mM/2tZGmjL3RA+EBeSHCFW/QW4CEzVMr4u4I0MdvWCMp13eWQmcDx7YvRs4hZIj0nvJ3 E5nfMdN7cjQ0gO8FD+wZjKjRWNYBywcktWax3d/OnULeXbVk8/BaSRwptfd4gt+XIsw1 1dlgSpwoMTwNKEdsJJgCFa0Udv5SxEPI8HrT3CISbqO431jD3U7Zql0wbiVDOo8xq56G +OVg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=+X2gifn9qFxltRlwIz1PyJXr7D7DhH6nYWpXoWuLDxQ=; b=AbZt8Gbke48NNdSz8aq4vYlN3DUNyOfLHuRDORKxU+TONvu+erJ3ABpioh2hz39pQh Wd9DRyCmFBJ/jXW5ty7pBnmE9bRPzvGXz2TzQxYlKJb+LCvcBonj/D0KeOfNFV4UfJo+ YTpf4CzmnG+Iju/beoC1ly+AIX3BdEW2DiVCJRlXV1/iOFSGjtZH1iBQLC0cDKwxaiOE iM1+MDhAfRehaorubpLTH1bqwr89KS1Df7LukbUwfVmHS6CmkPodSMzQV1rXyTWX0EHG y0DT8YLhvU9jk5mmq8AXEfdIKBoBRzwvDIDn2k/FU8f8PqIEWAHJ3H5iRf5cyVYwSyHy cZlQ== X-Gm-Message-State: AOAM532zjync+vTCOWDCJRFSgHXzjwNh4mTme4U/jpHkpUvc114sHDmA V+51L/zJUJ+8Y5gMaWJlnd4= X-Google-Smtp-Source: ABdhPJz7o9itNIFn8TdVqxtNpikaisRtapMBgN+dfuY4VI2I4Z1dkIeHPJKb570T7YiXp1tdfITTLw== X-Received: by 2002:a05:6122:550:: with SMTP id y16mr166578025vko.0.1637610274324; Mon, 22 Nov 2021 11:44:34 -0800 (PST) Received: from localhost.localdomain ([2804:431:c7f4:3a5b:14e9:b724:f63b:b22b]) by smtp.googlemail.com with ESMTPSA id i27sm5269373uab.8.2021.11.22.11.44.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 22 Nov 2021 11:44:34 -0800 (PST) From: Igor Torrente To: rodrigosiqueiramelo@gmail.com, melissa.srw@gmail.com, ppaalanen@gmail.com, tzimmermann@suse.de Subject: [PATCH v3 7/9] drm: vkms: Refactor the plane composer to accept new formats Date: Mon, 22 Nov 2021 16:43:58 -0300 Message-Id: <20211122194400.30836-8-igormtorrente@gmail.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20211122194400.30836-1-igormtorrente@gmail.com> References: <20211122194400.30836-1-igormtorrente@gmail.com> MIME-Version: 1.0 X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: hamohammed.sa@gmail.com, kernel test robot , airlied@linux.ie, leandro.ribeiro@collabora.com, dri-devel@lists.freedesktop.org, ~lkcamp/patches@lists.sr.ht, Igor Torrente Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" Currently the blend function only accepts XRGB_8888 and ARGB_8888 as a color input. This patch refactors all the functions related to the plane composition to overcome this limitation. A new internal format(`struct pixel`) is introduced to deal with all possible inputs. It consists of 16 bits fields that represent each of the channels. The pixels blend is done using this internal format. And new handlers are being added to convert a specific format to/from this internal format. So the blend operation depends on these handlers to convert to this common format. The blended result, if necessary, is converted to the writeback buffer format. This patch introduces three major differences to the blend function. 1 - All the planes are blended at once. 2 - The blend calculus is done as per line instead of per pixel. 3 - It is responsible to calculates the CRC and writing the writeback buffer(if necessary). These changes allow us to allocate way less memory in the intermediate buffer to compute these operations. Because now we don't need to have the entire intermediate image lines at once, just one line is enough. | Memory consumption (output dimensions) | |:--------------------------------------:| | Current | This patch | |:------------------:|:-----------------:| | Width * Heigth | 2 * Width | Beyond memory, we also have a minor performance benefit from all these changes. Results running the IGT tests `*kms_cursor_crc*`: | Frametime | |:------------------------------------------:| | Implementation | Current | This commit | |:---------------:|:---------:|:------------:| | frametime range | 8~22 ms | 5~18 ms | | Average | 10.0 ms | 7.3 ms | Reported-by: kernel test robot Signed-off-by: Igor Torrente --- V2: Improves the performance drastically, by perfoming the operations per-line and not per-pixel(Pekka Paalanen). Minor improvements(Pekka Paalanen). V3: Changes the code to blend the planes all at once. This improves performance, memory consumption, and removes much of the weirdness of the V2(Pekka Paalanen and me). Minor improvements(Pekka Paalanen and me). --- drivers/gpu/drm/vkms/Makefile | 1 + drivers/gpu/drm/vkms/vkms_composer.c | 350 ++++++++++++++------------- drivers/gpu/drm/vkms/vkms_formats.c | 138 +++++++++++ drivers/gpu/drm/vkms/vkms_formats.h | 31 +++ 4 files changed, 348 insertions(+), 172 deletions(-) create mode 100644 drivers/gpu/drm/vkms/vkms_formats.c create mode 100644 drivers/gpu/drm/vkms/vkms_formats.h diff --git a/drivers/gpu/drm/vkms/Makefile b/drivers/gpu/drm/vkms/Makefile index 72f779cbfedd..1b28a6a32948 100644 --- a/drivers/gpu/drm/vkms/Makefile +++ b/drivers/gpu/drm/vkms/Makefile @@ -3,6 +3,7 @@ vkms-y := \ vkms_drv.o \ vkms_plane.o \ vkms_output.o \ + vkms_formats.o \ vkms_crtc.o \ vkms_composer.o \ vkms_writeback.o diff --git a/drivers/gpu/drm/vkms/vkms_composer.c b/drivers/gpu/drm/vkms/vkms_composer.c index 95029d2ebcac..99049511c319 100644 --- a/drivers/gpu/drm/vkms/vkms_composer.c +++ b/drivers/gpu/drm/vkms/vkms_composer.c @@ -9,202 +9,225 @@ #include #include "vkms_drv.h" +#include "vkms_formats.h" -static u32 get_pixel_from_buffer(int x, int y, const u8 *buffer, - const struct vkms_frame_info *frame_info) +static u16 pre_mul_blend_channel(u16 src, u16 dst, u16 alpha) { - u32 pixel; - int src_offset = frame_info->offset + (y * frame_info->pitch) - + (x * frame_info->cpp); + u32 new_color; - pixel = *(u32 *)&buffer[src_offset]; + new_color = (src * 0xffff + dst * (0xffff - alpha)); - return pixel; + return DIV_ROUND_UP(new_color, 0xffff); } /** - * compute_crc - Compute CRC value on output frame + * pre_mul_alpha_blend - alpha blending equation + * @src_frame_info: source framebuffer's metadata + * @stage_buffer: The line with the pixels from src_plane + * @output_buffer: A line buffer that receives all the blends output * - * @vaddr: address to final framebuffer - * @frame_info: framebuffer's metadata + * Using the information from the `frame_info`, this blends only the + * necessary pixels from the `stage_buffer` to the `output_buffer` + * using premultiplied blend formula. * - * returns CRC value computed using crc32 on the visible portion of - * the final framebuffer at vaddr_out + * The current DRM assumption is that pixel color values have been already + * pre-multiplied with the alpha channel values. See more + * drm_plane_create_blend_mode_property(). Also, this formula assumes a + * completely opaque background. */ -static uint32_t compute_crc(const u8 *vaddr, - const struct vkms_frame_info *frame_info) +static void pre_mul_alpha_blend(struct vkms_frame_info *frame_info, + struct line_buffer *stage_buffer, + struct line_buffer *output_buffer) { - int x, y; - u32 crc = 0, pixel = 0; - int x_src = frame_info->src.x1 >> 16; - int y_src = frame_info->src.y1 >> 16; - int h_src = drm_rect_height(&frame_info->src) >> 16; - int w_src = drm_rect_width(&frame_info->src) >> 16; - - for (y = y_src; y < y_src + h_src; ++y) { - for (x = x_src; x < x_src + w_src; ++x) { - pixel = get_pixel_from_buffer(x, y, vaddr, frame_info); - crc = crc32_le(crc, (void *)&pixel, sizeof(u32)); - } + int x, x_dst = frame_info->dst.x1; + int x_limit = drm_rect_width(&frame_info->dst); + struct line_buffer *out = output_buffer + x_dst; + struct line_buffer *in = stage_buffer; + + for (x = 0; x < x_limit; x++) { + out[x].a = (u16)0xffff; + out[x].r = pre_mul_blend_channel(in[x].r, out[x].r, in[x].a); + out[x].g = pre_mul_blend_channel(in[x].g, out[x].g, in[x].a); + out[x].b = pre_mul_blend_channel(in[x].b, out[x].b, in[x].a); } - - return crc; -} - -static u8 blend_channel(u8 src, u8 dst, u8 alpha) -{ - u32 pre_blend; - u8 new_color; - - pre_blend = (src * 255 + dst * (255 - alpha)); - - /* Faster div by 255 */ - new_color = ((pre_blend + ((pre_blend + 257) >> 8)) >> 8); - - return new_color; } -/** - * alpha_blend - alpha blending equation - * @argb_src: src pixel on premultiplied alpha mode - * @argb_dst: dst pixel completely opaque - * - * blend pixels using premultiplied blend formula. The current DRM assumption - * is that pixel color values have been already pre-multiplied with the alpha - * channel values. See more drm_plane_create_blend_mode_property(). Also, this - * formula assumes a completely opaque background. - */ -static void alpha_blend(const u8 *argb_src, u8 *argb_dst) +static bool check_y_limit(struct vkms_frame_info *frame_info, int y) { - u8 alpha; + if (y >= frame_info->dst.y1 && y < frame_info->dst.y2) + return true; - alpha = argb_src[3]; - argb_dst[0] = blend_channel(argb_src[0], argb_dst[0], alpha); - argb_dst[1] = blend_channel(argb_src[1], argb_dst[1], alpha); - argb_dst[2] = blend_channel(argb_src[2], argb_dst[2], alpha); -} - -/** - * x_blend - blending equation that ignores the pixel alpha - * - * overwrites RGB color value from src pixel to dst pixel. - */ -static void x_blend(const u8 *xrgb_src, u8 *xrgb_dst) -{ - memcpy(xrgb_dst, xrgb_src, sizeof(u8) * 3); + return false; } /** - * blend - blend value at vaddr_src with value at vaddr_dst - * @vaddr_dst: destination address - * @vaddr_src: source address - * @dst_frame_info: destination framebuffer's metadata - * @src_frame_info: source framebuffer's metadata - * @pixel_blend: blending equation based on plane format + * @wb_frame_info: The writeback frame buffer metadata + * @wb_fmt_func: The format tranformatio function to the wb buffer + * @crtc_state: The crtc state + * @plane_fmt_func: A format tranformation function to each plane + * @crc32: The crc output of the final frame + * @output_buffer: A buffer of a row that will receive the result of the blend(s) + * @stage_buffer: The line with the pixels from src_compositor * - * Blend the vaddr_src value with the vaddr_dst value using a pixel blend - * equation according to the supported plane formats DRM_FORMAT_(A/XRGB8888) - * and clearing alpha channel to an completely opaque background. This function - * uses buffer's metadata to locate the new composite values at vaddr_dst. + * This function blends the pixels (Using the `pre_mul_alpha_blend`) + * from all planes, calculates the crc32 of the output from the former step, + * and, if necessary, convert and store the output to the writeback buffer. * * TODO: completely clear the primary plane (a = 0xff) before starting to blend * pixel color values */ -static void blend(void *vaddr_dst, void *vaddr_src, - struct vkms_frame_info *dst_frame_info, - struct vkms_frame_info *src_frame_info, - void (*pixel_blend)(const u8 *, u8 *)) +static void blend(struct vkms_frame_info *wb_frame_info, + format_transform_func wb_fmt_func, + struct vkms_crtc_state *crtc_state, + format_transform_func *plane_fmt_func, + u32 *crc32, struct line_buffer *stage_buffer, + struct line_buffer *output_buffer, s64 row_size) { - int i, j, j_dst, i_dst; - int offset_src, offset_dst; - u8 *pixel_dst, *pixel_src; - - int x_src = src_frame_info->src.x1 >> 16; - int y_src = src_frame_info->src.y1 >> 16; - - int x_dst = src_frame_info->dst.x1; - int y_dst = src_frame_info->dst.y1; - int h_dst = drm_rect_height(&src_frame_info->dst); - int w_dst = drm_rect_width(&src_frame_info->dst); + struct vkms_plane_state **plane = crtc_state->active_planes; + struct vkms_frame_info *primary_plane_info = plane[0]->frame_info; + u32 n_active_planes = crtc_state->num_active_planes; + int y_src = primary_plane_info->dst.y1; + int h_dst = drm_rect_height(&primary_plane_info->dst); int y_limit = y_src + h_dst; - int x_limit = x_src + w_dst; - - for (i = y_src, i_dst = y_dst; i < y_limit; ++i) { - for (j = x_src, j_dst = x_dst; j < x_limit; ++j) { - offset_dst = dst_frame_info->offset - + (i_dst * dst_frame_info->pitch) - + (j_dst++ * dst_frame_info->cpp); - offset_src = src_frame_info->offset - + (i * src_frame_info->pitch) - + (j * src_frame_info->cpp); - - pixel_src = (u8 *)(vaddr_src + offset_src); - pixel_dst = (u8 *)(vaddr_dst + offset_dst); - pixel_blend(pixel_src, pixel_dst); - /* clearing alpha channel (0xff)*/ - pixel_dst[3] = 0xff; + int y, i; + + for (y = y_src; y < y_limit; y++) { + plane_fmt_func[0](primary_plane_info, y, output_buffer); + + /* If there are other planes besides primary, we consider the active + * planes should be in z-order and compose them associatively: + * ((primary <- overlay) <- cursor) + */ + for (i = 1; i < n_active_planes; i++) { + if (!check_y_limit(plane[i]->frame_info, y)) + continue; + + plane_fmt_func[i](plane[i]->frame_info, y, stage_buffer); + pre_mul_alpha_blend(plane[i]->frame_info, stage_buffer, + output_buffer); } - i_dst++; + + *crc32 = crc32_le(*crc32, (void *)output_buffer, row_size); + + if (wb_frame_info) + wb_fmt_func(wb_frame_info, y, output_buffer); } } -static void compose_plane(struct vkms_frame_info *primary_plane_info, - struct vkms_frame_info *plane_frame_info, - void *vaddr_out) +static format_transform_func * +get_format_transform_functions(struct vkms_crtc_state *crtc_state) { - struct drm_framebuffer *fb = plane_frame_info->fb; - void *vaddr; - void (*pixel_blend)(const u8 *p_src, u8 *p_dst); - - if (WARN_ON(dma_buf_map_is_null(&primary_plane_info->map[0]))) - return; + struct vkms_plane_state **active_planes = crtc_state->active_planes; + u32 n_active_planes = crtc_state->num_active_planes; + u32 funcs_size = sizeof(format_transform_func); + format_transform_func *funcs; + u32 s_fmt; + int i; - vaddr = plane_frame_info->map[0].vaddr; + funcs = kvmalloc(n_active_planes * funcs_size, GFP_KERNEL); + if (!funcs) + return NULL; - if (fb->format->format == DRM_FORMAT_ARGB8888) - pixel_blend = &alpha_blend; - else - pixel_blend = &x_blend; + for (i = 0; i < n_active_planes; i++) { + s_fmt = active_planes[i]->frame_info->fb->format->format; + funcs[i] = get_fmt_transform_function(s_fmt); + } - blend(vaddr_out, vaddr, primary_plane_info, - plane_frame_info, pixel_blend); + return funcs; } -static int compose_active_planes(void **vaddr_out, - struct vkms_frame_info *primary_plane_info, - struct vkms_crtc_state *crtc_state) +static bool check_planes_x_bounds(struct vkms_crtc_state *crtc_state, + struct vkms_frame_info *wb_frame_info) { - struct drm_framebuffer *fb = primary_plane_info->fb; - struct drm_gem_object *gem_obj = drm_gem_fb_get_obj(fb, 0); - const void *vaddr; + struct vkms_plane_state **planes = crtc_state->active_planes; + struct vkms_frame_info *primary_plane_info = planes[0]->frame_info; + int line_width = drm_rect_width(&primary_plane_info->dst); + u32 n_active_planes = crtc_state->num_active_planes; int i; - if (!*vaddr_out) { - *vaddr_out = kvzalloc(gem_obj->size, GFP_KERNEL); - if (!*vaddr_out) { - DRM_ERROR("Cannot allocate memory for output frame."); - return -ENOMEM; - } + for (i = 0; i < n_active_planes; i++) { + int x_dst = planes[i]->frame_info->dst.x1; + int x_src = planes[i]->frame_info->src.x1 >> 16; + int x2_src = planes[i]->frame_info->src.x2 >> 16; + int x_limit = drm_rect_width(&planes[i]->frame_info->dst); + + if (x_dst + x_limit > line_width) + return false; + if (x_src + x_limit > x2_src) + return false; + } + + return true; +} + +static int compose_active_planes(struct vkms_frame_info *wb_frame_info, + struct vkms_crtc_state *crtc_state, + u32 *crc32) +{ + int line_width, ret = 0, pixel_size = sizeof(struct line_buffer); + format_transform_func *plane_funcs, wb_func = NULL; + struct vkms_frame_info *primary_plane_info = NULL; + struct line_buffer *output_buffer, *stage_buffer; + struct vkms_plane_state *act_plane = NULL; + u32 wb_format; + + if (WARN_ON(pixel_size != 8)) + return -EINVAL; + + if (crtc_state->num_active_planes >= 1) { + act_plane = crtc_state->active_planes[0]; + if (act_plane->base.base.plane->type == DRM_PLANE_TYPE_PRIMARY) + primary_plane_info = act_plane->frame_info; } + if (!primary_plane_info) + return -EINVAL; + if (WARN_ON(dma_buf_map_is_null(&primary_plane_info->map[0]))) return -EINVAL; - vaddr = primary_plane_info->map[0].vaddr; + if (WARN_ON(!check_planes_x_bounds(crtc_state, wb_frame_info))) + return -EINVAL; + + line_width = drm_rect_width(&primary_plane_info->dst); - memcpy(*vaddr_out, vaddr, gem_obj->size); + stage_buffer = kvmalloc(line_width * pixel_size, GFP_KERNEL); + if (!stage_buffer) { + DRM_ERROR("Cannot allocate memory for the output line buffer"); + return -ENOMEM; + } - /* If there are other planes besides primary, we consider the active - * planes should be in z-order and compose them associatively: - * ((primary <- overlay) <- cursor) - */ - for (i = 1; i < crtc_state->num_active_planes; i++) - compose_plane(primary_plane_info, - crtc_state->active_planes[i]->frame_info, - *vaddr_out); + output_buffer = kvmalloc(line_width * pixel_size, GFP_KERNEL); + if (!output_buffer) { + DRM_ERROR("Cannot allocate memory for intermediate line buffer"); + ret = -ENOMEM; + goto free_output_buffer; + } - return 0; + plane_funcs = get_format_transform_functions(crtc_state); + if (!plane_funcs) { + ret = -ENOMEM; + goto free_stage_buffer; + } + + if (wb_frame_info) { + wb_format = wb_frame_info->fb->format->format; + wb_func = get_wb_fmt_transform_function(wb_format); + wb_frame_info->src = primary_plane_info->src; + wb_frame_info->dst = primary_plane_info->dst; + } + + blend(wb_frame_info, wb_func, crtc_state, plane_funcs, crc32, + stage_buffer, output_buffer, (s64)line_width * pixel_size); + + kvfree(plane_funcs); +free_output_buffer: + kvfree(output_buffer); +free_stage_buffer: + kvfree(stage_buffer); + + return ret; } /** @@ -222,13 +245,12 @@ void vkms_composer_worker(struct work_struct *work) struct vkms_crtc_state, composer_work); struct drm_crtc *crtc = crtc_state->base.crtc; + struct vkms_writeback_job *active_wb = crtc_state->active_writeback; + struct vkms_frame_info *wb_frame_info = &active_wb->frame_info; struct vkms_output *out = drm_crtc_to_vkms_output(crtc); - struct vkms_frame_info *primary_plane_info = NULL; - struct vkms_plane_state *act_plane = NULL; bool crc_pending, wb_pending; - void *vaddr_out = NULL; - u32 crc32 = 0; u64 frame_start, frame_end; + u32 crc32 = 0; int ret; spin_lock_irq(&out->composer_lock); @@ -248,35 +270,19 @@ void vkms_composer_worker(struct work_struct *work) if (!crc_pending) return; - if (crtc_state->num_active_planes >= 1) { - act_plane = crtc_state->active_planes[0]; - if (act_plane->base.base.plane->type == DRM_PLANE_TYPE_PRIMARY) - primary_plane_info = act_plane->frame_info; - } - - if (!primary_plane_info) - return; - if (wb_pending) - vaddr_out = crtc_state->active_writeback->data[0].vaddr; + ret = compose_active_planes(wb_frame_info, crtc_state, &crc32); + else + ret = compose_active_planes(NULL, crtc_state, &crc32); - ret = compose_active_planes(&vaddr_out, primary_plane_info, - crtc_state); - if (ret) { - if (ret == -EINVAL && !wb_pending) - kvfree(vaddr_out); + if (ret) return; - } - - crc32 = compute_crc(vaddr_out, primary_plane_info); if (wb_pending) { drm_writeback_signal_completion(&out->wb_connector, 0); spin_lock_irq(&out->composer_lock); crtc_state->wb_pending = false; spin_unlock_irq(&out->composer_lock); - } else { - kvfree(vaddr_out); } /* diff --git a/drivers/gpu/drm/vkms/vkms_formats.c b/drivers/gpu/drm/vkms/vkms_formats.c new file mode 100644 index 000000000000..0d1838d1b835 --- /dev/null +++ b/drivers/gpu/drm/vkms/vkms_formats.c @@ -0,0 +1,138 @@ +/* SPDX-License-Identifier: GPL-2.0+ */ + +#include +#include "vkms_formats.h" + +format_transform_func get_fmt_transform_function(u32 format) +{ + if (format == DRM_FORMAT_ARGB8888) + return &ARGB8888_to_ARGB16161616; + else + return &XRGB8888_to_ARGB16161616; +} + +format_transform_func get_wb_fmt_transform_function(u32 format) +{ + if (format == DRM_FORMAT_ARGB8888) + return &convert_to_ARGB8888; + else + return &convert_to_XRGB8888; +} + +static int pixel_offset(struct vkms_frame_info *frame_info, int x, int y) +{ + return frame_info->offset + (y * frame_info->pitch) + + (x * frame_info->cpp); +} + +/* + * packed_pixels_addr - Get the pointer to pixel of a given pair of coordinates + * + * @frame_info: Buffer metadata + * @x: The x(width) coordinate of the 2D buffer + * @y: The y(Heigth) coordinate of the 2D buffer + * + * Takes the information stored in the frame_info, a pair of coordinates, and + * returns the address of the first color channel. + * This function assumes the channels are packed together, i.e. a color channel + * comes immediately after another in the memory. And therefore, this function + * doesn't work for YUV with chroma subsampling (e.g. YUV420 and NV21). + */ +static void *packed_pixels_addr(struct vkms_frame_info *frame_info, int x, int y) +{ + int offset = pixel_offset(frame_info, x, y); + + return (u8 *)frame_info->map[0].vaddr + offset; +} + +static void *get_packed_src_addr(struct vkms_frame_info *frame_info, int y) +{ + int x_src = frame_info->src.x1 >> 16; + int y_src = y - frame_info->dst.y1 + (frame_info->src.y1 >> 16); + + return packed_pixels_addr(frame_info, x_src, y_src); +} + +void ARGB8888_to_ARGB16161616(struct vkms_frame_info *frame_info, int y, + struct line_buffer *stage_buffer) +{ + u8 *src_pixels = get_packed_src_addr(frame_info, y); + int x, x_limit = drm_rect_width(&frame_info->dst); + + for (x = 0; x < x_limit; x++, src_pixels += 4) { + /* + * Organizes the channels in their respective positions and converts + * the 8 bits channel to 16. + * The 257 is the "conversion ratio". This number is obtained by the + * (2^16 - 1) / (2^8 - 1) division. Which, in this case, tries to get + * the best color value in a pixel format with more possibilities. + * And a similar idea applies to others RGB color conversions. + */ + stage_buffer[x].a = (u16)src_pixels[3] * 257; + stage_buffer[x].r = (u16)src_pixels[2] * 257; + stage_buffer[x].g = (u16)src_pixels[1] * 257; + stage_buffer[x].b = (u16)src_pixels[0] * 257; + } +} + +void XRGB8888_to_ARGB16161616(struct vkms_frame_info *frame_info, int y, + struct line_buffer *stage_buffer) +{ + u8 *src_pixels = get_packed_src_addr(frame_info, y); + int x, x_limit = drm_rect_width(&frame_info->dst); + + for (x = 0; x < x_limit; x++, src_pixels += 4) { + stage_buffer[x].a = (u16)0xffff; + stage_buffer[x].r = (u16)src_pixels[2] * 257; + stage_buffer[x].g = (u16)src_pixels[1] * 257; + stage_buffer[x].b = (u16)src_pixels[0] * 257; + } +} + +/* + * The following functions take an line of ARGB16161616 pixels from the + * src_buffer, convert them to a specific format, and store them in the + * destination. + * + * They are used in the `compose_active_planes` to convert and store a line + * from the src_buffer to the writeback buffer. + */ +void convert_to_ARGB8888(struct vkms_frame_info *frame_info, + int y, struct line_buffer *src_buffer) +{ + int x, x_dst = frame_info->dst.x1; + u8 *dst_pixels = packed_pixels_addr(frame_info, x_dst, y); + int x_limit = drm_rect_width(&frame_info->dst); + + for (x = 0; x < x_limit; x++, dst_pixels += 4) { + /* + * This sequence below is important because the format's byte order is + * in little-endian. In the case of the ARGB8888 the memory is + * organized this way: + * + * | Addr | = blue channel + * | Addr + 1 | = green channel + * | Addr + 2 | = Red channel + * | Addr + 3 | = Alpha channel + */ + dst_pixels[3] = DIV_ROUND_UP(src_buffer[x].a, 257); + dst_pixels[2] = DIV_ROUND_UP(src_buffer[x].r, 257); + dst_pixels[1] = DIV_ROUND_UP(src_buffer[x].g, 257); + dst_pixels[0] = DIV_ROUND_UP(src_buffer[x].b, 257); + } +} + +void convert_to_XRGB8888(struct vkms_frame_info *frame_info, + int y, struct line_buffer *src_buffer) +{ + int x, x_dst = frame_info->dst.x1; + u8 *dst_pixels = packed_pixels_addr(frame_info, x_dst, y); + int x_limit = drm_rect_width(&frame_info->dst); + + for (x = 0; x < x_limit; x++, dst_pixels += 4) { + dst_pixels[3] = (u8)0xff; + dst_pixels[2] = DIV_ROUND_UP(src_buffer[x].r, 257); + dst_pixels[1] = DIV_ROUND_UP(src_buffer[x].g, 257); + dst_pixels[0] = DIV_ROUND_UP(src_buffer[x].b, 257); + } +} diff --git a/drivers/gpu/drm/vkms/vkms_formats.h b/drivers/gpu/drm/vkms/vkms_formats.h new file mode 100644 index 000000000000..817e8b2124ae --- /dev/null +++ b/drivers/gpu/drm/vkms/vkms_formats.h @@ -0,0 +1,31 @@ +/* SPDX-License-Identifier: GPL-2.0+ */ + +#ifndef _VKMS_FORMATS_H_ +#define _VKMS_FORMATS_H_ + +#include "vkms_drv.h" + +struct line_buffer { + u16 a, r, g, b; +}; + +void ARGB8888_to_ARGB16161616(struct vkms_frame_info *frame_info, int y, + struct line_buffer *stage_buffer); + +void XRGB8888_to_ARGB16161616(struct vkms_frame_info *frame_info, int y, + struct line_buffer *stage_buffer); + +void convert_to_ARGB8888(struct vkms_frame_info *frame_info, int y, + struct line_buffer *src_buffer); + +void convert_to_XRGB8888(struct vkms_frame_info *frame_info, int y, + struct line_buffer *src_buffer); + +typedef void (*format_transform_func)(struct vkms_frame_info *frame_info, int y, + struct line_buffer *buffer); + +format_transform_func get_fmt_transform_function(u32 format); + +format_transform_func get_wb_fmt_transform_function(u32 format); + +#endif /* _VKMS_FORMATS_H_ */ From patchwork Mon Nov 22 19:43:59 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Igor Matheus Andrade Torrente X-Patchwork-Id: 12632743 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id C831EC433F5 for ; Mon, 22 Nov 2021 19:44:44 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 973D689D64; Mon, 22 Nov 2021 19:44:43 +0000 (UTC) Received: from mail-ua1-x933.google.com (mail-ua1-x933.google.com [IPv6:2607:f8b0:4864:20::933]) by gabe.freedesktop.org (Postfix) with ESMTPS id A1C1D89D58 for ; Mon, 22 Nov 2021 19:44:37 +0000 (UTC) Received: by mail-ua1-x933.google.com with SMTP id ay21so38850020uab.12 for ; Mon, 22 Nov 2021 11:44:37 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=w6oRMdQdTTLRMg12EM+5r4h4w3Qz4g9vnYiSKn8PWiM=; b=b3VCpm8zc92emK6yRT5Ne0Y6bOHU0HJp32kXTjXu3/C1CuCpcLE9W7TZ6RuzN1Q0/V WeJmt/ugB4iQIV9vMW/fJgvTMNqrNsp13d1BJsHJilE3mScAFQllzyEiLY0xNvJrWUzx qVdx/jVu5dd2zVChVJ9gvWIl8nnFOdIHt3Ap+MJLxfReLCbYYrbZb7mywMI8NKWTElce vcbbDGwIOq6lFPa/eoqsIvAg5SlYRIXXWnSiwRgQq+e0ANCETE9CGEGf94Jh6F5ID6pj g1p2wkQ53R9LlSeZ/7ka83jdagjtYEwtPT/pT9QZOX/h3f4G+cb0ItzFwnnupjYVLesb PyEQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=w6oRMdQdTTLRMg12EM+5r4h4w3Qz4g9vnYiSKn8PWiM=; b=AdD4mp9M3b9e8KGNd0CRuCDIYrOEEvBF5NR/2ZoIh03etBmqIU5OvUegswopVIz7Kt if4ZJYR0IkQAe22ivo61jg+xG5AlyjIWcuap/TMgm2KDrV23AO3xVtbWQCoI8lr43t25 3pKEuMirYlT3YGCmRbUyEI9F97CfVejbSddxwwWsjYc8v4Pme7H4TxWYa3Lb9cG6GbQA jnkAdRl37U3/Nj4helPHM4f3DUDIOM1wLAAXzpaj0d1scno5Ey/7wJnhegYo2csW8iFv y9tdI4XyNyBoKVMaIPbOtSx/VLdkoTIZHvaTqkD74S61oxcL4iBy7XAOIvX3eTKaPFC2 wvxg== X-Gm-Message-State: AOAM532aXnOMIyroEEZk2zDYeTcbPU9l9hQheskAphSshAH/i/l2ASi7 9k1IcKxqjFDbDk7P6F/dM/Y= X-Google-Smtp-Source: ABdhPJx/8i0EMm1TcWmHxFh1CGyixTxK/Rw+u5xClTy9cQZC93RlnXXREb9dYi2UAKCaQQz+6sGjGg== X-Received: by 2002:a67:bc16:: with SMTP id t22mr123652151vsn.10.1637610276838; Mon, 22 Nov 2021 11:44:36 -0800 (PST) Received: from localhost.localdomain ([2804:431:c7f4:3a5b:14e9:b724:f63b:b22b]) by smtp.googlemail.com with ESMTPSA id i27sm5269373uab.8.2021.11.22.11.44.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 22 Nov 2021 11:44:36 -0800 (PST) From: Igor Torrente To: rodrigosiqueiramelo@gmail.com, melissa.srw@gmail.com, ppaalanen@gmail.com, tzimmermann@suse.de Subject: [PATCH v3 8/9] drm: vkms: Adds XRGB_16161616 and ARGB_1616161616 formats Date: Mon, 22 Nov 2021 16:43:59 -0300 Message-Id: <20211122194400.30836-9-igormtorrente@gmail.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20211122194400.30836-1-igormtorrente@gmail.com> References: <20211122194400.30836-1-igormtorrente@gmail.com> MIME-Version: 1.0 X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: hamohammed.sa@gmail.com, airlied@linux.ie, leandro.ribeiro@collabora.com, dri-devel@lists.freedesktop.org, ~lkcamp/patches@lists.sr.ht, Igor Torrente Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" This will be useful to write tests that depends on these formats. ARGB and XRGB follows the a similar implementation of the former formats. Just adjusting for 16 bits per channel. Signed-off-by: Igor Torrente --- V3: Adapt the handlers to the new format introduced in patch 7 V3. --- drivers/gpu/drm/vkms/vkms_formats.c | 67 +++++++++++++++++++++++++++ drivers/gpu/drm/vkms/vkms_formats.h | 12 +++++ drivers/gpu/drm/vkms/vkms_plane.c | 5 +- drivers/gpu/drm/vkms/vkms_writeback.c | 2 + 4 files changed, 85 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/vkms/vkms_formats.c b/drivers/gpu/drm/vkms/vkms_formats.c index 0d1838d1b835..661da39d1276 100644 --- a/drivers/gpu/drm/vkms/vkms_formats.c +++ b/drivers/gpu/drm/vkms/vkms_formats.c @@ -7,6 +7,10 @@ format_transform_func get_fmt_transform_function(u32 format) { if (format == DRM_FORMAT_ARGB8888) return &ARGB8888_to_ARGB16161616; + else if (format == DRM_FORMAT_ARGB16161616) + return &get_ARGB16161616; + else if (format == DRM_FORMAT_XRGB16161616) + return &XRGB16161616_to_ARGB16161616; else return &XRGB8888_to_ARGB16161616; } @@ -15,6 +19,10 @@ format_transform_func get_wb_fmt_transform_function(u32 format) { if (format == DRM_FORMAT_ARGB8888) return &convert_to_ARGB8888; + else if (format == DRM_FORMAT_ARGB16161616) + return &convert_to_ARGB16161616; + else if (format == DRM_FORMAT_XRGB16161616) + return &convert_to_XRGB16161616; else return &convert_to_XRGB8888; } @@ -89,6 +97,35 @@ void XRGB8888_to_ARGB16161616(struct vkms_frame_info *frame_info, int y, } } +void get_ARGB16161616(struct vkms_frame_info *frame_info, int y, + struct line_buffer *stage_buffer) +{ + u16 *src_pixels = get_packed_src_addr(frame_info, y); + int x, x_limit = drm_rect_width(&frame_info->dst); + + for (x = 0; x < x_limit; x++, src_pixels += 4) { + stage_buffer[x].a = src_pixels[3]; + stage_buffer[x].r = src_pixels[2]; + stage_buffer[x].g = src_pixels[1]; + stage_buffer[x].b = src_pixels[0]; + } +} + +void XRGB16161616_to_ARGB16161616(struct vkms_frame_info *frame_info, int y, + struct line_buffer *stage_buffer) +{ + u16 *src_pixels = get_packed_src_addr(frame_info, y); + int x, x_limit = drm_rect_width(&frame_info->dst); + + for (x = 0; x < x_limit; x++, src_pixels += 4) { + stage_buffer[x].a = (u16)0xffff; + stage_buffer[x].r = src_pixels[2]; + stage_buffer[x].g = src_pixels[1]; + stage_buffer[x].b = src_pixels[0]; + } +} + + /* * The following functions take an line of ARGB16161616 pixels from the * src_buffer, convert them to a specific format, and store them in the @@ -136,3 +173,33 @@ void convert_to_XRGB8888(struct vkms_frame_info *frame_info, dst_pixels[0] = DIV_ROUND_UP(src_buffer[x].b, 257); } } + +void convert_to_ARGB16161616(struct vkms_frame_info *frame_info, int y, + struct line_buffer *src_buffer) +{ + int x, x_dst = frame_info->dst.x1; + u16 *dst_pixels = packed_pixels_addr(frame_info, x_dst, y); + int x_limit = drm_rect_width(&frame_info->dst); + + for (x = 0; x < x_limit; x++, dst_pixels += 4) { + dst_pixels[3] = src_buffer[x].a; + dst_pixels[2] = src_buffer[x].r; + dst_pixels[1] = src_buffer[x].g; + dst_pixels[0] = src_buffer[x].b; + } +} + +void convert_to_XRGB16161616(struct vkms_frame_info *frame_info, int y, + struct line_buffer *src_buffer) +{ + int x, x_dst = frame_info->dst.x1; + u16 *dst_pixels = packed_pixels_addr(frame_info, x_dst, y); + int x_limit = drm_rect_width(&frame_info->dst); + + for (x = 0; x < x_limit; x++, dst_pixels += 4) { + dst_pixels[3] = src_buffer[x].a; + dst_pixels[2] = src_buffer[x].r; + dst_pixels[1] = src_buffer[x].g; + dst_pixels[0] = src_buffer[x].b; + } +} diff --git a/drivers/gpu/drm/vkms/vkms_formats.h b/drivers/gpu/drm/vkms/vkms_formats.h index 817e8b2124ae..22358f3a33ab 100644 --- a/drivers/gpu/drm/vkms/vkms_formats.h +++ b/drivers/gpu/drm/vkms/vkms_formats.h @@ -15,12 +15,24 @@ void ARGB8888_to_ARGB16161616(struct vkms_frame_info *frame_info, int y, void XRGB8888_to_ARGB16161616(struct vkms_frame_info *frame_info, int y, struct line_buffer *stage_buffer); +void get_ARGB16161616(struct vkms_frame_info *frame_info, int y, + struct line_buffer *stage_buffer); + +void XRGB16161616_to_ARGB16161616(struct vkms_frame_info *frame_info, int y, + struct line_buffer *stage_buffer); + void convert_to_ARGB8888(struct vkms_frame_info *frame_info, int y, struct line_buffer *src_buffer); void convert_to_XRGB8888(struct vkms_frame_info *frame_info, int y, struct line_buffer *src_buffer); +void convert_to_ARGB16161616(struct vkms_frame_info *frame_info, int y, + struct line_buffer *src_buffer); + +void convert_to_XRGB16161616(struct vkms_frame_info *frame_info, int y, + struct line_buffer *src_buffer); + typedef void (*format_transform_func)(struct vkms_frame_info *frame_info, int y, struct line_buffer *buffer); diff --git a/drivers/gpu/drm/vkms/vkms_plane.c b/drivers/gpu/drm/vkms/vkms_plane.c index 28752af0118c..1d70c9e8f109 100644 --- a/drivers/gpu/drm/vkms/vkms_plane.c +++ b/drivers/gpu/drm/vkms/vkms_plane.c @@ -13,11 +13,14 @@ static const u32 vkms_formats[] = { DRM_FORMAT_XRGB8888, + DRM_FORMAT_XRGB16161616 }; static const u32 vkms_plane_formats[] = { DRM_FORMAT_ARGB8888, - DRM_FORMAT_XRGB8888 + DRM_FORMAT_XRGB8888, + DRM_FORMAT_XRGB16161616, + DRM_FORMAT_ARGB16161616 }; static struct drm_plane_state * diff --git a/drivers/gpu/drm/vkms/vkms_writeback.c b/drivers/gpu/drm/vkms/vkms_writeback.c index ad4bb1fb37ca..393d3fc7966f 100644 --- a/drivers/gpu/drm/vkms/vkms_writeback.c +++ b/drivers/gpu/drm/vkms/vkms_writeback.c @@ -14,6 +14,8 @@ static const u32 vkms_wb_formats[] = { DRM_FORMAT_XRGB8888, + DRM_FORMAT_XRGB16161616, + DRM_FORMAT_ARGB16161616 }; static const struct drm_connector_funcs vkms_wb_connector_funcs = { From patchwork Mon Nov 22 19:44:00 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Igor Matheus Andrade Torrente X-Patchwork-Id: 12632745 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 1B02BC433F5 for ; Mon, 22 Nov 2021 19:44:47 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 66E9789D83; Mon, 22 Nov 2021 19:44:44 +0000 (UTC) Received: from mail-ua1-x92e.google.com (mail-ua1-x92e.google.com [IPv6:2607:f8b0:4864:20::92e]) by gabe.freedesktop.org (Postfix) with ESMTPS id 42A6889D64 for ; Mon, 22 Nov 2021 19:44:40 +0000 (UTC) Received: by mail-ua1-x92e.google.com with SMTP id az37so38864299uab.13 for ; Mon, 22 Nov 2021 11:44:40 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=KrJK7VFm/uKvpjlyM0dM7TFPOBp3BJCfN+cH4kbu3+A=; b=I62NJYU+IEgoYkUEisjrNpVzHjo9Bn91V43Tww3jCtXVu3bR6n5wP6GwLaCUrde1Bs 73kw7E0jmNjIEgqWeC7RraPEv5EAFCmdjRVyM99RC+S2z0SgaN3AQ93BwKymV55Ilu7B rY7YM6/k6nLzWZiOP0ZnWILXvActV71ZiMEKPjRmMoL0scbmi6fv/kMsmcFYz+YL0NOI nBw8yMBBJlsQDKc24xXv6sH8n0hvLBVpcMTq+ln/XvfLBtUixjA/B4D+QCPgzQgglRvW R2SZ0/n1oxljBsMcjTP+L3NILt3IrxjBZzlayQyhtARVSvuLWRkorGjyuWHMWXjHt/gP 1YJA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=KrJK7VFm/uKvpjlyM0dM7TFPOBp3BJCfN+cH4kbu3+A=; b=eaby0DXbSibmv1HwXbiGkIFjwixAezhfU9lOB35SGakBE+JrLDK5sHYPlNKb/H5grC btPuSszXVlotuzD1KGw4R8gCAf3hmy6xzLS8texuvPmqmq5Nj6OBa3gVfQkbLxGw+0RE 90uxq5tAxKHvU3Aclwn5Irg8APzohDnF/s1sT6gdmmhHIFy9G3oee+bdWwTMGJD8gXXk Puoul7Ik8OYvC2csz9tvVe7bXaVDDLNFoT7e/DdrQxNNkxQ70zTljdJlM6MLstA0ZQlF EtB5x3NpKWTXd/trD6VliA+2wiPoQkt85xdA0PV7PK9smb2luB+OCR1AacG/78Sq/TLp RInQ== X-Gm-Message-State: AOAM5324HnD9KusR3XiDvlawUmUEzdfu6uGGVs+HPmJndb5HhEyaK7ZV OWV0QM2SPEdJNBNeofgZis4hVA3HabU= X-Google-Smtp-Source: ABdhPJxXLbHZ3jxVd7ndjy8EPyjq4MwAsCR6KnmwIiaVMHvxbBzt2q+FjggARM92eBtEgOQ0cx9deA== X-Received: by 2002:ab0:3ca0:: with SMTP id a32mr90316381uax.63.1637610279391; Mon, 22 Nov 2021 11:44:39 -0800 (PST) Received: from localhost.localdomain ([2804:431:c7f4:3a5b:14e9:b724:f63b:b22b]) by smtp.googlemail.com with ESMTPSA id i27sm5269373uab.8.2021.11.22.11.44.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 22 Nov 2021 11:44:39 -0800 (PST) From: Igor Torrente To: rodrigosiqueiramelo@gmail.com, melissa.srw@gmail.com, ppaalanen@gmail.com, tzimmermann@suse.de Subject: [PATCH v3 9/9] drm: vkms: Add support to the RGB565 format Date: Mon, 22 Nov 2021 16:44:00 -0300 Message-Id: <20211122194400.30836-10-igormtorrente@gmail.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20211122194400.30836-1-igormtorrente@gmail.com> References: <20211122194400.30836-1-igormtorrente@gmail.com> MIME-Version: 1.0 X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: hamohammed.sa@gmail.com, airlied@linux.ie, leandro.ribeiro@collabora.com, dri-devel@lists.freedesktop.org, ~lkcamp/patches@lists.sr.ht, Igor Torrente Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" Adds this common format to vkms. This commit also adds new helper macros to deal with fixed-point arithmetic. It was done to improve the precision of the conversion to ARGB16161616 since the "conversion ratio" is not an integer. Signed-off-by: Igor Torrente --- V3: Adapt the handlers to the new format introduced in patch 7 V3. --- drivers/gpu/drm/vkms/vkms_formats.c | 74 +++++++++++++++++++++++++++ drivers/gpu/drm/vkms/vkms_formats.h | 6 +++ drivers/gpu/drm/vkms/vkms_plane.c | 6 ++- drivers/gpu/drm/vkms/vkms_writeback.c | 3 +- 4 files changed, 86 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/drm/vkms/vkms_formats.c b/drivers/gpu/drm/vkms/vkms_formats.c index 661da39d1276..dc612882dd8c 100644 --- a/drivers/gpu/drm/vkms/vkms_formats.c +++ b/drivers/gpu/drm/vkms/vkms_formats.c @@ -11,6 +11,8 @@ format_transform_func get_fmt_transform_function(u32 format) return &get_ARGB16161616; else if (format == DRM_FORMAT_XRGB16161616) return &XRGB16161616_to_ARGB16161616; + else if (format == DRM_FORMAT_RGB565) + return &RGB565_to_ARGB16161616; else return &XRGB8888_to_ARGB16161616; } @@ -23,6 +25,8 @@ format_transform_func get_wb_fmt_transform_function(u32 format) return &convert_to_ARGB16161616; else if (format == DRM_FORMAT_XRGB16161616) return &convert_to_XRGB16161616; + else if (format == DRM_FORMAT_RGB565) + return &convert_to_RGB565; else return &convert_to_XRGB8888; } @@ -33,6 +37,26 @@ static int pixel_offset(struct vkms_frame_info *frame_info, int x, int y) + (x * frame_info->cpp); } +/* + * FP stands for _Fixed Point_ and **not** _Float Point_ + * LF stands for Long Float (i.e. double) + * The following macros help doing fixed point arithmetic. + */ +/* + * With FP scale 15 we have 17 and 15 bits of integer and fractional parts + * respectively. + * | 0000 0000 0000 0000 0.000 0000 0000 0000 | + * 31 0 + */ +#define FP_SCALE 15 + +#define LF_TO_FP(a) ((a) * (u64)(1 << FP_SCALE)) +#define INT_TO_FP(a) ((a) << FP_SCALE) +#define FP_MUL(a, b) ((s32)(((s64)(a) * (b)) >> FP_SCALE)) +#define FP_DIV(a, b) ((s32)(((s64)(a) << FP_SCALE) / (b))) +/* This macro converts a fixed point number to int, and round half up it */ +#define FP_TO_INT_ROUND_UP(a) (((a) + (1 << (FP_SCALE - 1))) >> FP_SCALE) + /* * packed_pixels_addr - Get the pointer to pixel of a given pair of coordinates * @@ -125,6 +149,33 @@ void XRGB16161616_to_ARGB16161616(struct vkms_frame_info *frame_info, int y, } } +void RGB565_to_ARGB16161616(struct vkms_frame_info *frame_info, int y, + struct line_buffer *stage_buffer) +{ + u16 *src_pixels = get_packed_src_addr(frame_info, y); + int x, x_limit = drm_rect_width(&frame_info->dst); + + for (x = 0; x < x_limit; x++, src_pixels++) { + u16 rgb_565 = le16_to_cpu(*src_pixels); + int fp_r = INT_TO_FP((rgb_565 >> 11) & 0x1f); + int fp_g = INT_TO_FP((rgb_565 >> 5) & 0x3f); + int fp_b = INT_TO_FP(rgb_565 & 0x1f); + + /* + * The magic constants is the "conversion ratio" and is calculated + * dividing 65535(2^16 - 1) by 31(2^5 -1) and 63(2^6 - 1) + * respectively. + */ + int fp_rb_ratio = LF_TO_FP(2114.032258065); + int fp_g_ratio = LF_TO_FP(1040.238095238); + + stage_buffer[x].a = (u16)0xffff; + stage_buffer[x].r = FP_TO_INT_ROUND_UP(FP_MUL(fp_r, fp_rb_ratio)); + stage_buffer[x].g = FP_TO_INT_ROUND_UP(FP_MUL(fp_g, fp_g_ratio)); + stage_buffer[x].b = FP_TO_INT_ROUND_UP(FP_MUL(fp_b, fp_rb_ratio)); + } +} + /* * The following functions take an line of ARGB16161616 pixels from the @@ -203,3 +254,26 @@ void convert_to_XRGB16161616(struct vkms_frame_info *frame_info, int y, dst_pixels[0] = src_buffer[x].b; } } + +void convert_to_RGB565(struct vkms_frame_info *frame_info, int y, + struct line_buffer *src_buffer) +{ + int x, x_dst = frame_info->dst.x1; + u16 *dst_pixels = packed_pixels_addr(frame_info, x_dst, y); + int x_limit = drm_rect_width(&frame_info->dst); + + for (x = 0; x < x_limit; x++, dst_pixels++) { + int fp_r = INT_TO_FP(src_buffer[x].r); + int fp_g = INT_TO_FP(src_buffer[x].g); + int fp_b = INT_TO_FP(src_buffer[x].b); + + int fp_rb_ratio = LF_TO_FP(2114.032258065); + int fp_g_ratio = LF_TO_FP(1040.238095238); + + u16 r = FP_TO_INT_ROUND_UP(FP_DIV(fp_r, fp_rb_ratio)); + u16 g = FP_TO_INT_ROUND_UP(FP_DIV(fp_g, fp_g_ratio)); + u16 b = FP_TO_INT_ROUND_UP(FP_DIV(fp_b, fp_rb_ratio)); + + *dst_pixels = cpu_to_le16(r << 11 | g << 5 | b); + } +} diff --git a/drivers/gpu/drm/vkms/vkms_formats.h b/drivers/gpu/drm/vkms/vkms_formats.h index 22358f3a33ab..836d6e43ea90 100644 --- a/drivers/gpu/drm/vkms/vkms_formats.h +++ b/drivers/gpu/drm/vkms/vkms_formats.h @@ -21,6 +21,9 @@ void get_ARGB16161616(struct vkms_frame_info *frame_info, int y, void XRGB16161616_to_ARGB16161616(struct vkms_frame_info *frame_info, int y, struct line_buffer *stage_buffer); +void RGB565_to_ARGB16161616(struct vkms_frame_info *frame_info, int y, + struct line_buffer *stage_buffer); + void convert_to_ARGB8888(struct vkms_frame_info *frame_info, int y, struct line_buffer *src_buffer); @@ -33,6 +36,9 @@ void convert_to_ARGB16161616(struct vkms_frame_info *frame_info, int y, void convert_to_XRGB16161616(struct vkms_frame_info *frame_info, int y, struct line_buffer *src_buffer); +void convert_to_RGB565(struct vkms_frame_info *frame_info, int y, + struct line_buffer *src_buffer); + typedef void (*format_transform_func)(struct vkms_frame_info *frame_info, int y, struct line_buffer *buffer); diff --git a/drivers/gpu/drm/vkms/vkms_plane.c b/drivers/gpu/drm/vkms/vkms_plane.c index 1d70c9e8f109..4643eefcdf29 100644 --- a/drivers/gpu/drm/vkms/vkms_plane.c +++ b/drivers/gpu/drm/vkms/vkms_plane.c @@ -13,14 +13,16 @@ static const u32 vkms_formats[] = { DRM_FORMAT_XRGB8888, - DRM_FORMAT_XRGB16161616 + DRM_FORMAT_XRGB16161616, + DRM_FORMAT_RGB565 }; static const u32 vkms_plane_formats[] = { DRM_FORMAT_ARGB8888, DRM_FORMAT_XRGB8888, DRM_FORMAT_XRGB16161616, - DRM_FORMAT_ARGB16161616 + DRM_FORMAT_ARGB16161616, + DRM_FORMAT_RGB565 }; static struct drm_plane_state * diff --git a/drivers/gpu/drm/vkms/vkms_writeback.c b/drivers/gpu/drm/vkms/vkms_writeback.c index 393d3fc7966f..1aaa630090d3 100644 --- a/drivers/gpu/drm/vkms/vkms_writeback.c +++ b/drivers/gpu/drm/vkms/vkms_writeback.c @@ -15,7 +15,8 @@ static const u32 vkms_wb_formats[] = { DRM_FORMAT_XRGB8888, DRM_FORMAT_XRGB16161616, - DRM_FORMAT_ARGB16161616 + DRM_FORMAT_ARGB16161616, + DRM_FORMAT_RGB565 }; static const struct drm_connector_funcs vkms_wb_connector_funcs = {