Re: [Mesa-dev] RFC - libglvnd and GLXVND vendor enumeration to facilitate GLX multi-vendor PRIME GPU offload

2019-02-13 Thread Kyle Brenneman

On 2/13/19 2:32 PM, Andy Ritger wrote:

On Wed, Feb 13, 2019 at 12:15:02PM -0700, Kyle Brenneman wrote:

On 02/12/2019 01:58 AM, Michel Dänzer wrote:

On 2019-02-11 5:18 p.m., Andy Ritger wrote:

On Mon, Feb 11, 2019 at 12:09:26PM +0100, Michel Dänzer wrote:

On 2019-02-08 11:43 p.m., Kyle Brenneman wrote:

Also, is Mesa the only client-side vendor library that works with the
Xorg GLX module? I vaguely remember that there was at least one other
driver that did, but I don't remember the details anymore.

AFAIK, the amdgpu-pro OpenGL driver can work with the Xorg GLX module
(or its own forked version of it).

Maybe the amdgpu-pro OpenGL driver uses a fork of the Xorg GLX module
(or sets the "GlxVendorLibrary" X configuration option?), but it doesn't
look to me like the in-tree Xorg GLX module could report anything other
than "mesa" for GLX_VENDOR_NAMES_EXT, without custom user configuration.

GLX_VENDOR_NAMES_EXT, which client-side glvnd uses to pick the
libGLX_${vendor}.so to load, is implemented in the Xorg GLX module
with this:

xserver/glx/glxcmds.c:__glXDisp_QueryServerString():

  case GLX_VENDOR_NAMES_EXT:
  if (pGlxScreen->glvnd) {
  ptr = pGlxScreen->glvnd;
  break;
  }

pGlxScreen->glvnd appears to be assigned here, defaulting to "mesa",
though allowing an xorg.conf override via the "GlxVendorLibrary" option:

xserver/glx/glxdri2.c:__glXDRIscreenProbe():

  xf86ProcessOptions(pScrn->scrnIndex, pScrn->options, options);
  glvnd = xf86GetOptValString(options, GLXOPT_VENDOR_LIBRARY);
  if (glvnd)
  screen->base.glvnd = xnfstrdup(glvnd);
  free(options);

  if (!screen->base.glvnd)
  screen->base.glvnd = strdup("mesa");

And swrast unconditionally sets pGlxScreen->glvnd to "mesa":

xserver/glx/glxdriswrast.c:__glXDRIscreenProbe():

  screen->base.glvnd = strdup("mesa");

Is there more to this that I'm missing?

I don't think so, I suspect we were just assuming slightly different
definitions of "works". :)



That should get fixed, but since that applies to the libglvnd's normal
vendor selection, I'd say it's orthogonal to GPU offloading. Off the top of
my head, the "GlxVendorLibrary" option ought to work regardless of which
__GLXprovider it finds. I think it would be possible to add a function to
let a driver override the GLX_VENDOR_NAMES_EXT string, too.

I think the point, though, is that thus far, libGLX_mesa.so is the only
glvnd client-side GLX implementation that will be loaded for use with
Xorg's GLX.  Thus, it doesn't seem to refute ajax's comment from earlier
in the thread:
I don't see that those are related. The GLX_VENDOR_NAMES_EXT string 
tells libglvnd which vendor to use by default. GPU offloading, more or 
less by definition, means using something other than the default.



At the other extreme, the server could do nearly all the work of
generating the possible __GLX_VENDOR_LIBRARY_NAME strings (with the
practical downside of each server-side GLX vendor needing to enumerate
the GPUs it can drive, in order to generate the hardware-specific
identifiers).

I don't think this downside is much of a burden? If you're registering
a provider other than Xorg's you're already doing it from the DDX
driver



-Kyle



___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Re: [Mesa-dev] RFC - libglvnd and GLXVND vendor enumeration to facilitate GLX multi-vendor PRIME GPU offload

2019-02-13 Thread Andy Ritger
On Wed, Feb 13, 2019 at 12:15:02PM -0700, Kyle Brenneman wrote:
> On 02/12/2019 01:58 AM, Michel Dänzer wrote:
> > On 2019-02-11 5:18 p.m., Andy Ritger wrote:
> > > On Mon, Feb 11, 2019 at 12:09:26PM +0100, Michel Dänzer wrote:
> > > > On 2019-02-08 11:43 p.m., Kyle Brenneman wrote:
> > > > > Also, is Mesa the only client-side vendor library that works with the
> > > > > Xorg GLX module? I vaguely remember that there was at least one other
> > > > > driver that did, but I don't remember the details anymore.
> > > > AFAIK, the amdgpu-pro OpenGL driver can work with the Xorg GLX module
> > > > (or its own forked version of it).
> > > Maybe the amdgpu-pro OpenGL driver uses a fork of the Xorg GLX module
> > > (or sets the "GlxVendorLibrary" X configuration option?), but it doesn't
> > > look to me like the in-tree Xorg GLX module could report anything other
> > > than "mesa" for GLX_VENDOR_NAMES_EXT, without custom user configuration.
> > > 
> > > GLX_VENDOR_NAMES_EXT, which client-side glvnd uses to pick the
> > > libGLX_${vendor}.so to load, is implemented in the Xorg GLX module
> > > with this:
> > > 
> > >xserver/glx/glxcmds.c:__glXDisp_QueryServerString():
> > > 
> > >  case GLX_VENDOR_NAMES_EXT:
> > >  if (pGlxScreen->glvnd) {
> > >  ptr = pGlxScreen->glvnd;
> > >  break;
> > >  }
> > > 
> > > pGlxScreen->glvnd appears to be assigned here, defaulting to "mesa",
> > > though allowing an xorg.conf override via the "GlxVendorLibrary" option:
> > > 
> > >xserver/glx/glxdri2.c:__glXDRIscreenProbe():
> > > 
> > >  xf86ProcessOptions(pScrn->scrnIndex, pScrn->options, options);
> > >  glvnd = xf86GetOptValString(options, GLXOPT_VENDOR_LIBRARY);
> > >  if (glvnd)
> > >  screen->base.glvnd = xnfstrdup(glvnd);
> > >  free(options);
> > > 
> > >  if (!screen->base.glvnd)
> > >  screen->base.glvnd = strdup("mesa");
> > > 
> > > And swrast unconditionally sets pGlxScreen->glvnd to "mesa":
> > > 
> > >xserver/glx/glxdriswrast.c:__glXDRIscreenProbe():
> > > 
> > >  screen->base.glvnd = strdup("mesa");
> > > 
> > > Is there more to this that I'm missing?
> > I don't think so, I suspect we were just assuming slightly different
> > definitions of "works". :)
> > 
> > 
> That should get fixed, but since that applies to the libglvnd's normal
> vendor selection, I'd say it's orthogonal to GPU offloading. Off the top of
> my head, the "GlxVendorLibrary" option ought to work regardless of which
> __GLXprovider it finds. I think it would be possible to add a function to
> let a driver override the GLX_VENDOR_NAMES_EXT string, too.

I think the point, though, is that thus far, libGLX_mesa.so is the only
glvnd client-side GLX implementation that will be loaded for use with
Xorg's GLX.  Thus, it doesn't seem to refute ajax's comment from earlier
in the thread:

>>> At the other extreme, the server could do nearly all the work of
>>> generating the possible __GLX_VENDOR_LIBRARY_NAME strings (with the
>>> practical downside of each server-side GLX vendor needing to enumerate
>>> the GPUs it can drive, in order to generate the hardware-specific
>>> identifiers).
>> I don't think this downside is much of a burden? If you're registering
>> a provider other than Xorg's you're already doing it from the DDX
>> driver 


> -Kyle
> 
___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Re: [Mesa-dev] RFC - libglvnd and GLXVND vendor enumeration to facilitate GLX multi-vendor PRIME GPU offload

2019-02-13 Thread Kyle Brenneman

On 02/12/2019 01:58 AM, Michel Dänzer wrote:

On 2019-02-11 5:18 p.m., Andy Ritger wrote:

On Mon, Feb 11, 2019 at 12:09:26PM +0100, Michel Dänzer wrote:

On 2019-02-08 11:43 p.m., Kyle Brenneman wrote:

Also, is Mesa the only client-side vendor library that works with the
Xorg GLX module? I vaguely remember that there was at least one other
driver that did, but I don't remember the details anymore.

AFAIK, the amdgpu-pro OpenGL driver can work with the Xorg GLX module
(or its own forked version of it).

Maybe the amdgpu-pro OpenGL driver uses a fork of the Xorg GLX module
(or sets the "GlxVendorLibrary" X configuration option?), but it doesn't
look to me like the in-tree Xorg GLX module could report anything other
than "mesa" for GLX_VENDOR_NAMES_EXT, without custom user configuration.

GLX_VENDOR_NAMES_EXT, which client-side glvnd uses to pick the
libGLX_${vendor}.so to load, is implemented in the Xorg GLX module
with this:

   xserver/glx/glxcmds.c:__glXDisp_QueryServerString():

 case GLX_VENDOR_NAMES_EXT:
 if (pGlxScreen->glvnd) {
 ptr = pGlxScreen->glvnd;
 break;
 }

pGlxScreen->glvnd appears to be assigned here, defaulting to "mesa",
though allowing an xorg.conf override via the "GlxVendorLibrary" option:

   xserver/glx/glxdri2.c:__glXDRIscreenProbe():

 xf86ProcessOptions(pScrn->scrnIndex, pScrn->options, options);
 glvnd = xf86GetOptValString(options, GLXOPT_VENDOR_LIBRARY);
 if (glvnd)
 screen->base.glvnd = xnfstrdup(glvnd);
 free(options);

 if (!screen->base.glvnd)
 screen->base.glvnd = strdup("mesa");

And swrast unconditionally sets pGlxScreen->glvnd to "mesa":

   xserver/glx/glxdriswrast.c:__glXDRIscreenProbe():

 screen->base.glvnd = strdup("mesa");

Is there more to this that I'm missing?

I don't think so, I suspect we were just assuming slightly different
definitions of "works". :)


That should get fixed, but since that applies to the libglvnd's normal 
vendor selection, I'd say it's orthogonal to GPU offloading. Off the top 
of my head, the "GlxVendorLibrary" option ought to work regardless of 
which __GLXprovider it finds. I think it would be possible to add a 
function to let a driver override the GLX_VENDOR_NAMES_EXT string, too.


-Kyle

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Re: [Mesa-dev] RFC - libglvnd and GLXVND vendor enumeration to facilitate GLX multi-vendor PRIME GPU offload

2019-02-13 Thread Kyle Brenneman

On 02/11/2019 02:51 PM, Andy Ritger wrote:

On Fri, Feb 08, 2019 at 03:43:25PM -0700, Kyle Brenneman wrote:

On 2/8/19 2:33 PM, Andy Ritger wrote:

On Fri, Feb 08, 2019 at 03:01:33PM -0500, Adam Jackson wrote:

On Fri, 2019-02-08 at 10:19 -0800, Andy Ritger wrote:


(1) If configured for PRIME GPU offloading (environment variable or
  application profile), client-side libglvnd could load the possible
  libGLX_${vendor}.so libraries it finds, and call into each to
  find which vendor (and possibly which GPU) matches the specified
  string. Once a vendor is selected, the vendor library could optionally
  tell the X server which GLX vendor to use server-side for this
  client connection.

I'm not a huge fan of the "dlopen everything" approach, if it can be
avoided.

Yes, I agree.

I'm pretty sure libglvnd could avoid unnecessarily loading vendor libraries
without adding nearly so much complexity.

If libglvnd just has a list of additional vendor library names to try, then
you could just have a flag to tell libglvnd to check some server string for
that name before it loads the vendor. If a client-side vendor would need a
server-side counterpart to work, then libglvnd can check for that. The
server only needs to keep a list of names to send back, which would be a
trivial (and backward-compatible) addition to the GLXVND interface.

Also, even without that, I don't think the extra dlopen calls would be a
problem in practice. It would only ever happen in applications that are
configured for offloading, which are (more-or-less by definition)
heavy-weight programs, so an extra millisecond or so of startup time is
probably fine.

But why incur that loading if we don't need to?
As I noted, we can still avoid loading extra loads even with an (almost) 
strictly client-based design. You don't need to do any sort of 
server-based device enumeration, all you need is something in the server 
to add a string to a list that the client can query.


But, there's no reason that query can't be optional, and there's no 
reason it has to be coupled with anything else.





I think I'd rather have a new enum for GLXQueryServerString
that elaborates on GLX_VENDOR_NAMES_EXT (perhaps GLX_VENDOR_MAP_EXT),
with the returned string a space-delimited list of :.
libGL could accept either a profile or a vendor name in the environment
variable, and the profile can be either semantic like
performance/battery, or a hardware selector, or whatever else.

This would probably be a layered extension, call it GLX_EXT_libglvnd2,
which you'd check for in the (already per-screen) server extension
string before trying to actually use.

That all sounds reasonable to me.


At the other extreme, the server could do nearly all the work of
generating the possible __GLX_VENDOR_LIBRARY_NAME strings (with the
practical downside of each server-side GLX vendor needing to enumerate
the GPUs it can drive, in order to generate the hardware-specific
identifiers).

I don't think this downside is much of a burden? If you're registering
a provider other than Xorg's you're already doing it from the DDX
driver (I think? Are y'all doing that from your libglx instead?), and
when that initializes it already knows which device it's driving.

Right.  It will be easy enough for the NVIDIA X driver + NVIDIA server-side GLX.

Kyle and I were chatting about this, and we weren't sure whether people
would object to doing that for the Xorg GLX provider: to create the
hardware names, Xorg's GLX would need to enumerate all the DRM devices
and list them all as possible : pairs for the Xorg
GLX-driven screens.  But, now that I look at it more closely, it looks
like drmGetDevices2() would work well for that.

So, if you're not concerned with that burden, I'm not.  I'll try coding
up the Xorg GLX part of things and see how it falls into place.

That actually is one of my big concerns: I'd like to come up with something
that can give something equivalent to Mesa's existing DRI_PRIME setting, and
requiring that logic to be in the server seems like a very poor match. You'd
need to take all of the device selection and enumeration stuff from Mesa and
transplant it into the Xorg GLX module, and then you'd need to define some
sort of protocol to get that data back into Mesa where you actually need it.
Or else you need to duplicate it between the client and server, which seems
like the worst of both worlds.

Is this actually a lot of code?  I'll try to put together a prototype so
we can see how much it is, but if it is just calling drmGetDevices2() and
then building PCI BusID-based names, that doesn't seem unreasonable to me.
The fact that it's required *at all* tells you that a server-based 
design doesn't match the reality of existing drivers. I've also seen 
ideas for GLX implementations based on EGL or Vulkan, which probably 
wouldn't be able to work with server-side device enumeration.


And like I pointed out, adding that requirement doesn't give you 
anything that 

Re: [Mesa-dev] RFC - libglvnd and GLXVND vendor enumeration to facilitate GLX multi-vendor PRIME GPU offload

2019-02-13 Thread Kyle Brenneman

On 02/08/2019 11:19 AM, Andy Ritger wrote:

(I'll omit EGL and Vulkan for the moment, for the sake of focus, and those
APIs have programmatic ways to enumerate and select GPUs.  Though, some
of what we decide here for GLX we may want to leverage for other APIs.)


Today, GLX implementations loaded into the X server register themselves
on a per-screen basis, GLXVND in the server dispatches GLX requests to
the registered vendor per screen, and libglvnd determines the client-side
vendor library to use by querying the per-screen GLX_VENDOR_NAMES_EXT
string from the X server (e.g., "mesa" or "nvidia").

The GLX_VENDOR_NAMES_EXT string can be overridden within libglvnd
through the __GLX_VENDOR_LIBRARY_NAME environment variable, though I
don't believe that is used much currently.

To enable GLX to be used in a multi-vendor PRIME GPU offload environment,
it seems there are several desirable user-visible behaviors:

* By default, users should get the same behavior we have today (i.e.,
   the GLX implementation used within the client and the server, for an X
   screen, is dictated by the X driver of the X screen).

* The user should be able to request a different GLX vendor for use on a
   per-process basis through either an environment variable (potentially
   reusing __GLX_VENDOR_LIBRARY_NAME) or possibly a future application
   profile mechanism in libglvnd.

* To make configuration optionally more "portable", the selection override
   mechanism should be able to refer to more generic names like
   "performance" or "battery", and those generic names should be mapped
   to specific GPUs/vendors on a per-system basis.

* To make configuration optionally more explicit, the selection override
   mechanism should be able to distinguish between individual GPUs by
   using hardware specific identifiers such as PCI BusID-based names like
   what DRI_PRIME currently honors (e.g., "pci-_03_00_0").

Do those behaviors seem reasonable?

If so, it seems like there are two general directions we could take to
implement that infrastructure in client-side libglvnd and GLXVND within
the X server, if the user or application profile requests a particular
vendor, either by vendor name (e.g., "mesa"/"nvidia"), functional
name (e.g., "battery"/"performance"), or hardware-based name (e.g.,
"pci-_03_00_0"/pci-_01_00_0"):

(1) If configured for PRIME GPU offloading (environment variable or
 application profile), client-side libglvnd could load the possible
 libGLX_${vendor}.so libraries it finds, and call into each to
 find which vendor (and possibly which GPU) matches the specified
 string. Once a vendor is selected, the vendor library could optionally
 tell the X server which GLX vendor to use server-side for this
 client connection.

(2) The GLX implementations within the X server could, when registering
 with GLXVND, tell GLXVND which screens they can support for PRIME
 GPU offloading.  That list could be queried by client-side libglvnd,
 and then used to interpret __GLX_VENDOR_LIBRARY_NAME and pick the
 corresponding vendor library to load.  Client-side would tell the X
 server which GLX vendor to use server-side for this client connection.

In either direction, if the user-requested string is a hardware-based
name ("pci-_03_00_0"), the GLX vendor library presumably needs to be
told that GPU, so that the vendor implementation can use the right GPU
(in the case that the vendor supports multiple GPUs in the system).

But, both (1) and (2) are really just points on a continuum.  I suppose
the more general question is: how much of the implementation should go
in the server and how much should go in the client?

At one extreme, the client could do nearly all the work (with the
practical downside of potentially loading multiple vendor libraries in
order to interpret __GLX_VENDOR_LIBRARY_NAME).

At the other extreme, the server could do nearly all the work of
generating the possible __GLX_VENDOR_LIBRARY_NAME strings (with the
practical downside of each server-side GLX vendor needing to enumerate
the GPUs it can drive, in order to generate the hardware-specific
identifiers).

I'm not sure where on that spectrum it makes the most sense to land,
and I'm curious what others think.

Thanks,
- Andy



For a more concrete example, this is what I've been working on for a 
client-based interface:

https://github.com/kbrenneman/libglvnd/tree/libglx-gpu-offloading

For this design, I've tried to keep the interface as simple as possible 
and to impose as few requirements or assumptions as possible. The basic 
idea behind it is that the only thing that a GLX application has to care 
about is calling GLX functions, and the only thing that libglvnd has to 
care about is forwarding those functions to the correct vendor library.


The general design is this:
* Libglvnd gets a list of alternate vendor libraries from an app profile 
(config file, environment variable, whatever)
* For each vendor in 

Re: [Mesa-dev] RFC - libglvnd and GLXVND vendor enumeration to facilitate GLX multi-vendor PRIME GPU offload

2019-02-12 Thread Michel Dänzer
On 2019-02-11 5:18 p.m., Andy Ritger wrote:
> On Mon, Feb 11, 2019 at 12:09:26PM +0100, Michel Dänzer wrote:
>> On 2019-02-08 11:43 p.m., Kyle Brenneman wrote:
>>>
>>> Also, is Mesa the only client-side vendor library that works with the
>>> Xorg GLX module? I vaguely remember that there was at least one other
>>> driver that did, but I don't remember the details anymore.
>>
>> AFAIK, the amdgpu-pro OpenGL driver can work with the Xorg GLX module
>> (or its own forked version of it).
> 
> Maybe the amdgpu-pro OpenGL driver uses a fork of the Xorg GLX module
> (or sets the "GlxVendorLibrary" X configuration option?), but it doesn't
> look to me like the in-tree Xorg GLX module could report anything other
> than "mesa" for GLX_VENDOR_NAMES_EXT, without custom user configuration.
> 
> GLX_VENDOR_NAMES_EXT, which client-side glvnd uses to pick the
> libGLX_${vendor}.so to load, is implemented in the Xorg GLX module
> with this:
> 
>   xserver/glx/glxcmds.c:__glXDisp_QueryServerString():
> 
> case GLX_VENDOR_NAMES_EXT:
> if (pGlxScreen->glvnd) {
> ptr = pGlxScreen->glvnd;
> break;
> }
> 
> pGlxScreen->glvnd appears to be assigned here, defaulting to "mesa", 
> though allowing an xorg.conf override via the "GlxVendorLibrary" option:
> 
>   xserver/glx/glxdri2.c:__glXDRIscreenProbe():
> 
> xf86ProcessOptions(pScrn->scrnIndex, pScrn->options, options);
> glvnd = xf86GetOptValString(options, GLXOPT_VENDOR_LIBRARY);
> if (glvnd)
> screen->base.glvnd = xnfstrdup(glvnd);
> free(options);
> 
> if (!screen->base.glvnd)
> screen->base.glvnd = strdup("mesa");
> 
> And swrast unconditionally sets pGlxScreen->glvnd to "mesa":
> 
>   xserver/glx/glxdriswrast.c:__glXDRIscreenProbe():
> 
> screen->base.glvnd = strdup("mesa");
> 
> Is there more to this that I'm missing?

I don't think so, I suspect we were just assuming slightly different
definitions of "works". :)


-- 
Earthling Michel Dänzer   |   http://www.amd.com
Libre software enthusiast | Mesa and X developer
___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Re: [Mesa-dev] RFC - libglvnd and GLXVND vendor enumeration to facilitate GLX multi-vendor PRIME GPU offload

2019-02-11 Thread Andy Ritger
On Fri, Feb 08, 2019 at 03:43:25PM -0700, Kyle Brenneman wrote:
> On 2/8/19 2:33 PM, Andy Ritger wrote:
> > On Fri, Feb 08, 2019 at 03:01:33PM -0500, Adam Jackson wrote:
> > > On Fri, 2019-02-08 at 10:19 -0800, Andy Ritger wrote:
> > > 
> > > > (1) If configured for PRIME GPU offloading (environment variable or
> > > >  application profile), client-side libglvnd could load the possible
> > > >  libGLX_${vendor}.so libraries it finds, and call into each to
> > > >  find which vendor (and possibly which GPU) matches the specified
> > > >  string. Once a vendor is selected, the vendor library could 
> > > > optionally
> > > >  tell the X server which GLX vendor to use server-side for this
> > > >  client connection.
> > > I'm not a huge fan of the "dlopen everything" approach, if it can be
> > > avoided.
> > Yes, I agree.
> I'm pretty sure libglvnd could avoid unnecessarily loading vendor libraries
> without adding nearly so much complexity.
> 
> If libglvnd just has a list of additional vendor library names to try, then
> you could just have a flag to tell libglvnd to check some server string for
> that name before it loads the vendor. If a client-side vendor would need a
> server-side counterpart to work, then libglvnd can check for that. The
> server only needs to keep a list of names to send back, which would be a
> trivial (and backward-compatible) addition to the GLXVND interface.
> 
> Also, even without that, I don't think the extra dlopen calls would be a
> problem in practice. It would only ever happen in applications that are
> configured for offloading, which are (more-or-less by definition)
> heavy-weight programs, so an extra millisecond or so of startup time is
> probably fine.

But why incur that loading if we don't need to?

> > > I think I'd rather have a new enum for GLXQueryServerString
> > > that elaborates on GLX_VENDOR_NAMES_EXT (perhaps GLX_VENDOR_MAP_EXT),
> > > with the returned string a space-delimited list of :.
> > > libGL could accept either a profile or a vendor name in the environment
> > > variable, and the profile can be either semantic like
> > > performance/battery, or a hardware selector, or whatever else.
> > > 
> > > This would probably be a layered extension, call it GLX_EXT_libglvnd2,
> > > which you'd check for in the (already per-screen) server extension
> > > string before trying to actually use.
> > That all sounds reasonable to me.
> > 
> > > > At the other extreme, the server could do nearly all the work of
> > > > generating the possible __GLX_VENDOR_LIBRARY_NAME strings (with the
> > > > practical downside of each server-side GLX vendor needing to enumerate
> > > > the GPUs it can drive, in order to generate the hardware-specific
> > > > identifiers).
> > > I don't think this downside is much of a burden? If you're registering
> > > a provider other than Xorg's you're already doing it from the DDX
> > > driver (I think? Are y'all doing that from your libglx instead?), and
> > > when that initializes it already knows which device it's driving.
> > Right.  It will be easy enough for the NVIDIA X driver + NVIDIA server-side 
> > GLX.
> > 
> > Kyle and I were chatting about this, and we weren't sure whether people
> > would object to doing that for the Xorg GLX provider: to create the
> > hardware names, Xorg's GLX would need to enumerate all the DRM devices
> > and list them all as possible : pairs for the Xorg
> > GLX-driven screens.  But, now that I look at it more closely, it looks
> > like drmGetDevices2() would work well for that.
> > 
> > So, if you're not concerned with that burden, I'm not.  I'll try coding
> > up the Xorg GLX part of things and see how it falls into place.
> That actually is one of my big concerns: I'd like to come up with something
> that can give something equivalent to Mesa's existing DRI_PRIME setting, and
> requiring that logic to be in the server seems like a very poor match. You'd
> need to take all of the device selection and enumeration stuff from Mesa and
> transplant it into the Xorg GLX module, and then you'd need to define some
> sort of protocol to get that data back into Mesa where you actually need it.
> Or else you need to duplicate it between the client and server, which seems
> like the worst of both worlds.

Is this actually a lot of code?  I'll try to put together a prototype so
we can see how much it is, but if it is just calling drmGetDevices2() and
then building PCI BusID-based names, that doesn't seem unreasonable to me.

> By comparison, if libglvnd just hands the problem off to the vendor
> libraries, then you could do either. A vendor library could do its device
> enumeration in the client like Mesa does, or it could send a request to
> query something from the server, using whatever protocol you want --
> whatever makes the most sense for that particular driver.
> 
> More generally, I worry that defining a (vendor+device+descriptor) list as
> an interface between libglvnd and the server 

Re: [Mesa-dev] RFC - libglvnd and GLXVND vendor enumeration to facilitate GLX multi-vendor PRIME GPU offload

2019-02-11 Thread Andy Ritger
On Mon, Feb 11, 2019 at 12:09:26PM +0100, Michel Dänzer wrote:
> On 2019-02-08 11:43 p.m., Kyle Brenneman wrote:
> > 
> > Also, is Mesa the only client-side vendor library that works with the
> > Xorg GLX module? I vaguely remember that there was at least one other
> > driver that did, but I don't remember the details anymore.
> 
> AFAIK, the amdgpu-pro OpenGL driver can work with the Xorg GLX module
> (or its own forked version of it).

Maybe the amdgpu-pro OpenGL driver uses a fork of the Xorg GLX module
(or sets the "GlxVendorLibrary" X configuration option?), but it doesn't
look to me like the in-tree Xorg GLX module could report anything other
than "mesa" for GLX_VENDOR_NAMES_EXT, without custom user configuration.

GLX_VENDOR_NAMES_EXT, which client-side glvnd uses to pick the
libGLX_${vendor}.so to load, is implemented in the Xorg GLX module
with this:

  xserver/glx/glxcmds.c:__glXDisp_QueryServerString():

case GLX_VENDOR_NAMES_EXT:
if (pGlxScreen->glvnd) {
ptr = pGlxScreen->glvnd;
break;
}

pGlxScreen->glvnd appears to be assigned here, defaulting to "mesa", 
though allowing an xorg.conf override via the "GlxVendorLibrary" option:

  xserver/glx/glxdri2.c:__glXDRIscreenProbe():

xf86ProcessOptions(pScrn->scrnIndex, pScrn->options, options);
glvnd = xf86GetOptValString(options, GLXOPT_VENDOR_LIBRARY);
if (glvnd)
screen->base.glvnd = xnfstrdup(glvnd);
free(options);

if (!screen->base.glvnd)
screen->base.glvnd = strdup("mesa");

And swrast unconditionally sets pGlxScreen->glvnd to "mesa":

  xserver/glx/glxdriswrast.c:__glXDRIscreenProbe():

screen->base.glvnd = strdup("mesa");

Is there more to this that I'm missing?


> -- 
> Earthling Michel Dänzer   |   http://www.amd.com
> Libre software enthusiast | Mesa and X developer
___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev


Re: [Mesa-dev] RFC - libglvnd and GLXVND vendor enumeration to facilitate GLX multi-vendor PRIME GPU offload

2019-02-11 Thread Michel Dänzer
On 2019-02-08 11:43 p.m., Kyle Brenneman wrote:
> 
> Also, is Mesa the only client-side vendor library that works with the
> Xorg GLX module? I vaguely remember that there was at least one other
> driver that did, but I don't remember the details anymore.

AFAIK, the amdgpu-pro OpenGL driver can work with the Xorg GLX module
(or its own forked version of it).


-- 
Earthling Michel Dänzer   |   http://www.amd.com
Libre software enthusiast | Mesa and X developer
___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev


Re: [Mesa-dev] RFC - libglvnd and GLXVND vendor enumeration to facilitate GLX multi-vendor PRIME GPU offload

2019-02-08 Thread Kyle Brenneman

On 2/8/19 2:33 PM, Andy Ritger wrote:

On Fri, Feb 08, 2019 at 03:01:33PM -0500, Adam Jackson wrote:

On Fri, 2019-02-08 at 10:19 -0800, Andy Ritger wrote:


(1) If configured for PRIME GPU offloading (environment variable or
 application profile), client-side libglvnd could load the possible
 libGLX_${vendor}.so libraries it finds, and call into each to
 find which vendor (and possibly which GPU) matches the specified
 string. Once a vendor is selected, the vendor library could optionally
 tell the X server which GLX vendor to use server-side for this
 client connection.

I'm not a huge fan of the "dlopen everything" approach, if it can be
avoided.

Yes, I agree.
I'm pretty sure libglvnd could avoid unnecessarily loading vendor 
libraries without adding nearly so much complexity.


If libglvnd just has a list of additional vendor library names to try, 
then you could just have a flag to tell libglvnd to check some server 
string for that name before it loads the vendor. If a client-side vendor 
would need a server-side counterpart to work, then libglvnd can check 
for that. The server only needs to keep a list of names to send back, 
which would be a trivial (and backward-compatible) addition to the 
GLXVND interface.


Also, even without that, I don't think the extra dlopen calls would be a 
problem in practice. It would only ever happen in applications that are 
configured for offloading, which are (more-or-less by definition) 
heavy-weight programs, so an extra millisecond or so of startup time is 
probably fine.






I think I'd rather have a new enum for GLXQueryServerString
that elaborates on GLX_VENDOR_NAMES_EXT (perhaps GLX_VENDOR_MAP_EXT),
with the returned string a space-delimited list of :.
libGL could accept either a profile or a vendor name in the environment
variable, and the profile can be either semantic like
performance/battery, or a hardware selector, or whatever else.

This would probably be a layered extension, call it GLX_EXT_libglvnd2,
which you'd check for in the (already per-screen) server extension
string before trying to actually use.

That all sounds reasonable to me.


At the other extreme, the server could do nearly all the work of
generating the possible __GLX_VENDOR_LIBRARY_NAME strings (with the
practical downside of each server-side GLX vendor needing to enumerate
the GPUs it can drive, in order to generate the hardware-specific
identifiers).

I don't think this downside is much of a burden? If you're registering
a provider other than Xorg's you're already doing it from the DDX
driver (I think? Are y'all doing that from your libglx instead?), and
when that initializes it already knows which device it's driving.

Right.  It will be easy enough for the NVIDIA X driver + NVIDIA server-side GLX.

Kyle and I were chatting about this, and we weren't sure whether people
would object to doing that for the Xorg GLX provider: to create the
hardware names, Xorg's GLX would need to enumerate all the DRM devices
and list them all as possible : pairs for the Xorg
GLX-driven screens.  But, now that I look at it more closely, it looks
like drmGetDevices2() would work well for that.

So, if you're not concerned with that burden, I'm not.  I'll try coding
up the Xorg GLX part of things and see how it falls into place.
That actually is one of my big concerns: I'd like to come up with 
something that can give something equivalent to Mesa's existing 
DRI_PRIME setting, and requiring that logic to be in the server seems 
like a very poor match. You'd need to take all of the device selection 
and enumeration stuff from Mesa and transplant it into the Xorg GLX 
module, and then you'd need to define some sort of protocol to get that 
data back into Mesa where you actually need it. Or else you need to 
duplicate it between the client and server, which seems like the worst 
of both worlds.


By comparison, if libglvnd just hands the problem off to the vendor 
libraries, then you could do either. A vendor library could do its 
device enumeration in the client like Mesa does, or it could send a 
request to query something from the server, using whatever protocol you 
want -- whatever makes the most sense for that particular driver.


More generally, I worry that defining a (vendor+device+descriptor) list 
as an interface between libglvnd and the server means baking in a lot of 
unnecessary assumptions and requirements for drivers that we could 
otherwise avoid without losing any functionality.


Also, is Mesa the only client-side vendor library that works with the 
Xorg GLX module? I vaguely remember that there was at least one other 
driver that did, but I don't remember the details anymore.





Two follow-up questions:

(1) Even when direct-rendering, NVIDIA's OpenGL/GLX implementation sends
 GLX protocol (MakeCurrent, etc).  So, we'd like something client-side
 to be able to request that server-side GLXVND route GLX protocol for the
 calling client connection 

Re: [Mesa-dev] RFC - libglvnd and GLXVND vendor enumeration to facilitate GLX multi-vendor PRIME GPU offload

2019-02-08 Thread Andy Ritger
On Fri, Feb 08, 2019 at 03:01:33PM -0500, Adam Jackson wrote:
> On Fri, 2019-02-08 at 10:19 -0800, Andy Ritger wrote:
> 
> > (1) If configured for PRIME GPU offloading (environment variable or
> > application profile), client-side libglvnd could load the possible
> > libGLX_${vendor}.so libraries it finds, and call into each to
> > find which vendor (and possibly which GPU) matches the specified
> > string. Once a vendor is selected, the vendor library could optionally
> > tell the X server which GLX vendor to use server-side for this
> > client connection.
> 
> I'm not a huge fan of the "dlopen everything" approach, if it can be
> avoided.

Yes, I agree.

> I think I'd rather have a new enum for GLXQueryServerString
> that elaborates on GLX_VENDOR_NAMES_EXT (perhaps GLX_VENDOR_MAP_EXT),
> with the returned string a space-delimited list of :.
> libGL could accept either a profile or a vendor name in the environment
> variable, and the profile can be either semantic like
> performance/battery, or a hardware selector, or whatever else.
> 
> This would probably be a layered extension, call it GLX_EXT_libglvnd2,
> which you'd check for in the (already per-screen) server extension
> string before trying to actually use.

That all sounds reasonable to me.

> > At the other extreme, the server could do nearly all the work of
> > generating the possible __GLX_VENDOR_LIBRARY_NAME strings (with the
> > practical downside of each server-side GLX vendor needing to enumerate
> > the GPUs it can drive, in order to generate the hardware-specific
> > identifiers).
> 
> I don't think this downside is much of a burden? If you're registering
> a provider other than Xorg's you're already doing it from the DDX
> driver (I think? Are y'all doing that from your libglx instead?), and
> when that initializes it already knows which device it's driving.

Right.  It will be easy enough for the NVIDIA X driver + NVIDIA server-side GLX.

Kyle and I were chatting about this, and we weren't sure whether people
would object to doing that for the Xorg GLX provider: to create the
hardware names, Xorg's GLX would need to enumerate all the DRM devices
and list them all as possible : pairs for the Xorg
GLX-driven screens.  But, now that I look at it more closely, it looks
like drmGetDevices2() would work well for that.

So, if you're not concerned with that burden, I'm not.  I'll try coding
up the Xorg GLX part of things and see how it falls into place.

Two follow-up questions:

(1) Even when direct-rendering, NVIDIA's OpenGL/GLX implementation sends
GLX protocol (MakeCurrent, etc).  So, we'd like something client-side
to be able to request that server-side GLXVND route GLX protocol for the
calling client connection to a specific vendor (on a per-screen basis).
Do you think it would be reasonable for GLX_EXT_libglvnd2 to define a
new protocol request, that client-side libglvnd uses, and sends either
the profile or vendor name from the selected ':'?

(2) Who should decide which vendor/gpu gets the semantic name
"performance" or "battery"?  They are relative, so I don't know that
vendors can decide for themselves in isolation.  It kind of feels
like it should be GLXVND's job, but I don't know that it has enough
context to infer.  I'm curious if anyone else has ideas.

Thanks,
- Andy


> - ajax
___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev


Re: [Mesa-dev] RFC - libglvnd and GLXVND vendor enumeration to facilitate GLX multi-vendor PRIME GPU offload

2019-02-08 Thread Adam Jackson
On Fri, 2019-02-08 at 10:19 -0800, Andy Ritger wrote:

> (1) If configured for PRIME GPU offloading (environment variable or
> application profile), client-side libglvnd could load the possible
> libGLX_${vendor}.so libraries it finds, and call into each to
> find which vendor (and possibly which GPU) matches the specified
> string. Once a vendor is selected, the vendor library could optionally
> tell the X server which GLX vendor to use server-side for this
> client connection.

I'm not a huge fan of the "dlopen everything" approach, if it can be
avoided. I think I'd rather have a new enum for GLXQueryServerString
that elaborates on GLX_VENDOR_NAMES_EXT (perhaps GLX_VENDOR_MAP_EXT),
with the returned string a space-delimited list of :.
libGL could accept either a profile or a vendor name in the environment
variable, and the profile can be either semantic like
performance/battery, or a hardware selector, or whatever else.

This would probably be a layered extension, call it GLX_EXT_libglvnd2,
which you'd check for in the (already per-screen) server extension
string before trying to actually use.

> At the other extreme, the server could do nearly all the work of
> generating the possible __GLX_VENDOR_LIBRARY_NAME strings (with the
> practical downside of each server-side GLX vendor needing to enumerate
> the GPUs it can drive, in order to generate the hardware-specific
> identifiers).

I don't think this downside is much of a burden? If you're registering
a provider other than Xorg's you're already doing it from the DDX
driver (I think? Are y'all doing that from your libglx instead?), and
when that initializes it already knows which device it's driving.

- ajax
___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev