Commit b9e831dc authored by Paulo Zanoni's avatar Paulo Zanoni Committed by Daniel Vetter

drm/i915: reject invalid formats for FBC

This commit is essentially a rewrite of "drm/i915: Check pixel format
for fbc" from Ville Syrjälä. The idea is the same, but the code is
different due to all the changes that happened since his original
patch. So any bugs are due to my bad rewrite.

v2:
  - Drop the alpha formats (Ville).
v3:
  - Drop the stale comment (Ville).

Testcases: igt/kms_frontbuffer_tracking/*fbc*-${format_name}-draw-*
Credits-to: Ville Syrjälä <ville.syrjala@linux.intel.com>
Reviewed-by: default avatarVille Syrjälä <ville.syrjala@linux.intel.com>
Signed-off-by: default avatarPaulo Zanoni <paulo.r.zanoni@intel.com>
Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
parent 40f4022e
...@@ -950,6 +950,7 @@ struct i915_fbc { ...@@ -950,6 +950,7 @@ struct i915_fbc {
FBC_IN_DBG_MASTER, /* kernel debugger is active */ FBC_IN_DBG_MASTER, /* kernel debugger is active */
FBC_BAD_STRIDE, /* stride is not supported */ FBC_BAD_STRIDE, /* stride is not supported */
FBC_PIXEL_RATE, /* pixel rate is too big */ FBC_PIXEL_RATE, /* pixel rate is too big */
FBC_PIXEL_FORMAT /* pixel format is invalid */
} no_fbc_reason; } no_fbc_reason;
bool (*fbc_enabled)(struct drm_i915_private *dev_priv); bool (*fbc_enabled)(struct drm_i915_private *dev_priv);
......
...@@ -484,6 +484,8 @@ const char *intel_no_fbc_reason_str(enum no_fbc_reason reason) ...@@ -484,6 +484,8 @@ const char *intel_no_fbc_reason_str(enum no_fbc_reason reason)
return "framebuffer stride not supported"; return "framebuffer stride not supported";
case FBC_PIXEL_RATE: case FBC_PIXEL_RATE:
return "pixel rate is too big"; return "pixel rate is too big";
case FBC_PIXEL_FORMAT:
return "pixel format is invalid";
default: default:
MISSING_CASE(reason); MISSING_CASE(reason);
return "unknown reason"; return "unknown reason";
...@@ -709,6 +711,29 @@ static bool stride_is_valid(struct drm_i915_private *dev_priv, ...@@ -709,6 +711,29 @@ static bool stride_is_valid(struct drm_i915_private *dev_priv,
return true; return true;
} }
static bool pixel_format_is_valid(struct drm_framebuffer *fb)
{
struct drm_device *dev = fb->dev;
struct drm_i915_private *dev_priv = dev->dev_private;
switch (fb->pixel_format) {
case DRM_FORMAT_XRGB8888:
case DRM_FORMAT_XBGR8888:
return true;
case DRM_FORMAT_XRGB1555:
case DRM_FORMAT_RGB565:
/* 16bpp not supported on gen2 */
if (IS_GEN2(dev))
return false;
/* WaFbcOnly1to1Ratio:ctg */
if (IS_G4X(dev_priv))
return false;
return true;
default:
return false;
}
}
/** /**
* __intel_fbc_update - enable/disable FBC as needed, unlocked * __intel_fbc_update - enable/disable FBC as needed, unlocked
* @dev_priv: i915 device instance * @dev_priv: i915 device instance
...@@ -824,6 +849,11 @@ static void __intel_fbc_update(struct drm_i915_private *dev_priv) ...@@ -824,6 +849,11 @@ static void __intel_fbc_update(struct drm_i915_private *dev_priv)
goto out_disable; goto out_disable;
} }
if (!pixel_format_is_valid(fb)) {
set_no_fbc_reason(dev_priv, FBC_PIXEL_FORMAT);
goto out_disable;
}
/* If the kernel debugger is active, always disable compression */ /* If the kernel debugger is active, always disable compression */
if (in_dbg_master()) { if (in_dbg_master()) {
set_no_fbc_reason(dev_priv, FBC_IN_DBG_MASTER); set_no_fbc_reason(dev_priv, FBC_IN_DBG_MASTER);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment