On Fri, Jan 10, 2014 at 5:02 AM, Vincent ABRIOU <vincent.abriou@xxxxxx> 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@xxxxxx> > --- > 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@xxxxxxxxxxxxxxxxxxxxx > http://lists.freedesktop.org/mailman/listinfo/dri-devel _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/dri-devel