From: Pekka Paalanen <ppaalanen@gmail.com>
To: Melissa Wen <melissa.srw@gmail.com>
Cc: David Airlie <airlied@linux.ie>,
Haneen Mohammed <hamohammed.sa@gmail.com>,
Sumera Priyadarsini <sylphrenadin@gmail.com>,
Rodrigo Siqueira <rodrigosiqueiramelo@gmail.com>,
dri-devel@lists.freedesktop.org
Subject: Re: [PATCH v4 4/4] drm/vkms: add overlay support
Date: Mon, 26 Apr 2021 11:07:04 +0300 [thread overview]
Message-ID: <20210426110704.7cde8c1a@eldfell> (raw)
In-Reply-To: <8261bf93d8a0e3ffaf81d8e7c9b3e9c229116be3.1619250933.git.melissa.srw@gmail.com>
[-- Attachment #1.1: Type: text/plain, Size: 7994 bytes --]
On Sat, 24 Apr 2021 05:26:10 -0300
Melissa Wen <melissa.srw@gmail.com> wrote:
> Add support to overlay plane, in addition to primary and cursor
> planes. In this approach, the plane composition still requires an
> active primary plane and planes are composed associatively in the
> order: (primary <- overlay) <- cursor
>
> It enables to run the following IGT tests successfully:
> - kms_plane_cursor:
> - pipe-A-[overlay, primary, viewport]-size-[64, 128, 256]
> - kms_atomic:
> - plane-overlay-legacy
> and preserves the successful execution of kms_cursor_crc,
> kms_writeback and kms_flip
>
> Signed-off-by: Melissa Wen <melissa.srw@gmail.com>
> Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Hi,
just curious, when you need to compute a CRC without having a writeback
connector output, where do you write the blended result in order to
compute CRC?
Thanks,
pq
> ---
> drivers/gpu/drm/vkms/vkms_composer.c | 27 +++++++++++++++++----------
> drivers/gpu/drm/vkms/vkms_drv.c | 5 +++++
> drivers/gpu/drm/vkms/vkms_drv.h | 1 +
> drivers/gpu/drm/vkms/vkms_output.c | 11 ++++++++++-
> drivers/gpu/drm/vkms/vkms_plane.c | 15 ++++++++++++---
> 5 files changed, 45 insertions(+), 14 deletions(-)
>
> diff --git a/drivers/gpu/drm/vkms/vkms_composer.c b/drivers/gpu/drm/vkms/vkms_composer.c
> index 7e01bc39d2a1..1b510f3dbcbf 100644
> --- a/drivers/gpu/drm/vkms/vkms_composer.c
> +++ b/drivers/gpu/drm/vkms/vkms_composer.c
> @@ -176,11 +176,12 @@ static void compose_plane(struct vkms_composer *primary_composer,
>
> static int compose_active_planes(void **vaddr_out,
> struct vkms_composer *primary_composer,
> - struct vkms_composer *cursor_composer)
> + struct vkms_crtc_state *crtc_state)
> {
> struct drm_framebuffer *fb = &primary_composer->fb;
> struct drm_gem_object *gem_obj = drm_gem_fb_get_obj(fb, 0);
> struct drm_gem_shmem_object *shmem_obj = to_drm_gem_shmem_obj(gem_obj);
> + int i;
>
> if (!*vaddr_out) {
> *vaddr_out = kzalloc(shmem_obj->base.size, GFP_KERNEL);
> @@ -195,8 +196,14 @@ static int compose_active_planes(void **vaddr_out,
>
> memcpy(*vaddr_out, shmem_obj->vaddr, shmem_obj->base.size);
>
> - if (cursor_composer)
> - compose_plane(primary_composer, cursor_composer, *vaddr_out);
> + /* 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_composer,
> + crtc_state->active_planes[i]->composer,
> + *vaddr_out);
>
> return 0;
> }
> @@ -218,7 +225,7 @@ void vkms_composer_worker(struct work_struct *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_composer *cursor_composer = NULL;
> + struct vkms_plane_state *act_plane = NULL;
> bool crc_pending, wb_pending;
> void *vaddr_out = NULL;
> u32 crc32 = 0;
> @@ -242,11 +249,11 @@ void vkms_composer_worker(struct work_struct *work)
> if (!crc_pending)
> return;
>
> - if (crtc_state->num_active_planes >= 1)
> - primary_composer = crtc_state->active_planes[0]->composer;
> -
> - if (crtc_state->num_active_planes == 2)
> - cursor_composer = crtc_state->active_planes[1]->composer;
> + if (crtc_state->num_active_planes >= 1) {
> + act_plane = crtc_state->active_planes[0];
> + if (act_plane->base.plane->type == DRM_PLANE_TYPE_PRIMARY)
> + primary_composer = act_plane->composer;
> + }
>
> if (!primary_composer)
> return;
> @@ -255,7 +262,7 @@ void vkms_composer_worker(struct work_struct *work)
> vaddr_out = crtc_state->active_writeback;
>
> ret = compose_active_planes(&vaddr_out, primary_composer,
> - cursor_composer);
> + crtc_state);
> if (ret) {
> if (ret == -EINVAL && !wb_pending)
> kfree(vaddr_out);
> diff --git a/drivers/gpu/drm/vkms/vkms_drv.c b/drivers/gpu/drm/vkms/vkms_drv.c
> index 2173b82606f6..027ffe759440 100644
> --- a/drivers/gpu/drm/vkms/vkms_drv.c
> +++ b/drivers/gpu/drm/vkms/vkms_drv.c
> @@ -44,6 +44,10 @@ static bool enable_writeback = true;
> module_param_named(enable_writeback, enable_writeback, bool, 0444);
> MODULE_PARM_DESC(enable_writeback, "Enable/Disable writeback connector support");
>
> +static bool enable_overlay;
> +module_param_named(enable_overlay, enable_overlay, bool, 0444);
> +MODULE_PARM_DESC(enable_overlay, "Enable/Disable overlay support");
> +
> DEFINE_DRM_GEM_FOPS(vkms_driver_fops);
>
> static void vkms_release(struct drm_device *dev)
> @@ -198,6 +202,7 @@ static int __init vkms_init(void)
>
> config->cursor = enable_cursor;
> config->writeback = enable_writeback;
> + config->overlay = enable_overlay;
>
> return vkms_create(config);
> }
> diff --git a/drivers/gpu/drm/vkms/vkms_drv.h b/drivers/gpu/drm/vkms/vkms_drv.h
> index 70fb79621617..ac8c9c2fa4ed 100644
> --- a/drivers/gpu/drm/vkms/vkms_drv.h
> +++ b/drivers/gpu/drm/vkms/vkms_drv.h
> @@ -89,6 +89,7 @@ struct vkms_device;
> struct vkms_config {
> bool writeback;
> bool cursor;
> + bool overlay;
> /* only set when instantiated */
> struct vkms_device *dev;
> };
> diff --git a/drivers/gpu/drm/vkms/vkms_output.c b/drivers/gpu/drm/vkms/vkms_output.c
> index 6979fbc7f821..04406bd3ff02 100644
> --- a/drivers/gpu/drm/vkms/vkms_output.c
> +++ b/drivers/gpu/drm/vkms/vkms_output.c
> @@ -39,7 +39,7 @@ int vkms_output_init(struct vkms_device *vkmsdev, int index)
> struct drm_connector *connector = &output->connector;
> struct drm_encoder *encoder = &output->encoder;
> struct drm_crtc *crtc = &output->crtc;
> - struct vkms_plane *primary, *cursor = NULL;
> + struct vkms_plane *primary, *cursor = NULL, *overlay = NULL;
> int ret;
> int writeback;
>
> @@ -47,6 +47,15 @@ int vkms_output_init(struct vkms_device *vkmsdev, int index)
> if (IS_ERR(primary))
> return PTR_ERR(primary);
>
> + if (vkmsdev->config->overlay) {
> + overlay = vkms_plane_init(vkmsdev, DRM_PLANE_TYPE_OVERLAY, index);
> + if (IS_ERR(overlay))
> + return PTR_ERR(overlay);
> +
> + if (!overlay->base.possible_crtcs)
> + overlay->base.possible_crtcs = drm_crtc_mask(crtc);
> + }
> +
> if (vkmsdev->config->cursor) {
> cursor = vkms_plane_init(vkmsdev, DRM_PLANE_TYPE_CURSOR, index);
> if (IS_ERR(cursor))
> diff --git a/drivers/gpu/drm/vkms/vkms_plane.c b/drivers/gpu/drm/vkms/vkms_plane.c
> index da4251aff67f..107521ace597 100644
> --- a/drivers/gpu/drm/vkms/vkms_plane.c
> +++ b/drivers/gpu/drm/vkms/vkms_plane.c
> @@ -133,7 +133,7 @@ static int vkms_plane_atomic_check(struct drm_plane *plane,
> if (IS_ERR(crtc_state))
> return PTR_ERR(crtc_state);
>
> - if (plane->type == DRM_PLANE_TYPE_CURSOR)
> + if (plane->type != DRM_PLANE_TYPE_PRIMARY)
> can_position = true;
>
> ret = drm_atomic_helper_check_plane_state(new_plane_state, crtc_state,
> @@ -200,14 +200,23 @@ struct vkms_plane *vkms_plane_init(struct vkms_device *vkmsdev,
> const u32 *formats;
> int nformats;
>
> - if (type == DRM_PLANE_TYPE_CURSOR) {
> + switch (type) {
> + case DRM_PLANE_TYPE_PRIMARY:
> + formats = vkms_formats;
> + nformats = ARRAY_SIZE(vkms_formats);
> + funcs = &vkms_primary_helper_funcs;
> + break;
> + case DRM_PLANE_TYPE_CURSOR:
> + case DRM_PLANE_TYPE_OVERLAY:
> formats = vkms_plane_formats;
> nformats = ARRAY_SIZE(vkms_plane_formats);
> funcs = &vkms_primary_helper_funcs;
> - } else {
> + break;
> + default:
> formats = vkms_formats;
> nformats = ARRAY_SIZE(vkms_formats);
> funcs = &vkms_primary_helper_funcs;
> + break;
> }
>
> plane = drmm_universal_plane_alloc(dev, struct vkms_plane, base, 1 << index,
[-- Attachment #1.2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
[-- Attachment #2: Type: text/plain, Size: 160 bytes --]
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
next prev parent reply other threads:[~2021-04-26 8:07 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-04-24 8:22 [PATCH v4 0/4] drm/vkms: add overlay plane support Melissa Wen
2021-04-24 8:23 ` [PATCH v4 1/4] drm/vkms: init plane using drmm_universal_plane_alloc Melissa Wen
2021-04-24 8:24 ` [PATCH v4 2/4] drm/vkms: rename cursor to plane on ops of planes composition Melissa Wen
2021-04-24 8:25 ` [PATCH v4 3/4] drm/vkms: add XRGB " Melissa Wen
2021-04-26 8:03 ` Pekka Paalanen
2021-04-26 16:28 ` Daniel Vetter
2021-04-26 17:31 ` Melissa Wen
2021-04-27 8:10 ` Pekka Paalanen
2021-04-27 8:31 ` Melissa Wen
2021-04-27 9:04 ` Daniel Vetter
2021-04-24 8:26 ` [PATCH v4 4/4] drm/vkms: add overlay support Melissa Wen
2021-04-26 8:07 ` Pekka Paalanen [this message]
2021-04-26 17:07 ` Melissa Wen
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20210426110704.7cde8c1a@eldfell \
--to=ppaalanen@gmail.com \
--cc=airlied@linux.ie \
--cc=dri-devel@lists.freedesktop.org \
--cc=hamohammed.sa@gmail.com \
--cc=melissa.srw@gmail.com \
--cc=rodrigosiqueiramelo@gmail.com \
--cc=sylphrenadin@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.