Commit graph

78 commits

Author SHA1 Message Date
Simon Ser
29dfe66ecf
example: add dynamic example
This example demonstrates how incremental layer updates should be applied. It
contains a basic rendering loop. Each layers has a back-buffer and a
front-buffer. The color of one of the layers will change at each frame.
2019-10-15 12:08:02 +03:00
Simon Ser
5a66e567ec
Track layer property changes
This commit adds basic per-property change tracking.

When only FB_ID has changed, we try to re-use the previous allocation. If that
fails, go on with regular plane allocation.

Closes: https://github.com/emersion/libliftoff/issues/6
2019-10-15 12:07:43 +03:00
Simon Ser
76cca57504
example: add a description of each example 2019-10-15 11:55:23 +03:00
Simon Ser
fe2e7d0133
Extract plane allocation constraints in functions
Instead of baking plane allocation constraints in output_choose_layers, extract
constraints checked at each step in check_layer_plane_compatible and final
constraints in check_alloc_valid.
2019-10-15 11:42:40 +03:00
Simon Ser
ca0cbbee02
test: add liftoff_mock_commit_count
This allows tests to read the number of atomic commits performed by the library.
2019-10-14 18:44:48 +03:00
Simon Ser
6849a6af1f
test: refactor build
Put the tests definition inside a big dictionary (with the executable test name
and the subtests). This allows to easily add more executables.
2019-10-14 18:44:48 +03:00
Simon Ser
14d64ebe39
ci: add codecov 2019-10-14 18:04:59 +03:00
Simon Ser
72f5e9bd2f
Add TODO about remaining plane counting optimization 2019-10-13 01:25:08 +03:00
Simon Ser
927efe09d2
example/compositor: handle out-of-bounds coords when compositing 2019-10-11 22:54:54 +03:00
Simon Ser
aacbcf40b4
Split plane functions into a separate file 2019-10-11 17:09:35 +03:00
Simon Ser
5115e96cd9
test: add composition tests 2019-10-11 14:31:17 +03:00
Simon Ser
d63b4291da
example/compositor: take advantage of the composition layer
Create a special layer that we will use only for composition.

If we manage to put all other layers into planes, we don't need to use it.
Otherwise, blend other layers that didn't make it in a plane.
2019-10-11 14:31:17 +03:00
Simon Ser
e9433997d9
Add liftoff_output_set_composition_layer
This lets the library user define a layer where composition will happen. At the
moment there can be at most one composition layer per output, on the primary
plane. It should be possible to remove these restrictions in the future if
desirable.

The composition layer will be put on a plane if and only if composition is
needed.

The compositor needs to know where composited layers will be blended to resolve
zpos conflicts.

Closes: https://github.com/emersion/libliftoff/issues/9
2019-10-11 14:31:17 +03:00
Simon Ser
5b8cbd76db
readme: add CI badge 2019-10-11 13:07:10 +03:00
Simon Ser
1ee86c6290
Add logging functions
This allows turning on and off debug logs, as well as defining a logging
callback.
2019-10-11 12:03:14 +03:00
Simon Ser
3671a64ade
Add opaque structs forward declaration in libliftoff.h 2019-09-30 14:19:27 -04:00
Simon Ser
fe1ee8563d
example/compositor: add flag to specify number of layers 2019-09-30 12:25:38 +03:00
Simon Ser
dd0e550a99
readme: add missing variable decl in example 2019-09-26 10:43:05 +03:00
Simon Ser
de7a7fe5f9
example/compositor: new example 2019-09-25 15:58:38 +03:00
Simon Ser
03679c9303
example/simple: don't hardcode number of layers, use white background 2019-09-25 15:16:14 +03:00
Simon Ser
a30668b06e
example: refactor dumb FB helper
This is necessary for the upcoming composer example.
2019-09-25 15:06:46 +03:00
Simon Ser
a7128585fe
example: extract helpers into separate file 2019-09-25 14:08:07 +03:00
Simon Ser
42b58e8802
example/simple: disable CRTCs we don't use 2019-09-25 12:26:06 +03:00
Simon Ser
35da32683f
Unset CRTC_ID on planes before plane allocation
If a plane was previously enabled on another CRTC, we need to set its CRTC_ID to
zero. Otherwise atomic commits fail with:

    [drm:drm_atomic_check_only [drm]] [PLANE:31:primary A] CRTC set but no FB
2019-09-25 12:23:42 +03:00
Simon Ser
3999474b32
Move example to its own directory 2019-09-16 23:41:19 +03:00
Simon Ser
67549c6c9f
readme: add basic usage 2019-09-16 11:38:54 +03:00
Simon Ser
74040a817b
Rename plane_alloc and plane_data
Rename plane_alloc to alloc_result and plane_data to alloc_step. This is more
accurate and less confusing.
2019-09-16 00:13:04 +03:00
Simon Ser
0596d6f66e
Rename on_top to over
Rename has_composited_layer_on_top to has_composited_layer_over. This is more
consistent with has_allocated_layer_over.

While at it, add a comment to explain why has_allocated_layer_over is named like
so.
2019-09-16 00:00:03 +03:00
Simon Ser
7382dfd346
Add intersection check for layers over the current one
Make sure we don't use planes with lower zpos for layers over the previous ones,
unless there is no collision.

This adds the last intersection check.

Closes: https://github.com/emersion/libliftoff/issues/3
2019-09-15 23:54:29 +03:00
Simon Ser
c63c8c0d15
test: add zpos-4x-disjoint-alt
And restore the original zpos-4x-disjoint test. Depending on the constraints on
the last two layers, one branch of the layer zpos check or the other is taken.

Fixes: 8617ddfd05 ("Add intersection check for planes under the current one")
2019-09-15 23:48:10 +03:00
Simon Ser
e898ce0631
Fix format string in liftoff_display_apply 2019-09-15 23:28:08 +03:00
Simon Ser
00fb6fce21
ci: add .build.yml 2019-09-15 22:44:18 +03:00
Simon Ser
cf861bae35
Remove last_plane_zpos from plane allocation state
Comparing with the last plane zpos isn't enough, we now perform intersection
checks too. The last plane zpos isn't used anymore, remove it.
2019-09-15 22:32:42 +03:00
Simon Ser
8617ddfd05
Add intersection check for planes under the current one
References: https://github.com/emersion/libliftoff/issues/3
2019-09-15 22:31:10 +03:00
Simon Ser
c5d22e1310
Add intersection checks for composited layer on top check
has_composited_layer_on_top is now less strict and performs plane intersection
checks before returning true.

This allows for more layers to be assigned to planes, the relevant tests have
been enabled.

References: https://github.com/emersion/libliftoff/issues/3
2019-09-15 17:08:32 +03:00
Simon Ser
e85a1a5ecf
Add layer_intersects
This will be useful for implementing optimizations in case planes don't collide.
In these cases we can ignore some zpos constraints.

References: https://github.com/emersion/libliftoff/issues/3
2019-09-15 17:00:48 +03:00
Simon Ser
b447a3bc34
test: prevent layers from being assigned to primary plane
In these tests, we always want to use the same layer for the primary plane.
Prevent othr layers from ending up on the primary plane.
2019-09-15 16:56:24 +03:00
Simon Ser
aa2478cda8
Extract plane_data init logic to function
This allows to unclutter output_choose_layers a little.
2019-09-15 15:11:29 +03:00
Simon Ser
364be1c5a6
Document how plane allocation works
Describe the core of the idea in a big comment right before the algorithm
implementation.
2019-09-15 14:31:00 +03:00
Simon Ser
dcf6bc750b
Move composited layer on top constraint up
Move it before applying properties. There's no point in applying properties if
this constraint fails.
2019-09-14 21:24:20 +03:00
Simon Ser
8c93a6fc88
test: add alloc@zpos-4x-domino-partial
This is a variant of alloc@zpos-4x-domino-fail, with plane ordering changed so
that one layer can be mapped to a plane.
2019-09-14 21:18:20 +03:00
Simon Ser
a93ea4a300
test: add alloc@zpos-4x-domino-fail
This test makes sure composited layers make layers underneath fall back to
composition too, in a transitive manner. That is, if plane A is under plane B
which is itself under plane C, plane A falling back to composition means that
both planes B and C fall back to composition too (even if C isn't directly
underneath A).
2019-09-14 21:05:14 +03:00
Simon Ser
07e04a50b6
Make composited layers prevent plane allocation underneath
If a layer cannot be mapped to a plane, make it so all layers under it also fail
plane allocation so that they can be properly composited on the primary plane.

A test was incorrect and has been fixed. Another test had two possible solutions
and has been updated with the one libliftoff yields.
2019-09-14 21:03:30 +03:00
Simon Ser
d9024483c8
test: make our mock drmModeAtomicReq support more properties
We are hitting the 64 properties limit in some new tests.
2019-09-14 20:59:11 +03:00
Simon Ser
a3b8bc33ea
test: add various zpos tests
Some of these are failing, so they are disabled for now.
2019-09-14 12:59:37 +03:00
Simon Ser
3200016033
test: add basic zpos tests
zpos-3x maps three layers to primary, cursor and one of the overlays planes.

zpos-4x-partial sets up 4 layers but is only able to find a plane for 3 layers,
because ordering between the two overlay planes is undefined.
2019-09-13 22:53:15 +03:00
Simon Ser
de8175c998
test: add an alloc test with 3 layers 2019-09-13 22:35:23 +03:00
Simon Ser
060023c6f1
test: fix atomic commit layer compatibility
Used wrong index while iterating.
2019-09-13 22:34:34 +03:00
Simon Ser
fccdebfd6e
test: introduce structured alloc tests
This is a new kind of tests defined by a static structure. The structure
contains the layers and planes to setup as well as the expected result.
2019-09-13 19:47:00 +03:00
Simon Ser
54bb501cae
test: add liftoff_mock_drm_get_plane
Allows to get a mock plane from a plane ID.
2019-09-13 19:46:21 +03:00