[Intel-gfx] [PATCH 2/3] drm/i915: Fix overlay frontbuffer tracking
Chris Wilson
chris at chris-wilson.co.uk
Tue Feb 9 09:33:11 UTC 2021
Quoting Ville Syrjala (2021-02-09 02:19:17)
> From: Ville Syrjälä <ville.syrjala at linux.intel.com>
>
> We don't have a persistent fb holding a reference to the frontbuffer
> object, so every time we do the get+put we throw the frontbuffer object
> immediately away. And so the next time around we get a pristine
> frontbuffer object with bits==0 even for the old vma. This confuses
> the frontbuffer tracking code which understandably expects the old
> frontbuffer to have the overlay's bit set.
>
> Fix this by hanging on to the frontbuffer reference until the next
> flip. And just to make this a bit more clear let's track the frontbuffer
> explicitly instead of just grabbing it via the old vma.
>
> Cc: stable at vger.kernel.org
> Cc: Chris Wilson <chris at chris-wilson.co.uk>
> Cc: Joonas Lahtinen <joonas.lahtinen at linux.intel.com>
> Closes: https://gitlab.freedesktop.org/drm/intel/-/issues/1136
> Fixes: da42104f589d ("drm/i915: Hold reference to intel_frontbuffer as we track activity")
Maybe more apropos, same kernel though
Fixes: 8e7cb1799b4f ("drm/i915: Extract intel_frontbuffer active tracking")
Ok, so this definitely used to be swapping between the
obj->frontbuffer_bits and so used to have a persistent reference.
Keeping the frontbuffer tracking with the overlay makes even more sense.
> Signed-off-by: Ville Syrjälä <ville.syrjala at linux.intel.com>
Reviewed-by: Chris Wilson <chris at chris-wilson.co.uk>
> ---
> drivers/gpu/drm/i915/display/intel_overlay.c | 17 ++++++++---------
> 1 file changed, 8 insertions(+), 9 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/display/intel_overlay.c b/drivers/gpu/drm/i915/display/intel_overlay.c
> index 9c0113f15b58..ef8f44f5e751 100644
> --- a/drivers/gpu/drm/i915/display/intel_overlay.c
> +++ b/drivers/gpu/drm/i915/display/intel_overlay.c
> @@ -183,6 +183,7 @@ struct intel_overlay {
> struct intel_crtc *crtc;
> struct i915_vma *vma;
> struct i915_vma *old_vma;
> + struct intel_frontbuffer *frontbuffer;
> bool active;
> bool pfit_active;
> u32 pfit_vscale_ratio; /* shifted-point number, (1<<12) == 1.0 */
> @@ -283,21 +284,19 @@ static void intel_overlay_flip_prepare(struct intel_overlay *overlay,
> struct i915_vma *vma)
> {
> enum pipe pipe = overlay->crtc->pipe;
> - struct intel_frontbuffer *from = NULL, *to = NULL;
> + struct intel_frontbuffer *frontbuffer = NULL;
>
> drm_WARN_ON(&overlay->i915->drm, overlay->old_vma);
>
> - if (overlay->vma)
> - from = intel_frontbuffer_get(overlay->vma->obj);
> if (vma)
> - to = intel_frontbuffer_get(vma->obj);
> + frontbuffer = intel_frontbuffer_get(vma->obj);
>
> - intel_frontbuffer_track(from, to, INTEL_FRONTBUFFER_OVERLAY(pipe));
> + intel_frontbuffer_track(overlay->frontbuffer, frontbuffer,
> + INTEL_FRONTBUFFER_OVERLAY(pipe));
>
> - if (to)
> - intel_frontbuffer_put(to);
> - if (from)
> - intel_frontbuffer_put(from);
> + if (overlay->frontbuffer)
> + intel_frontbuffer_put(overlay->frontbuffer);
> + overlay->frontbuffer = frontbuffer;
And this will drop the ref on overlay->frontbuffer as we flip to NULL on
shutdown.
Now if only someone still had the code to expose sprites instead of
overlays.
-Chris
More information about the Intel-gfx
mailing list