last = list_empty(zorder_list) ?
NULL : list_last_entry(zorder_list, typeof(*last), zlist_node);
/* Considering the list sequence is zpos increasing, so if list is empty * or the zpos of new node bigger than the last node in list, no need * loop and just insert the new one to the tail of the list.
*/ if (!last || (new->base.zpos > last->base.zpos)) {
list_add_tail(&new->zlist_node, zorder_list); return 0;
}
/* Build the list by zpos increasing */
list_for_each_entry(node, zorder_list, zlist_node) { if (new->base.zpos < node->base.zpos) {
list_add_tail(&new->zlist_node, &node->zlist_node); break;
} elseif (node->base.zpos == new->base.zpos) { struct drm_plane *a = node->base.plane; struct drm_plane *b = new->base.plane;
/* Komeda doesn't support setting a same zpos for * different planes.
*/
DRM_DEBUG_ATOMIC("PLANE: %s and PLANE: %s are configured same zpos: %d.\n",
a->name, b->name, node->base.zpos); return -EINVAL;
}
}
/* This loop also added all effected planes into the new state */
drm_for_each_plane_mask(plane, crtc->dev, crtc_st->plane_mask) {
plane_st = drm_atomic_get_plane_state(state, plane); if (IS_ERR(plane_st)) return PTR_ERR(plane_st);
/* Build a list by zpos increasing */
err = komeda_plane_state_list_add(plane_st, &zorder_list); if (err) return err;
}
plane_st->normalized_zpos = order++; /* When layer_split has been enabled, one plane will be handled * by two separated komeda layers (left/right), which may needs * two zorders. * - zorder: for left_layer for left display part. * - zorder + 1: will be reserved for right layer.
*/ if (to_kplane_st(plane_st)->layer_split)
order++;
/* calculate max slave zorder */ if (has_bit(drm_plane_index(plane), kcrtc->slave_planes)) {
slave_zpos = plane_st->normalized_zpos; if (to_kplane_st(plane_st)->layer_split)
slave_zpos++;
kcrtc_st->max_slave_zorder =
max(slave_zpos, kcrtc_st->max_slave_zorder);
}
}
crtc_st->zpos_changed = true;
return 0;
}
staticint komeda_kms_check(struct drm_device *dev, struct drm_atomic_state *state)
{ struct drm_crtc *crtc; struct drm_crtc_state *new_crtc_st; int i, err;
err = drm_atomic_helper_check_modeset(dev, state); if (err) return err;
/* Komeda need to re-calculate resource assumption in every commit * so need to add all affected_planes (even unchanged) to * drm_atomic_state.
*/
for_each_new_crtc_in_state(state, crtc, new_crtc_st, i) {
err = drm_atomic_add_affected_planes(state, crtc); if (err) return err;
err = komeda_crtc_normalize_zpos(crtc, new_crtc_st); if (err) return err;
}
err = drm_atomic_helper_check_planes(dev, state); if (err) return err;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.