All of lore.kernel.org
 help / color / mirror / Atom feed
From: Mamta Shukla <mamtashukla555@gmail.com>
To: Rodrigo Siqueira <rodrigosiqueiramelo@gmail.com>
Cc: Manasi Navare <manasi.d.navare@intel.com>,
	Haneen Mohammed <hamohammed.sa@gmail.com>,
	Daniel Vetter <daniel.vetter@ffwll.ch>,
	dri-devel@lists.freedesktop.org, eric.engestrom@intel.com
Subject: Re: [PATCH v3] drm/vkms: Add overlay plane support
Date: Wed, 13 Mar 2019 00:36:09 +0530	[thread overview]
Message-ID: <CAMNCNOVRU6+p7VxZR=MjtFPjO+zvwnsrC6vpwGp395v5=Sdi0Q@mail.gmail.com> (raw)
In-Reply-To: <20190310152954.jpxxs6gidanmxkp2@smtp.gmail.com>

On Sun, Mar 10, 2019 at 9:00 PM Rodrigo Siqueira
<rodrigosiqueiramelo@gmail.com> wrote:
>
> Hi,
>
> Thanks for your patch.
>
> You can see my comments inline.
>
> On 03/09, Mamta Shukla wrote:
> > Add overlay plane support in vkms aligned with cursor and primary
> > plane with module option 'enable_overlay' to enable/disable overlay
> > plane while testing.
> >
> > This currently passes plane-position-covered-pipe-A-plane subtest
> > from IGT kms_plane test.
>
> What the difference of running this test with and without your patch?
> This test pass without your patch as well. Additionally, I briefly
> looked at the test, and l could not get confident that
> "plane-position-covered-pipe-A-plane" validate overlays. Did I miss
> something?
>
> > Signed-off-by: Mamta Shukla <mamtashukla555@gmail.com>
> > ---
> > changes in v3:
> > -Fix spelling mistake 'palne'->'plane'
> > -Use switch case
> > -Use logical operator '||' in place of '|'
> >
> > change in v2:
> > -Fix warning: return makes pointer from integer without a cast using
> >  ERR_PTR
> >
> >  drivers/gpu/drm/vkms/vkms_crc.c   | 42 +++++++++++++++++++++++++++----
> >  drivers/gpu/drm/vkms/vkms_drv.c   |  4 +++
> >  drivers/gpu/drm/vkms/vkms_drv.h   |  8 ++++++
> >  drivers/gpu/drm/vkms/vkms_plane.c | 36 +++++++++++++++++++++++++-
> >  4 files changed, 84 insertions(+), 6 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/vkms/vkms_crc.c b/drivers/gpu/drm/vkms/vkms_crc.c
> > index 4dd6c155363d..82bfee7c79b5 100644
> > --- a/drivers/gpu/drm/vkms/vkms_crc.c
> > +++ b/drivers/gpu/drm/vkms/vkms_crc.c
> > @@ -109,6 +109,26 @@ static void blend(void *vaddr_dst, void *vaddr_src,
> >       }
> >  }
> >
> > +static void compose_overlay(struct vkms_crc_data *overlay_crc,
> > +                         struct vkms_crc_data *primary_crc, void *vaddr_out)
> > +{
> > +     struct drm_gem_object *overlay_obj;
> > +     struct vkms_gem_object  *overlay_vkms_obj;
> > +
> > +     overlay_obj = drm_gem_fb_get_obj(&overlay_crc->fb, 0);
> > +     overlay_vkms_obj = drm_gem_to_vkms_gem(overlay_obj);
> > +     mutex_lock(&overlay_vkms_obj->pages_lock);
> > +     if (!overlay_vkms_obj->vaddr) {
> > +             DRM_WARN("overlay plane vaddr is NULL");
> > +             goto out;
> > +     }
> > +
> > +     blend(vaddr_out, overlay_vkms_obj->vaddr, primary_crc, overlay_crc);
> > +
> > +out:
> > +     mutex_unlock(&overlay_vkms_obj->pages_lock);
> > +}
> > +
> >  static void compose_cursor(struct vkms_crc_data *cursor_crc,
> >                          struct vkms_crc_data *primary_crc, void *vaddr_out)
> >  {
> > @@ -131,7 +151,8 @@ static void compose_cursor(struct vkms_crc_data *cursor_crc,
> >  }
> >
> >  static uint32_t _vkms_get_crc(struct vkms_crc_data *primary_crc,
> > -                           struct vkms_crc_data *cursor_crc)
> > +                           struct vkms_crc_data *cursor_crc,
> > +                           struct vkms_crc_data *overlay_crc)
> >  {
> >       struct drm_framebuffer *fb = &primary_crc->fb;
> >       struct drm_gem_object *gem_obj = drm_gem_fb_get_obj(fb, 0);
> > @@ -154,6 +175,8 @@ static uint32_t _vkms_get_crc(struct vkms_crc_data *primary_crc,
> >       memcpy(vaddr_out, vkms_obj->vaddr, vkms_obj->gem.size);
> >       mutex_unlock(&vkms_obj->pages_lock);
> >
> > +     if (overlay_crc)
> > +             compose_overlay(overlay_crc, primary_crc, vaddr_out);
> >       if (cursor_crc)
> >               compose_cursor(cursor_crc, primary_crc, vaddr_out);
> >
> > @@ -184,6 +207,7 @@ void vkms_crc_work_handle(struct work_struct *work)
> >                                               output);
> >       struct vkms_crc_data *primary_crc = NULL;
> >       struct vkms_crc_data *cursor_crc = NULL;
> > +     struct vkms_crc_data *overlay_crc = NULL;
> >       struct drm_plane *plane;
> >       u32 crc32 = 0;
> >       u64 frame_start, frame_end;
> > @@ -208,14 +232,22 @@ void vkms_crc_work_handle(struct work_struct *work)
> >               if (drm_framebuffer_read_refcount(&crc_data->fb) == 0)
> >                       continue;
> >
> > -             if (plane->type == DRM_PLANE_TYPE_PRIMARY)
> > +             switch (plane->type) {
> > +             case DRM_PLANE_TYPE_PRIMARY:
> >                       primary_crc = crc_data;
> > -             else
> > +                     break;
> > +             case DRM_PLANE_TYPE_CURSOR:
> >                       cursor_crc = crc_data;
> > +                     break;
> > +             case DRM_PLANE_TYPE_OVERLAY:
> > +                     overlay_crc = crc_data;
> > +                     break;
> > +             }
> >       }
> >
> > -     if (primary_crc)
> > -             crc32 = _vkms_get_crc(primary_crc, cursor_crc);
> > +     if (primary_crc)  {
> > +             crc32 = _vkms_get_crc(primary_crc, cursor_crc, overlay_crc);
> > +     }
>
> Please, remember to use checkpatch in your patches before sending them.
>
> >       frame_end = drm_crtc_accurate_vblank_count(crtc);
> >
> > diff --git a/drivers/gpu/drm/vkms/vkms_drv.c b/drivers/gpu/drm/vkms/vkms_drv.c
> > index 738dd6206d85..b08ad6f95675 100644
> > --- a/drivers/gpu/drm/vkms/vkms_drv.c
> > +++ b/drivers/gpu/drm/vkms/vkms_drv.c
> > @@ -29,6 +29,10 @@ bool enable_cursor;
> >  module_param_named(enable_cursor, enable_cursor, bool, 0444);
> >  MODULE_PARM_DESC(enable_cursor, "Enable/Disable cursor support");
> >
> > +bool enable_overlay;
> > +module_param_named(enable_overlay, enable_overlay, bool, 0444);
> > +MODULE_PARM_DESC(enable_overlay, "Enable/Disable overlay support");
> > +
> >  static const struct file_operations vkms_driver_fops = {
> >       .owner          = THIS_MODULE,
> >       .open           = drm_open,
> > diff --git a/drivers/gpu/drm/vkms/vkms_drv.h b/drivers/gpu/drm/vkms/vkms_drv.h
> > index 81f1cfbeb936..6861dbee01fd 100644
> > --- a/drivers/gpu/drm/vkms/vkms_drv.h
> > +++ b/drivers/gpu/drm/vkms/vkms_drv.h
> > @@ -20,6 +20,8 @@
> >
> >  extern bool enable_cursor;
> >
> > +extern bool enable_overlay;
> > +
> >  static const u32 vkms_formats[] = {
> >       DRM_FORMAT_XRGB8888,
> >  };
> > @@ -28,6 +30,10 @@ static const u32 vkms_cursor_formats[] = {
> >       DRM_FORMAT_ARGB8888,
> >  };
> >
> > +static const u32 vkms_overlay_formats[] = {
> > +     DRM_FORMAT_ARGB8888,
> > +};
> > +
> >  struct vkms_crc_data {
> >       struct drm_framebuffer fb;
> >       struct drm_rect src, dst;
> > @@ -118,6 +124,8 @@ int vkms_output_init(struct vkms_device *vkmsdev);
> >  struct drm_plane *vkms_plane_init(struct vkms_device *vkmsdev,
> >                                 enum drm_plane_type type);
> >
> > +struct drm_plane *vkms_overlay_init(struct vkms_device *vkmsdev);
> > +
> >  /* Gem stuff */
> >  struct drm_gem_object *vkms_gem_create(struct drm_device *dev,
> >                                      struct drm_file *file,
> > diff --git a/drivers/gpu/drm/vkms/vkms_plane.c b/drivers/gpu/drm/vkms/vkms_plane.c
> > index 0e67d2d42f0c..090b21a2afab 100644
> > --- a/drivers/gpu/drm/vkms/vkms_plane.c
> > +++ b/drivers/gpu/drm/vkms/vkms_plane.c
> > @@ -114,7 +114,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_CURSOR) || (plane->type == DRM_PLANE_TYPE_OVERLAY))
> >               can_position = true;
> >
> >       ret = drm_atomic_helper_check_plane_state(state, crtc_state,
> > @@ -167,6 +167,40 @@ static const struct drm_plane_helper_funcs vkms_primary_helper_funcs = {
> >       .cleanup_fb             = vkms_cleanup_fb,
> >  };
> >
> > +struct drm_plane *vkms_overlay_init(struct vkms_device *vkmsdev)
> > +{
> > +     struct drm_device *dev = &vkmsdev->drm;
> > +     const struct drm_plane_helper_funcs *funcs;
> > +     struct drm_plane *overlay;
> > +     const u32 *formats;
> > +     int ret, nformats;
> > +     unsigned int blend_caps  = BIT(DRM_MODE_BLEND_PIXEL_NONE) |
> > +                             BIT(DRM_MODE_BLEND_PREMULTI);
> > +
> > +     overlay = kzalloc(sizeof(*overlay), GFP_KERNEL);
> > +     if (!overlay)
> > +             return ERR_PTR(-ENOMEM);
> > +
> > +     formats = vkms_overlay_formats;
> > +     nformats = ARRAY_SIZE(vkms_overlay_formats);
> > +     funcs = &vkms_primary_helper_funcs;
> > +     drm_plane_helper_add(overlay, funcs);
> > +     drm_plane_create_alpha_property(overlay);
> > +     drm_plane_create_blend_mode_property(overlay, blend_caps);
> > +
> > +     ret = drm_universal_plane_init(dev, overlay, 0,
> > +                                     &vkms_plane_funcs,
> > +                                     formats, nformats,
> > +                                     NULL,
> > +                                     DRM_PLANE_TYPE_OVERLAY, NULL);
> > +     if (ret) {
> > +             kfree(overlay);
> > +             return ERR_PTR(ret);
> > +     }
> > +
>
> IMHO you don't need to create a new function just for overlays
> initialization, because we already have a function named
> vkms_plane_init() that centralizes the responsibility of initializing
> planes. It could be better if you extend vkms_plane_init() to make it
> handle overlays.
>
Used vkms_overlay_init() as a separate function as added few more
properties for overlay as alpha channel and alpha blending where as
these properties are not added for primary and cursor using
vkms_plane_init() . So to avoid breaking other parts of code, added it
separately.

> Additionally, I think you never initialized overlays in your patch. You
> have the initialization function, but no ones invoke it. Am I right or I
> missed something?
Thank you for pointing this out. I corrected this by invoking
vkms_overlay_init() with enable_overlay option in vkms_output_init()
as -
if (enable_overlay) {
        overlay = vkms_overlay_init(vkmsdev);
 }
And it works fine while loading driver using sudo modprobe vkms
enable_cursor=1  enable_overlay =1

> Best Regards
>
> > +     return overlay;
> > +}
> > +
> >  struct drm_plane *vkms_plane_init(struct vkms_device *vkmsdev,
> >                                 enum drm_plane_type type)
> >  {
> > --
> > 2.17.1
> >
But the IGT test kms_plane.c fails with error :
[  504.028013] [drm:drm_crtc_add_crc_entry [drm]] *ERROR* Overflow of
CRC buffer, userspace reads too slow.
[  504.040961] [drm] failed to queue vkms_crc_work_handle

>
> --
> Rodrigo Siqueira
> https://siqueira.tech
> Graduate Student
> Department of Computer Science
> University of São Paulo

---
Mamta
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

  reply	other threads:[~2019-03-12 19:06 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-03-09 15:39 [PATCH v3] drm/vkms: Add overlay plane support Mamta Shukla
2019-03-10 15:29 ` Rodrigo Siqueira
2019-03-12 19:06   ` Mamta Shukla [this message]
2019-03-14 13:57     ` Rodrigo Siqueira

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='CAMNCNOVRU6+p7VxZR=MjtFPjO+zvwnsrC6vpwGp395v5=Sdi0Q@mail.gmail.com' \
    --to=mamtashukla555@gmail.com \
    --cc=daniel.vetter@ffwll.ch \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=eric.engestrom@intel.com \
    --cc=hamohammed.sa@gmail.com \
    --cc=manasi.d.navare@intel.com \
    --cc=rodrigosiqueiramelo@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.