7 EGL_MESA_screen_surface
13 To discuss, join the dri-egl@lists.freedesktop.org list.
17 Preliminary - totally subject to change.
33 EGL 1.1 supports three types of drawing surfaces:
37 This extension defines a fourth type of drawing surface:
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.
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.
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.
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.
65 1. Should EGL_INTERLACE be a supported mode attribute?
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]
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]
82 Resolution: Defer for future extension?
85 2. Should EGL_REFRESH_RATE be a supported mode attribute?
89 Yes, it's been shown that applications and/or users need to select
90 modes by this. [M. Danzer]
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]
103 3. Exactly how should the list of modes returned by eglChooseConfigMESA
106 Current method is described in the text below. Subject to change.
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.
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?
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]
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.
130 Resolution: Omit. The EGL 1.2 specification includes queries for
131 the display resolution and pixel aspect ratio.
134 6. Should detailed mode timing information be exposed by this API?
136 Probably not. Instead, offer that information in a layered extension.
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.
143 The mode attribute EGL_OPTIMAL_MESA will be set for modes which
144 best match the screen. [M. Danzer]
147 8. Should eglQueryModeStringMESA() be included? This function returns
148 a human-readable string which corresponds to an EGLMode.
152 A mode name such as "HDTV-720P" might mean more to users than
153 "1280x720@60Hz" if the later were generated via code.
157 There's no standard syntax for the strings. May cause more
158 trouble than it's worth.
160 Postpone for future extension. [A. Jackson]
162 Latest discussion leaning toward omitting this function.
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.
169 Use "Get" for mode-related queries (as for EGLConfigs) but "Query"
173 10. What should be the default size for screen surfaces?
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.
181 11. Should there be a function for resizing a screen surface?
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).
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?
193 12. How should sub-pixel LCD color information be made available?
194 What about the display's gamma value?
196 Perhaps expose as additional read-only mode attributes.
198 Perhaps postpone for a layered extension.
201 13. What happens if the user attempts to delete a screen surface that
202 is currently being shown?
204 Spec currently says that's illegal and that an error (TBD) will be
208 14. What if the physical screen size can't be determined? Should
209 a query of EGL_PHYSICAL_SIZE_MESA return [0,0]?
211 Obsolete: EGL_PHYSICAL_SIZE_MESA not used.
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).
218 Address this in a follow-on extension. [Matthias Hopf]
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
225 A HAL event could be received via DBUS in the application [J. Smirl,
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.
233 Maybe leave that to a future extension.
235 See also the EGL_SCREEN_COUNT_MESA query.
238 17. What if pixel-accurate panning is not supported (see
239 eglScreenPositionMESA)? [M. Danzer]
241 Is this a common problem? Can we ignore it for now?
244 18. Should eglShowSurfaceMESA be renamed to eglShowScreenSurfaceMESA?
250 New Procedures and Functions
252 EGLBoolean eglChooseModeMESA(EGLDisplay dpy, EGLScreenMESA screen,
253 const EGLint *attrib_list,
254 EGLModeMESA *modes, EGLint modes_size,
257 EGLBoolean eglGetModesMESA(EGLDisplay dpy, EGLScreenMESA screen,
258 EGLModeMESA *modes, EGLint modes_size,
261 EGLBoolean eglGetModeAttribMESA(EGLDisplay dpy, EGLModeMESA mode,
262 EGLint attrib, EGLint *value)
265 EGLBoolean eglGetScreensMESA(EGLDisplay dpy, EGLScreenMESA *screens,
266 EGLint screens_size, EGLint *num_screens)
268 EGLSurface eglCreateScreenSurfaceMESA(EGLDisplay dpy, EGLConfig config,
269 const EGLint *attrib_list)
271 EGLBoolean eglShowSurfaceMESA(EGLDisplay dpy, EGLScreenMESA screen,
272 EGLSurface surface, EGLModeMESA mode)
274 EGLBoolean eglScreenPositionMESA(EGLDisplay dpy, EGLScreenMESA screen,
278 EGLBoolean eglQueryScreenMESA(EGLDisplay dpy, EGLScreenMESA screen,
279 EGLint attrib, EGLint *value);
281 EGLBoolean eglQueryScreenSurfaceMESA(EGLDisplay dpy, EGLScreenMESA screen,
284 EGLBoolean eglQueryScreenModeMESA(EGLDisplay dpy, EGLScreenMESA screen,
287 const char *eglQueryModeStringMESA(EGLDisplay dpy, EGLMode mode);
302 Screen-related tokens:
304 EGL_SCREEN_COUNT_MESA
305 EGL_SCREEN_POSITION_MESA
307 EGL_SCREEN_POSITION_GRANULARITY_MESA
312 EGL_REFRESH_RATE_MESA
318 Additions to Chapter X of the EGL 1.1 Specification
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.]
325 EGLBoolean eglChooseModeMESA(EGLDisplay dpy, const EGLScreenMESA screen,
326 EGLint *attrib_list, EGLModeMESA *modes,
327 EGLint modes_size, EGLint *num_modes)
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:
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)
343 Any other token will generate the error EGL_BAD_ATTRIBUTE.
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.
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
360 EGLBoolean eglGetModesMESA(EGLDisplay dpy, EGLScreenMESA screen,
361 EGLModeMESA *modes, EGLint modes_size,
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().
370 EGLBoolean eglGetModeAttribMESA(EGLDisplay dpy, EGLModeMESA mode,
371 EGLint attrib, EGLint *value)
373 Used to query mode attributes. The following attributes are supported:
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
384 Any other token will generate the error EGL_BAD_ATTRIBUTE.
388 EGLBoolean eglGetScreensMESA(EGLDisplay dpy, EGLScreenMESA *screens,
389 EGLint screens_size, EGLint *num_screens)
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.
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.
401 The first screen handle returned will be considered to be the primary
406 EGLSurface eglCreateScreenSurfaceMESA(EGLDisplay dpy, EGLConfig config,
407 const EGLint *attrib_list)
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
414 ---------------- --------------------------------
415 EGL_WIDTH desired surface width in pixels
416 EGL_HEIGHT desired surface height in pixels
418 Any other token will generate the error EGL_BAD_ATTRIBUTE.
419 The default width and height are zero.
423 EGLBoolean eglShowSurfaceMESA(EGLDisplay dpy, EGLScreenMESA screen,
424 EGLSurface surface, EGLModeMESA mode)
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.
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
436 To disable a screen, the values EGL_NO_SURFACE and EGL_NO_MODE_MESA
437 be passed as the <surface> and <mode> parameters.
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].
444 Attempting to delete a screen surface which is currently being
445 displayed will result in the error EGL_BAD_ACCESS being generated.
449 EGLBoolean eglScreenPositionMESA(EGLDisplay dpy, EGLScreenMESA screen,
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],
457 The x and y values are also constrained to be integer multiples of the
458 EGL_SCREEN_POSITION_GRANULARITY_MESA values.
463 EGLBoolean eglQueryScreenMESA(EGLDisplay dpy, EGLScreenMESA screen,
464 EGLint attrib, EGLint *value);
466 Used to query screen attributes. <attrib> may be one of the following:
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.
477 Any other token will generate the error EGL_BAD_ATTRIBUTE.
482 EGLBoolean eglQueryScreenSurfaceMESA(EGLDisplay dpy, EGLScreenMESA screen,
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.
491 EGLBoolean eglQueryScreenModeMESA(EGLDisplay dpy, EGLScreenMESA screen,
494 Returns the given screen's current display mode. The mode may be
495 EGL_NO_MODE_MESA if the screen is currently disabled.
499 const char *eglQueryModeStringMESA(EGLDisplay dpy, EGLModeMESA mode);
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.
510 1. 15 March 2005 - BrianP
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.
520 3. 18 March 2005 - BrianP
521 Added screen_number to eglChooseModeMESA().
522 Fix off by one mistake in value range for ORIGIN attributes
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.
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.
538 6. 22 April 2005 - BrianP
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.
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)
551 8. 2 May 2005 - BrianP
552 Removed eglQueryDisplayMESA.
553 Fixed a few more EGLint -> EGLScreenMESA changes.
555 9. 20 May 2005 - BrianP
557 Updated some open issues text.
559 10. 10 August 2005 - BrianP
560 Added EGL_SCREEN_POSITION_GRANULARITY_MESA.
562 11. 27 January 2006 - BrianP
563 EGL_PHYSICAL_SIZE_MESA removed since EGL 1.2 has a similar feature.