Bug 103575 - eglQueryDevicesEXT returns 0 devices
Summary: eglQueryDevicesEXT returns 0 devices
Status: RESOLVED NOTABUG
Alias: None
Product: Mesa
Classification: Unclassified
Component: Drivers/Gallium/r600 (show other bugs)
Version: 17.2
Hardware: x86-64 (AMD64) Linux (All)
: medium normal
Assignee: Default DRI bug account
QA Contact: Default DRI bug account
URL:
Whiteboard:
Keywords:
Depends on:
Blocks:
 
Reported: 2017-11-05 01:48 UTC by Hi-Angel
Modified: 2017-11-30 16:16 UTC (History)
0 users

See Also:
i915 platform:
i915 features:


Attachments

Description Hi-Angel 2017-11-05 01:48:32 UTC
I'm following this guide https://devblogs.nvidia.com/parallelforall/egl-eye-opengl-visualization-without-x-server/ to choose a GPU through native means of EGL.

Using eglQueryDevicesEXT() in both modes, i.e. with "devices" array to get descriptions, as well as by passing 0 as "devices", results in 0 as a number of supported devices. Specification says that I should've get at least 1 (and I actually have two, r600g-managed, cards):

https://www.khronos.org/registry/EGL/extensions/EXT/EGL_EXT_device_enumeration.txt
> EGL devices can be enumerated before EGL is initialized.  Use:
> 
>         EGLBoolean eglQueryDevicesEXT(EGLint max_devices,
>                                       EGLDeviceEXT *devices,
>                                       EGLint *num_devices);
[SNIP]
> If <devices> is NULL, then <max_devices> will be ignored, no devices will be
> returned in <devices>, and <num_devices> will be set to the number of
> supported devices in the system.  All implementations must support at least
> one device.
> 
> On failure, EGL_FALSE is returned.

Below is the modified code I'm using:

	#include <EGL/egl.h>
	#include <EGL/eglext.h>
	#include <stdio.h>
	
	int main(int argc, char *argv[])
	{
	    EGLint numDevices;
	
	    PFNEGLQUERYDEVICESEXTPROC eglQueryDevicesEXT =
	        (PFNEGLQUERYDEVICESEXTPROC) eglGetProcAddress("eglQueryDevicesEXT");
	    if (eglQueryDevicesEXT(2, 0, &numDevices) == EGL_FALSE) {
	        puts("error in eglQueryDevicesEXT");
	        return 1;
	    }
	
	    printf("Detected %d devices\n", numDevices);
	}
Comment 1 Adam Jackson 2017-11-29 20:34:17 UTC
Mesa doesn't implement EGL_EXT_device_enumeration yet, so this isn't entirely surprising.
Comment 2 Hi-Angel 2017-11-29 20:40:02 UTC
(In reply to Adam Jackson from comment #1)
> Mesa doesn't implement EGL_EXT_device_enumeration yet, so this isn't
> entirely surprising.

Then, shouldn't I be getting either linking or calling errors?
Comment 3 Adam Jackson 2017-11-30 15:04:30 UTC
(In reply to Hi-Angel from comment #2)
> (In reply to Adam Jackson from comment #1)
> > Mesa doesn't implement EGL_EXT_device_enumeration yet, so this isn't
> > entirely surprising.
> 
> Then, shouldn't I be getting either linking or calling errors?

If your libEGL is from libglvnd then no. glvnd has explicit support for QueryDevicesEXT because it has to aggregate the results from all installed vendor libraries. Which means eglGetProcAddress will return the glvnd frontend function, even if no vendors support the extension.

That's arguably a bug in glvnd. It should at minimum return an error if it enumerates zero devices, I think. But I think your code is already in error in calling eglQueryDevicesEXT without checking that EGL_EXT_device_enumeration is in the client extension string (it certainly isn't on my machine, which does use libglvnd).
Comment 4 Emil Velikov 2017-11-30 15:30:40 UTC
(In reply to Hi-Angel from comment #2)
> (In reply to Adam Jackson from comment #1)
> > Mesa doesn't implement EGL_EXT_device_enumeration yet, so this isn't
> > entirely surprising.
> 
> Then, shouldn't I be getting either linking or calling errors?

Linking - yes things should fail fail at linking. The spec clearly says that one should use eglGetProcAddress to get the function pointers.

Runtime - nope. The extension defines the means, a device is not guaranteed.

Also ... I really hope that Nvidia fixes that blog - it contains a number of fairly fundamental issues.
I reached out to the author ~1year ago listing all the bad stuff but never heard back :-\ Oh well
Comment 5 Hi-Angel 2017-11-30 16:16:01 UTC
(In reply to Emil Velikov from comment #4)
> Also ... I really hope that Nvidia fixes that blog - it contains a number of
> fairly fundamental issues.
> I reached out to the author ~1year ago listing all the bad stuff but never
> heard back :-\ Oh well

You may copy-paste the content of that mail into blog comments, I think readers would appreciate. Comments were the first thing I started reading after looking through the post to see any possible caveats.


Use of freedesktop.org services, including Bugzilla, is subject to our Code of Conduct. How we collect and use information is described in our Privacy Policy.