[PATCH libdrm 2/2] modetest: Add a new "-r" option to set a default mode

Emil Velikov emil.l.velikov at gmail.com
Tue Jan 21 18:30:21 UTC 2020


Hi Ezequiel,

The first patch looks spot on. I'll commit it in a moment.

On Mon, 22 Jul 2019 at 17:08, Ezequiel Garcia <ezequiel at collabora.com> wrote:
>
> This option finds the first connected connector and then
> sets its preferred mode on it.
>
> Set this option to be set when no mode or plane is set
> explicitily. This allows to quickly test, in cases where
> one just needs something displayed.
>
> Signed-off-by: Ezequiel Garcia <ezequiel at collabora.com>
> ---
>  tests/modetest/modetest.c | 81 ++++++++++++++++++++++++++++++++++++---
>  1 file changed, 75 insertions(+), 6 deletions(-)
>
> diff --git a/tests/modetest/modetest.c b/tests/modetest/modetest.c
> index 5e628127a130..6042aaae7cca 100644
> --- a/tests/modetest/modetest.c
> +++ b/tests/modetest/modetest.c

> @@ -1874,6 +1878,9 @@ static int pipe_resolve_connectors(struct device *dev, struct pipe_arg *pipe)
>         char *endp;
>
>         for (i = 0; i < pipe->num_cons; i++) {
> +               /* If set_preferred is used, the connector is already resolved. */
> +               if (pipe->con_ids[i])
> +                       continue;
This seems rather non-intuitive. How about we guard invocation of this
function altogether?
For example (minimal whitespace changes), in main() we can use:

if (!set_preferred && pipe_resolve_connectors()....)


> +static int pipe_find_preferred(struct device *dev, struct pipe_arg *pipe)
> +{
> +       drmModeRes *res = dev->resources->res;
> +       drmModeConnector *con = NULL;
> +       char *con_str;
> +       int i;
> +
> +       for (i = 0; i < res->count_connectors; i++) {
> +               con = drmModeGetConnector(dev->fd, res->connectors[i]);
> +               if (con->connection == DRM_MODE_CONNECTED)
> +                       break;
> +               drmModeFreeConnector(con);
> +               con = NULL;
> +       }
> +

> +
> +       /* A CRTC possible will be chosen by pipe_find_crtc_and_mode. */
> +       pipe->crtc_id = (uint32_t)-1;
> +
As-is this will pick the first connector, which may not work with all crtcs.

How about we tweak the loop above to pick a connector for the given crtc_id?
Feel free to do that as follow-up.


>  int main(int argc, char **argv)

>         int test_cursor = 0;
> +       int set_preferred = 0;
>         int use_atomic = 0;
>         char *device = NULL;
>         char *module = NULL;
> @@ -1987,6 +2043,9 @@ int main(int argc, char **argv)
>                 case 'v':
>                         test_vsync = 1;
>                         break;
> +               case 'r':
> +                       set_preferred = 1;
> +                       break;
>                 case 'w':
>                         prop_args = realloc(prop_args,
>                                            (prop_count + 1) * sizeof *prop_args);
> @@ -2008,7 +2067,7 @@ int main(int argc, char **argv)
>         }
>
>         if (!args || (args == 1 && use_atomic))
> -               encoders = connectors = crtcs = planes = framebuffers = 1;
> +               set_preferred = encoders = connectors = crtcs = planes = framebuffers = 1;
>
Did you mean to git add this? The variable set_preferred is already
set as needed.

Any reason why using atomic modeset (modetest -r -a), clears the
screen while legacy (modetest -r) sets the usual pattern. What am I
missing?

Thanks
Emil


More information about the dri-devel mailing list