[PATCH xf86-video-intel 7/7] sna/video/sprite: Reset colorkey whenever disabling the sprite plane

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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




[Index of Archives]     [AMD Graphics]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux