summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVille Syrjälä <ville.syrjala@linux.intel.com>2019-11-11 18:45:40 +0200
committerVille Syrjälä <ville.syrjala@linux.intel.com>2025-03-21 23:10:23 +0200
commit4a64400ec6a7d8c0aba0e6a39b16a5e86d0af843 (patch)
treef23d1551490bf108ec001f0fa19f62904636f3d4
parentb45e222e71b6bf6e101241932338e62d3283e4aa (diff)
sna/video/sprite: Reset colorkey whenever disabling the sprite planeHEADmaster
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.c31
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));