[igt-dev] [PATCH i-g-t v2] tests/kms_plane_scaling: Increase buffer size if driver doesn't support larger scale factors
Jessica Zhang
quic_jesszhan at quicinc.com
Tue Dec 14 00:50:26 UTC 2021
On 12/9/2021 10:11 PM, Petri Latvala wrote:
> On Thu, Dec 09, 2021 at 12:54:58PM -0800, Jessica Zhang wrote:
>>
>>
>> On 12/9/2021 3:26 AM, Petri Latvala wrote:
>>> On Wed, Dec 08, 2021 at 04:27:16PM -0800, Jessica Zhang wrote:
>>>> Catch edge cases where driver doesn't support larger scale factors or
>>>> pipe doesn't support scaling.
>>>>
>>>> Currently, a 20x20 framebuffer is passed in to be upscaled. However,
>>>> this will cause issues with other drivers as they may not support larger
>>>> scale factors or may not support scaling at all for certain planes.
>>>>
>>>> This avoids failures due to invalid scale factor by trying
>>>> the original 20x20 framebuffer commit, then trying to commit larger
>>>> framebuffers up to and including unity scale.
>>>>
>>>> Changes since V1:
>>>> - try_commit_with_fb_size: Changed igt_try_commit2 to
>>>> igt_display_try_commit_atomic instead to avoid redundant commits
>>>> - try_commit_with_fb_size: Moved calls to clear framebuffer to outside
>>>> of success condition and moved cleanup_crtc back to outside of method
>>>>
>>>> Tested-on: Qualcomm RB5 (sdm845)
>>>>
>>>> Signed-off-by: Jessica Zhang <quic_jesszhan at quicinc.com>
>>>> ---
>>>> tests/kms_plane_scaling.c | 55 ++++++++++++++++++++++++++++++++-------
>>>> 1 file changed, 46 insertions(+), 9 deletions(-)
>>>>
>>>> diff --git a/tests/kms_plane_scaling.c b/tests/kms_plane_scaling.c
>>>> index 85db11ee..971c1532 100644
>>>> --- a/tests/kms_plane_scaling.c
>>>> +++ b/tests/kms_plane_scaling.c
>>>> @@ -1,5 +1,6 @@
>>>> /*
>>>> * Copyright © 2013,2014 Intel Corporation
>>>> + * Copyright (c) 2021 Qualcomm Innovation Center, Inc. All rights reserved.
>>>> *
>>>> * Permission is hereby granted, free of charge, to any person obtaining a
>>>> * copy of this software and associated documentation files (the "Software"),
>>>> @@ -118,6 +119,32 @@ static void prepare_crtc(data_t *data, igt_output_t *output, enum pipe pipe,
>>>> igt_display_commit2(display, COMMIT_ATOMIC);
>>>> }
>>>> +static int try_commit_with_fb_size(int width, int height, igt_rotation_t rot,
>>>> + igt_display_t *display, data_t *d,
>>>> + igt_plane_t *plane,
>>>> + drmModeModeInfo *mode)
>>>> +{
>>>> + int ret;
>>>> +
>>>> + /* Check min to full resolution upscaling */
>>>> + igt_fb_set_position(&d->fb[0], plane, 0, 0);
>>>> + igt_fb_set_size(&d->fb[0], plane, width, height);
>>>> + igt_plane_set_position(plane, 0, 0);
>>>> + igt_plane_set_size(plane, mode->hdisplay, mode->vdisplay);
>>>> + igt_plane_set_rotation(plane, rot);
>>>> +
>>>> + ret = igt_display_try_commit_atomic(display, DRM_MODE_ATOMIC_TEST_ONLY |
>>>> + DRM_MODE_ATOMIC_ALLOW_MODESET, NULL);
>>>> +
>>>> + if (!ret)
>>>> + igt_display_commit2(display, COMMIT_ATOMIC);
>>>
>>> Now this looks more understandable but I still have one "why"
>>> remaining: Why test_only the commit if you're anyway going to perform
>>> the commit? You could just have this as one try_commit, without
>>> test_only, and let it perform it, as there's nothing done differently
>>> here based on success/failure.
>>>
>> The original intention was to test that a commit will go through before
>> actually doing the commit. This way, the test would be more optimized since
>> we would only perform a commit when we know it will succeed. Otherwise, in a
>> worst case scenario, we'd be performing 3 or 4 commits per pipe/format for a
>> subtest like pipe-*-scaler-with-pixel-format.
>
> But the kernel does the same checks for TEST_ONLY as for actually
> doing the commit. For this kind of optimization assertion I have to
> ask for some numbers to prove it's saving time enough to be worth of
> the more complicated code.
>
> Doing a TEST_ONLY commit followed by doing the same commit without
> TEST_ONLY surely is slower when the commit will succeed at least.
>
Sorry if this wasn't clear in my previous reply -- I'm focusing on
optimizing for cases where scaling a 20x20 buffer isn't supported and
for failure cases. For example, if we just call try_commit, we would be
doing 3 commits per format per pipe in cases where the driver only
supports unity scale. Since TEST_ONLY will only perform a check without
performing an actual commit [1], wouldn't it be more optimal to only
perform a commit if the commit will succeed in cases like this?
This approach is based on instances of try_commit_atomic in other tests
[2, 3] where we catch an error from the commit and adjust the test
accordingly, which is what this patch wants to emulate.
Thanks,
Jessica Zhang
[1]
https://gitlab.freedesktop.org/drm/msm/-/blob/msm-next/drivers/gpu/drm/drm_atomic_uapi.c#L1456
[2]
https://gitlab.freedesktop.org/drm/igt-gpu-tools/-/blob/master/tests/kms_plane_scaling.c#L660
[3]
https://gitlab.freedesktop.org/drm/igt-gpu-tools/-/blob/master/tests/kms_atomic_transition.c#L75
>
More information about the igt-dev
mailing list