[Intel-gfx] [PATCH 3/3] drm/i915: Add format modifiers for Intel
This was based on a patch originally by Kristian. It has been modified pretty heavily to use the new callbacks from the previous patch. v2: - Add LINEAR and Yf modifiers to list (Ville) - Combine i8xx and i965 into one list of formats (Ville) - Allow 1010102 formats for Y/Yf tiled (Ville) v3: - Handle cursor formats (Ville) - Put handling for LINEAR in the mod_support functions (Ville) Cc: Ville Syrjälä Cc: Kristian H. Kristensen Signed-off-by: Ben Widawsky --- drivers/gpu/drm/i915/intel_display.c | 112 +-- drivers/gpu/drm/i915/intel_sprite.c | 25 +++- 2 files changed, 131 insertions(+), 6 deletions(-) diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index 802a8449c5d3..bb559a116fda 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c @@ -72,6 +72,12 @@ static const uint32_t i965_primary_formats[] = { DRM_FORMAT_XBGR2101010, }; +static const uint64_t i9xx_format_modifiers[] = { + I915_FORMAT_MOD_X_TILED, + DRM_FORMAT_MOD_LINEAR, + DRM_FORMAT_MOD_INVALID +}; + static const uint32_t skl_primary_formats[] = { DRM_FORMAT_C8, DRM_FORMAT_RGB565, @@ -87,6 +93,14 @@ static const uint32_t skl_primary_formats[] = { DRM_FORMAT_VYUY, }; +static const uint64_t skl_format_modifiers[] = { + I915_FORMAT_MOD_Yf_TILED, + I915_FORMAT_MOD_Y_TILED, + I915_FORMAT_MOD_X_TILED, + DRM_FORMAT_MOD_LINEAR, + DRM_FORMAT_MOD_INVALID +}; + /* Cursor formats */ static const uint32_t intel_cursor_formats[] = { DRM_FORMAT_ARGB, @@ -13453,6 +13467,83 @@ void intel_plane_destroy(struct drm_plane *plane) kfree(to_intel_plane(plane)); } +static bool i8xx_mod_supported(uint32_t format, uint64_t modifier) +{ + switch (format) { + case DRM_FORMAT_C8: + case DRM_FORMAT_RGB565: + case DRM_FORMAT_XRGB1555: + case DRM_FORMAT_XRGB: + return modifier == DRM_FORMAT_MOD_LINEAR || + modifier == I915_FORMAT_MOD_X_TILED; + default: + return false; + } +} + +static bool i965_mod_supported(uint32_t format, uint64_t modifier) +{ + switch (format) { + case DRM_FORMAT_C8: + case DRM_FORMAT_RGB565: + case DRM_FORMAT_XRGB: + case DRM_FORMAT_XBGR: + case DRM_FORMAT_XRGB2101010: + case DRM_FORMAT_XBGR2101010: + return modifier == DRM_FORMAT_MOD_LINEAR || + modifier == I915_FORMAT_MOD_X_TILED; + default: + return false; + } +} + +static bool skl_mod_supported(uint32_t format, uint64_t modifier) +{ + switch (format) { + case DRM_FORMAT_C8: + return modifier == DRM_FORMAT_MOD_LINEAR || + (modifier >= I915_FORMAT_MOD_X_TILED && +modifier < I915_FORMAT_MOD_Yf_TILED); + case DRM_FORMAT_RGB565: + case DRM_FORMAT_XRGB: + case DRM_FORMAT_XBGR: + case DRM_FORMAT_ARGB: + case DRM_FORMAT_ABGR: + case DRM_FORMAT_XRGB2101010: + case DRM_FORMAT_XBGR2101010: + return modifier == DRM_FORMAT_MOD_LINEAR || + (modifier >= I915_FORMAT_MOD_X_TILED && + modifier <= I915_FORMAT_MOD_Yf_TILED); + case DRM_FORMAT_YUYV: + case DRM_FORMAT_YVYU: + case DRM_FORMAT_UYVY: + case DRM_FORMAT_VYUY: + return modifier == DRM_FORMAT_MOD_LINEAR; + default: + return false; + } + +} + +static bool intel_plane_format_mod_supported(struct drm_plane *plane, +uint32_t format, +uint64_t modifier) +{ + struct drm_i915_private *dev_priv = to_i915(plane->dev); + + if (WARN_ON(modifier == DRM_FORMAT_MOD_INVALID)) + return false; + + if (INTEL_GEN(dev_priv) >= 9) + return skl_mod_supported(format, modifier); + else if (INTEL_GEN(dev_priv) >= 4) + return i965_mod_supported(format, modifier); + else + return i8xx_mod_supported(format, modifier); + + return false; +} + const struct drm_plane_funcs intel_plane_funcs = { .update_plane = drm_atomic_helper_update_plane, .disable_plane = drm_atomic_helper_disable_plane, @@ -13462,6 +13553,7 @@ const struct drm_plane_funcs intel_plane_funcs = { .atomic_set_property = intel_plane_atomic_set_property, .atomic_duplicate_state = intel_plane_duplicate_state, .atomic_destroy_state = intel_plane_destroy_state, + .format_mod_supported = intel_plane_format_mod_supported, }; static int @@ -13598,6 +13690,7 @@ static const struct drm_plane_funcs intel_cursor_plane_funcs = { .atomic_set_property = intel_plane_atomic_set_property, .atomic_duplicate
[Intel-gfx] [PATCH 3/3] drm/i915: Add format modifiers for Intel
This was based on a patch originally by Kristian. It has been modified pretty heavily to use the new callbacks from the previous patch. v2: - Add LINEAR and Yf modifiers to list (Ville) - Combine i8xx and i965 into one list of formats (Ville) - Allow 1010102 formats for Y/Yf tiled (Ville) v3: - Handle cursor formats (Ville) - Put handling for LINEAR in the mod_support functions (Ville) v4: - List each modifier explicitly in supported modifiers (Ville) - Handle the CURSOR plane (Ville) v5: - Split out cursor and sprite handling (Ville) Cc: Ville Syrjälä Cc: Kristian H. Kristensen Signed-off-by: Ben Widawsky --- drivers/gpu/drm/i915/intel_display.c | 131 +-- drivers/gpu/drm/i915/intel_sprite.c | 76 +++- 2 files changed, 201 insertions(+), 6 deletions(-) diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index d52bd05a017d..18aac538d978 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c @@ -72,6 +72,12 @@ static const uint32_t i965_primary_formats[] = { DRM_FORMAT_XBGR2101010, }; +static const uint64_t i9xx_format_modifiers[] = { + I915_FORMAT_MOD_X_TILED, + DRM_FORMAT_MOD_LINEAR, + DRM_FORMAT_MOD_INVALID +}; + static const uint32_t skl_primary_formats[] = { DRM_FORMAT_C8, DRM_FORMAT_RGB565, @@ -87,6 +93,14 @@ static const uint32_t skl_primary_formats[] = { DRM_FORMAT_VYUY, }; +static const uint64_t skl_format_modifiers[] = { + I915_FORMAT_MOD_Yf_TILED, + I915_FORMAT_MOD_Y_TILED, + I915_FORMAT_MOD_X_TILED, + DRM_FORMAT_MOD_LINEAR, + DRM_FORMAT_MOD_INVALID +}; + /* Cursor formats */ static const uint32_t intel_cursor_formats[] = { DRM_FORMAT_ARGB, @@ -13381,6 +13395,103 @@ void intel_plane_destroy(struct drm_plane *plane) kfree(to_intel_plane(plane)); } +static bool i8xx_mod_supported(uint32_t format, uint64_t modifier) +{ + switch (format) { + case DRM_FORMAT_C8: + case DRM_FORMAT_RGB565: + case DRM_FORMAT_XRGB1555: + case DRM_FORMAT_XRGB: + return modifier == DRM_FORMAT_MOD_LINEAR || + modifier == I915_FORMAT_MOD_X_TILED; + default: + return false; + } +} + +static bool i965_mod_supported(uint32_t format, uint64_t modifier) +{ + switch (format) { + case DRM_FORMAT_C8: + case DRM_FORMAT_RGB565: + case DRM_FORMAT_XRGB: + case DRM_FORMAT_XBGR: + case DRM_FORMAT_XRGB2101010: + case DRM_FORMAT_XBGR2101010: + return modifier == DRM_FORMAT_MOD_LINEAR || + modifier == I915_FORMAT_MOD_X_TILED; + default: + return false; + } +} + +static bool skl_mod_supported(uint32_t format, uint64_t modifier) +{ + switch (format) { + case DRM_FORMAT_C8: + switch (modifier) { + case DRM_FORMAT_MOD_LINEAR: + case I915_FORMAT_MOD_X_TILED: + case I915_FORMAT_MOD_Y_TILED: + return true; + default: + return false; + } + case DRM_FORMAT_RGB565: + case DRM_FORMAT_XRGB: + case DRM_FORMAT_XBGR: + case DRM_FORMAT_ARGB: + case DRM_FORMAT_ABGR: + case DRM_FORMAT_XRGB2101010: + case DRM_FORMAT_XBGR2101010: + case DRM_FORMAT_YUYV: + case DRM_FORMAT_YVYU: + case DRM_FORMAT_UYVY: + case DRM_FORMAT_VYUY: + /* All i915 modifiers are fine */ + switch (modifier) { + case DRM_FORMAT_MOD_LINEAR: + case I915_FORMAT_MOD_X_TILED: + case I915_FORMAT_MOD_Y_TILED: + case I915_FORMAT_MOD_Yf_TILED: + return true; + default: + return false; + } + default: + return false; + } +} + +static bool intel_primary_plane_format_mod_supported(struct drm_plane *plane, +uint32_t format, +uint64_t modifier) +{ + struct drm_i915_private *dev_priv = to_i915(plane->dev); + + if (WARN_ON(modifier == DRM_FORMAT_MOD_INVALID)) + return false; + + if (INTEL_GEN(dev_priv) >= 9) + return skl_mod_supported(format, modifier); + else if (INTEL_GEN(dev_priv) >= 4) + return i965_mod_supported(format, modifier); + else + return i8xx_mod_supported(format, modifier); + + return false; +} + +static bool intel_cursor_plane_format_mod_supported(struct drm_plane *plane, + uint32_t format, + uint64_t modifier) +{ + if (WARN_ON(modifier
Re: [Intel-gfx] [PATCH 3/3] drm/i915: Add format modifiers for Intel
On Fri, Mar 24, 2017 at 02:29:50PM -0700, Ben Widawsky wrote: > This was based on a patch originally by Kristian. It has been modified > pretty heavily to use the new callbacks from the previous patch. > > v2: > - Add LINEAR and Yf modifiers to list (Ville) > - Combine i8xx and i965 into one list of formats (Ville) > - Allow 1010102 formats for Y/Yf tiled (Ville) > > v3: > - Handle cursor formats (Ville) > - Put handling for LINEAR in the mod_support functions (Ville) > > Cc: Ville Syrjälä > Cc: Kristian H. Kristensen > Signed-off-by: Ben Widawsky > --- > drivers/gpu/drm/i915/intel_display.c | 112 > +-- > drivers/gpu/drm/i915/intel_sprite.c | 25 +++- > 2 files changed, 131 insertions(+), 6 deletions(-) > > diff --git a/drivers/gpu/drm/i915/intel_display.c > b/drivers/gpu/drm/i915/intel_display.c > index 802a8449c5d3..bb559a116fda 100644 > --- a/drivers/gpu/drm/i915/intel_display.c > +++ b/drivers/gpu/drm/i915/intel_display.c > @@ -72,6 +72,12 @@ static const uint32_t i965_primary_formats[] = { > DRM_FORMAT_XBGR2101010, > }; > > +static const uint64_t i9xx_format_modifiers[] = { > + I915_FORMAT_MOD_X_TILED, > + DRM_FORMAT_MOD_LINEAR, > + DRM_FORMAT_MOD_INVALID > +}; > + > static const uint32_t skl_primary_formats[] = { > DRM_FORMAT_C8, > DRM_FORMAT_RGB565, > @@ -87,6 +93,14 @@ static const uint32_t skl_primary_formats[] = { > DRM_FORMAT_VYUY, > }; > > +static const uint64_t skl_format_modifiers[] = { > + I915_FORMAT_MOD_Yf_TILED, > + I915_FORMAT_MOD_Y_TILED, > + I915_FORMAT_MOD_X_TILED, > + DRM_FORMAT_MOD_LINEAR, > + DRM_FORMAT_MOD_INVALID > +}; > + > /* Cursor formats */ > static const uint32_t intel_cursor_formats[] = { > DRM_FORMAT_ARGB, > @@ -13453,6 +13467,83 @@ void intel_plane_destroy(struct drm_plane *plane) > kfree(to_intel_plane(plane)); > } > > +static bool i8xx_mod_supported(uint32_t format, uint64_t modifier) > +{ > + switch (format) { > + case DRM_FORMAT_C8: > + case DRM_FORMAT_RGB565: > + case DRM_FORMAT_XRGB1555: > + case DRM_FORMAT_XRGB: > + return modifier == DRM_FORMAT_MOD_LINEAR || > + modifier == I915_FORMAT_MOD_X_TILED; > + default: > + return false; > + } > +} > + > +static bool i965_mod_supported(uint32_t format, uint64_t modifier) > +{ > + switch (format) { > + case DRM_FORMAT_C8: > + case DRM_FORMAT_RGB565: > + case DRM_FORMAT_XRGB: > + case DRM_FORMAT_XBGR: > + case DRM_FORMAT_XRGB2101010: > + case DRM_FORMAT_XBGR2101010: > + return modifier == DRM_FORMAT_MOD_LINEAR || > + modifier == I915_FORMAT_MOD_X_TILED; > + default: > + return false; > + } > +} > + > +static bool skl_mod_supported(uint32_t format, uint64_t modifier) > +{ > + switch (format) { > + case DRM_FORMAT_C8: > + return modifier == DRM_FORMAT_MOD_LINEAR || > + (modifier >= I915_FORMAT_MOD_X_TILED && > + modifier < I915_FORMAT_MOD_Yf_TILED); The >= stuff makes this harder to parse than it should be IMO. I'd just list each modifier explicitly. > + case DRM_FORMAT_RGB565: > + case DRM_FORMAT_XRGB: > + case DRM_FORMAT_XBGR: > + case DRM_FORMAT_ARGB: > + case DRM_FORMAT_ABGR: > + case DRM_FORMAT_XRGB2101010: > + case DRM_FORMAT_XBGR2101010: > + return modifier == DRM_FORMAT_MOD_LINEAR || > + (modifier >= I915_FORMAT_MOD_X_TILED && > + modifier <= I915_FORMAT_MOD_Yf_TILED); ditto. At first I couldn't even spot the difference between this and the C8 case. > + case DRM_FORMAT_YUYV: > + case DRM_FORMAT_YVYU: > + case DRM_FORMAT_UYVY: > + case DRM_FORMAT_VYUY: > + return modifier == DRM_FORMAT_MOD_LINEAR; Any modifier will do for these formats. > + default: > + return false; > + } > + > +} > + > +static bool intel_plane_format_mod_supported(struct drm_plane *plane, > + uint32_t format, > + uint64_t modifier) > +{ > + struct drm_i915_private *dev_priv = to_i915(plane->dev); > + > + if (WARN_ON(modifier == DRM_FORMAT_MOD_INVALID)) > + return false; > + > + if (INTEL_GEN(dev_priv) >= 9) > + return skl_mod_supported(format, modifier); > + else if (INTEL_GEN(dev_priv) >= 4) > + return i965_mod_supported(format, modifier); > + else > + return i8xx_mod_supported(format, modifier); > + > + return false; > +} I'd also like to see .format_mod_supported() + modifiers[] for cursors as well. Those should only accept LINEAR+ARGB. Apart from those issues, I think this is looking pretty good. > + > const struct drm_plane_funcs intel_plane_funcs = { > .update_plane = drm
Re: [Intel-gfx] [PATCH 3/3] drm/i915: Add format modifiers for Intel
On 17-03-29 23:17:13, Ville Syrjälä wrote: On Fri, Mar 24, 2017 at 02:29:50PM -0700, Ben Widawsky wrote: This was based on a patch originally by Kristian. It has been modified pretty heavily to use the new callbacks from the previous patch. v2: - Add LINEAR and Yf modifiers to list (Ville) - Combine i8xx and i965 into one list of formats (Ville) - Allow 1010102 formats for Y/Yf tiled (Ville) v3: - Handle cursor formats (Ville) - Put handling for LINEAR in the mod_support functions (Ville) Cc: Ville Syrjälä Cc: Kristian H. Kristensen Signed-off-by: Ben Widawsky --- drivers/gpu/drm/i915/intel_display.c | 112 +-- drivers/gpu/drm/i915/intel_sprite.c | 25 +++- 2 files changed, 131 insertions(+), 6 deletions(-) diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index 802a8449c5d3..bb559a116fda 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c @@ -72,6 +72,12 @@ static const uint32_t i965_primary_formats[] = { DRM_FORMAT_XBGR2101010, }; +static const uint64_t i9xx_format_modifiers[] = { + I915_FORMAT_MOD_X_TILED, + DRM_FORMAT_MOD_LINEAR, + DRM_FORMAT_MOD_INVALID +}; + static const uint32_t skl_primary_formats[] = { DRM_FORMAT_C8, DRM_FORMAT_RGB565, @@ -87,6 +93,14 @@ static const uint32_t skl_primary_formats[] = { DRM_FORMAT_VYUY, }; +static const uint64_t skl_format_modifiers[] = { + I915_FORMAT_MOD_Yf_TILED, + I915_FORMAT_MOD_Y_TILED, + I915_FORMAT_MOD_X_TILED, + DRM_FORMAT_MOD_LINEAR, + DRM_FORMAT_MOD_INVALID +}; + /* Cursor formats */ static const uint32_t intel_cursor_formats[] = { DRM_FORMAT_ARGB, @@ -13453,6 +13467,83 @@ void intel_plane_destroy(struct drm_plane *plane) kfree(to_intel_plane(plane)); } +static bool i8xx_mod_supported(uint32_t format, uint64_t modifier) +{ + switch (format) { + case DRM_FORMAT_C8: + case DRM_FORMAT_RGB565: + case DRM_FORMAT_XRGB1555: + case DRM_FORMAT_XRGB: + return modifier == DRM_FORMAT_MOD_LINEAR || + modifier == I915_FORMAT_MOD_X_TILED; + default: + return false; + } +} + +static bool i965_mod_supported(uint32_t format, uint64_t modifier) +{ + switch (format) { + case DRM_FORMAT_C8: + case DRM_FORMAT_RGB565: + case DRM_FORMAT_XRGB: + case DRM_FORMAT_XBGR: + case DRM_FORMAT_XRGB2101010: + case DRM_FORMAT_XBGR2101010: + return modifier == DRM_FORMAT_MOD_LINEAR || + modifier == I915_FORMAT_MOD_X_TILED; + default: + return false; + } +} + +static bool skl_mod_supported(uint32_t format, uint64_t modifier) +{ + switch (format) { + case DRM_FORMAT_C8: + return modifier == DRM_FORMAT_MOD_LINEAR || + (modifier >= I915_FORMAT_MOD_X_TILED && +modifier < I915_FORMAT_MOD_Yf_TILED); The >= stuff makes this harder to parse than it should be IMO. I'd just list each modifier explicitly. + case DRM_FORMAT_RGB565: + case DRM_FORMAT_XRGB: + case DRM_FORMAT_XBGR: + case DRM_FORMAT_ARGB: + case DRM_FORMAT_ABGR: + case DRM_FORMAT_XRGB2101010: + case DRM_FORMAT_XBGR2101010: + return modifier == DRM_FORMAT_MOD_LINEAR || + (modifier >= I915_FORMAT_MOD_X_TILED && + modifier <= I915_FORMAT_MOD_Yf_TILED); ditto. At first I couldn't even spot the difference between this and the C8 case. Okay, got those both. I think for now it's just: switch (format) { case DRM_FORMAT_C8: switch (modifier) { case DRM_FORMAT_MOD_LINEAR: case I915_FORMAT_MOD_X_TILED: case I915_FORMAT_MOD_Y_TILED: return true; default: return false; } case DRM_FORMAT_RGB565: case DRM_FORMAT_XRGB: case DRM_FORMAT_XBGR: case DRM_FORMAT_ARGB: case DRM_FORMAT_ABGR: case DRM_FORMAT_XRGB2101010: case DRM_FORMAT_XBGR2101010: case DRM_FORMAT_YUYV: case DRM_FORMAT_YVYU: case DRM_FORMAT_UYVY: case DRM_FORMAT_VYUY: /* All i915 modifiers are fine */ switch (modifier) { case DRM_FORMAT_MOD_LINEAR: case I915_FORMAT_MOD_X_TILED: case I915_FORMAT_MOD_Y_TILED: case I915_FORMAT_MOD_Yf_TILED: return true; default: return false; } default: return false; } + case DRM_FORMAT_YUYV: + case DRM_FORMAT_YVYU: + case DRM_FORMAT_UYVY: + case DRM_FORMAT_VYUY: +
Re: [Intel-gfx] [PATCH 3/3] drm/i915: Add format modifiers for Intel
On Wed, Mar 29, 2017 at 03:11:26PM -0700, Ben Widawsky wrote: > On 17-03-29 23:17:13, Ville Syrjälä wrote: > >On Fri, Mar 24, 2017 at 02:29:50PM -0700, Ben Widawsky wrote: > >> This was based on a patch originally by Kristian. It has been modified > >> pretty heavily to use the new callbacks from the previous patch. > >> > >> v2: > >> - Add LINEAR and Yf modifiers to list (Ville) > >> - Combine i8xx and i965 into one list of formats (Ville) > >> - Allow 1010102 formats for Y/Yf tiled (Ville) > >> > >> v3: > >> - Handle cursor formats (Ville) > >> - Put handling for LINEAR in the mod_support functions (Ville) > >> > >> Cc: Ville Syrjälä > >> Cc: Kristian H. Kristensen > >> Signed-off-by: Ben Widawsky > >> --- > >> drivers/gpu/drm/i915/intel_display.c | 112 > >> +-- > >> drivers/gpu/drm/i915/intel_sprite.c | 25 +++- > >> 2 files changed, 131 insertions(+), 6 deletions(-) > >> > >> diff --git a/drivers/gpu/drm/i915/intel_display.c > >> b/drivers/gpu/drm/i915/intel_display.c > >> index 802a8449c5d3..bb559a116fda 100644 > >> --- a/drivers/gpu/drm/i915/intel_display.c > >> +++ b/drivers/gpu/drm/i915/intel_display.c > >> @@ -72,6 +72,12 @@ static const uint32_t i965_primary_formats[] = { > >>DRM_FORMAT_XBGR2101010, > >> }; > >> > >> +static const uint64_t i9xx_format_modifiers[] = { > >> + I915_FORMAT_MOD_X_TILED, > >> + DRM_FORMAT_MOD_LINEAR, > >> + DRM_FORMAT_MOD_INVALID > >> +}; > >> + > >> static const uint32_t skl_primary_formats[] = { > >>DRM_FORMAT_C8, > >>DRM_FORMAT_RGB565, > >> @@ -87,6 +93,14 @@ static const uint32_t skl_primary_formats[] = { > >>DRM_FORMAT_VYUY, > >> }; > >> > >> +static const uint64_t skl_format_modifiers[] = { > >> + I915_FORMAT_MOD_Yf_TILED, > >> + I915_FORMAT_MOD_Y_TILED, > >> + I915_FORMAT_MOD_X_TILED, > >> + DRM_FORMAT_MOD_LINEAR, > >> + DRM_FORMAT_MOD_INVALID > >> +}; > >> + > >> /* Cursor formats */ > >> static const uint32_t intel_cursor_formats[] = { > >>DRM_FORMAT_ARGB, > >> @@ -13453,6 +13467,83 @@ void intel_plane_destroy(struct drm_plane *plane) > >>kfree(to_intel_plane(plane)); > >> } > >> > >> +static bool i8xx_mod_supported(uint32_t format, uint64_t modifier) > >> +{ > >> + switch (format) { > >> + case DRM_FORMAT_C8: > >> + case DRM_FORMAT_RGB565: > >> + case DRM_FORMAT_XRGB1555: > >> + case DRM_FORMAT_XRGB: > >> + return modifier == DRM_FORMAT_MOD_LINEAR || > >> + modifier == I915_FORMAT_MOD_X_TILED; > >> + default: > >> + return false; > >> + } > >> +} > >> + > >> +static bool i965_mod_supported(uint32_t format, uint64_t modifier) > >> +{ > >> + switch (format) { > >> + case DRM_FORMAT_C8: > >> + case DRM_FORMAT_RGB565: > >> + case DRM_FORMAT_XRGB: > >> + case DRM_FORMAT_XBGR: > >> + case DRM_FORMAT_XRGB2101010: > >> + case DRM_FORMAT_XBGR2101010: > >> + return modifier == DRM_FORMAT_MOD_LINEAR || > >> + modifier == I915_FORMAT_MOD_X_TILED; > >> + default: > >> + return false; > >> + } > >> +} > >> + > >> +static bool skl_mod_supported(uint32_t format, uint64_t modifier) > >> +{ > >> + switch (format) { > >> + case DRM_FORMAT_C8: > >> + return modifier == DRM_FORMAT_MOD_LINEAR || > >> + (modifier >= I915_FORMAT_MOD_X_TILED && > >> + modifier < I915_FORMAT_MOD_Yf_TILED); > > > >The >= stuff makes this harder to parse than it should be IMO. > >I'd just list each modifier explicitly. > > > >> + case DRM_FORMAT_RGB565: > >> + case DRM_FORMAT_XRGB: > >> + case DRM_FORMAT_XBGR: > >> + case DRM_FORMAT_ARGB: > >> + case DRM_FORMAT_ABGR: > >> + case DRM_FORMAT_XRGB2101010: > >> + case DRM_FORMAT_XBGR2101010: > >> + return modifier == DRM_FORMAT_MOD_LINEAR || > >> + (modifier >= I915_FORMAT_MOD_X_TILED && > >> + modifier <= I915_FORMAT_MOD_Yf_TILED); > > > >ditto. At first I couldn't even spot the difference between this and > >the C8 case. > > > > Okay, got those both. I think for now it's just: > switch (format) { > case DRM_FORMAT_C8: > switch (modifier) { > case DRM_FORMAT_MOD_LINEAR: > case I915_FORMAT_MOD_X_TILED: > case I915_FORMAT_MOD_Y_TILED: > return true; > default: > return false; > } > case DRM_FORMAT_RGB565: > case DRM_FORMAT_XRGB: > case DRM_FORMAT_XBGR: > case DRM_FORMAT_ARGB: > case DRM_FORMAT_ABGR: > case DRM_FORMAT_XRGB2101010: > case DRM_FORMAT_XBGR2101010: > case DRM_FORMAT_YUYV: > case DRM_FORMAT_YVYU: > case DRM_FORMAT_UYVY: > case DRM_FORMAT_VYUY: > /* All i915 modifiers are fine */ > switch (modifier) { > case DRM_FORMAT_MOD_LINEAR: >