drm/i915: Calculate visibility in check_plane correctly regardless of dpms.
authorMaarten Lankhorst <maarten.lankhorst@linux.intel.com>
Thu, 3 Dec 2015 13:31:07 +0000 (14:31 +0100)
committerMaarten Lankhorst <maarten.lankhorst@linux.intel.com>
Tue, 22 Dec 2015 12:45:42 +0000 (13:45 +0100)
When the crtc is configured but not active we currently clip to (0,0)x(0,0).
This results in differences in calculations depending on dpms setting.
When the crtc is enabled but not active run check_plane as if it were on,
but afterwards set plane_state->visible = false for the checks.

Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Reviewed-by: Mika Kahola <mika.kahola@intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/1447945645-32005-13-git-send-email-maarten.lankhorst@linux.intel.com
drivers/gpu/drm/i915/intel_atomic_plane.c
drivers/gpu/drm/i915/intel_display.c

index c6bb0fc1edfb57280c37972e656c1eb6f04c0990..856c3118bb87b756633fe3477bcae3b994ad2b6d 100644 (file)
@@ -152,9 +152,9 @@ static int intel_plane_atomic_check(struct drm_plane *plane,
        intel_state->clip.x1 = 0;
        intel_state->clip.y1 = 0;
        intel_state->clip.x2 =
-               crtc_state->base.active ? crtc_state->pipe_src_w : 0;
+               crtc_state->base.enable ? crtc_state->pipe_src_w : 0;
        intel_state->clip.y2 =
-               crtc_state->base.active ? crtc_state->pipe_src_h : 0;
+               crtc_state->base.enable ? crtc_state->pipe_src_h : 0;
 
        if (state->fb && intel_rotation_90_or_270(state->rotation)) {
                if (!(state->fb->modifier[0] == I915_FORMAT_MOD_Y_TILED ||
index 30cd48ea61e8f6d9e682e0ebe132f4e3a7795469..eea2cd26ba176262dee1549b7d5c43dd6f059276 100644 (file)
@@ -11873,8 +11873,13 @@ int intel_plane_atomic_calc_changes(struct drm_crtc_state *crtc_state,
        if (!was_crtc_enabled && WARN_ON(was_visible))
                was_visible = false;
 
-       if (!is_crtc_enabled && WARN_ON(visible))
-               visible = false;
+       /*
+        * Visibility is calculated as if the crtc was on, but
+        * after scaler setup everything depends on it being off
+        * when the crtc isn't active.
+        */
+       if (!is_crtc_enabled)
+               to_intel_plane_state(plane_state)->visible = visible = false;
 
        if (!was_visible && !visible)
                return 0;