diff options
author | Ville Syrjälä <ville.syrjala@linux.intel.com> | 2019-11-11 18:45:40 +0200 |
---|---|---|
committer | Ville Syrjälä <ville.syrjala@linux.intel.com> | 2025-03-21 23:10:23 +0200 |
commit | 4a64400ec6a7d8c0aba0e6a39b16a5e86d0af843 (patch) | |
tree | f23d1551490bf108ec001f0fa19f62904636f3d4 | |
parent | b45e222e71b6bf6e101241932338e62d3283e4aa (diff) |
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@linux.intel.com>
-rw-r--r-- | src/sna/sna_video_sprite.c | 31 |
1 files changed, 20 insertions, 11 deletions
diff --git a/src/sna/sna_video_sprite.c b/src/sna/sna_video_sprite.c index 5f1e4616..5cb9e638 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)); |