From: Ville Syrjälä <ville.syrjala@xxxxxxxxxxxxxxx> Let's disable the colorkey whenever we hide the sprite. The colorkey is a non-standard thing so generic kms clients have no way to disable it, and the kernel may reject certain otherwise legal things if colorkeying is left active. Signed-off-by: Ville Syrjälä <ville.syrjala@xxxxxxxxxxxxxxx> --- src/sna/sna_video_sprite.c | 31 ++++++++++++++++++++----------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/src/sna/sna_video_sprite.c b/src/sna/sna_video_sprite.c index 5f1e4616a23e..5cb9e638abe0 100644 --- a/src/sna/sna_video_sprite.c +++ b/src/sna/sna_video_sprite.c @@ -93,15 +93,34 @@ static const XvAttributeRec attribs[] = { { XvSettable | XvGettable, 0, 1, (char *)"XV_ALWAYS_ON_TOP" }, }; +#define DRM_I915_SET_SPRITE_COLORKEY 0x2b +#define LOCAL_IOCTL_I915_SET_SPRITE_COLORKEY DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_SET_SPRITE_COLORKEY, struct local_intel_sprite_colorkey) +#define LOCAL_IOCTL_MODE_ADDFB2 DRM_IOWR(0xb8, struct local_mode_fb_cmd2) + +struct local_intel_sprite_colorkey { + uint32_t plane_id; + uint32_t min_value; + uint32_t channel_mask; + uint32_t max_value; + uint32_t flags; +}; + static void sna_video_sprite_hide(xf86CrtcPtr crtc, struct sna_video *video) { struct local_mode_set_plane s = { .plane_id = sna_crtc_to_sprite(crtc, video->idx), }; + struct local_intel_sprite_colorkey key = { + .plane_id = sna_crtc_to_sprite(crtc, video->idx), + }; + int index = sna_crtc_index(crtc); if (drmIoctl(video->sna->kgem.fd, LOCAL_IOCTL_MODE_SETPLANE, &s)) xf86DrvMsg(video->sna->scrn->scrnIndex, X_ERROR, "failed to disable plane\n"); + + drmIoctl(video->sna->kgem.fd, LOCAL_IOCTL_I915_SET_SPRITE_COLORKEY, &key); + video->color_key_changed |= 1 << index; } static int sna_video_sprite_stop(ddStopVideo_ARGS) @@ -300,18 +319,8 @@ sna_video_sprite_show(struct sna *sna, VG_CLEAR(s); s.plane_id = sna_crtc_to_sprite(crtc, video->idx); -#define DRM_I915_SET_SPRITE_COLORKEY 0x2b -#define LOCAL_IOCTL_I915_SET_SPRITE_COLORKEY DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_SET_SPRITE_COLORKEY, struct local_intel_sprite_colorkey) -#define LOCAL_IOCTL_MODE_ADDFB2 DRM_IOWR(0xb8, struct local_mode_fb_cmd2) - if (video->color_key_changed & (1 << index) && video->has_color_key) { - struct local_intel_sprite_colorkey { - uint32_t plane_id; - uint32_t min_value; - uint32_t channel_mask; - uint32_t max_value; - uint32_t flags; - } set; + struct local_intel_sprite_colorkey set; DBG(("%s: updating color key: %x\n", __FUNCTION__, video->color_key)); -- 2.45.3