On Wed, Jul 29, 2015 at 6:54 AM, Mario Kleiner
<mario.kleiner...@gmail.com> wrote:
> Allow user to select the maximum level of DRI implementation
> to use, DRI2 or DRI3.
>
> exa accel supports both DRI2 and, if the kernel supports
> rendernodes, also DRI3. However, DRI3 still seems to have
> some bugs on current implementations, and additionally it
> doesn't work well at all for X-Servers older than 1.16.3
> due to X-Server bugs. Therefore we default to DRI2 on exa,
> but allow the user to enable DRI3 with this new option.
>
> nouveau's glamor accel backend currently doesn't work under
> DRI2 at all, so we continue to use DRI3 whenever it is
> supported and ignore this new option for now.
>
> Also add a bit more output about status of Present and
> DRI3 to aid debugging.
>
> Note: This was originally meant to be a boolean parameter,
>       to just select between DRI3 on and off, but changed
>       here to a DRI level to make it consistent with the
>       same option in the released Intel-ddx.
>
> Signed-off-by: Mario Kleiner <mario.kleiner...@gmail.com>
> Cc: Ilia Mirkin <imir...@alum.mit.edu>
> Cc: Emil Velikov <emil.l.veli...@gmail.com>
> Cc: Martin Peres <martin.pe...@free.fr>
> Cc: Ben Skeggs <bske...@redhat.com>
> ---
>  man/nouveau.man      |  6 ++++++
>  src/nouveau_dri2.c   | 11 ++++++++++-
>  src/nouveau_glamor.c |  2 +-
>  src/nv_const.h       |  2 ++
>  src/nv_driver.c      | 30 ++++++++++++++++++++++++++++--
>  src/nv_type.h        |  1 +
>  6 files changed, 48 insertions(+), 4 deletions(-)
>
> diff --git a/man/nouveau.man b/man/nouveau.man
> index 129bb7f..3d5a428 100644
> --- a/man/nouveau.man
> +++ b/man/nouveau.man
> @@ -125,6 +125,12 @@ that relies on correct presentation timing behaviour as 
> defined in that
>  specification.
>  .br
>  Default: 1.
> +.TP
> +.BI "Option \*qDRI\*q \*q" integer \*q
> +Define the maximum level of DRI to enable. Valid values are 2 or 3.
> +exa acceleration will honor the maximum level if it is supported.
> +Under glamor acceleration DRI3 is always enabled if supported,
> +as glamor currently does not support DRI2. Default: 2 on exa, 3 on glamor.
>  .SH "SEE ALSO"
>  __xservername__(__appmansuffix__), __xconfigfile__(__filemansuffix__), 
> Xserver(__appmansuffix__), X(__miscmansuffix__)
>  .SH AUTHORS
> diff --git a/src/nouveau_dri2.c b/src/nouveau_dri2.c
> index ce6f53e..81ee9be 100644
> --- a/src/nouveau_dri2.c
> +++ b/src/nouveau_dri2.c
> @@ -1134,7 +1134,16 @@ nouveau_dri3_screen_init(ScreenPtr screen)
>         if (buf && stat(buf, &render) == 0 &&
>             master.st_mode == render.st_mode) {
>                 pNv->render_node = buf;
> -               return dri3_screen_init(screen, &nouveau_dri3_screen_info);
> +               if (dri3_screen_init(screen, &nouveau_dri3_screen_info)) {
> +                       xf86DrvMsg(pScrn->scrnIndex, X_INFO,
> +                                  "DRI3 on EXA enabled\n");
> +                       return TRUE;
> +               }
> +               else {
> +                       xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
> +                                  "DRI3 on EXA initialization failed\n");
> +                       return FALSE;
> +               }
>         } else
>                 free(buf);
>  #endif
> diff --git a/src/nouveau_glamor.c b/src/nouveau_glamor.c
> index b8bca17..a8e9206 100644
> --- a/src/nouveau_glamor.c
> +++ b/src/nouveau_glamor.c
> @@ -240,7 +240,7 @@ nouveau_glamor_init(ScreenPtr screen)
>         screen->SharePixmapBacking = nouveau_glamor_share_pixmap_backing;
>         screen->SetSharedPixmapBacking = 
> nouveau_glamor_set_shared_pixmap_backing;
>
> -       xf86DrvMsg(scrn->scrnIndex, X_INFO, "[GLAMOR] initialised\n");
> +       xf86DrvMsg(scrn->scrnIndex, X_INFO, "[GLAMOR] initialised with 
> DRI3\n");
>         pNv->Flush = nouveau_glamor_flush;
>         return TRUE;
>  }
> diff --git a/src/nv_const.h b/src/nv_const.h
> index f1b4e9b..3f18d23 100644
> --- a/src/nv_const.h
> +++ b/src/nv_const.h
> @@ -18,6 +18,7 @@ typedef enum {
>      OPTION_SWAP_LIMIT,
>      OPTION_ASYNC_COPY,
>      OPTION_ACCELMETHOD,
> +    OPTION_DRI,
>  } NVOpts;
>
>
> @@ -34,6 +35,7 @@ static const OptionInfoRec NVOptions[] = {
>      { OPTION_SWAP_LIMIT,       "SwapLimit",    OPTV_INTEGER,   {0}, FALSE },
>      { OPTION_ASYNC_COPY,       "AsyncUTSDFS",  OPTV_BOOLEAN,   {0}, FALSE },
>      { OPTION_ACCELMETHOD,      "AccelMethod",  OPTV_STRING,    {0}, FALSE },
> +    { OPTION_DRI,              "DRI",          OPTV_INTEGER,   {0}, FALSE },
>      { -1,                       NULL,           OPTV_NONE,      {0}, FALSE }
>  };
>
> diff --git a/src/nv_driver.c b/src/nv_driver.c
> index 4218e4f..b284d96 100644
> --- a/src/nv_driver.c
> +++ b/src/nv_driver.c
> @@ -1095,6 +1095,25 @@ NVPreInit(ScrnInfoPtr pScrn, int flags)
>         pNv->ce_enabled =
>                 xf86ReturnOptValBool(pNv->Options, OPTION_ASYNC_COPY, FALSE);
>
> +       /* Define maximum allowed level of DRI implementation to use.
> +        * We default to DRI2 on EXA for now, as DRI3 still has some
> +        * problems. However, the max_dri_level can be only honored
> +        * by EXA, as GLAMOR only supports DRI3 at the moment.
> +        */
> +       pNv->max_dri_level = (pNv->AccelMethod == GLAMOR) ? 3 : 2;
> +       from = X_DEFAULT;
> +
> +       if (xf86GetOptValInteger(pNv->Options, OPTION_DRI,
> +                                &pNv->max_dri_level)) {
> +               from = X_CONFIG;
> +               if (pNv->max_dri_level < 2)
> +                       pNv->max_dri_level = 2;
> +               if (pNv->max_dri_level > 3)
> +                       pNv->max_dri_level = 3;
> +       }
> +       xf86DrvMsg(pScrn->scrnIndex, from, "Allowed maximum DRI level %i.\n",
> +                  pNv->max_dri_level);
> +
>         if (pNv->AccelMethod > NONE && pNv->dev->chipset >= 0x11) {
>                 from = X_DEFAULT;
>                 pNv->glx_vblank = TRUE;
> @@ -1474,7 +1493,13 @@ NVScreenInit(SCREEN_INIT_ARGS_DECL)
>
>         xf86SetBlackWhitePixels(pScreen);
>
> -       nouveau_present_init(pScreen);
> +       if (nouveau_present_init(pScreen) <= 0)

Not your fault, but you have to normalize this:

src/nouveau_present.c-int
src/nouveau_present.c:nouveau_present_init(ScreenPtr screen)

src/nouveau_present.h:Bool nouveau_present_init(ScreenPtr pScreen);

I'm sure Bool is a typedef of some sort to something horrid, like int,
but... I hate to see mismatches like that, they just confuse everyone.

/usr/include/xorg/present.h-extern _X_EXPORT Bool
/usr/include/xorg/present.h:present_screen_init(ScreenPtr screen,
present_screen_info_ptr info);

So I think that it's just nouveau_present.c that needs to be fixed,
and you can drop the <= 0 and flip the print order.

Overall looks great, thanks!

> +               xf86DrvMsg(pScrn->scrnIndex, X_INFO,
> +                          "Hardware support for Present disabled\n");
> +       else
> +               xf86DrvMsg(pScrn->scrnIndex, X_INFO,
> +                          "Hardware support for Present enabled\n");
> +
>         nouveau_sync_init(pScreen);
>         nouveau_dri2_init(pScreen);
>         if (pNv->AccelMethod == GLAMOR) {
> @@ -1482,7 +1507,8 @@ NVScreenInit(SCREEN_INIT_ARGS_DECL)
>                         return FALSE;
>         } else
>         if (pNv->AccelMethod == EXA) {
> -               if (!nouveau_dri3_screen_init(pScreen))
> +               if (pNv->max_dri_level >= 3 &&
> +                   !nouveau_dri3_screen_init(pScreen))
>                         return FALSE;
>
>                 if (!nouveau_exa_init(pScreen))
> diff --git a/src/nv_type.h b/src/nv_type.h
> index e6ab192..510a30c 100644
> --- a/src/nv_type.h
> +++ b/src/nv_type.h
> @@ -71,6 +71,7 @@ typedef struct _NVRec {
>      Bool               has_pageflip;
>      int                swap_limit;
>      int                max_swap_limit;
> +    int                max_dri_level;
>
>      ScreenBlockHandlerProcPtr BlockHandler;
>      CreateScreenResourcesProcPtr CreateScreenResources;
> --
> 1.9.1
>
_______________________________________________
Nouveau mailing list
Nouveau@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/nouveau

Reply via email to