1Name
2
3    MESA_query_renderer
4
5Name Strings
6
7    GLX_MESA_query_renderer
8
9Contact
10
11    Ian Romanick <ian.d.romanick@intel.com>
12
13IP Status
14
15    No known IP claims.
16
17Status
18
19    Shipping as of Mesa 10.0
20
21Version
22
23    Version 9, 09 November 2018
24
25Number
26
27    OpenGL Extension #446
28
29Dependencies
30
31    GLX 1.4 is required.
32
33    GLX_ARB_create_context and GLX_ARB_create_context_profile are required.
34
35Overview
36
37    In many situations, applications want to detect characteristics of a
38    rendering device before creating a context for that device.  Information
39    gathered at this stage may guide choices the application makes about
40    color depth, number of samples per-pixel, texture quality, and so on.
41    In addition, versions of supported APIs and implementation API
42    preference may also guide start-up decisions made by the application.
43    For example, one implementation may prefer vertex data be supplied using
44    methods only available in a compatibility profile, but another
45    implementation may only support the desired version in a core profile.
46
47    There are also cases where more than one renderer may be available per
48    display.  For example, there is typically a hardware implementation and
49    a software based implementation.  There are cases where an application
50    may want to pick one over the other.  One such situation is when the
51    software implementation supports more features than the hardware
52    implementation.  Another situation is when a particular version of the
53    hardware implementation is blacklisted due to known bugs.
54
55    This extension provides a mechanism for the application to query all of
56    the available renderers for a particular display and screen.  In
57    addition, this extension provides a mechanism for applications to create
58    contexts with respect to a specific renderer.
59
60New Procedures and Functions
61
62    Bool glXQueryRendererIntegerMESA(Display *dpy, int screen,
63                                     int renderer, int attribute,
64                                     unsigned int *value);
65    Bool glXQueryCurrentRendererIntegerMESA(int attribute, unsigned int *value);
66
67    const char *glXQueryRendererStringMESA(Display *dpy, int screen,
68                                           int renderer, int attribute);
69
70    const char *glXQueryCurrentRendererStringMESA(int attribute);
71
72New Tokens
73
74    Accepted as an <attribute> in glXQueryRendererIntegerMESA and
75    glXQueryCurrentRendererIntegerMESA:
76
77        GLX_RENDERER_VENDOR_ID_MESA                      0x8183
78        GLX_RENDERER_DEVICE_ID_MESA                      0x8184
79        GLX_RENDERER_VERSION_MESA                        0x8185
80        GLX_RENDERER_ACCELERATED_MESA                    0x8186
81        GLX_RENDERER_VIDEO_MEMORY_MESA                   0x8187
82        GLX_RENDERER_UNIFIED_MEMORY_ARCHITECTURE_MESA    0x8188
83        GLX_RENDERER_PREFERRED_PROFILE_MESA              0x8189
84        GLX_RENDERER_OPENGL_CORE_PROFILE_VERSION_MESA    0x818A
85        GLX_RENDERER_OPENGL_COMPATIBILITY_PROFILE_VERSION_MESA    0x818B
86        GLX_RENDERER_OPENGL_ES_PROFILE_VERSION_MESA      0x818C
87        GLX_RENDERER_OPENGL_ES2_PROFILE_VERSION_MESA     0x818D
88
89    Accepted as an <attribute> in glXQueryRendererStringMESA and
90    glXQueryCurrentRendererStringMESA:
91
92        GLX_RENDERER_VENDOR_ID_MESA
93        GLX_RENDERER_DEVICE_ID_MESA
94
95Additions to the OpenGL / WGL Specifications
96
97    None. This specification is written for GLX.
98
99Additions to the GLX 1.4 Specification
100
101    [Add to Section 3.3.2 "GLX Versioning" of the GLX Specification]
102
103    To obtain information about the available renderers for a particular
104    display and screen,
105
106        Bool glXQueryRendererIntegerMESA(Display *dpy, int screen, int renderer,
107                                         int attribute, unsigned int *value);
108
109    can be used.  The value for <attribute> will be returned in one or more
110    integers specified by <value>.  The values, data sizes, and descriptions
111    of each renderer attribute are listed in the table below.
112
113    GLX renderer attribute         number     description
114                                  of values
115    ----------------------        ---------   -----------
116    GLX_RENDERER_VENDOR_ID_MESA   1           PCI ID of the device vendor
117    GLX_RENDERER_DEVICE_ID_MESA   1           PCI ID of the device
118    GLX_RENDERER_VERSION_MESA     3           Major, minor, and patch level of
119                                              the renderer implementation
120    GLX_RENDERER_ACCELERATED_MESA 1           Boolean indicating whether or
121                                              not the renderer is hardware
122                                              accelerated
123    GLX_RENDERER_VIDEO_MEMORY_MESA 1          Number of megabytes of video
124                                              memory available to the renderer
125    GLX_RENDERER_UNIFIED_MEMORY_ARCHITECTURE_MESA
126                                  1           Boolean indicating whether or
127                                              not the renderer uses a unified
128                                              memory architecture or has
129                                              separate "on-card" and GART
130                                              memory.
131    GLX_RENDERER_PREFERRED_PROFILE_MESA
132                                  1           Bitmask of the preferred context
133                                              profile for this renderer.  This
134                                              value is suitable to be supplied
135                                              with the
136                                              GLX_CONTEXT_PROFILE_MASK_ARB
137                                              attribute to
138                                              glXCreateContextAttribsARB
139    GLX_RENDERER_OPENGL_CORE_PROFILE_VERSION_MESA
140                                  2           Maximum core profile major and
141                                              minor version supported by the
142                                              renderer
143    GLX_RENDERER_OPENGL_COMPATIBILITY_PROFILE_VERSION_MESA
144                                  2           Maximum compatibility profile
145                                              major and minor version
146                                              supported by the renderer
147    GLX_RENDERER_OPENGL_ES_PROFILE_VERSION_MESA
148                                  2           Maximum OpenGL ES 1.x
149                                              major and minor version
150                                              supported by the renderer
151    GLX_RENDERER_OPENGL_ES2_PROFILE_VERSION_MESA
152                                  2           Maximum OpenGL ES 2.x or 3.x
153                                              major and minor version
154                                              supported by the renderer
155
156    In the table, boolean attributes will have either the value 0 or 1.
157
158    GLX_RENDERER_OPENGL_CORE_PROFILE_VERSION_MESA,
159    GLX_RENDERER_OPENGL_COMPATIBILITY_PROFILE_VERSION_MESA,
160    GLX_RENDERER_OPENGL_ES_PROFILE_VERSION_MESA, and
161    GLX_RENDERER_OPENGL_ES2_PROFILE_VERSION_MESA each return <0, 0> in
162    *value if no version of that profile is supported.
163
164    GLX_RENDERER_VENDOR_ID_MESA and GLX_RENDERER_DEVICE_ID_MESA may return
165    0xFFFFFFFF if the device does not have a PCI ID (because it is not a PCI
166    device) or if the PCI ID is not available.  In this case the application
167    should rely on the string query instead.
168
169    If <attribute> is not a recognized value, False is returned, but no GLX
170    error is generated.  Otherwise, True is returned.
171
172    String versions of some attributes may also be queried using
173
174        const char *glXQueryRendererStringMESA(Display *dpy, int screen,
175                                               int renderer, int attribute);
176
177    The value for <attribute> will be returned in one or more
178    integers specified by <value>.  The values, data sizes, and descriptions
179    of each renderer attribute are listed in the table below.
180
181    GLX renderer attribute        description
182    ----------------------        -----------
183    GLX_RENDERER_VENDOR_ID_MESA   Name of the renderer provider.  This may
184                                  differ from the vendor name of the
185                                  underlying hardware.
186    GLX_RENDERER_DEVICE_ID_MESA   Name of the renderer.  This may differ from
187                                  the name of the underlying hardware (e.g.,
188                                  for a software renderer).
189
190    If <attribute> is not a recognized value, NULL is returned, but no GLX
191    error is generated.
192
193    The string returned for GLX_RENDERER_VENDOR_ID_MESA will have the same
194    format as the string that would be returned by glGetString of GL_VENDOR.
195    It may, however, have a different value.
196
197    The string returned for GLX_RENDERER_DEVICE_ID_MESA will have the same
198    format as the string that would be returned by glGetString of GL_RENDERER.
199    It may, however, have a different value.
200
201Issues
202
203    1) How should the difference between on-card and GART memory be exposed?
204
205        UNRESOLVED.
206
207    2) How should memory limitations of unified memory architecture (UMA)
208    systems be exposed?
209
210        UNRESOLVED.  Some hardware has different per-process and global
211        limits for memory that can be accessed within a single draw call.
212
213    3) How should the renderer's API preference be advertised?
214
215        UNRESOLVED.  The common case for desktop renderers is to prefer
216        either core or compatibility.  However, some renderers may actually
217        prefer an ES context.  This leaves the application in a tough spot
218        if it can only support core or compatibility and the renderer says it
219        wants ES.
220
221    4) Should OpenGL ES 2.0 and OpenGL ES 3.0 be treated separately?
222
223        RESOLVED.  No.  OpenGL ES 3.0 is backwards compatible with OpenGL ES
224        2.0.  Applications can detect OpenGL ES 3.0 support by querying
225        GLX_RENDERER_OPENGL_ES2_PROFILE_VERSION_MESA.
226
227    5) How can applications tell the difference between different hardware
228    renderers for the same device?  For example, whether the renderer is the
229    open-source driver or the closed-source driver.
230
231        RESOLVED.  Assuming this extension is ever implemented outside Mesa,
232        applications can query GLX_RENDERER_VENDOR_ID_MESA from
233        glXQueryRendererStringMESA.  This will almost certainly return
234        different strings for open-source and closed-source drivers.
235
236    6) What is the value of GLX_RENDERER_UNIFIED_MEMORY_ARCHITECTURE_MESA for
237    software renderers?
238
239        UNRESOLVED.  Video (display) memory and texture memory is not unified
240        for software implementations, so it seems reasonable for this to be
241        False.
242
243    7) How does an application determine the number of available renderers?
244
245        UNRESOLVED.
246
247    8) What happens if a fbconfig is used to create context on a renderer
248    that cannot support it?  For example, if a multisampled config is used
249    with a software renderer that does not support multisampling.
250
251        RESOLVED.  The language for glXCreateContextAttribsARB already covers
252        this case.  Context creation will fail, and BadMatch is generated.
253
254    9) In addition to being able to query the supported versions, should
255    applications also be able to query the supported extensions?
256
257        RESOLVED.  No.  Desktop OpenGL core profiles and OpenGL ES 3.0 have
258        moved away from the monolithic string returned by glGetString of
259        GL_EXTENSIONS.  Providing the newer indexed query would require adding
260        a lot of extra infrastructure, and it would probably provide little
261        benefit to applications.
262
263    10) What combination of values for GLX_RENDERER_PREFERRED_PROFILE_MESA,
264    GLX_RENDERER_OPENGL_COMPATIBILITY_PROFILE_VERSION_MESA, and
265    GLX_RENDERER_OPENGL_CORE_PROFILE_VERSION_MESA should be returned
266    for a renderer that only supports OpenGL 3.1 without the
267    GL_ARB_compatibility extension?
268
269        RESOLVED.  The renderer will return GLX_CONTEXT_CORE_PROFILE_BIT_ARB
270        for GLX_RENDERER_PREFERRED_PROFILE_MESA.
271
272        Further, the renderer will return <3,0> for
273        GLX_RENDERER_OPENGL_COMPATIBILITY_PROFILE_VERSION_MESA because OpenGL
274        3.1 without GL_ARB_compatibility is not backwards compatible with
275        previous versions of OpenGL.  The render will return <3,1> for
276        GLX_RENDERER_OPENGL_CORE_PROFILE_VERSION_MESA indicating that support
277        for OpenGL 3.1 is available.
278
279        Even though there is no OpenGL 3.1 core profile, the values
280        returned for GLX_RENDERER_PREFERRED_PROFILE_MESA and
281        GLX_RENDERER_OPENGL_CORE_PROFILE_VERSION_MESA can be supplied
282        with the GLX_CONTEXT_PROFILE_MASK_ARB and
283        GLX_CONTEXT_{MAJOR,MINOR}_VERSION_ARB attributes of
284        glXCreateContextAttribsARB without error.  If the requested
285        OpenGL version is less than 3.2, the
286        GLX_CONTEXT_PROFILE_MASK_ARB attribute is ignored by
287        glXCreateContextAttribsARB.
288
289    11) How can application learn about multi-GPU (e.g., SLI, CrossFireX,
290    etc.) configurations?
291
292        UNRESOLVED.  Based on ISV feedback, this is important information to
293        provide to the application.  Given the variety of possible hardware
294        configurations (e.g., Hybrid CrossFireX) and different rendering
295        modes (e.g., split-frame rendering vs. alternate-frame rendering),
296        it's not clear how this information can be communicated.
297
298        It is likely that this will be left to a layered extension.
299
300    12) Should capability queries similar to those in
301    GL_ARB_internalformat_query or GL_ARB_internalformat_query2 be added?
302
303        RESOLVED.  No.  With the possible exception of the texture size
304        queries, it seems unlikely that applications would ever use this
305        information before creating a context.
306
307    13) Existing GL extensions (e.g., GL_ATI_meminfo and
308    GL_NVX_gpu_memory_info) allow easy queries after context creation.  With
309    this extension it is a bit of a pain for a portable application to query
310    the information after context creation.
311
312        RESOLVED.  Add versions of the queries that implicitly take the
313        display, screen, and renderer from the currently bound context.
314
315    14) Why not make the queries from issue #13 GL functions (instead of GLX)?
316
317        RESOLVED.  It is fairly compelling for the post-creation queries to
318        just use glGetInteger and glGetString.  However, the GL enums and
319        the GLX enums would have different names and would almost certainly
320        have different values.  It seems like this would cause more problems
321        than it would solve.
322
323    15) Should the string queries be required to return the same values as
324    glGetString(GL_VENDOR) and glGetString(GL_RENDERER)?
325
326        UNRESOLVED.  This may be useful for applications that already do
327        device detection based on these strings.
328
329    16) What type should the value parameter of glXQueryRendererIntegerMESA
330        and glXQueryCurrentRendererIntegerMESA be?
331
332        UNRESOLVED.  Other similar GLX query functions just use int or
333        unsigned int, so that's what this extension uses for now.  However,
334        an expeclitly sized value, such as uint32_t or uint64_t, seems
335        preferable.
336
337    17) What about SoCs and other systems that don't have PCI?
338
339        RESOLVED. The GLX_RENDERER_VENDOR_ID_MESA and
340        GLX_RENDERER_DEVICE_ID_MESA integer queries may return 0xFFFFFFFF if a
341        PCI ID either does not exist or is not available.  Implementations
342        should make every attempt to return as much information as is
343        possible.  For example, if the implementation is running on a non-PCI
344        SoC with a Qualcomm GPU, GLX_RENDERER_VENDOR_ID_MESA should return
345        0x5143, but GLX_RENDERER_DEVICE_ID_MESA will return 0xFFFFFFFF.
346
347Revision History
348
349    Version 1, 2012/08/27 - Initial version
350
351    Version 2, 2012/09/04 - Specify behavior of implementations that
352                            do not support certain profiles.
353                            Change wording of issue #8 to be more
354                            clear.
355                            Make some wording changes to issue #10 to
356                            clarify the resolution a bit.
357
358    Version 3, 2012/09/23 - Add issue #11 regarding multi-GPU systems.
359
360    Version 4, 2013/02/01 - Add issue #12 regarding texture / renderbuffer
361                            format queries.
362
363    Version 5, 2013/02/14 - Add issues #13 and #14 regarding simpler queires
364                            after the context is created and made current.
365                            Add issue #15 regarding the string query.
366                            Add issue #16 regarding the value type returned
367                            by the Integer functions.
368
369    Version 6, 2013/10/25 - Fix a typo.  Update the list of functions to
370                            which the new enums can be passed.  The "Current"
371                            versions were previously missing.
372
373    Version 7, 2013/11/07 - Fix a couple more typos.  Add issue #17 regarding
374                            the PCI queries on systems that don't have PCI.
375
376    Version 8, 2014/02/14 - Fix a couple typos. GLX_RENDER_ID_MESA should
377                            read GLX_RENDERER_ID_MESA. The VENDOR/DEVICE_ID
378                            example given in issue #17 should be 0x5143 and
379                            0xFFFFFFFF respectively.
380
381    Version 9, 2018/11/09 - Remove GLX_RENDERER_ID_MESA, which has never been
382                            implemented. Remove the unnecessary interactions
383                            with the GLX GLES profile extensions. Note the
384                            official GL extension number. Specify the section
385                            of the GLX spec to modify.
386