Merge branch '7.8'
[mesa.git] / src / egl / docs / EGL_MESA_screen_surface
1 Name
2
3 MESA_screen_surface
4
5 Name Strings
6
7 EGL_MESA_screen_surface
8
9 Contact
10
11 Brian Paul
12
13 To discuss, join the dri-egl@lists.freedesktop.org list.
14
15 Status
16
17 Preliminary - totally subject to change.
18
19 Version
20
21 11 (27 January 2006)
22
23 Number
24
25 TBD
26
27 Dependencies
28
29 EGL 1.0 or later.
30
31 Overview
32
33 EGL 1.1 supports three types of drawing surfaces:
34 * Window surfaces
35 * Pixmap surfaces
36 * Pbuffer surfaces
37 This extension defines a fourth type of drawing surface:
38 * Screen surface
39
40 A screen surface is a surface for which the (front) color buffer can
41 be directly displayed (i.e. scanned out) on a monitor (such as a flat
42 panel or CRT). In particular the color buffer memory will be allocated
43 at a location in VRAM (and in a suitable format) which can be displayed
44 by the graphics hardware.
45
46 Note that the width and height of the screen surface need not exactly
47 match the monitor's current resolution. For example, while the monitor
48 may be configured to to show 1024x768 pixels, the associated screen
49 surface may be larger, such as 1200x1000. The "screen origin" attribute
50 will specify which region of the screen surface which is visible on the
51 monitor. The screen surface can be scrolled by changing this origin.
52
53 This extension also defines functions for controlling the monitor's
54 display mode (width, height, refresh rate, etc), and specifing which
55 screen surface is to be displayed on a monitor.
56
57 The new EGLModeMESA type and related functions are very similar to the
58 EGLConfig type and related functions. The user may get a list of
59 supported modes for a screen and specify the mode to be used when
60 displaying a screen surface.
61
62
63 Issues
64
65 1. Should EGL_INTERLACE be a supported mode attribute?
66
67 Arguments against:
68
69 No, this should be provided by another extension which would
70 also provide the mechanisms needed to play back interlaced video
71 material correctly on hardware that supports it.
72 This extension should prefer non-interlaced modes. [M. Danzer]
73
74 Arguments for:
75
76 An interlaced display can be of use without considering video
77 material. Being able to query whether a screen is operating in
78 interlaced mode can be used by applications to control their
79 drawing. For example: avoid drawing 1-pixel-wide horizontal lines
80 if screen is interlaced. [B. Paul]
81
82 Resolution: Defer for future extension?
83
84
85 2. Should EGL_REFRESH_RATE be a supported mode attribute?
86
87 Arguments for:
88
89 Yes, it's been shown that applications and/or users need to select
90 modes by this. [M. Danzer]
91
92 Many examples have been given in which it's desirable to let the
93 user choose from a variety of refresh rates without having to
94 restart/reconfigure. [B. Paul]
95
96 Arguments against:
97
98 TBD.
99
100 Resolution: Yes.
101
102
103 3. Exactly how should the list of modes returned by eglChooseConfigMESA
104 be sorted?
105
106 Current method is described in the text below. Subject to change.
107
108 Alternately, leave the sorting order undefined so that each
109 implementation can return the modes in order of "most desirable"
110 to "least desirable" which may depend on the display technology
111 (CRT vs LCD, etc) or other factors.
112
113
114 4. How should screen blanking be supported? Note that a screen can be
115 disabled or turned off by calling eglShowSurface(dpy, scrn,
116 EGL_NO_SURFACE, EGL_NO_MODE_MESA). But what about power-save mode?
117
118 I would defer this to other extensions that depend on this one.
119 I can imagine people wanting different semantics not just in
120 relation to the power management API being exposed (DPMS or whatever)
121 but also relating to what events can trigger EGL_CONTEXT_LOST. Also
122 I'm not sure whether power management commands are properly operations
123 on the Display or on a screen surface. [A. Jackson]
124
125
126 5. Should the EGL_PHYSICAL_SIZE_EGL query be kept? The size information
127 isn't always reliable (consider video projectors) but can still be
128 used to determine the pixel aspect ratio.
129
130 Resolution: Omit. The EGL 1.2 specification includes queries for
131 the display resolution and pixel aspect ratio.
132
133
134 6. Should detailed mode timing information be exposed by this API?
135
136 Probably not. Instead, offer that information in a layered extension.
137
138
139 7. How should the notion of a screen's "native" mode be expressed?
140 For example, LCD panels have a native resolution and refresh rate
141 that looks best but other sub-optimal resolutions may be supported.
142
143 The mode attribute EGL_OPTIMAL_MESA will be set for modes which
144 best match the screen. [M. Danzer]
145
146
147 8. Should eglQueryModeStringMESA() be included? This function returns
148 a human-readable string which corresponds to an EGLMode.
149
150 Arguments for:
151
152 A mode name such as "HDTV-720P" might mean more to users than
153 "1280x720@60Hz" if the later were generated via code.
154
155 Arguments against:
156
157 There's no standard syntax for the strings. May cause more
158 trouble than it's worth.
159
160 Postpone for future extension. [A. Jackson]
161
162 Latest discussion leaning toward omitting this function.
163
164
165 9. Should we use "Get" or "Query" for functions which return state?
166 The EGL 1.x specification doesn't seem to be totally consistent
167 in this regard, but "Query" is used more often.
168
169 Use "Get" for mode-related queries (as for EGLConfigs) but "Query"
170 for everything else.
171
172
173 10. What should be the default size for screen surfaces?
174
175 For Pbuffer surfaces the default width and height are zero.
176 We'll do the same for screen surfaces. Since there's no function
177 to resize surfaces it's useless to have a 0x0 screen, but this isn't
178 a situation that'll normally be encountered.
179
180
181 11. Should there be a function for resizing a screen surface?
182
183 Suppose one wants to change the screen's size in the EGL application.
184 Also suppose there's a hardware restriction such that only one screen
185 surface can exist at a time (either for lack of memory or because of
186 memory layout restrictions).
187
188 The basic idea is that the currently displayed screen surface must
189 be deallocated before a new one can be created. Perhaps a resize
190 function would work better?
191
192
193 12. How should sub-pixel LCD color information be made available?
194 What about the display's gamma value?
195
196 Perhaps expose as additional read-only mode attributes.
197
198 Perhaps postpone for a layered extension.
199
200
201 13. What happens if the user attempts to delete a screen surface that
202 is currently being shown?
203
204 Spec currently says that's illegal and that an error (TBD) will be
205 generated.
206
207
208 14. What if the physical screen size can't be determined? Should
209 a query of EGL_PHYSICAL_SIZE_MESA return [0,0]?
210
211 Obsolete: EGL_PHYSICAL_SIZE_MESA not used.
212
213
214 15. Suppose the device's number of RAMDACs is different from the
215 number of output ports. For example, a graphics card with
216 two RAMDACs but three ports (VGA, DVI, TV).
217
218 Address this in a follow-on extension. [Matthias Hopf]
219
220
221 16. How should we deal with on-the-fly device changes? For example,
222 the monitor being unplugged and replaced by another with different
223 characteristics?
224
225 A HAL event could be received via DBUS in the application [J. Smirl,
226 A. Jackson].
227
228 Should there be an EGL mechanism for detecting this? Maybe an
229 EGL_SCREEN_LOST error (similar to EGL_CONTEXT_LOST) can be recorded
230 when there's a screen change. At least then the application can
231 poll to detect this situation.
232
233 Maybe leave that to a future extension.
234
235 See also the EGL_SCREEN_COUNT_MESA query.
236
237
238 17. What if pixel-accurate panning is not supported (see
239 eglScreenPositionMESA)? [M. Danzer]
240
241 Is this a common problem? Can we ignore it for now?
242
243
244 18. Should eglShowSurfaceMESA be renamed to eglShowScreenSurfaceMESA?
245
246 Probably.
247
248
249
250 New Procedures and Functions
251
252 EGLBoolean eglChooseModeMESA(EGLDisplay dpy, EGLScreenMESA screen,
253 const EGLint *attrib_list,
254 EGLModeMESA *modes, EGLint modes_size,
255 EGLint *num_modes)
256
257 EGLBoolean eglGetModesMESA(EGLDisplay dpy, EGLScreenMESA screen,
258 EGLModeMESA *modes, EGLint modes_size,
259 EGLint *num_modes)
260
261 EGLBoolean eglGetModeAttribMESA(EGLDisplay dpy, EGLModeMESA mode,
262 EGLint attrib, EGLint *value)
263
264
265 EGLBoolean eglGetScreensMESA(EGLDisplay dpy, EGLScreenMESA *screens,
266 EGLint screens_size, EGLint *num_screens)
267
268 EGLSurface eglCreateScreenSurfaceMESA(EGLDisplay dpy, EGLConfig config,
269 const EGLint *attrib_list)
270
271 EGLBoolean eglShowSurfaceMESA(EGLDisplay dpy, EGLScreenMESA screen,
272 EGLSurface surface, EGLModeMESA mode)
273
274 EGLBoolean eglScreenPositionMESA(EGLDisplay dpy, EGLScreenMESA screen,
275 EGLint x, EGLint y)
276
277
278 EGLBoolean eglQueryScreenMESA(EGLDisplay dpy, EGLScreenMESA screen,
279 EGLint attrib, EGLint *value);
280
281 EGLBoolean eglQueryScreenSurfaceMESA(EGLDisplay dpy, EGLScreenMESA screen,
282 EGLSurface *surface)
283
284 EGLBoolean eglQueryScreenModeMESA(EGLDisplay dpy, EGLScreenMESA screen,
285 EGLModeMESA *mode)
286
287 const char *eglQueryModeStringMESA(EGLDisplay dpy, EGLMode mode);
288
289
290 New Types
291
292 EGLModeMESA
293 EGLScreenMESA
294
295 New Tokens
296
297 New error codes:
298
299 EGL_BAD_SCREEN_MESA
300 EGL_BAD_MODE_MESA
301
302 Screen-related tokens:
303
304 EGL_SCREEN_COUNT_MESA
305 EGL_SCREEN_POSITION_MESA
306 EGL_SCREEN_BIT_MESA
307 EGL_SCREEN_POSITION_GRANULARITY_MESA
308
309 Mode-related tokens:
310
311 EGL_MODE_ID_MESA
312 EGL_REFRESH_RATE_MESA
313 EGL_INTERLACED_MESA
314 EGL_OPTIMAL_MESA
315 EGL_NO_MODE_MESA
316
317
318 Additions to Chapter X of the EGL 1.1 Specification
319
320 [XXX this all has to be rewritten to fit into the EGL specification
321 and match the conventions of an EGL extension. For now, just list
322 all the functions with brief descriptions.]
323
324
325 EGLBoolean eglChooseModeMESA(EGLDisplay dpy, const EGLScreenMESA screen,
326 EGLint *attrib_list, EGLModeMESA *modes,
327 EGLint modes_size, EGLint *num_modes)
328
329 Like eglChooseConfig, returns a list of EGLModes which match the given
330 attribute list. This does not set the screen's current display mode.
331 The attribute list is a list of token/value pairs terminated with
332 EGL_NONE. Supported attributes include:
333
334 Name Description
335 --------------------- ---------------------------------------------
336 EGL_WIDTH Mode width (resolution)
337 EGL_HEIGHT Mode height (resolution)
338 EGL_REFRESH_RATE_MESA The mode's refresh rate, multiplied by 1000
339 EGL_INTERLACED_MESA 1 indicates an interlaced mode, 0 otherwise
340 EGL_OPTIMAL_MESA Set if the most is especially optimal for the
341 screen (ex. for particular LCD resolutions)
342
343 Any other token will generate the error EGL_BAD_ATTRIBUTE.
344
345 The list of modes returned by eglChooseModeMESA will be sorted
346 according to the following criteria. See the discussion of table 3.3
347 in the EGL specification for more information.
348
349 Selection Sort Sort
350 Attribute Default Criteria Order Priority
351 -------------------- -------------- ----------- ------ --------
352 EGL_OPTIMAL_MESA EGL_DONT_CARE Exact 1,0 1
353 EGL_INTERLACED_MESA EGL_DONT_CARE Exact 0,1 2
354 EGL_REFRESH_RATE EGL_DONT_CARE AtLeast Larger 3
355 EGL_WIDTH EGL_DONT_CARE AtLeast Larger 4
356 EGL_HEIGHT EGL_DONT_CARE AtLeast Larger 5
357 EGL_MODE_ID_MESA EGL_DONT_CARE Exact Smaller 6
358
359
360 EGLBoolean eglGetModesMESA(EGLDisplay dpy, EGLScreenMESA screen,
361 EGLModeMESA *modes, EGLint modes_size,
362 EGLint *num_modes)
363
364 Like eglGetConfigs, returns a list of all modes supported by the
365 given screen. The returned modes will be sorted in the same manner
366 as for eglChooseModeMESA().
367
368
369
370 EGLBoolean eglGetModeAttribMESA(EGLDisplay dpy, EGLModeMESA mode,
371 EGLint attrib, EGLint *value)
372
373 Used to query mode attributes. The following attributes are supported:
374
375 Name Return value description
376 --------------------- ----------------------------------------------
377 EGL_OPTIMAL_MESA 1 indicates an optimal mode, 0 otherwise
378 EGL_INTERLACED_MESA 1 indicates an interlaced mode, 0 otherwise
379 EGL_REFRESH_RATE_MESA The mode's refresh rate, multiplied by 1000
380 EGL_WIDTH Mode width (resolution)
381 EGL_HEIGHT Mode height (resolution)
382 EGL_MODE_ID_MESA A unique small integer identifier for the mode
383
384 Any other token will generate the error EGL_BAD_ATTRIBUTE.
385
386
387
388 EGLBoolean eglGetScreensMESA(EGLDisplay dpy, EGLScreenMESA *screens,
389 EGLint screens_size, EGLint *num_screens)
390
391 This function returns an array of all available screen handles.
392 <screens_size> is the maximum number of screens to return in the
393 <screens> array. <num_screens> will return the number of screen handles
394 placed in the array, even if <screens> is NULL.
395
396 The number of screens and the availability of each may change over
397 time (hot-plugging). Screen handles will not be reused. When a
398 screen handle becomes invalid, function calls which reference an
399 invalid handle will generate EGL_BAD_SCREEN_MESA.
400
401 The first screen handle returned will be considered to be the primary
402 one.
403
404
405
406 EGLSurface eglCreateScreenSurfaceMESA(EGLDisplay dpy, EGLConfig config,
407 const EGLint *attrib_list)
408
409 Create a surface that can be displayed on a screen. <attrib_list> is
410 an array of token/value pairs terminated with EGL_NONE. Valid tokens
411 include:
412
413 Name Description
414 ---------------- --------------------------------
415 EGL_WIDTH desired surface width in pixels
416 EGL_HEIGHT desired surface height in pixels
417
418 Any other token will generate the error EGL_BAD_ATTRIBUTE.
419 The default width and height are zero.
420
421
422
423 EGLBoolean eglShowSurfaceMESA(EGLDisplay dpy, EGLScreenMESA screen,
424 EGLSurface surface, EGLModeMESA mode)
425
426 This function causes a screen to show the given surface (or more
427 precisely, the surface's front color buffer) with the given mode.
428
429 If the surface is in any way incompatible with the mode, the error
430 EGL_BAD_MATCH will be generated, EGL_FALSE will be returned, and the
431 previous screen state will remain in effect. This might occur when
432 the bandwidth of the video-out subsystem is exceeded, or if the mode
433 specifies a width or height that's greater than the width or height
434 of the surface.
435
436 To disable a screen, the values EGL_NO_SURFACE and EGL_NO_MODE_MESA
437 be passed as the <surface> and <mode> parameters.
438
439 The values of EGL_SCREEN_POSITION_MESA are clamped to the new valid
440 range computed from the screen size and surface size. If the new
441 surface is EGL_NO_SURFACE, EGL_SCREEN_POSITION_MESA is set to [0, 0].
442
443
444 Attempting to delete a screen surface which is currently being
445 displayed will result in the error EGL_BAD_ACCESS being generated.
446
447
448
449 EGLBoolean eglScreenPositionMESA(EGLDisplay dpy, EGLScreenMESA screen,
450 EGLint x, EGLint y)
451
452 Specifies the origin of the screen's view into the surface, if the
453 surface is larger than the screen. Valid values for x and y are
454 [0, surfaceWidth - screenWidth] and [0, surfaceHeight - screenHeight],
455 respectively.
456
457 The x and y values are also constrained to be integer multiples of the
458 EGL_SCREEN_POSITION_GRANULARITY_MESA values.
459
460
461
462
463 EGLBoolean eglQueryScreenMESA(EGLDisplay dpy, EGLScreenMESA screen,
464 EGLint attrib, EGLint *value);
465
466 Used to query screen attributes. <attrib> may be one of the following:
467
468 Name Return value description
469 ------------------------ ---------------------------------------------
470 EGL_SCREEN_POSITION_MESA x, y position of the screen's origin with
471 respect to the surface. If no surface is
472 attached to the screen, [0, 0] is returned.
473 EGL_SCREEN_POSITION_GRANULARITY_MESA
474 Returns the granularity, in pixels, for
475 which the screen position is constrained.
476
477 Any other token will generate the error EGL_BAD_ATTRIBUTE.
478
479
480
481
482 EGLBoolean eglQueryScreenSurfaceMESA(EGLDisplay dpy, EGLScreenMESA screen,
483 EGLSurface *surface)
484
485 Returns the surface currently displayed on the given screen. <surface>
486 may be EGL_NO_SURFACE if the screen isn't currently showing any surface.
487
488
489
490
491 EGLBoolean eglQueryScreenModeMESA(EGLDisplay dpy, EGLScreenMESA screen,
492 EGLModeMESA *mode)
493
494 Returns the given screen's current display mode. The mode may be
495 EGL_NO_MODE_MESA if the screen is currently disabled.
496
497
498
499 const char *eglQueryModeStringMESA(EGLDisplay dpy, EGLModeMESA mode);
500
501 Returns a human-readable string for the given mode. The string is a
502 zero-terminated C string which the user should not attempt to free.
503 There is no standard syntax for mode strings. Applications should
504 not directly rely on mode strings.
505
506
507
508 Version History
509
510 1. 15 March 2005 - BrianP
511 Initial version
512
513 2. 16 March 2005 - BrianP
514 Removed EGL_DEPTH_MESA
515 Added EGL_PHYSICAL_WIDTH_MESA, EGL_PHYSICAL_HEIGHT_MESA queries
516 Added EGL_OPTIMAL_MESA for width/height/refresh rate selection
517 Added possible eglQueryModeStringMESA() function
518 More details of the new functions explained.
519
520 3. 18 March 2005 - BrianP
521 Added screen_number to eglChooseModeMESA().
522 Fix off by one mistake in value range for ORIGIN attributes
523 Added Issues section
524
525 4. 21 March 2005 - BrianP
526 Removed eglScreenAttribsMESA().
527 Added eglScreenPositionMESA() to set screen origin.
528 Replaced EGL_SCREEN_X/Y_OFFSET_MESA with EGL_SCREEN_POSITION_MESA.
529 Replaced EGL_PHYSICAL_WIDTH/HEIGHT_MESA with EGL_PHYSICAL_SIZE_MESA.
530 Use EGL_OPTIMAL_MESA as a new mode attribute. (Michel Danzer)
531 Added a few more issues.
532
533 5. 6 April 2005 - BrianP
534 More language for eglGetModeStringMESA().
535 Added issues 10, 11, 12, 13, 14.
536 Updated issue 3 discussion about mode sorting.
537
538 6. 22 April 2005 - BrianP
539 Fixed "LDC" typo.
540 Added issues 15, 16.
541 Changed dependency on EGL 1.1 to EGL 1.0
542 s/EGL_NUM_SCREENS_MESA/EGL_SCREEN_COUNT_MESA/
543 Added eglQueryDisplayMESA() to New Functions section.
544 Clarified language for the EGL_SCREEN_COUNT_MESA query.
545
546 7. 29 April 2005 - BrianP
547 Added EGLScreenMESA type and eglGetScreensMESA() function. [J. Smirl].
548 Replaced EGLint screen_number parameters with EGLScreenMESA screen.
549 Added issue 17 (pixel-accurate panning)
550
551 8. 2 May 2005 - BrianP
552 Removed eglQueryDisplayMESA.
553 Fixed a few more EGLint -> EGLScreenMESA changes.
554
555 9. 20 May 2005 - BrianP
556 Fixed a few typos.
557 Updated some open issues text.
558
559 10. 10 August 2005 - BrianP
560 Added EGL_SCREEN_POSITION_GRANULARITY_MESA.
561
562 11. 27 January 2006 - BrianP
563 EGL_PHYSICAL_SIZE_MESA removed since EGL 1.2 has a similar feature.
564