[PATCH v14 35/41] compositor-drm: Add modes to drm_output_propose_state
Pekka Paalanen
ppaalanen at gmail.com
Mon Jan 29 10:54:58 UTC 2018
On Mon, 29 Jan 2018 09:17:49 +0000
Daniel Stone <daniel at fooishbar.org> wrote:
> Hi Pekka,
> Thanks again for all the review! I'm really grateful you got this far,
> and surprised: I'd expected the assign_planes() rewrite to be the much
> more hairy part of the series, and state to be relatively
> straightforward. \_o_/
Hi Daniel,
you're welcome!
Heh, maybe getting state straight has rippled through assing_planes()
and simplified that as well. :-)
> Most everything I've seen going past I agree with at least on the face
> of it. I'm going through fixing it up in various bits of downtime, and
> will reply to them all when I've had a chance to go through and do a
> last pass before sending out. So I don't forget things like, e.g.:
> https://gitlab.collabora.com/pq/weston/commit/81f74def4ed1285ad3794f80d93178039be3cae1
Please, do send out v15 only up to "Atomic modesetting support" first.
> On 26 January 2018 at 14:04, Pekka Paalanen <ppaalanen at gmail.com> wrote:
> > On Wed, 20 Dec 2017 12:26:52 +0000
> > Daniel Stone <daniels at collabora.com> wrote:
> >> +enum drm_output_propose_state_mode {
> >> + DRM_OUTPUT_PROPOSE_STATE_MIXED, /**< mix renderer & planes */
> >> + DRM_OUTPUT_PROPOSE_STATE_PLANES_ONLY, /**< only assign to planes */
> >> +};
> >
> > what is the reason to have a planes-only mode? I saw the patch
> > "compositor-drm: Add test-only mode to state application" will first
> > attempt a planes-only mode and then fall back to mixed mode. Why does
> > the planes-only mode not fall out of mixed mode naturally when it runs
> > out of views to show? This would be good to explain in the commit
> > message to justify the modes.
>
> This could again go into a comment or documentation I suppose, but I'm
> not sure where I'd put it without adding so much clutter to the code
> as to hide it. Ideas?
Commit message would be fine by me, you can be as verbose as you want
without a worry.
> Our assign_planes() loop is top (closest to eye / least occluded) to
> bottom (furthest from eye / most occluded) through the stack of views.
> If we encounter a view which is not in any way occluded and there is a
> free format-compatible (etc) overlay plane, we run a TEST_ONLY commit,
> with whatever the current state is + view on overlay plane, and keep
> the assignment if that succeeds. (Fullscreen views skip the occlusion
> test and we attempt to assign them to the scanout plane.)
>
> In the steady state, this isn't really a problem: we have the mode
> from the CRTC state (which doesn't change), the scanout plane from the
> _previous_ state (which we temporarily reuse), then we apply overlay
> planes on top of this to test.
>
> On the other hand, if we're newly enabling an output, switching modes,
> etc, the top-to-bottom ordering implies that without the previous
> state, we'll be testing mode/connectors (from CRTC state) + overlay
> planes + not-well-known scanout plane state (either disabled by
> state_invalid, or whatever it was previously; probably disabled). So
> testing isn't meaningful at all.
>
> We have two options: either punt when we don't have valid scanout
> state, or do what we do here. Which is, speculatively build a state
> composed purely of planes with no intermediate checks, and test once
> at the end. If it works, then we use it. If not, we build a
> renderer-only (i.e. renderer + cursor) state and just use that. In the
> next repaint, we will use the normal 'mixed' mode.
>
> (All of the above described is the intention. If these patches differ
> from that description, then the patches are wrong.)
Ok, this is something that never occurred to me when reading this
patch. This is going to a great length to avoid allocating a
framebuffer for the renderer unless absolutely necessary.
A quick check on "compositor-drm: Add test-only mode to state
application" revealed code:
drm_assign_planes(struct weston_output *output_base, void *repaint_data)
{
...
state = drm_output_propose_state(output_base, pending_state,
DRM_OUTPUT_PROPOSE_STATE_PLANES_ONLY);
if (!state)
state = drm_output_propose_state(output_base, pending_state,
DRM_OUTPUT_PROPOSE_STATE_MIXED);
from which I made wrong conclusions on what the two modes do. An
important bit that I missed was the hunk added to
drm_output_propose_state() that fundamentally changes how 'planes_ok'
gets set.
Another reason I was confused was that STATE_PLANES_ONLY is attempted
on every frame. Should that not be skipped if we have an existing
primary fb to test with? Then the renderer-not-needed case might be
slightly more obvious to fall out from STATE_MIXED.
Maybe it would be more clear if the hunk that sets up the real
planes_ok logic in "compositor-drm: Add test-only mode to state
application" would be moved into this patch?
Or thinking these patches from a higher level...
Essentially there are three modes: renderer-only, mixed, and
planes-only. In this patch series, the renderer-only mode is a hidden
mode under the mixed mode, and it's not obvious why the planes-only
mode exists. Mixed mode is a bit special, because it can natually fall
into renderer-only or planes-only setups.
What would you think of exposing all three modes explicitly, and having
the logic to choose one mode and the fallback to renderer-only mode in
drm_assing_planes()?
You could have a helper like
bool drm_output_has_testable_scanout_fb()
to make it more self-documenting.
Something along the lines of
if (drm_output_has_testable_scanout_fb()) {
state = drm_output_propose_state(MIXED);
} else {
state = drm_output_propose_state(PLANES_ONLY);
if (!state)
state = drm_output_propose_state(RENDERER_ONLY);
}
Thanks,
pq
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 833 bytes
Desc: OpenPGP digital signature
URL: <https://lists.freedesktop.org/archives/wayland-devel/attachments/20180129/9ca6699a/attachment-0001.sig>
More information about the wayland-devel
mailing list