summaryrefslogtreecommitdiff
path: root/drivers/gpu/drm/drm_plane.c
diff options
context:
space:
mode:
authorPankaj Bharadiya <pankaj.laxminarayan.bharadiya@intel.com>2020-10-20 21:44:23 +0530
committerJani Nikula <jani.nikula@intel.com>2020-10-21 12:19:54 +0300
commit5c759eda9b04cd1047b4cda8ac1eaadf8a9e4fce (patch)
tree9c09dbd275912c35e53d48ed5c9e9162c14b1c7b /drivers/gpu/drm/drm_plane.c
parente7fc3f902d76f1c5f6e226f951a03a796e6763df (diff)
downloadlwn-5c759eda9b04cd1047b4cda8ac1eaadf8a9e4fce.tar.gz
lwn-5c759eda9b04cd1047b4cda8ac1eaadf8a9e4fce.zip
drm: Introduce plane and CRTC scaling filter properties
Introduce per-plane and per-CRTC scaling filter properties to allow userspace to select the driver's default scaling filter or Nearest-neighbor(NN) filter for upscaling operations on CRTC and plane. Drivers can set up this property for a plane by calling drm_plane_create_scaling_filter() and for a CRTC by calling drm_crtc_create_scaling_filter(). NN filter works by filling in the missing color values in the upscaled image with that of the coordinate-mapped nearest source pixel value. NN filter for integer multiple scaling can be particularly useful for for pixel art games that rely on sharp, blocky images to deliver their distinctive look. changes since: v6: * Move property doc to existing "Standard CRTC Properties" and "Plane Composition Properties" doc comments (Simon) changes since v3: * Refactor code, add new function for common code (Ville) changes since v2: * Create per-plane and per-CRTC scaling filter property (Ville) changes since v1: * None changes since RFC: * Add separate properties for plane and CRTC (Ville) Link: https://github.com/xbmc/xbmc/pull/18194 Link: https://github.com/xbmc/xbmc/pull/18567 Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Reviewed-by: Uma Shankar <uma.shankar@intel.com> Acked-by: Simon Ser <contact@emersion.fr> Acked-by: Daniel Vetter <daniel@ffwll.ch> Signed-off-by: Pankaj Bharadiya <pankaj.laxminarayan.bharadiya@intel.com> Signed-off-by: Jani Nikula <jani.nikula@intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20201020161427.6941-2-pankaj.laxminarayan.bharadiya@intel.com
Diffstat (limited to 'drivers/gpu/drm/drm_plane.c')
-rw-r--r--drivers/gpu/drm/drm_plane.c73
1 files changed, 73 insertions, 0 deletions
diff --git a/drivers/gpu/drm/drm_plane.c b/drivers/gpu/drm/drm_plane.c
index affe1cfed009..e6231947f987 100644
--- a/drivers/gpu/drm/drm_plane.c
+++ b/drivers/gpu/drm/drm_plane.c
@@ -1231,3 +1231,76 @@ out:
return ret;
}
+
+struct drm_property *
+drm_create_scaling_filter_prop(struct drm_device *dev,
+ unsigned int supported_filters)
+{
+ struct drm_property *prop;
+ static const struct drm_prop_enum_list props[] = {
+ { DRM_SCALING_FILTER_DEFAULT, "Default" },
+ { DRM_SCALING_FILTER_NEAREST_NEIGHBOR, "Nearest Neighbor" },
+ };
+ unsigned int valid_mode_mask = BIT(DRM_SCALING_FILTER_DEFAULT) |
+ BIT(DRM_SCALING_FILTER_NEAREST_NEIGHBOR);
+ int i;
+
+ if (WARN_ON((supported_filters & ~valid_mode_mask) ||
+ ((supported_filters & BIT(DRM_SCALING_FILTER_DEFAULT)) == 0)))
+ return ERR_PTR(-EINVAL);
+
+ prop = drm_property_create(dev, DRM_MODE_PROP_ENUM,
+ "SCALING_FILTER",
+ hweight32(supported_filters));
+ if (!prop)
+ return ERR_PTR(-ENOMEM);
+
+ for (i = 0; i < ARRAY_SIZE(props); i++) {
+ int ret;
+
+ if (!(BIT(props[i].type) & supported_filters))
+ continue;
+
+ ret = drm_property_add_enum(prop, props[i].type,
+ props[i].name);
+
+ if (ret) {
+ drm_property_destroy(dev, prop);
+
+ return ERR_PTR(ret);
+ }
+ }
+
+ return prop;
+}
+
+/**
+ * drm_plane_create_scaling_filter_property - create a new scaling filter
+ * property
+ *
+ * @plane: drm plane
+ * @supported_filters: bitmask of supported scaling filters, must include
+ * BIT(DRM_SCALING_FILTER_DEFAULT).
+ *
+ * This function lets driver to enable the scaling filter property on a given
+ * plane.
+ *
+ * RETURNS:
+ * Zero for success or -errno
+ */
+int drm_plane_create_scaling_filter_property(struct drm_plane *plane,
+ unsigned int supported_filters)
+{
+ struct drm_property *prop =
+ drm_create_scaling_filter_prop(plane->dev, supported_filters);
+
+ if (IS_ERR(prop))
+ return PTR_ERR(prop);
+
+ drm_object_attach_property(&plane->base, prop,
+ DRM_SCALING_FILTER_DEFAULT);
+ plane->scaling_filter_property = prop;
+
+ return 0;
+}
+EXPORT_SYMBOL(drm_plane_create_scaling_filter_property);