Re: [PATCH 1/3] drm: Introduce scaling filter mode property

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hello Mihail,

Thanks for your review, my comments inline.

On 10/22/2019 6:56 PM, Mihail Atanassov wrote:
Hi Shashank,

On Tuesday, 22 October 2019 10:59:44 BST Shashank Sharma wrote:
This patch adds a scaling filter mode porperty
to allow:
- A driver/HW to showcase it's scaling filter capabilities.
- A userspace to pick a desired effect while scaling.

This option will be particularly useful in the scenarios where
Integer mode scaling is possible, and a UI client wants to pick
filters like Nearest-neighbor applied for non-blurry outputs.

There was a RFC patch series published, to discus the request to enable
Integer mode scaling by some of the gaming communities, which can be
found here:
https://patchwork.freedesktop.org/series/66175/

Signed-off-by: Shashank Sharma <shashank.sharma@xxxxxxxxx>
---
  drivers/gpu/drm/drm_atomic_uapi.c |  4 ++++
  include/drm/drm_crtc.h            | 26 ++++++++++++++++++++++++++
  include/drm/drm_mode_config.h     |  6 ++++++
  3 files changed, 36 insertions(+)

diff --git a/drivers/gpu/drm/drm_atomic_uapi.c b/drivers/gpu/drm/drm_atomic_uapi.c
index 0d466d3b0809..883329453a86 100644
--- a/drivers/gpu/drm/drm_atomic_uapi.c
+++ b/drivers/gpu/drm/drm_atomic_uapi.c
@@ -435,6 +435,8 @@ static int drm_atomic_crtc_set_property(struct drm_crtc *crtc,
               return ret;
       } else if (property == config->prop_vrr_enabled) {
               state->vrr_enabled = val;
+     } else if (property == config->scaling_filter_property) {
+             state->scaling_filter = val;
       } else if (property == config->degamma_lut_property) {
               ret = drm_atomic_replace_property_blob_from_id(dev,
                                       &state->degamma_lut,
@@ -503,6 +505,8 @@ drm_atomic_crtc_get_property(struct drm_crtc *crtc,
               *val = (state->gamma_lut) ? state->gamma_lut->base.id : 0;
       else if (property == config->prop_out_fence_ptr)
               *val = 0;
+     else if (property == config->scaling_filter_property)
+             *val = state->scaling_filter;
       else if (crtc->funcs->atomic_get_property)
               return crtc->funcs->atomic_get_property(crtc, state, property, val);
       else
diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h
index 5e9b15a0e8c5..94c5509474a8 100644
--- a/include/drm/drm_crtc.h
+++ b/include/drm/drm_crtc.h
@@ -58,6 +58,25 @@ struct device_node;
  struct dma_fence;
  struct edid;

+enum drm_scaling_filters {
+     DRM_SCALING_FILTER_DEFAULT,
+     DRM_SCALING_FILTER_MEDIUM,
+     DRM_SCALING_FILTER_BILINEAR,
+     DRM_SCALING_FILTER_NN,
+     DRM_SCALING_FILTER_NN_IS_ONLY,
+     DRM_SCALING_FILTER_EDGE_ENHANCE,
This one looks to be missing a stringified version below.
Oh yes, it did. Thanks for pointing this out.
  Just wanted
to jump in early and suggest dropping it from the scaling filter enum.
Edge enhancement is orthogonal to the mode used for scaling, at least
on komeda HW, so we wouldn't be able to make the best use of the
property in its current form.
Yes, Ville also suggested similar, I guess we can start with the smaller set.

+     DRM_SCALING_FILTER_INVALID,
+};
+
+static const struct drm_prop_enum_list drm_scaling_filter_enum_list[] = {
+     { DRM_SCALING_FILTER_DEFAULT, "Default" },
+     { DRM_SCALING_FILTER_MEDIUM, "Medium" },
+     { DRM_SCALING_FILTER_BILINEAR, "Bilinear" },
+     { DRM_SCALING_FILTER_NN, "Nearest Neighbor" },
+     { DRM_SCALING_FILTER_NN_IS_ONLY, "Integer Mode Scaling" },
+     { DRM_SCALING_FILTER_INVALID, "Invalid" },
+};
+
  static inline int64_t U642I64(uint64_t val)
  {
       return (int64_t)*((int64_t *)&val);
@@ -283,6 +302,13 @@ struct drm_crtc_state {
        */
       u32 target_vblank;

+     /**
+      * @scaling_filter:
+      *
+      * Scaling filter mode to be applied
+      */
+     u32 scaling_filter;
+
       /**
        * @async_flip:
        *
diff --git a/include/drm/drm_mode_config.h b/include/drm/drm_mode_config.h
index 3bcbe30339f0..efd6fd55770f 100644
--- a/include/drm/drm_mode_config.h
+++ b/include/drm/drm_mode_config.h
@@ -914,6 +914,12 @@ struct drm_mode_config {
        */
       struct drm_property *modifiers_property;

+     /**
+      * @scaling_filter_property: CRTC property to apply a particular filter
A scaling filter option can also be useful for scaling individual
planes, do you have any plans to extend the property's applications
in that direction?

Yes, the second stage of development should contain the plane level filtering too, but as you know, that would be a complex thing to handle, as planes apply filter pre-blending. We need to discus that (in a parallel thread :)) how should that look like.

- Shashank


+      * while scaling in panel fitter mode.
+      */
+     struct drm_property *scaling_filter_property;
+
       /* cursor size */
       uint32_t cursor_width, cursor_height;



--
Mihail



IMPORTANT NOTICE: The contents of this email and any attachments are confidential and may also be privileged. If you are not the intended recipient, please notify the sender immediately and do not disclose the contents to any other person, use it for any purpose, or store or copy the information in any medium. Thank you.
_______________________________________________
dri-devel mailing list
dri-devel@xxxxxxxxxxxxxxxxxxxxx
https://lists.freedesktop.org/mailman/listinfo/dri-devel




[Index of Archives]     [Linux DRI Users]     [Linux Intel Graphics]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [XFree86]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [XFree86]
  Powered by Linux