summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVille Syrjälä <ville.syrjala@linux.intel.com>2018-05-29 21:33:15 +0300
committerChris Wilson <chris@chris-wilson.co.uk>2018-05-31 20:35:44 +0100
commit42c24d32d03410c65bb7165b90cf166d762ccb8e (patch)
treee027ba8a5a7866d100c16b142f5c2f4964ae6467
parentbb5ee1adea838b99d60e18523c3632eb02fb04d8 (diff)
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>
-rw-r--r--src/sna/sna_video_sprite.c16
1 files changed, 13 insertions, 3 deletions
diff --git a/src/sna/sna_video_sprite.c b/src/sna/sna_video_sprite.c
index 0f52f032..f713abcb 100644
--- a/src/sna/sna_video_sprite.c
+++ b/src/sna/sna_video_sprite.c
@@ -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);