[igt-dev] [V3 1/4] lib/igt_kms: Add helper functions to sort drm modes
Nautiyal, Ankit K
ankit.k.nautiyal at intel.com
Tue May 31 07:21:47 UTC 2022
The patch looks good to me.
The helper functions will need documentation.
With that fixed, this is:
Reviewed-by: Ankit Nautiyal <ankit.k.nautiyal at intel.com>
On 5/31/2022 11:06 AM, Bhanuprakash Modem wrote:
> Add helper function to sort drm modes based on the clock, resolution
> in both ascending & descending order.
>
> V2:
> * Minor changes
>
> Signed-off-by: Bhanuprakash Modem <bhanuprakash.modem at intel.com>
> ---
> lib/igt_kms.c | 55 +++++++++++++++++++++++++++++++++++++--------------
> lib/igt_kms.h | 10 ++++++++++
> 2 files changed, 50 insertions(+), 15 deletions(-)
>
> diff --git a/lib/igt_kms.c b/lib/igt_kms.c
> index a25fac74..ada42cc8 100644
> --- a/lib/igt_kms.c
> +++ b/lib/igt_kms.c
> @@ -1477,6 +1477,43 @@ void kmstest_force_edid(int drm_fd, drmModeConnector *connector,
> igt_assert(ret != -1);
> }
>
> +int sort_drm_modes_by_clk_dsc(const void *a, const void *b)
> +{
> + const drmModeModeInfo *mode1 = a, *mode2 = b;
> +
> + return (mode1->clock < mode2->clock) - (mode2->clock < mode1->clock);
> +}
> +
> +int sort_drm_modes_by_clk_asc(const void *a, const void *b)
> +{
> + const drmModeModeInfo *mode1 = a, *mode2 = b;
> +
> + return (mode1->clock > mode2->clock) - (mode2->clock > mode1->clock);
> +}
> +
> +int sort_drm_modes_by_res_dsc(const void *a, const void *b)
> +{
> + const drmModeModeInfo *mode1 = a, *mode2 = b;
> +
> + return (mode1->hdisplay < mode2->hdisplay) - (mode2->hdisplay < mode1->hdisplay);
> +}
> +
> +int sort_drm_modes_by_res_asc(const void *a, const void *b)
> +{
> + const drmModeModeInfo *mode1 = a, *mode2 = b;
> +
> + return (mode1->hdisplay > mode2->hdisplay) - (mode2->hdisplay > mode1->hdisplay);
> +}
> +
> +void igt_sort_connector_modes(drmModeConnector *connector,
> + int (*comparator)(const void *, const void*))
> +{
> + qsort(connector->modes,
> + connector->count_modes,
> + sizeof(drmModeModeInfo),
> + comparator);
> +}
> +
> /**
> * kmstest_get_connector_default_mode:
> * @drm_fd: DRM fd
> @@ -4204,16 +4241,6 @@ void igt_output_set_pipe(igt_output_t *output, enum pipe pipe)
> }
> }
>
> -#define for_each_connector_mode(output) \
> - for (int i__ = 0; i__ < output->config.connector->count_modes; i__++)
> -
> -static int sort_drm_modes(const void *a, const void *b)
> -{
> - const drmModeModeInfo *mode1 = a, *mode2 = b;
> -
> - return (mode1->clock < mode2->clock) - (mode2->clock < mode1->clock);
> -}
> -
> static
> bool __override_all_active_output_modes_to_fit_bw(igt_display_t *display,
> igt_output_t *outputs[IGT_MAX_PIPES],
> @@ -4230,7 +4257,7 @@ bool __override_all_active_output_modes_to_fit_bw(igt_display_t *display,
> for_each_connector_mode(output) {
> int ret;
>
> - igt_output_override_mode(output, &output->config.connector->modes[i__]);
> + igt_output_override_mode(output, &output->config.connector->modes[j__]);
>
> if (__override_all_active_output_modes_to_fit_bw(display, outputs, n_outputs, base + 1))
> return true;
> @@ -4271,10 +4298,8 @@ bool igt_override_all_active_output_modes_to_fit_bw(igt_display_t *display)
> continue;
>
> /* Sort the modes in descending order by clock freq. */
> - qsort(output->config.connector->modes,
> - output->config.connector->count_modes,
> - sizeof(drmModeModeInfo),
> - sort_drm_modes);
> + igt_sort_connector_modes(output->config.connector,
> + sort_drm_modes_by_clk_dsc);
>
> outputs[n_outputs++] = output;
> }
> diff --git a/lib/igt_kms.h b/lib/igt_kms.h
> index ba0bf4d6..0f12d825 100644
> --- a/lib/igt_kms.h
> +++ b/lib/igt_kms.h
> @@ -637,6 +637,9 @@ igt_output_t **__igt_pipe_populate_outputs(igt_display_t *display,
> for (int j__ = 0; assert(igt_can_fail()), (plane) = &(display)->pipes[(pipe)].planes[j__], \
> j__ < (display)->pipes[(pipe)].n_planes; j__++)
>
> +#define for_each_connector_mode(output) \
> + for (int j__ = 0; j__ < output->config.connector->count_modes; j__++)
> +
> #define IGT_FIXED(i,f) ((i) << 16 | (f))
>
> /**
> @@ -957,4 +960,11 @@ void igt_assert_output_bpc_equal(int drmfd, enum pipe pipe,
> bool igt_check_output_bpc_equal(int drmfd, enum pipe pipe,
> char *output_name, unsigned int bpc);
>
> +int sort_drm_modes_by_clk_dsc(const void *a, const void *b);
> +int sort_drm_modes_by_clk_asc(const void *a, const void *b);
> +int sort_drm_modes_by_res_dsc(const void *a, const void *b);
> +int sort_drm_modes_by_res_asc(const void *a, const void *b);
> +void igt_sort_connector_modes(drmModeConnector *connector,
> + int (*comparator)(const void *, const void*));
> +
> #endif /* __IGT_KMS_H__ */
More information about the igt-dev
mailing list