[PATCH v2] tests/kms_async_flips: Create subtest for overlay planes

André Almeida andrealmeid at igalia.com
Tue Feb 25 22:01:20 UTC 2025


Hi Alex,

Em 25/02/2025 18:40, Alex Hung escreveu:
> 
> 
> On 2/25/25 13:16, André Almeida wrote:
>> Hi Alex,
>>
>> Thanks for testing it.
>>
>> Em 25/02/2025 16:06, Alex Hung escreveu:
>>>
>>> We don't have a CI to test individual IGT patches so I tested this 
>>> patch on an APU and dGPU with kms_async_flips
>>
>> [...]
>>
>>>
>>>
>>> If I run overlay-atomic alone (i.e., --run-subtest overlay-atomic), 
>>> overlay-atomic fails as below (partial outputs only). Is this an 
>>> expected result? Does overlay-atomic need to run along with other 
>>> subtests?
>>>
>>
>> This is not the expected result, I tried to reproduce here but it 
>> worked fine. Tested on Steam Deck, rebased on current igt master 
>> (commit 6cdff4099c6c95e):
> 
> I also have IGT rebased to current commit (same as yours)
> 
> db3a185f3 (HEAD -> master) tests/kms_async_flips: Create subtest for 
> overlay planes
> 6cdff4099 (origin/master, origin/HEAD) lib/i915/fbc: fbc psr combo 
> support update for xe3
> 
> The kernels I tried are
> - 6.11.0-18-generic (from Ubuntu's current)
> - 6.12.0 from amd-staging-drm-next
> 

The changes required for this tested can't be found in any of those 
branches. They are in after the tag drm-misc-next-2025-02-20 
("drm-misc-next for v6.15") and this is the patchset:

https://lore.kernel.org/lkml/20250127-tonyk-async_flip-v12-2-0f7f8a8610d3@igalia.com/

So now the mistery is not about why this test fails, but why it succeeds 
in the first place :) I will have a look using an older kernel to see if 
I can figure that out, thanks!

>>
>> sudo ./build/tests/kms_async_flips --run-subtest overlay-atomic
>> IGT-Version: 1.30-g19c7e62ea (x86_64) (Linux: 6.14.0-rc4-00318- 
>> g72d0af4accd9 x86_64)
>> Using IGT_SRANDOM=1740513273 for randomisation
>> Opened device: /dev/dri/card0
>> Starting subtest: overlay-atomic
>> Starting dynamic subtest: pipe-A-eDP-1
>> Dynamic subtest pipe-A-eDP-1: SUCCESS (2.124s)
>> Starting dynamic subtest: pipe-B-eDP-1
>> Dynamic subtest pipe-B-eDP-1: SUCCESS (2.101s)
>> Starting dynamic subtest: pipe-C-eDP-1
>> Dynamic subtest pipe-C-eDP-1: SUCCESS (2.101s)
>> Starting dynamic subtest: pipe-D-eDP-1
>> Dynamic subtest pipe-D-eDP-1: SUCCESS (2.101s)
>> Subtest overlay-atomic: SUCCESS (8.950s)
>>
>> However, I saw this type of error before where the first flip is 
>> refused with -EINVAL. That usually happens because we can't change 
>> most of plane properties with the DRM_MODE_PAGE_FLIP_ASYNC flag and 
>> the previous state was somewhat different from the one that we want to 
>> present now, so we need to do a sync flip to modeset, and then do the 
>> async ones.
>>
>> Is there anything particular from your setup so I can try to reproduce 
>> here? I see that you have more than one card attached, what did you 
>> run prior to the test on that card?
> 
> I tried on phoenix APU and dGPU Radeon RX 6800/6800 XT, and both of them 
> have the same results.
> 
>>
>> Alternatively, adding the following lines in the begining of 
>> test_async_flip() should force a DRM_MODE_ATOMIC_ALLOW_MODESET and 
>> allow the next page flips:
>>
>> igt_plane_set_fb(data->overlay_plane, &data->bufs[0]);
>> igt_display_try_commit_atomic(&data->display, 
>> DRM_MODE_ATOMIC_ALLOW_MODESET, data);
>>
> 
> Like the below changes? It doesn't fix the error messages for me, and I 
> saw some SIGSEGV.
> 
> --- a/tests/kms_async_flips.c
> +++ b/tests/kms_async_flips.c
> @@ -326,6 +326,9 @@ static void test_async_flip(data_t *data)
>          struct timeval start, end, diff;
>          int suspend_time = RUN_TIME / 2;
> 
> +       igt_plane_set_fb(data->overlay_plane, &data->bufs[0]);
> +       igt_display_try_commit_atomic(&data->display, 
> DRM_MODE_ATOMIC_ALLOW_MODESET, data);
> +
>          igt_display_commit2(&data->display, data->display.is_atomic ? 
> COMMIT_ATOMIC : COMMIT_LEGACY);
> 
> 
> 
> If either alternate-sync-async-flip or alternate-sync-async-flip-atomic 
> is run before overlay-atomic, overlay-atomic will SUCCESS (tested on 
> phoenix APU)
> 
> Cheers,
> Alex Hung
> 
>> Thanks,
>>       André
>>
>>> IGT-Version: 1.30-g8fee6d12c (x86_64) (Linux: 6.11.0-18-generic x86_64)
>>> Using IGT_SRANDOM=1740510058 for randomisation
>>> Opened device: /dev/dri/card1
>>> Starting subtest: overlay-atomic
>>> Starting dynamic subtest: pipe-A-DP-1
>>> (kms_async_flips:3180096) CRITICAL: Test assertion failure function 
>>> test_async_flip, file ../tests/kms_async_flips.c:361:
>>> (kms_async_flips:3180096) CRITICAL: Failed assertion: ret == 0
>>> (kms_async_flips:3180096) CRITICAL: Last errno: 22, Invalid argument
>>> (kms_async_flips:3180096) CRITICAL: error: -22 != 0
>>> Stack trace:
>>> Dynamic subtest pipe-A-DP-1 failed.
>>> **** DEBUG ****
>>> (kms_async_flips:3180096) DEBUG: Test requirement passed: ! 
>>> (is_joiner_mode(data->drm_fd, data->output))
>>> (kms_async_flips:3180096) igt_fb-DEBUG: 
>>> igt_create_fb_with_bo_size(width=3440, height=1440, 
>>> format=XR24(0x34325258), modifier=0x0, size=0)
>>> (kms_async_flips:3180096) igt_fb-DEBUG: 
>>> igt_create_fb_with_bo_size(handle=1, pitch=13824)
>>> (kms_async_flips:3180096) ioctl_wrappers-DEBUG: Test requirement 
>>> passed: igt_has_fb_modifiers(fd)
>>> (kms_async_flips:3180096) igt_fb-DEBUG: Test requirement passed: 
>>> cairo_surface_status(fb->cairo_surface) == CAIRO_STATUS_SUCCESS
>>> (kms_async_flips:3180096) igt_fb-DEBUG: Test requirement passed: 
>>> cairo_surface_status(fb->cairo_surface) == CAIRO_STATUS_SUCCESS
>>> (kms_async_flips:3180096) igt_fb-DEBUG: 
>>> igt_create_fb_with_bo_size(width=3440, height=1440, 
>>> format=XR24(0x34325258), modifier=0x0, size=0)
>>> (kms_async_flips:3180096) igt_fb-DEBUG: 
>>> igt_create_fb_with_bo_size(handle=2, pitch=13824)
>>> (kms_async_flips:3180096) ioctl_wrappers-DEBUG: Test requirement 
>>> passed: igt_has_fb_modifiers(fd)
>>> (kms_async_flips:3180096) igt_fb-DEBUG: Test requirement passed: 
>>> cairo_surface_status(fb->cairo_surface) == CAIRO_STATUS_SUCCESS
>>> (kms_async_flips:3180096) igt_fb-DEBUG: Test requirement passed: 
>>> cairo_surface_status(fb->cairo_surface) == CAIRO_STATUS_SUCCESS
>>> (kms_async_flips:3180096) igt_fb-DEBUG: 
>>> igt_create_fb_with_bo_size(width=3440, height=1440, 
>>> format=XR24(0x34325258), modifier=0x0, size=0)
>>> (kms_async_flips:3180096) igt_fb-DEBUG: 
>>> igt_create_fb_with_bo_size(handle=3, pitch=13824)
>>> (kms_async_flips:3180096) ioctl_wrappers-DEBUG: Test requirement 
>>> passed: igt_has_fb_modifiers(fd)
>>> (kms_async_flips:3180096) igt_fb-DEBUG: Test requirement passed: 
>>> cairo_surface_status(fb->cairo_surface) == CAIRO_STATUS_SUCCESS
>>> (kms_async_flips:3180096) igt_fb-DEBUG: Test requirement passed: 
>>> cairo_surface_status(fb->cairo_surface) == CAIRO_STATUS_SUCCESS
>>> (kms_async_flips:3180096) igt_fb-DEBUG: 
>>> igt_create_fb_with_bo_size(width=3440, height=1440, 
>>> format=XR24(0x34325258), modifier=0x0, size=0)
>>> (kms_async_flips:3180096) igt_fb-DEBUG: 
>>> igt_create_fb_with_bo_size(handle=4, pitch=13824)
>>> (kms_async_flips:3180096) ioctl_wrappers-DEBUG: Test requirement 
>>> passed: igt_has_fb_modifiers(fd)
>>> (kms_async_flips:3180096) igt_fb-DEBUG: Test requirement passed: 
>>> cairo_surface_status(fb->cairo_surface) == CAIRO_STATUS_SUCCESS
>>> (kms_async_flips:3180096) igt_fb-DEBUG: Test requirement passed: 
>>> cairo_surface_status(fb->cairo_surface) == CAIRO_STATUS_SUCCESS
>>> (kms_async_flips:3180096) igt_fb-DEBUG: 
>>> igt_create_fb_with_bo_size(width=3440, height=1440, 
>>> format=XR24(0x34325258), modifier=0x0, size=0)
>>> (kms_async_flips:3180096) igt_fb-DEBUG: 
>>> igt_create_fb_with_bo_size(handle=5, pitch=13824)
>>> (kms_async_flips:3180096) ioctl_wrappers-DEBUG: Test requirement 
>>> passed: igt_has_fb_modifiers(fd)
>>> (kms_async_flips:3180096) igt_fb-DEBUG: Test requirement passed: 
>>> cairo_surface_status(fb->cairo_surface) == CAIRO_STATUS_SUCCESS
>>> (kms_async_flips:3180096) igt_fb-DEBUG: Test requirement passed: 
>>> cairo_surface_status(fb->cairo_surface) == CAIRO_STATUS_SUCCESS
>>> (kms_async_flips:3180096) igt_fb-DEBUG: 
>>> igt_create_fb_with_bo_size(width=3440, height=1440, 
>>> format=XR24(0x34325258), modifier=0x0, size=0)
>>> (kms_async_flips:3180096) igt_fb-DEBUG: 
>>> igt_create_fb_with_bo_size(handle=6, pitch=13824)
>>> (kms_async_flips:3180096) ioctl_wrappers-DEBUG: Test requirement 
>>> passed: igt_has_fb_modifiers(fd)
>>> (kms_async_flips:3180096) igt_fb-DEBUG: Test requirement passed: 
>>> cairo_surface_status(fb->cairo_surface) == CAIRO_STATUS_SUCCESS
>>> (kms_async_flips:3180096) igt_fb-DEBUG: Test requirement passed: 
>>> cairo_surface_status(fb->cairo_surface) == CAIRO_STATUS_SUCCESS
>>> (kms_async_flips:3180096) igt_fb-DEBUG: 
>>> igt_create_fb_with_bo_size(width=3440, height=1440, 
>>> format=XR24(0x34325258), modifier=0x0, size=0)
>>> (kms_async_flips:3180096) igt_fb-DEBUG: 
>>> igt_create_fb_with_bo_size(handle=7, pitch=13824)
>>> (kms_async_flips:3180096) ioctl_wrappers-DEBUG: Test requirement 
>>> passed: igt_has_fb_modifiers(fd)
>>> (kms_async_flips:3180096) igt_fb-DEBUG: Test requirement passed: 
>>> cairo_surface_status(fb->cairo_surface) == CAIRO_STATUS_SUCCESS
>>> (kms_async_flips:3180096) igt_fb-DEBUG: Test requirement passed: 
>>> cairo_surface_status(fb->cairo_surface) == CAIRO_STATUS_SUCCESS
>>> (kms_async_flips:3180096) igt_fb-DEBUG: 
>>> igt_create_fb_with_bo_size(width=3440, height=1440, 
>>> format=XR24(0x34325258), modifier=0x0, size=0)
>>> (kms_async_flips:3180096) igt_fb-DEBUG: 
>>> igt_create_fb_with_bo_size(handle=8, pitch=13824)
>>> (kms_async_flips:3180096) ioctl_wrappers-DEBUG: Test requirement 
>>> passed: igt_has_fb_modifiers(fd)
>>> (kms_async_flips:3180096) igt_fb-DEBUG: Test requirement passed: 
>>> cairo_surface_status(fb->cairo_surface) == CAIRO_STATUS_SUCCESS
>>> (kms_async_flips:3180096) igt_fb-DEBUG: Test requirement passed: 
>>> cairo_surface_status(fb->cairo_surface) == CAIRO_STATUS_SUCCESS
>>> (kms_async_flips:3180096) igt_kms-DEBUG: display: A.0: plane_set_fb(151)
>>> (kms_async_flips:3180096) igt_kms-DEBUG: display: A.0: plane_set_size 
>>> (3440x1440)
>>> (kms_async_flips:3180096) igt_kms-DEBUG: display: A.0: 
>>> fb_set_position(0,0)
>>> (kms_async_flips:3180096) igt_kms-DEBUG: display: A.0: 
>>> fb_set_size(3440x1440)
>>> (kms_async_flips:3180096) igt_kms-DEBUG: display: A.0: plane_set_size 
>>> (3440x1440)
>>> (kms_async_flips:3180096) igt_kms-DEBUG: display: A.2: plane_set_fb(151)
>>> (kms_async_flips:3180096) igt_kms-DEBUG: display: A.2: plane_set_size 
>>> (3440x1440)
>>> (kms_async_flips:3180096) igt_kms-DEBUG: display: A.2: 
>>> fb_set_position(0,0)
>>> (kms_async_flips:3180096) igt_kms-DEBUG: display: A.2: 
>>> fb_set_size(3440x1440)
>>> (kms_async_flips:3180096) igt_kms-DEBUG: display: A.2: plane_set_size 
>>> (3440x1440)
>>> (kms_async_flips:3180096) igt_kms-DEBUG: display: commit {
>>> (kms_async_flips:3180096) igt_kms-DEBUG: Pipe A: Setting property 
>>> "MODE_ID" to 0x96/150
>>> (kms_async_flips:3180096) igt_kms-DEBUG: Pipe A: Setting property 
>>> "ACTIVE" to 0x1/1
>>> (kms_async_flips:3180096) igt_kms-DEBUG: display:     populating 
>>> plane data: A.0, fb 151
>>> (kms_async_flips:3180096) igt_kms-DEBUG: plane A.0: Setting property 
>>> "SRC_X" to 0x0/0
>>> (kms_async_flips:3180096) igt_kms-DEBUG: plane A.0: Setting property 
>>> "SRC_Y" to 0x0/0
>>> (kms_async_flips:3180096) igt_kms-DEBUG: plane A.0: Setting property 
>>> "SRC_W" to 0xd700000/225443840
>>> (kms_async_flips:3180096) igt_kms-DEBUG: plane A.0: Setting property 
>>> "SRC_H" to 0x5a00000/94371840
>>> (kms_async_flips:3180096) igt_kms-DEBUG: plane A.0: Setting property 
>>> "CRTC_W" to 0xd70/3440
>>> (kms_async_flips:3180096) igt_kms-DEBUG: plane A.0: Setting property 
>>> "CRTC_H" to 0x5a0/1440
>>> (kms_async_flips:3180096) igt_kms-DEBUG: plane A.0: Setting property 
>>> "FB_ID" to 0x97/151
>>> (kms_async_flips:3180096) igt_kms-DEBUG: plane A.0: Setting property 
>>> "CRTC_ID" to 0x5b/91
>>> (kms_async_flips:3180096) igt_kms-DEBUG: plane A.0: Setting property 
>>> "COLOR_ENCODING" to 0x1/1
>>> (kms_async_flips:3180096) igt_kms-DEBUG: plane A.0: Setting property 
>>> "COLOR_RANGE" to 0x0/0
>>> (kms_async_flips:3180096) igt_kms-DEBUG: display:     populating 
>>> plane data: A.2, fb 151
>>> (kms_async_flips:3180096) igt_kms-DEBUG: plane A.2: Setting property 
>>> "SRC_X" to 0x0/0
>>> (kms_async_flips:3180096) igt_kms-DEBUG: plane A.2: Setting property 
>>> "SRC_Y" to 0x0/0
>>> (kms_async_flips:3180096) igt_kms-DEBUG: plane A.2: Setting property 
>>> "SRC_W" to 0xd700000/225443840
>>> (kms_async_flips:3180096) igt_kms-DEBUG: plane A.2: Setting property 
>>> "SRC_H" to 0x5a00000/94371840
>>> (kms_async_flips:3180096) igt_kms-DEBUG: plane A.2: Setting property 
>>> "CRTC_W" to 0xd70/3440
>>> (kms_async_flips:3180096) igt_kms-DEBUG: plane A.2: Setting property 
>>> "CRTC_H" to 0x5a0/1440
>>> (kms_async_flips:3180096) igt_kms-DEBUG: plane A.2: Setting property 
>>> "FB_ID" to 0x97/151
>>> (kms_async_flips:3180096) igt_kms-DEBUG: plane A.2: Setting property 
>>> "CRTC_ID" to 0x5b/91
>>> (kms_async_flips:3180096) igt_kms-DEBUG: display:     populating 
>>> plane data: B.0, fb 0
>>> (kms_async_flips:3180096) igt_kms-DEBUG: plane B.0: Setting property 
>>> "COLOR_ENCODING" to 0x0/0
>>> (kms_async_flips:3180096) igt_kms-DEBUG: plane B.0: Setting property 
>>> "COLOR_RANGE" to 0x0/0
>>> (kms_async_flips:3180096) igt_kms-DEBUG: display:     populating 
>>> plane data: C.0, fb 0
>>> (kms_async_flips:3180096) igt_kms-DEBUG: plane C.0: Setting property 
>>> "COLOR_ENCODING" to 0x0/0
>>> (kms_async_flips:3180096) igt_kms-DEBUG: plane C.0: Setting property 
>>> "COLOR_RANGE" to 0x0/0
>>> (kms_async_flips:3180096) igt_kms-DEBUG: display:     populating 
>>> plane data: D.0, fb 0
>>> (kms_async_flips:3180096) igt_kms-DEBUG: plane D.0: Setting property 
>>> "COLOR_ENCODING" to 0x0/0
>>> (kms_async_flips:3180096) igt_kms-DEBUG: plane D.0: Setting property 
>>> "COLOR_RANGE" to 0x0/0
>>> (kms_async_flips:3180096) igt_kms-DEBUG: display:     populating 
>>> plane data: E.0, fb 0
>>> (kms_async_flips:3180096) igt_kms-DEBUG: plane E.0: Setting property 
>>> "COLOR_ENCODING" to 0x0/0
>>> (kms_async_flips:3180096) igt_kms-DEBUG: plane E.0: Setting property 
>>> "COLOR_RANGE" to 0x0/0
>>> (kms_async_flips:3180096) igt_kms-DEBUG: display:     populating 
>>> plane data: F.0, fb 0
>>> (kms_async_flips:3180096) igt_kms-DEBUG: plane F.0: Setting property 
>>> "COLOR_ENCODING" to 0x0/0
>>> (kms_async_flips:3180096) igt_kms-DEBUG: plane F.0: Setting property 
>>> "COLOR_RANGE" to 0x0/0
>>> (kms_async_flips:3180096) igt_kms-DEBUG: display:     DP-1: preparing 
>>> atomic, pipe: A
>>> (kms_async_flips:3180096) igt_kms-DEBUG: DP-1: Setting property 
>>> "CRTC_ID" to 0x5b/91
>>> (kms_async_flips:3180096) igt_kms-DEBUG: display: }
>>> (kms_async_flips:3180096) igt_kms-DEBUG: display: A.2: plane_set_fb(154)
>>> (kms_async_flips:3180096) igt_kms-DEBUG: display: A.2: plane_set_size 
>>> (3440x1440)
>>> (kms_async_flips:3180096) igt_kms-DEBUG: display: A.2: 
>>> fb_set_position(0,0)
>>> (kms_async_flips:3180096) igt_kms-DEBUG: display: A.2: 
>>> fb_set_size(3440x1440)
>>> (kms_async_flips:3180096) igt_kms-DEBUG: display: commit {
>>> (kms_async_flips:3180096) igt_kms-DEBUG: display:     populating 
>>> plane data: A.2, fb 154
>>> (kms_async_flips:3180096) igt_kms-DEBUG: plane A.2: Setting property 
>>> "SRC_X" to 0x0/0
>>> (kms_async_flips:3180096) igt_kms-DEBUG: plane A.2: Setting property 
>>> "SRC_Y" to 0x0/0
>>> (kms_async_flips:3180096) igt_kms-DEBUG: plane A.2: Setting property 
>>> "SRC_W" to 0xd700000/225443840
>>> (kms_async_flips:3180096) igt_kms-DEBUG: plane A.2: Setting property 
>>> "SRC_H" to 0x5a00000/94371840
>>> (kms_async_flips:3180096) igt_kms-DEBUG: plane A.2: Setting property 
>>> "CRTC_W" to 0xd70/3440
>>> (kms_async_flips:3180096) igt_kms-DEBUG: plane A.2: Setting property 
>>> "CRTC_H" to 0x5a0/1440
>>> (kms_async_flips:3180096) igt_kms-DEBUG: plane A.2: Setting property 
>>> "FB_ID" to 0x9a/154
>>> (kms_async_flips:3180096) igt_kms-DEBUG: plane A.2: Setting property 
>>> "CRTC_ID" to 0x5b/91
>>> (kms_async_flips:3180096) igt_kms-DEBUG: display: }
>>> (kms_async_flips:3180096) CRITICAL: Test assertion failure function 
>>> test_async_flip, file ../tests/kms_async_flips.c:361:
>>> (kms_async_flips:3180096) CRITICAL: Failed assertion: ret == 0
>>> (kms_async_flips:3180096) CRITICAL: Last errno: 22, Invalid argument
>>> (kms_async_flips:3180096) CRITICAL: error: -22 != 0
>>> (kms_async_flips:3180096) igt_core-INFO: Stack trace:
>>> ****  END  ****
>>> Dynamic subtest pipe-A-DP-1: FAIL (0.227s)
>>>
>>>
>>>
>>>>
>>>>>
>>>>> Thanks!
>>>>>
>>>>>> Vitaly
>>>>>>
>>>>>>> Please add to Cc Vitaly from AMD:
>>>>>>> Cc: Vitaly Prosyak <vitaly.prosyak at amd.com>
>>>>>>>
>>>>>>> Also add Jeevan here:
>>>>>>> Cc: Jeevan B <jeevan.b at intel.com>
>>>>>>>
>>>>>>> Regards,
>>>>>>> Kamil
>>>>>>>
>>>>>>>> Signed-off-by: André Almeida <andrealmeid at igalia.com>
>>>>>>>> ---
>>>>>>>> v2: Add test description for GitLab compilation
>>>>>>>> ---
>>>>>>>>    tests/kms_async_flips.c | 45 ++++++++++++++++++++++++++++++++ 
>>>>>>>> + + +++----
>>>>>>>>    1 file changed, 41 insertions(+), 4 deletions(-)
>>>>>>>>
>>>>>>>> diff --git a/tests/kms_async_flips.c b/tests/kms_async_flips.c
>>>>>>>> index 4a72be7b5..dd0907d50 100644
>>>>>>>> --- a/tests/kms_async_flips.c
>>>>>>>> +++ b/tests/kms_async_flips.c
>>>>>>>> @@ -89,6 +89,9 @@
>>>>>>>>     *
>>>>>>>>     * SUBTEST: async-flip-suspend-resume
>>>>>>>>     * Description: Verify the async flip functionality with 
>>>>>>>> suspend and resume cycle
>>>>>>>> + *
>>>>>>>> + * SUBTEST: overlay-atomic
>>>>>>>> + * Description: Verify overlay planes with async flips in 
>>>>>>>> atomic API
>>>>>>>>     */
>>>>>>>>    #define CURSOR_POS 128
>>>>>>>> @@ -109,12 +112,14 @@ typedef struct {
>>>>>>>>        uint32_t crtc_id;
>>>>>>>>        uint32_t refresh_rate;
>>>>>>>>        struct igt_fb bufs[NUM_FBS];
>>>>>>>> +    struct igt_fb bufs_overlay[NUM_FBS];
>>>>>>>>        igt_display_t display;
>>>>>>>>        igt_output_t *output;
>>>>>>>>        unsigned long flip_timestamp_us;
>>>>>>>>        double flip_interval;
>>>>>>>>        uint64_t modifier;
>>>>>>>>        igt_plane_t *plane;
>>>>>>>> +    igt_plane_t *overlay_plane;
>>>>>>>>        igt_pipe_crc_t *pipe_crc;
>>>>>>>>        igt_crc_t ref_crc;
>>>>>>>>        int flip_count;
>>>>>>>> @@ -126,6 +131,7 @@ typedef struct {
>>>>>>>>        bool allow_fail;
>>>>>>>>        struct buf_ops *bops;
>>>>>>>>        bool atomic_path;
>>>>>>>> +    bool overlay_path;
>>>>>>>>    } data_t;
>>>>>>>>    static void flip_handler(int fd_, unsigned int sequence, 
>>>>>>>> unsigned int tv_sec,
>>>>>>>> @@ -226,6 +232,8 @@ static void test_init(data_t *data)
>>>>>>>>        igt_output_set_pipe(data->output, data->pipe);
>>>>>>>>        data->plane = igt_output_get_plane_type(data->output, 
>>>>>>>> DRM_PLANE_TYPE_PRIMARY);
>>>>>>>> +    if (data->overlay_path)
>>>>>>>> +        data->overlay_plane = igt_output_get_plane_type(data- 
>>>>>>>> >output, DRM_PLANE_TYPE_OVERLAY);
>>>>>>>>    }
>>>>>>>>    static void test_init_fbs(data_t *data)
>>>>>>>> @@ -246,16 +254,27 @@ static void test_init_fbs(data_t *data)
>>>>>>>>            prev_modifier = data->modifier;
>>>>>>>>            if (data->bufs[0].fb_id) {
>>>>>>>> -            for (i = 0; i < NUM_FBS; i++)
>>>>>>>> +            for (i = 0; i < NUM_FBS; i++) {
>>>>>>>>                    igt_remove_fb(data->drm_fd, &data->bufs[i]);
>>>>>>>> +                if (data->overlay_path)
>>>>>>>> +                    igt_remove_fb(data->drm_fd, &data- 
>>>>>>>> >bufs_overlay[i]);
>>>>>>>> +            }
>>>>>>>>            }
>>>>>>>> -        for (i = 0; i < NUM_FBS; i++)
>>>>>>>> +        for (i = 0; i < NUM_FBS; i++) {
>>>>>>>>                make_fb(data, &data->bufs[i], width, height, i);
>>>>>>>> +            if (data->overlay_path)
>>>>>>>> +                make_fb(data, &data->bufs_overlay[i], width, 
>>>>>>>> height, i);
>>>>>>>> +        }
>>>>>>>>        }
>>>>>>>>        igt_plane_set_fb(data->plane, &data->bufs[0]);
>>>>>>>>        igt_plane_set_size(data->plane, width, height);
>>>>>>>> +
>>>>>>>> +    if (data->overlay_path) {
>>>>>>>> +        igt_plane_set_fb(data->overlay_plane, &data->bufs[0]);
>>>>>>>> +        igt_plane_set_size(data->overlay_plane, width, height);
>>>>>>>> +    }
>>>>>>>>    }
>>>>>>>>    static bool async_flip_needs_extra_frame(data_t *data)
>>>>>>>> @@ -283,12 +302,17 @@ static bool 
>>>>>>>> async_flip_needs_extra_frame(data_t *data)
>>>>>>>>    static int perform_flip(data_t *data, int frame, int flags)
>>>>>>>>    {
>>>>>>>>        int ret;
>>>>>>>> +    igt_plane_t *plane;
>>>>>>>> +    struct igt_fb *bufs;
>>>>>>>> +
>>>>>>>> +    plane = data->overlay_path ? data->overlay_plane : data- 
>>>>>>>> >plane;
>>>>>>>> +    bufs = data->overlay_path ? data->bufs_overlay : data->bufs;
>>>>>>>>        if (!data->atomic_path) {
>>>>>>>>            ret = drmModePageFlip(data->drm_fd, data->crtc_id,
>>>>>>>> -                      data->bufs[frame % NUM_FBS].fb_id, flags, 
>>>>>>>> data);
>>>>>>>> +                     bufs[frame % NUM_FBS].fb_id, flags, data);
>>>>>>>>        } else {
>>>>>>>> -        igt_plane_set_fb(data->plane, &data->bufs[frame % 
>>>>>>>> NUM_FBS]);
>>>>>>>> +        igt_plane_set_fb(plane, &data->bufs[frame % NUM_FBS]);
>>>>>>>>            ret = igt_display_try_commit_atomic(&data->display, 
>>>>>>>> flags, data);
>>>>>>>>        }
>>>>>>>> @@ -772,6 +796,7 @@ igt_main
>>>>>>>>            igt_subtest_with_dynamic("async-flip-with-page-flip- 
>>>>>>>> events") {
>>>>>>>>                data.alternate_sync_async = false;
>>>>>>>>                data.atomic_path = false;
>>>>>>>> +            data.overlay_path = false;
>>>>>>>>                if (is_intel_device(data.drm_fd))
>>>>>>>>                    run_test_with_modifiers(&data, test_async_flip);
>>>>>>>>                else
>>>>>>>> @@ -783,6 +808,7 @@ igt_main
>>>>>>>>            igt_subtest_with_dynamic("async-flip-with-page-flip- 
>>>>>>>> events-atomic") {
>>>>>>>>                data.alternate_sync_async = false;
>>>>>>>>                data.atomic_path = true;
>>>>>>>> +            data.overlay_path = false;
>>>>>>>>                if (is_intel_device(data.drm_fd))
>>>>>>>>                    run_test_with_modifiers(&data, test_async_flip);
>>>>>>>>                else
>>>>>>>> @@ -793,6 +819,7 @@ igt_main
>>>>>>>>            igt_subtest_with_dynamic("alternate-sync-async-flip") {
>>>>>>>>                data.alternate_sync_async = true;
>>>>>>>>                data.atomic_path = false;
>>>>>>>> +            data.overlay_path = false;
>>>>>>>>                run_test(&data, test_async_flip);
>>>>>>>>            }
>>>>>>>> @@ -800,7 +827,17 @@ igt_main
>>>>>>>>            igt_subtest_with_dynamic("alternate-sync-async-flip- 
>>>>>>>> atomic") {
>>>>>>>>                data.alternate_sync_async = true;
>>>>>>>>                data.atomic_path = true;
>>>>>>>> +            data.overlay_path = false;
>>>>>>>> +            run_test(&data, test_async_flip);
>>>>>>>> +        }
>>>>>>>> +
>>>>>>>> +        igt_describe("Verify overlay planes with async flips in 
>>>>>>>> atomic API");
>>>>>>>> +        igt_subtest_with_dynamic("overlay-atomic") {
>>>>>>>> +            igt_require(is_amdgpu_device(data.drm_fd));
>>>>>>>> +            data.atomic_path = true;
>>>>>>>> +            data.overlay_path = true;
>>>>>>>>                run_test(&data, test_async_flip);
>>>>>>>> +            data.overlay_path = false;
>>>>>>>>            }
>>>>>>>>            igt_describe("Verify that the async flip timestamp 
>>>>>>>> does not "
>>>>>>>> -- 
>>>>>>>> 2.47.1
>>>>>>>>
>>>
>>>
>>
> 
> 



More information about the igt-dev mailing list