sna/video/sprite: Try disabling plane before giving up on colorkey

When we're trying to reinstate the colorkey we might fail on account of
the plane still being enable with a configuration that prevent the
use of colorkey. This happens easily with NV12 since the plane scaler
required by even unscaled NV12 is not compatible with colorkey.

To work around the problem let's try disabling the plane first, then
re-enable the colorkey, and finally we will try to re-enable the plane.
The plane re-enable may fail, in which case we'll head to the GPU
scaling fallback path. The cost is a flash of the colorkey when the
plane blink off and then back on.

Help me atomic ioctl, you're my only hope!

Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
This commit is contained in:
Ville Syrjälä 2018-05-29 21:33:15 +03:00 committed by Chris Wilson
parent bb5ee1adea
commit 42c24d32d0
1 changed files with 13 additions and 3 deletions

View File

@ -270,9 +270,19 @@ sna_video_sprite_show(struct sna *sna,
if (drmIoctl(sna->kgem.fd,
LOCAL_IOCTL_I915_SET_SPRITE_COLORKEY,
&set)) {
xf86DrvMsg(sna->scrn->scrnIndex, X_ERROR,
"failed to update color key, disabling future updates\n");
video->has_color_key = false;
memset(&s, 0, sizeof(s));
s.plane_id = sna_crtc_to_sprite(crtc, video->idx);
/* try to disable the plane first */
if (drmIoctl(video->sna->kgem.fd, LOCAL_IOCTL_MODE_SETPLANE, &s))
xf86DrvMsg(video->sna->scrn->scrnIndex, X_ERROR,
"failed to disable plane\n");
if (drmIoctl(sna->kgem.fd, LOCAL_IOCTL_I915_SET_SPRITE_COLORKEY, &set)) {
xf86DrvMsg(sna->scrn->scrnIndex, X_ERROR,
"failed to update color key, disabling future updates\n");
video->has_color_key = false;
}
}
video->color_key_changed &= ~(1 << pipe);