Commit 859b456b authored by Ben Skeggs's avatar Ben Skeggs

drm/nouveau/kms/nv50-: store window visibility in state

Window visibility is going to become a little more complicated with the
upcoming LUT changes, so store the calculated value to avoid needing to
recalculate the armed state again.
Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent 45a2945a
...@@ -136,6 +136,8 @@ nv50_head_atom_get(struct drm_atomic_state *state, struct drm_crtc *crtc) ...@@ -136,6 +136,8 @@ nv50_head_atom_get(struct drm_atomic_state *state, struct drm_crtc *crtc)
struct nv50_wndw_atom { struct nv50_wndw_atom {
struct drm_plane_state state; struct drm_plane_state state;
bool visible;
struct { struct {
u32 handle; u32 handle;
u16 offset:12; u16 offset:12;
......
...@@ -244,26 +244,33 @@ nv50_wndw_atomic_check(struct drm_plane *plane, struct drm_plane_state *state) ...@@ -244,26 +244,33 @@ nv50_wndw_atomic_check(struct drm_plane *plane, struct drm_plane_state *state)
struct nv50_wndw_atom *armw = nv50_wndw_atom(wndw->plane.state); struct nv50_wndw_atom *armw = nv50_wndw_atom(wndw->plane.state);
struct nv50_wndw_atom *asyw = nv50_wndw_atom(state); struct nv50_wndw_atom *asyw = nv50_wndw_atom(state);
struct nv50_head_atom *harm = NULL, *asyh = NULL; struct nv50_head_atom *harm = NULL, *asyh = NULL;
bool varm = false, asyv = false, asym = false; bool modeset = false;
int ret; int ret;
NV_ATOMIC(drm, "%s atomic_check\n", plane->name); NV_ATOMIC(drm, "%s atomic_check\n", plane->name);
/* Fetch the assembly state for the head the window will belong to,
* and determine whether the window will be visible.
*/
if (asyw->state.crtc) { if (asyw->state.crtc) {
asyh = nv50_head_atom_get(asyw->state.state, asyw->state.crtc); asyh = nv50_head_atom_get(asyw->state.state, asyw->state.crtc);
if (IS_ERR(asyh)) if (IS_ERR(asyh))
return PTR_ERR(asyh); return PTR_ERR(asyh);
asym = drm_atomic_crtc_needs_modeset(&asyh->state); modeset = drm_atomic_crtc_needs_modeset(&asyh->state);
asyv = asyh->state.active; asyw->visible = asyh->state.active;
} else {
asyw->visible = false;
} }
/* Fetch assembly state for the head the window used to belong to. */
if (armw->state.crtc) { if (armw->state.crtc) {
harm = nv50_head_atom_get(asyw->state.state, armw->state.crtc); harm = nv50_head_atom_get(asyw->state.state, armw->state.crtc);
if (IS_ERR(harm)) if (IS_ERR(harm))
return PTR_ERR(harm); return PTR_ERR(harm);
varm = harm->state.crtc->state->active;
} }
if (asyv) { /* Calculate new window state. */
if (asyw->visible) {
asyw->point.x = asyw->state.crtc_x; asyw->point.x = asyw->state.crtc_x;
asyw->point.y = asyw->state.crtc_y; asyw->point.y = asyw->state.crtc_y;
if (memcmp(&armw->point, &asyw->point, sizeof(asyw->point))) if (memcmp(&armw->point, &asyw->point, sizeof(asyw->point)))
...@@ -273,18 +280,22 @@ nv50_wndw_atomic_check(struct drm_plane *plane, struct drm_plane_state *state) ...@@ -273,18 +280,22 @@ nv50_wndw_atomic_check(struct drm_plane *plane, struct drm_plane_state *state)
if (ret) if (ret)
return ret; return ret;
} else } else
if (varm) { if (armw->visible) {
nv50_wndw_atomic_check_release(wndw, asyw, harm); nv50_wndw_atomic_check_release(wndw, asyw, harm);
} else { } else {
return 0; return 0;
} }
if (!asyv || asym) { /* Aside from the obvious case where the window is actively being
* disabled, we might also need to temporarily disable the window
* when performing certain modeset operations.
*/
if (!asyw->visible || modeset) {
asyw->clr.ntfy = armw->ntfy.handle != 0; asyw->clr.ntfy = armw->ntfy.handle != 0;
asyw->clr.sema = armw->sema.handle != 0; asyw->clr.sema = armw->sema.handle != 0;
if (wndw->func->image_clr) if (wndw->func->image_clr)
asyw->clr.image = armw->image.handle[0] != 0; asyw->clr.image = armw->image.handle[0] != 0;
asyw->set.lut = wndw->func->lut && asyv; asyw->set.lut = wndw->func->lut && asyw->visible;
} }
return 0; return 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment