mirror of https://gitee.com/openkylin/linux.git
drm/i915: Unconditionally clear plane visibility, v2.
We need to assume the plane has been visible before, even if no CRTC is assigned to the plane. This is because when enabling a nv12 plane on gen11, we will have to enable an extra plane and make it visible by marking it in crtc_state->active_planes for intel_update_planes_on_crtc(). Additionally, clear visible flag in intel_plane_atomic_check, in case we ever hit a bug with visibility. Our code implicitly assumes that plane_state->visible is only true when crtc and fb are set, so we will either null deref in intel_fbc_choose_crtc() or do something bad during the actual commit which cares even more. Changes since v1: - Unconditionally clear crtc_state->active_planes as well. - Reword commit message, since this is now a preparation patch for NV12 Y / UV plane linking. Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com> [mlankhorst: Clear nv12_planes in the beginning as well, clarify commit message] Reviewed-by: Matt Roper <matthew.d.roper@intel.com> Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20180920102711.4184-4-maarten.lankhorst@linux.intel.com
This commit is contained in:
parent
c249c5f643
commit
62ef0dd3cc
|
@ -117,10 +117,14 @@ int intel_plane_atomic_check_with_state(const struct intel_crtc_state *old_crtc_
|
||||||
struct intel_plane *intel_plane = to_intel_plane(plane);
|
struct intel_plane *intel_plane = to_intel_plane(plane);
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
crtc_state->active_planes &= ~BIT(intel_plane->id);
|
||||||
|
crtc_state->nv12_planes &= ~BIT(intel_plane->id);
|
||||||
|
intel_state->base.visible = false;
|
||||||
|
|
||||||
|
/* If this is a cursor plane, no further checks are needed. */
|
||||||
if (!intel_state->base.crtc && !old_plane_state->base.crtc)
|
if (!intel_state->base.crtc && !old_plane_state->base.crtc)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
intel_state->base.visible = false;
|
|
||||||
ret = intel_plane->check_plane(crtc_state, intel_state);
|
ret = intel_plane->check_plane(crtc_state, intel_state);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -128,13 +132,9 @@ int intel_plane_atomic_check_with_state(const struct intel_crtc_state *old_crtc_
|
||||||
/* FIXME pre-g4x don't work like this */
|
/* FIXME pre-g4x don't work like this */
|
||||||
if (state->visible)
|
if (state->visible)
|
||||||
crtc_state->active_planes |= BIT(intel_plane->id);
|
crtc_state->active_planes |= BIT(intel_plane->id);
|
||||||
else
|
|
||||||
crtc_state->active_planes &= ~BIT(intel_plane->id);
|
|
||||||
|
|
||||||
if (state->visible && state->fb->format->format == DRM_FORMAT_NV12)
|
if (state->visible && state->fb->format->format == DRM_FORMAT_NV12)
|
||||||
crtc_state->nv12_planes |= BIT(intel_plane->id);
|
crtc_state->nv12_planes |= BIT(intel_plane->id);
|
||||||
else
|
|
||||||
crtc_state->nv12_planes &= ~BIT(intel_plane->id);
|
|
||||||
|
|
||||||
return intel_plane_atomic_calc_changes(old_crtc_state,
|
return intel_plane_atomic_calc_changes(old_crtc_state,
|
||||||
&crtc_state->base,
|
&crtc_state->base,
|
||||||
|
@ -152,6 +152,7 @@ static int intel_plane_atomic_check(struct drm_plane *plane,
|
||||||
const struct drm_crtc_state *old_crtc_state;
|
const struct drm_crtc_state *old_crtc_state;
|
||||||
struct drm_crtc_state *new_crtc_state;
|
struct drm_crtc_state *new_crtc_state;
|
||||||
|
|
||||||
|
new_plane_state->visible = false;
|
||||||
if (!crtc)
|
if (!crtc)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue