[Nouveau] [PATCH] Add Option "DRI3" to allow to disable DRI3 under EXA.

Ilia Mirkin imirkin at alum.mit.edu
Sat Jul 4 11:28:36 PDT 2015


Erm, that's nuts. I also don't really understand what they're talking
about there... i915g vs i915? Anyways, I just meant the version
numbers :)

On Sat, Jul 4, 2015 at 2:23 PM, Emil Velikov <emil.l.velikov at gmail.com> wrote:
> That would be great, as long as it does only that and does not go into
> the "drivername" territory. As the said driver ;-)
>
> "A driver name to use can be provided instead
> of simple boolean value, which will be passed to the GL implementation for
> it to load the appropriate backend."
>
> -Emil
>
> On 4 July 2015 at 18:17, Ilia Mirkin <imirkin at alum.mit.edu> wrote:
>> IMO it'd be nice to keep this compatible with the intel driver, which
>> has a "DRI" option, which can take the values 1, 2, 3. Obviously for
>> nouveau, 1 makes no sense as that was dropped quite some time ago.
>>
>> See http://cgit.freedesktop.org/xorg/driver/xf86-video-intel/tree/man/intel.man#n68
>>
>> On Mon, Jun 29, 2015 at 11:30 PM, Mario Kleiner
>> <mario.kleiner.de at gmail.com> wrote:
>>> X-Server versions older than 1.16.3 have bugs in their
>>> DRI3/Present implementation which impair nouveau, so
>>> it is better to stick to good old DRI2 by default on
>>> such servers. E.g., page flipping doesn't work at all
>>> under DRI3/Present with older servers, and use of
>>> extensions like OML_sync_control, SGI_video_sync or
>>> INTEL_swap_events also causes failure of Present.
>>>
>>> nouveau's glamor accel backend currently doesn't work under
>>> DRI2, so continue to use DRI3 whenever it is supported.
>>>
>>> Under the exa accel backend, DRI2 works just fine, so
>>> disable DRI3 and choose DRI2 by default when nouveau
>>> is built for X-Server < 1.16.3, and enable DRI3 if
>>> building on later X-Servers which work reasonably well
>>> under DRI3/Present.
>>>
>>> A new boolean xorg.conf Option "DRI3" allows to enforce or
>>> prevent use of DRI3/Present under EXA acceleration for
>>> testing.
>>>
>>> Also add a bit more output about status of Present and
>>> DRI3 to aid debugging.
>>>
>>> Signed-off-by: Mario Kleiner <mario.kleiner.de at gmail.com>
>>> ---
>>>  man/nouveau.man    |  6 ++++++
>>>  src/nouveau_dri2.c | 11 ++++++++++-
>>>  src/nv_const.h     |  2 ++
>>>  src/nv_driver.c    | 17 +++++++++++++++--
>>>  4 files changed, 33 insertions(+), 3 deletions(-)
>>>
>>> diff --git a/man/nouveau.man b/man/nouveau.man
>>> index 129bb7f..12cfbc0 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 \*qDRI3\*q \*q" boolean \*q
>>> +Enable the DRI3 extension under exa acceleration if supported by server.
>>> +A setting of "off" will only use DRI2 instead. Under glamor acceleration,
>>> +DRI3 is always enabled if supported. Default: on for XOrg >= 1.16.3, off for
>>> +earlier versions.
>>>  .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 f22e319..d818976 100644
>>> --- a/src/nouveau_dri2.c
>>> +++ b/src/nouveau_dri2.c
>>> @@ -1130,7 +1130,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/nv_const.h b/src/nv_const.h
>>> index f1b4e9b..df1e398 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_DRI3,
>>>  } 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_DRI3,             "DRI3",         OPTV_BOOLEAN,   {0}, FALSE },
>>>      { -1,                       NULL,           OPTV_NONE,      {0}, FALSE }
>>>  };
>>>
>>> diff --git a/src/nv_driver.c b/src/nv_driver.c
>>> index 8e2ae03..32f04d8 100644
>>> --- a/src/nv_driver.c
>>> +++ b/src/nv_driver.c
>>> @@ -1470,7 +1470,13 @@ NVScreenInit(SCREEN_INIT_ARGS_DECL)
>>>
>>>         xf86SetBlackWhitePixels(pScreen);
>>>
>>> -       nouveau_present_init(pScreen);
>>> +       if (nouveau_present_init(pScreen) <= 0)
>>> +               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) {
>>> @@ -1478,7 +1484,14 @@ NVScreenInit(SCREEN_INIT_ARGS_DECL)
>>>                         return FALSE;
>>>         } else
>>>         if (pNv->AccelMethod == EXA) {
>>> -               if (!nouveau_dri3_screen_init(pScreen))
>>> +               /* Default to DRI3/Present on XOrg >= 1.16.3, DRI2 on older
>>> +                * servers, as older servers have DRI3/Present bugs affecting
>>> +                * nouveau.
>>> +                */
>>> +               ret = xf86ReturnOptValBool(pNv->Options, OPTION_DRI3,
>>> +                                          XORG_VERSION_CURRENT >=
>>> +                                          XORG_VERSION_NUMERIC(1,16,3,0,0));
>>> +               if (ret && !nouveau_dri3_screen_init(pScreen))
>>>                         return FALSE;
>>>
>>>                 if (!nouveau_exa_init(pScreen))
>>> --
>>> 1.9.1
>>>
>>> _______________________________________________
>>> Nouveau mailing list
>>> Nouveau at lists.freedesktop.org
>>> http://lists.freedesktop.org/mailman/listinfo/nouveau
>> _______________________________________________
>> Nouveau mailing list
>> Nouveau at lists.freedesktop.org
>> http://lists.freedesktop.org/mailman/listinfo/nouveau


More information about the Nouveau mailing list