diff options
author | Ville Syrjälä <ville.syrjala@linux.intel.com> | 2013-02-08 16:13:35 -0500 |
---|---|---|
committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2013-02-15 04:30:37 -0500 |
commit | 2c6602df1a7ff79c9e489602445a6d7eb728744e (patch) | |
tree | 553f9792187be83ec128a071751a3b9cd79c128f /drivers/gpu/drm/i915/intel_sprite.c | |
parent | 26739f12cf210cb8df35969258a1f064e8e12b63 (diff) |
drm/i915: Fix sprite_scaling_enabled for multiple sprites
We have more than one sprite, so a boolean simply won't cut it.
Turn sprite_scaling_enabled into a bitmask and track the state
of sprite scaler for each sprite independently.
Also don't re-enable LP watermarks until the sprite registers
have actually been written, and thus sprite scaling has really
been disabled.
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'drivers/gpu/drm/i915/intel_sprite.c')
-rw-r--r-- | drivers/gpu/drm/i915/intel_sprite.c | 27 |
1 files changed, 16 insertions, 11 deletions
diff --git a/drivers/gpu/drm/i915/intel_sprite.c b/drivers/gpu/drm/i915/intel_sprite.c index f8293061d6bd..03cfd62d17e2 100644 --- a/drivers/gpu/drm/i915/intel_sprite.c +++ b/drivers/gpu/drm/i915/intel_sprite.c | |||
@@ -50,6 +50,7 @@ ivb_update_plane(struct drm_plane *plane, struct drm_framebuffer *fb, | |||
50 | u32 sprctl, sprscale = 0; | 50 | u32 sprctl, sprscale = 0; |
51 | unsigned long sprsurf_offset, linear_offset; | 51 | unsigned long sprsurf_offset, linear_offset; |
52 | int pixel_size = drm_format_plane_cpp(fb->pixel_format, 0); | 52 | int pixel_size = drm_format_plane_cpp(fb->pixel_format, 0); |
53 | bool scaling_was_enabled = dev_priv->sprite_scaling_enabled; | ||
53 | 54 | ||
54 | sprctl = I915_READ(SPRCTL(pipe)); | 55 | sprctl = I915_READ(SPRCTL(pipe)); |
55 | 56 | ||
@@ -103,19 +104,15 @@ ivb_update_plane(struct drm_plane *plane, struct drm_framebuffer *fb, | |||
103 | * when scaling is disabled. | 104 | * when scaling is disabled. |
104 | */ | 105 | */ |
105 | if (crtc_w != src_w || crtc_h != src_h) { | 106 | if (crtc_w != src_w || crtc_h != src_h) { |
106 | if (!dev_priv->sprite_scaling_enabled) { | 107 | dev_priv->sprite_scaling_enabled |= 1 << pipe; |
107 | dev_priv->sprite_scaling_enabled = true; | 108 | |
109 | if (!scaling_was_enabled) { | ||
108 | intel_update_watermarks(dev); | 110 | intel_update_watermarks(dev); |
109 | intel_wait_for_vblank(dev, pipe); | 111 | intel_wait_for_vblank(dev, pipe); |
110 | } | 112 | } |
111 | sprscale = SPRITE_SCALE_ENABLE | (src_w << 16) | src_h; | 113 | sprscale = SPRITE_SCALE_ENABLE | (src_w << 16) | src_h; |
112 | } else { | 114 | } else |
113 | if (dev_priv->sprite_scaling_enabled) { | 115 | dev_priv->sprite_scaling_enabled &= ~(1 << pipe); |
114 | dev_priv->sprite_scaling_enabled = false; | ||
115 | /* potentially re-enable LP watermarks */ | ||
116 | intel_update_watermarks(dev); | ||
117 | } | ||
118 | } | ||
119 | 116 | ||
120 | I915_WRITE(SPRSTRIDE(pipe), fb->pitches[0]); | 117 | I915_WRITE(SPRSTRIDE(pipe), fb->pitches[0]); |
121 | I915_WRITE(SPRPOS(pipe), (crtc_y << 16) | crtc_x); | 118 | I915_WRITE(SPRPOS(pipe), (crtc_y << 16) | crtc_x); |
@@ -141,6 +138,10 @@ ivb_update_plane(struct drm_plane *plane, struct drm_framebuffer *fb, | |||
141 | I915_WRITE(SPRCTL(pipe), sprctl); | 138 | I915_WRITE(SPRCTL(pipe), sprctl); |
142 | I915_MODIFY_DISPBASE(SPRSURF(pipe), obj->gtt_offset + sprsurf_offset); | 139 | I915_MODIFY_DISPBASE(SPRSURF(pipe), obj->gtt_offset + sprsurf_offset); |
143 | POSTING_READ(SPRSURF(pipe)); | 140 | POSTING_READ(SPRSURF(pipe)); |
141 | |||
142 | /* potentially re-enable LP watermarks */ | ||
143 | if (scaling_was_enabled && !dev_priv->sprite_scaling_enabled) | ||
144 | intel_update_watermarks(dev); | ||
144 | } | 145 | } |
145 | 146 | ||
146 | static void | 147 | static void |
@@ -150,6 +151,7 @@ ivb_disable_plane(struct drm_plane *plane) | |||
150 | struct drm_i915_private *dev_priv = dev->dev_private; | 151 | struct drm_i915_private *dev_priv = dev->dev_private; |
151 | struct intel_plane *intel_plane = to_intel_plane(plane); | 152 | struct intel_plane *intel_plane = to_intel_plane(plane); |
152 | int pipe = intel_plane->pipe; | 153 | int pipe = intel_plane->pipe; |
154 | bool scaling_was_enabled = dev_priv->sprite_scaling_enabled; | ||
153 | 155 | ||
154 | I915_WRITE(SPRCTL(pipe), I915_READ(SPRCTL(pipe)) & ~SPRITE_ENABLE); | 156 | I915_WRITE(SPRCTL(pipe), I915_READ(SPRCTL(pipe)) & ~SPRITE_ENABLE); |
155 | /* Can't leave the scaler enabled... */ | 157 | /* Can't leave the scaler enabled... */ |
@@ -159,8 +161,11 @@ ivb_disable_plane(struct drm_plane *plane) | |||
159 | I915_MODIFY_DISPBASE(SPRSURF(pipe), 0); | 161 | I915_MODIFY_DISPBASE(SPRSURF(pipe), 0); |
160 | POSTING_READ(SPRSURF(pipe)); | 162 | POSTING_READ(SPRSURF(pipe)); |
161 | 163 | ||
162 | dev_priv->sprite_scaling_enabled = false; | 164 | dev_priv->sprite_scaling_enabled &= ~(1 << pipe); |
163 | intel_update_watermarks(dev); | 165 | |
166 | /* potentially re-enable LP watermarks */ | ||
167 | if (scaling_was_enabled && !dev_priv->sprite_scaling_enabled) | ||
168 | intel_update_watermarks(dev); | ||
164 | } | 169 | } |
165 | 170 | ||
166 | static int | 171 | static int |