[RFC][PATCH v2 3/3] drm/i915: Add SIZE_HINTS property for cursors

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

 



From: Ville Syrjälä <ville.syrjala@xxxxxxxxxxxxxxx>

Advertize more suitable cursor sizes via the new SIZE_HINTS
plane property.

Here are some examples on various platforms:
ivb+:
            31 SIZE_HINTS:
                    flags: immutable blob
                    blobs:

                    value:
                            4000080000010001ff6f0200
                    size_hints blob decoded:
                            min: 64x8
                            max: 256x256
                            bitmap[0]: 0b100110111111111111
                                    64  128  256
                               8     *    *    *
                              16     *    *    *
                              32     *    *    *
                              64     *    *    *
                             128          *    *
                             256               *
i945+:
            31 SIZE_HINTS:
                    flags: immutable blob
                    blobs:

                    value:
                            400040000001000111010000
                    size_hints blob decoded:
                            min: 64x64
                            max: 256x256
                            bitmap[0]: 0b100010001
                                    64  128  256
                              64     *
                             128          *
                             256               *
i865:
            31 SIZE_HINTS:
                    flags: immutable blob
                    blobs:

                    value:
                            400001000002ff03ffffffffff0f0000
                    size_hints blob decoded:
                            min: 64x1
                            max: 512x1023
                            bitmap[0]: 0b11111111111111111111111111111111
                            bitmap[1]: 0b111111111111
                                    64  128  256  512
                               1     *    *    *    *
                               2     *    *    *    *
                               4     *    *    *    *
                               8     *    *    *    *
                              16     *    *    *    *
                              32     *    *    *    *
                              64     *    *    *    *
                             128     *    *    *    *
                             256     *    *    *    *
                             512     *    *    *    *
                            1023     *    *    *    *

Cc: Simon Ser <contact@xxxxxxxxxxx>
Cc: Jonas Ådahl <jadahl@xxxxxxxxxx>
Cc: Daniel Stone <daniel@xxxxxxxxxxxxx>
Cc: Pekka Paalanen <pekka.paalanen@xxxxxxxxxxxxx>
Signed-off-by: Ville Syrjälä <ville.syrjala@xxxxxxxxxxxxxxx>
---
 drivers/gpu/drm/i915/display/intel_cursor.c | 43 ++++++++++++++++++---
 1 file changed, 38 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_cursor.c b/drivers/gpu/drm/i915/display/intel_cursor.c
index edeeb5f9f795..449860342aea 100644
--- a/drivers/gpu/drm/i915/display/intel_cursor.c
+++ b/drivers/gpu/drm/i915/display/intel_cursor.c
@@ -388,9 +388,9 @@ static u32 i9xx_cursor_ctl(const struct intel_crtc_state *crtc_state,
 	return cntl;
 }
 
-static bool i9xx_cursor_size_ok(struct drm_plane *plane,
-				int width, int height,
-				unsigned int rotation)
+static bool _i9xx_cursor_size_ok(struct drm_plane *plane,
+				 int width, int height,
+				 unsigned int rotation)
 {
 	struct drm_i915_private *i915 = to_i915(plane->dev);
 
@@ -424,6 +424,12 @@ static bool i9xx_cursor_size_ok(struct drm_plane *plane,
 	return true;
 }
 
+static bool i9xx_cursor_size_ok(struct drm_plane *plane,
+				int width, int height)
+{
+	return _i9xx_cursor_size_ok(plane, width, height, DRM_MODE_ROTATE_0);
+}
+
 static int i9xx_check_cursor(struct intel_crtc_state *crtc_state,
 			     struct intel_plane_state *plane_state)
 {
@@ -445,8 +451,8 @@ static int i9xx_check_cursor(struct intel_crtc_state *crtc_state,
 	height = drm_rect_height(&plane_state->uapi.dst);
 
 	/* Check for which cursor types we support */
-	if (!i9xx_cursor_size_ok(&plane->base, width, height,
-				 plane_state->hw.rotation)) {
+	if (!_i9xx_cursor_size_ok(&plane->base, width, height,
+				  plane_state->hw.rotation)) {
 		drm_dbg_kms(&dev_priv->drm,
 			    "Cursor dimension %dx%d not supported\n",
 			    width, height);
@@ -757,6 +763,31 @@ static const struct drm_plane_funcs intel_cursor_plane_funcs = {
 	.format_mod_supported = intel_cursor_format_mod_supported,
 };
 
+static void intel_cursor_add_size_hints_property(struct intel_plane *plane)
+{
+	struct drm_i915_private *i915 = to_i915(plane->base.dev);
+	const struct drm_mode_config *config = &i915->drm.mode_config;
+
+	if (IS_I845G(i915) || IS_I865G(i915))
+		drm_plane_add_size_hints_property(&plane->base,
+						  64, 1,
+						  config->cursor_width,
+						  config->cursor_height,
+						  i845_cursor_size_ok);
+	else if (HAS_CUR_FBC(i915))
+		drm_plane_add_size_hints_property(&plane->base,
+						  64, 8,
+						  config->cursor_width,
+						  config->cursor_height,
+						  i9xx_cursor_size_ok);
+	else
+		drm_plane_add_size_hints_property(&plane->base,
+						  64, 64,
+						  config->cursor_width,
+						  config->cursor_height,
+						  i9xx_cursor_size_ok);
+}
+
 struct intel_plane *
 intel_cursor_plane_create(struct drm_i915_private *dev_priv,
 			  enum pipe pipe)
@@ -815,6 +846,8 @@ intel_cursor_plane_create(struct drm_i915_private *dev_priv,
 						   DRM_MODE_ROTATE_0 |
 						   DRM_MODE_ROTATE_180);
 
+	intel_cursor_add_size_hints_property(cursor);
+
 	zpos = RUNTIME_INFO(dev_priv)->num_sprites[pipe] + 1;
 	drm_plane_create_zpos_immutable_property(&cursor->base, zpos);
 
-- 
2.39.2




[Index of Archives]     [AMD Graphics]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux