From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
To: dri-devel@lists.freedesktop.org
Cc: Daniel Vetter <daniel.vetter@ffwll.ch>, intel-gfx@lists.freedesktop.org
Subject: Re: [PATCH v3 4/7] drm/atomic: Fix atomic helpers to use the new iterator macros.
Date: Tue, 17 Jan 2017 03:01:57 +0200 [thread overview]
Message-ID: <5696725.2aGLkINkpF@avalon> (raw)
In-Reply-To: <1484559464-27107-5-git-send-email-maarten.lankhorst@linux.intel.com>
Hi Maarten,
(CC'ing Daniel)
Thank you for the patch.
On Monday 16 Jan 2017 10:37:41 Maarten Lankhorst wrote:
> Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
> ---
> drivers/gpu/drm/drm_atomic_helper.c | 293 +++++++++++++++++---------------
> 1 file changed, 152 insertions(+), 141 deletions(-)
>
> diff --git a/drivers/gpu/drm/drm_atomic_helper.c
> b/drivers/gpu/drm/drm_atomic_helper.c index d153e8a72921..b26cf786ce12
> 100644
> --- a/drivers/gpu/drm/drm_atomic_helper.c
> +++ b/drivers/gpu/drm/drm_atomic_helper.c
[snip]
> @@ -245,22 +246,22 @@ steal_encoder(struct drm_atomic_state *state,
> {
> struct drm_crtc_state *crtc_state;
> struct drm_connector *connector;
> - struct drm_connector_state *connector_state;
> + struct drm_connector_state *old_connector_state, *new_connector_state;
The kernel favours one variable declaration per line, and I think this file
does as well, at least mostly (this comment holds for the rest of this patch
and the other patches in the series).
> int i;
>
> - for_each_connector_in_state(state, connector, connector_state, i) {
> + for_each_oldnew_connector_in_state(state, connector,
> old_connector_state, new_connector_state, i) {
This is getting quite long, you could wrap the line.
> struct drm_crtc *encoder_crtc;
>
> - if (connector_state->best_encoder != encoder)
> + if (new_connector_state->best_encoder != encoder)
> continue;
>
> - encoder_crtc = connector->state->crtc;
> + encoder_crtc = old_connector_state->crtc;
>
> DRM_DEBUG_ATOMIC("[ENCODER:%d:%s] in use on [CRTC:%d:%s],
stealing it\n",
> encoder->base.id, encoder->name,
> encoder_crtc->base.id, encoder_crtc->name);
>
> - set_best_encoder(state, connector_state, NULL);
> + set_best_encoder(state, new_connector_state, NULL);
>
> crtc_state = drm_atomic_get_existing_crtc_state(state,
encoder_crtc);
> crtc_state->connectors_changed = true;
[snip]
> @@ -516,14 +518,15 @@ drm_atomic_helper_check_modeset(struct drm_device
> *dev, if (ret)
> return ret;
>
> - for_each_connector_in_state(state, connector, connector_state, i) {
> + for_each_oldnew_connector_in_state(state, connector,
> old_connector_state, new_connector_state, i) {
Line wrap here too ?
> /*
> * This only sets crtc->connectors_changed for routing
changes,
> * drivers must set crtc->connectors_changed themselves when
> * connector properties need to be updated.
> */
> ret = update_connector_routing(state, connector,
> - connector_state);
> + old_connector_state,
> + new_connector_state);
> if (ret)
> return ret;
> }
[snip]
> @@ -599,15 +602,15 @@ drm_atomic_helper_check_planes(struct drm_device *dev,
> struct drm_crtc *crtc;
> struct drm_crtc_state *crtc_state;
> struct drm_plane *plane;
> - struct drm_plane_state *plane_state;
> + struct drm_plane_state *plane_state, *old_plane_state;
In some location you use new_*_state and in others *_state. I believe this
should this be standardized to avoid confusion (the code is hard enough to
read as it is :-)).
Similarly, you sometimes use *_conn_state and sometimes *_connector_state.
That should be standardized as well.
> int i, ret = 0;
>
> - for_each_plane_in_state(state, plane, plane_state, i) {
> + for_each_oldnew_plane_in_state(state, plane, old_plane_state,
> plane_state, i) {
> const struct drm_plane_helper_funcs *funcs;
>
> funcs = plane->helper_private;
>
> - drm_atomic_helper_plane_changed(state, plane_state, plane);
> + drm_atomic_helper_plane_changed(state, old_plane_state,
> plane_state, plane);
>
> if (!funcs || !funcs->atomic_check)
> continue;
[snip]
> @@ -974,18 +977,18 @@ void drm_atomic_helper_commit_modeset_enables(struct
> drm_device *dev, }
> }
>
> - for_each_connector_in_state(old_state, connector, old_conn_state, i) {
> + for_each_new_connector_in_state(old_state, connector, conn_state, i) {
Not strictly related to this patch, but I've been wondering how this works,
given that we need to loop over connectors in the new state, not the old
state. After some investigation I've realized that both the old and new states
contain the same list of objects, as we don't keep a copy of the old global
atomic state. old_state was the new state before the state swap, and the swap
operation sets state->/objects/[*].state to the old state for all objects, but
doesn't modify the object pointers. This is possibly more of a question for
Daniel, should this be captured in the documentation somewhere (and is my
understanding correct) ?
> const struct drm_encoder_helper_funcs *funcs;
> struct drm_encoder *encoder;
>
> - if (!connector->state->best_encoder)
> + if (!conn_state->best_encoder)
> continue;
>
> - if (!connector->state->crtc->state->active ||
> - !drm_atomic_crtc_needs_modeset(connector->state->crtc-
>state))
> + if (!conn_state->crtc->state->active ||
> + !drm_atomic_crtc_needs_modeset(conn_state->crtc->state))
> continue;
>
> - encoder = connector->state->best_encoder;
> + encoder = conn_state->best_encoder;
> funcs = encoder->helper_private;
>
> DRM_DEBUG_ATOMIC("enabling [ENCODER:%d:%s]\n",
[snip]
> @@ -1921,12 +1919,19 @@ void drm_atomic_helper_cleanup_planes(struct
> drm_device *dev, struct drm_atomic_state *old_state)
> {
> struct drm_plane *plane;
> - struct drm_plane_state *plane_state;
> + struct drm_plane_state *plane_state, *new_plane_state;
> int i;
>
> - for_each_plane_in_state(old_state, plane, plane_state, i) {
> + for_each_oldnew_plane_in_state(old_state, plane, plane_state,
> new_plane_state, i) {
> const struct drm_plane_helper_funcs *funcs;
>
> + /*
> + * This might be called before swapping when commit is
aborted,
> + * in which case we have to free the new state.
Should this be "cleanup the new state" instead of "free the new state" ?
> + */
> + if (plane_state == plane->state)
> + plane_state = new_plane_state;
> +
> funcs = plane->helper_private;
>
> if (funcs->cleanup_fb)
[snip]
--
Regards,
Laurent Pinchart
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
next prev parent reply other threads:[~2017-01-17 1:01 UTC|newest]
Thread overview: 32+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-01-16 9:37 [PATCH v3 0/7] drm/atomic: Add accessor macros for all atomic state Maarten Lankhorst
2017-01-16 9:37 ` [PATCH v3 1/7] drm/atomic: Add new iterators over all state, v3 Maarten Lankhorst
2017-01-16 23:11 ` Laurent Pinchart
2017-01-17 7:41 ` Maarten Lankhorst
2017-01-18 22:56 ` Laurent Pinchart
2017-01-23 8:48 ` Daniel Vetter
2017-02-12 12:11 ` Laurent Pinchart
2017-02-12 12:13 ` Laurent Pinchart
2017-01-16 9:37 ` [PATCH v3 2/7] drm/atomic: Make add_affected_connectors look at crtc_state Maarten Lankhorst
2017-01-16 23:29 ` Laurent Pinchart
2017-01-16 9:37 ` [PATCH v3 3/7] drm/atomic: Use new atomic iterator macros Maarten Lankhorst
2017-01-16 23:55 ` Laurent Pinchart
2017-02-14 20:03 ` Daniel Vetter
2017-02-14 20:07 ` Laurent Pinchart
2017-01-16 9:37 ` [PATCH v3 4/7] drm/atomic: Fix atomic helpers to use the new " Maarten Lankhorst
2017-01-17 1:01 ` Laurent Pinchart [this message]
2017-01-18 14:49 ` Maarten Lankhorst
2017-01-18 18:03 ` Laurent Pinchart
2017-01-16 9:37 ` [PATCH v3 5/7] drm/atomic: Add macros to access existing old/new state Maarten Lankhorst
2017-01-17 1:05 ` Laurent Pinchart
2017-01-16 9:37 ` [PATCH v3 6/7] drm/atomic: Convert get_existing_state callers to get_old/new_state, v2 Maarten Lankhorst
2017-01-17 1:12 ` Laurent Pinchart
2017-02-16 14:37 ` Maarten Lankhorst
2017-01-17 1:27 ` Laurent Pinchart
2017-02-16 14:34 ` Maarten Lankhorst
2017-01-16 9:37 ` [PATCH v3 7/7] drm/blend: Use new atomic iterator macros Maarten Lankhorst
2017-01-17 1:14 ` Laurent Pinchart
2017-01-16 11:24 ` ✗ Fi.CI.BAT: warning for drm/atomic: Add accessor macros for all atomic state. (rev4) Patchwork
2017-01-17 0:45 ` [PATCH v3 0/7] drm/atomic: Add accessor macros for all atomic state Laurent Pinchart
2017-01-23 8:50 ` [Intel-gfx] " Daniel Vetter
2017-01-17 1:34 ` Laurent Pinchart
2017-02-12 12:35 ` Laurent Pinchart
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=5696725.2aGLkINkpF@avalon \
--to=laurent.pinchart@ideasonboard.com \
--cc=daniel.vetter@ffwll.ch \
--cc=dri-devel@lists.freedesktop.org \
--cc=intel-gfx@lists.freedesktop.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox