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