From: Mamta Shukla <mamtashukla555@gmail.com>
To: dri-devel@lists.freedesktop.org, daniel.vetter@ffwll.ch,
harry.wentland@amd.com, hamohammed.sa@gmail.com,
rodrigosiqueiramelo@gmail.com, manasi.d.navare@intel.com
Subject: [PATCH v2] drm/vkms: Add overlay plane support
Date: Tue, 5 Mar 2019 21:54:47 +0530 [thread overview]
Message-ID: <20190305162447.GA15792@armorer> (raw)
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.
Signed-off-by: Mamta Shukla <mamtashukla555@gmail.com>
---
change in v2:
-Fix warning: return makes pointer from integer without a cast using
ERR_PTR
drivers/gpu/drm/vkms/vkms_crc.c | 36 +++++++++++++++++++++++++++----
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, 79 insertions(+), 5 deletions(-)
diff --git a/drivers/gpu/drm/vkms/vkms_crc.c b/drivers/gpu/drm/vkms/vkms_crc.c
index 4dd6c155363d..ac3ed863cf34 100644
--- a/drivers/gpu/drm/vkms/vkms_crc.c
+++ b/drivers/gpu/drm/vkms/vkms_crc.c
@@ -109,6 +109,25 @@ 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 palne 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 +150,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 +174,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 +206,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;
@@ -210,12 +233,17 @@ void vkms_crc_work_handle(struct work_struct *work)
if (plane->type == DRM_PLANE_TYPE_PRIMARY)
primary_crc = crc_data;
- else
+
+ if (plane->type == DRM_PLANE_TYPE_CURSOR)
cursor_crc = crc_data;
+
+ if (plane->type == DRM_PLANE_TYPE_OVERLAY)
+ overlay_crc = crc_data;
}
- if (primary_crc)
- crc32 = _vkms_get_crc(primary_crc, cursor_crc);
+ if (primary_crc){
+ crc32 = _vkms_get_crc(primary_crc, cursor_crc, overlay_crc);
+ }
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..81dceadfde62 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..d540b9500633 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);
+ }
+
+ return overlay;
+}
+
struct drm_plane *vkms_plane_init(struct vkms_device *vkmsdev,
enum drm_plane_type type)
{
--
2.17.1
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
next reply other threads:[~2019-03-05 16:24 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-03-05 16:24 Mamta Shukla [this message]
2019-03-06 14:25 ` [PATCH v2] drm/vkms: Add overlay plane support Eric Engestrom
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=20190305162447.GA15792@armorer \
--to=mamtashukla555@gmail.com \
--cc=daniel.vetter@ffwll.ch \
--cc=dri-devel@lists.freedesktop.org \
--cc=hamohammed.sa@gmail.com \
--cc=harry.wentland@amd.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.