[PATCH] modetest: add the possibility to select the refresh frequency for a mode

Rob Clark robdclark at gmail.com
Sun Jan 12 05:26:27 PST 2014


On Fri, Jan 10, 2014 at 5:02 AM, Vincent ABRIOU <vincent.abriou at st.com> wrote:
> When mode is selected we only give the name of the mode as parameter.
> But sometime, two different modes have the same name but not
> the same vrefresh frequency.
> This patch give the possibility to select a mode by its name
> and optionally by its refresh frequency.

Thanks, pushed

I've wanted this feature more than a few times already :-)

BR,
-R


> Signed-off-by: Vincent Abriou <vincent.abriou at st.com>
> ---
>  tests/modetest/modetest.c |   35 +++++++++++++++++++++++++++--------
>  1 file changed, 27 insertions(+), 8 deletions(-)
>
> diff --git a/tests/modetest/modetest.c b/tests/modetest/modetest.c
> index 51c4e6d..bc9c998 100644
> --- a/tests/modetest/modetest.c
> +++ b/tests/modetest/modetest.c
> @@ -693,6 +693,7 @@ struct pipe_arg {
>         uint32_t crtc_id;
>         char mode_str[64];
>         char format_str[5];
> +       unsigned int vrefresh;
>         unsigned int fourcc;
>         drmModeModeInfo *mode;
>         struct crtc *crtc;
> @@ -714,7 +715,8 @@ struct plane_arg {
>  };
>
>  static drmModeModeInfo *
> -connector_find_mode(struct device *dev, uint32_t con_id, const char *mode_str)
> +connector_find_mode(struct device *dev, uint32_t con_id, const char *mode_str,
> +        const unsigned int vrefresh)
>  {
>         drmModeConnector *connector;
>         drmModeModeInfo *mode;
> @@ -726,8 +728,16 @@ connector_find_mode(struct device *dev, uint32_t con_id, const char *mode_str)
>
>         for (i = 0; i < connector->count_modes; i++) {
>                 mode = &connector->modes[i];
> -               if (!strcmp(mode->name, mode_str))
> -                       return mode;
> +               if (!strcmp(mode->name, mode_str)) {
> +                       /* If the vertical refresh frequency is not specified then return the
> +                        * first mode that match with the name. Else, return the mode that match
> +                        * the name and the specified vertical refresh frequency.
> +                        */
> +                       if (vrefresh == 0)
> +                               return mode;
> +                       else if (mode->vrefresh == vrefresh)
> +                               return mode;
> +               }
>         }
>
>         return NULL;
> @@ -789,7 +799,7 @@ static int pipe_find_crtc_and_mode(struct device *dev, struct pipe_arg *pipe)
>
>         for (i = 0; i < (int)pipe->num_cons; i++) {
>                 mode = connector_find_mode(dev, pipe->con_ids[i],
> -                                          pipe->mode_str);
> +                                          pipe->mode_str, pipe->vrefresh);
>                 if (mode == NULL) {
>                         fprintf(stderr,
>                                 "failed to find mode \"%s\" for connector %u\n",
> @@ -1059,8 +1069,8 @@ static void set_mode(struct device *dev, struct pipe_arg *pipes, unsigned int co
>                 if (pipe->mode == NULL)
>                         continue;
>
> -               printf("setting mode %s@%s on connectors ",
> -                      pipe->mode_str, pipe->format_str);
> +               printf("setting mode %s-%dHz@%s on connectors ",
> +                      pipe->mode_str, pipe->mode->vrefresh, pipe->format_str);
>                 for (j = 0; j < pipe->num_cons; ++j)
>                         printf("%u, ", pipe->con_ids[j]);
>                 printf("crtc %d\n", pipe->crtc->crtc->crtc_id);
> @@ -1192,6 +1202,7 @@ static int parse_connector(struct pipe_arg *pipe, const char *arg)
>         const char *p;
>         char *endp;
>
> +       pipe->vrefresh = 0;
>         pipe->crtc_id = (uint32_t)-1;
>         strcpy(pipe->format_str, "XR24");
>
> @@ -1226,11 +1237,19 @@ static int parse_connector(struct pipe_arg *pipe, const char *arg)
>
>         arg = endp + 1;
>
> -       p = strchrnul(arg, '@');
> +       /* Search for the vertical refresh or the format. */
> +       p = strpbrk(arg, "-@");
> +       if (p == NULL)
> +               p = arg + strlen(arg);
>         len = min(sizeof pipe->mode_str - 1, (unsigned int)(p - arg));
>         strncpy(pipe->mode_str, arg, len);
>         pipe->mode_str[len] = '\0';
>
> +       if (*p == '-') {
> +               pipe->vrefresh = strtoul(p + 1, &endp, 10);
> +               p = endp;
> +       }
> +
>         if (*p == '@') {
>                 strncpy(pipe->format_str, p + 1, 4);
>                 pipe->format_str[4] = '\0';
> @@ -1323,7 +1342,7 @@ static void usage(char *name)
>
>         fprintf(stderr, "\n Test options:\n\n");
>         fprintf(stderr, "\t-P <crtc_id>:<w>x<h>[+<x>+<y>][*<scale>][@<format>]\tset a plane\n");
> -       fprintf(stderr, "\t-s <connector_id>[,<connector_id>][@<crtc_id>]:<mode>[@<format>]\tset a mode\n");
> +       fprintf(stderr, "\t-s <connector_id>[,<connector_id>][@<crtc_id>]:<mode>[-<vrefresh>][@<format>]\tset a mode\n");
>         fprintf(stderr, "\t-v\ttest vsynced page flipping\n");
>         fprintf(stderr, "\t-w <obj_id>:<prop_name>:<value>\tset property\n");
>
> --
> 1.7.9.5
>
> _______________________________________________
> dri-devel mailing list
> dri-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/dri-devel


More information about the dri-devel mailing list