[Intel-gfx] [1/2] drm/i915: Extract intel_wm_plane_visible()
Dorota Czaplejewicz
dorota.czaplejewicz at collabora.co.uk
Tue Mar 21 09:58:33 UTC 2017
I have tested this patch series (with [2/2] drm/i915: Fix SKL cursor watermarks, X-Patchwork-Id: 143965, 143966) and I can confirm it fixes https://bugs.freedesktop.org/show_bug.cgi?id=100195
Tested-by: Dorota Czaplejewicz <dorota.czaplejewicz at collabora.co.uk>
On Tue, 14 Mar 2017 17:10:49 +0200
ville.syrjala at linux.intel.com wrote:
> From: Ville Syrjälä <ville.syrjala at linux.intel.com>
>
> All platforms that lack double buffered watermarks will need to
> handle the legacy cursor updates in the same way. So let's extract the
> logic to determine the plane visibility into a small helper. For
> simplicity we'll make the function DTRT for any plane, but only apply
> the special sauce for cursor planes.
>
> Signed-off-by: Ville Syrjälä <ville.syrjala at linux.intel.com>
> ---
> drivers/gpu/drm/i915/intel_pm.c | 39 +++++++++++++++++++++++++++------------
> 1 file changed, 27 insertions(+), 12 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
> index 2ca38ae4421e..3b0d379b6f38 100644
> --- a/drivers/gpu/drm/i915/intel_pm.c
> +++ b/drivers/gpu/drm/i915/intel_pm.c
> @@ -655,6 +655,29 @@ static unsigned long intel_calculate_wm(unsigned long clock_in_khz,
> return wm_size;
> }
>
> +static bool intel_wm_plane_visible(const struct intel_crtc_state *crtc_state,
> + const struct intel_plane_state *plane_state)
> +{
> + struct intel_plane *plane = to_intel_plane(plane_state->base.plane);
> +
> + /* FIXME check the 'enable' instead */
> + if (!crtc_state->base.active)
> + return false;
> +
> + /*
> + * Treat cursor with fb as always visible since cursor updates
> + * can happen faster than the vrefresh rate, and the current
> + * watermark code doesn't handle that correctly. Cursor updates
> + * which set/clear the fb or change the cursor size are going
> + * to get throttled by intel_legacy_cursor_update() to work
> + * around this problem with the watermark code.
> + */
> + if (plane->id == PLANE_CURSOR)
> + return plane_state->base.fb != NULL;
> + else
> + return plane_state->base.visible;
> +}
> +
> static struct intel_crtc *single_enabled_crtc(struct drm_i915_private *dev_priv)
> {
> struct intel_crtc *crtc, *enabled = NULL;
> @@ -1961,7 +1984,7 @@ static uint32_t ilk_compute_pri_wm(const struct intel_crtc_state *cstate,
> uint32_t method1, method2;
> int cpp;
>
> - if (!cstate->base.active || !pstate->base.visible)
> + if (!intel_wm_plane_visible(cstate, pstate))
> return 0;
>
> cpp = pstate->base.fb->format->cpp[0];
> @@ -1990,7 +2013,7 @@ static uint32_t ilk_compute_spr_wm(const struct intel_crtc_state *cstate,
> uint32_t method1, method2;
> int cpp;
>
> - if (!cstate->base.active || !pstate->base.visible)
> + if (!intel_wm_plane_visible(cstate, pstate))
> return 0;
>
> cpp = pstate->base.fb->format->cpp[0];
> @@ -2013,15 +2036,7 @@ static uint32_t ilk_compute_cur_wm(const struct intel_crtc_state *cstate,
> {
> int cpp;
>
> - /*
> - * Treat cursor with fb as always visible since cursor updates
> - * can happen faster than the vrefresh rate, and the current
> - * watermark code doesn't handle that correctly. Cursor updates
> - * which set/clear the fb or change the cursor size are going
> - * to get throttled by intel_legacy_cursor_update() to work
> - * around this problem with the watermark code.
> - */
> - if (!cstate->base.active || !pstate->base.fb)
> + if (!intel_wm_plane_visible(cstate, pstate))
> return 0;
>
> cpp = pstate->base.fb->format->cpp[0];
> @@ -2038,7 +2053,7 @@ static uint32_t ilk_compute_fbc_wm(const struct intel_crtc_state *cstate,
> {
> int cpp;
>
> - if (!cstate->base.active || !pstate->base.visible)
> + if (!intel_wm_plane_visible(cstate, pstate))
> return 0;
>
> cpp = pstate->base.fb->format->cpp[0];
More information about the Intel-gfx
mailing list