[PATCH libdrm] modetest: Use floating vrefresh while dumping mode
Ville Syrjälä
ville.syrjala at linux.intel.com
Wed Nov 27 12:59:12 UTC 2019
On Wed, Nov 27, 2019 at 07:28:31AM +0000, Devarsh Thakkar wrote:
> Thanks for the review Ville, please see inline:
>
> > -----Original Message-----
> > From: Ville Syrjälä <ville.syrjala at linux.intel.com>
> > Sent: 26 November 2019 07:15
> > To: Devarsh Thakkar <DEVARSHT at xilinx.com>
> > Cc: dri-devel at lists.freedesktop.org; Hyun Kwon <hyunk at xilinx.com>; vcu-
> > team <vcu-team at xilinx.com>; Ranganathan Sk <rsk at xilinx.com>; Dhaval
> > Rajeshbhai Shah <dshah at xilinx.com>; Satish Kumar Nagireddy
> > <SATISHNA at xilinx.com>; Varunkumar Allagadapa <VARUNKUM at xilinx.com>;
> > Rohit Visavalia <RVISAVAL at xilinx.com>
> > Subject: Re: [PATCH libdrm] modetest: Use floating vrefresh while dumping
> > mode
> >
> > EXTERNAL EMAIL
> >
> > On Tue, Nov 26, 2019 at 07:03:58AM -0800, Devarsh Thakkar wrote:
> > > Add inline function to derive floating value of vertical refresh rate
> > > from pixel clock, horizontal total size and vertical total size.
> > >
> > > Use this function to find suitable mode having vrefresh value which is
> > > matching with user provided vrefresh value.
> > >
> > > If user doesn't provide any vrefresh value in args then update
> > > vertical refresh rate value in pipe args using this function so that
> > > it will be used for printing floating vrefresh while dumping mode.
> > >
> > > This will give more accurate picture to user for available modes
> > > differentiated by floating vertical refresh rate and help user select
> > > more appropriate mode using suitable refresh rate value.
> > >
> > > Signed-off-by: Devarsh Thakkar <devarsh.thakkar at xilinx.com>
> > > ---
> > > tests/modetest/modetest.c | 36 ++++++++++++++++++++++--------------
> > > 1 file changed, 22 insertions(+), 14 deletions(-)
> > >
> > > diff --git a/tests/modetest/modetest.c b/tests/modetest/modetest.c
> > > index b4edfcb..80cf076 100644
> > > --- a/tests/modetest/modetest.c
> > > +++ b/tests/modetest/modetest.c
> > > @@ -133,6 +133,12 @@ static inline int64_t U642I64(uint64_t val)
> > > return (int64_t)*((int64_t *)&val); }
> > >
> > > +static inline float get_floating_vrefresh(drmModeModeInfo *mode)
> >
> > Drop the 'inline'. I'd call it just mode_vrefresh() or somehting like that.
> >
>
> Yes I do agree that most compilers will substitute function body if needed (and I do see that in generated assembly even without inline) but I still thought better to add inline keyword just to give the hint to compiler in case if it doesn't.
> Any specific reason or issues if we use inline ?
My usual rule is to use static inline only in header files,
otherwise I never use it unless it shows a tangible performance
benefit.
>
>
> > > +{
> > > + return mode->clock * 1000.00
> > > + / (mode->htotal * mode->vtotal); }
> > > +
> > > #define bit_name_fn(res) \
> > > const char * res##_str(int type) { \
> > > unsigned int i; \
> > > @@ -210,9 +216,9 @@ static void dump_encoders(struct device *dev)
> > >
> > > static void dump_mode(drmModeModeInfo *mode) {
> > > - printf(" %s %d %d %d %d %d %d %d %d %d %d",
> > > + printf(" %s %.2f %d %d %d %d %d %d %d %d %d",
> > > mode->name,
> > > - mode->vrefresh,
> > > + get_floating_vrefresh(mode),
> > > mode->hdisplay,
> > > mode->hsync_start,
> > > mode->hsync_end,
> > > @@ -823,12 +829,11 @@ struct plane_arg {
> > >
> > > static drmModeModeInfo *
> > > connector_find_mode(struct device *dev, uint32_t con_id, const char
> > *mode_str,
> > > - const float vrefresh)
> > > + float *vrefresh)
> > > {
> > > drmModeConnector *connector;
> > > drmModeModeInfo *mode;
> > > int i;
> > > - float mode_vrefresh;
> > >
> > > connector = get_connector_by_id(dev, con_id);
> > > if (!connector || !connector->count_modes) @@ -837,16 +842,19 @@
> > > 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)) {
> > > - /* 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 the vertical refresh frequency is not specified
> > > + * then return the first mode that match with the name
> > > + * and update corresponding vrefresh in pipe_arg.
> > > + * Else, return the mode that match the name and
> > > + * the specified vertical refresh frequency.
> > > */
> > > - mode_vrefresh = mode->clock * 1000.00
> > > - / (mode->htotal * mode->vtotal);
> > > - if (vrefresh == 0)
> > > + if (*vrefresh == 0) {
> > > + *vrefresh = get_floating_vrefresh(mode);
> > > return mode;
> > > - else if (fabs(mode_vrefresh - vrefresh) < 0.005)
> > > + } else if (fabs(get_floating_vrefresh(mode)
> > > + - *vrefresh) < 0.005) {
> > > return mode;
> > > + }
> > > }
> > > }
> > >
> > > @@ -909,11 +917,11 @@ 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->vrefresh);
> > > + pipe->mode_str,
> > > + &pipe->vrefresh);
> > > if (mode == NULL) {
> > > fprintf(stderr,
> > > - "failed to find mode \"%s\" for connector %s\n",
> > > - pipe->mode_str, pipe->cons[i]);
> > > + "failed to find mode \"%s-%.2fHz\" for connector %s\n",
> > > + pipe->mode_str, pipe->vrefresh, pipe->cons[i]);
> >
> > We didn't find any mode so having connector_find_mode() update vrefresh
> > for us is nonsense.
>
> Yes that's correct, but we need it in a scenario where user provided a vrefresh for the mode and mode is not available with that exact vrefresh but available with a different refresh rate. So for e.g if 1920x1080-60 is only available and user set 1920x1080-59.92 (which is not available). Then it should display that mode 1920x1080-59.92 is not available and not that 1920x1080 is not found (since 1920x1080-60 is available). So I guess best way to handle not found mode is to print vrefresh too only in scenario where user had provided a specific refresh rate as arg. What's your opinion ?
Yeah, only printing it if the user asked for it seems like the sanest
option.
>
>
> >
> > > return -EINVAL;
> > > }
> > > }
> > > --
> > > 2.7.4
> >
> > --
> > Ville Syrjälä
> > Intel
--
Ville Syrjälä
Intel
More information about the dri-devel
mailing list