| Name |
| |
| MESA_screen_surface |
| |
| Name Strings |
| |
| EGL_MESA_screen_surface |
| |
| Contact |
| |
| Brian Paul |
| |
| To discuss, join the dri-egl@lists.freedesktop.org list. |
| |
| Status |
| |
| Preliminary - totally subject to change. |
| |
| Version |
| |
| 11 (27 January 2006) |
| |
| Number |
| |
| TBD |
| |
| Dependencies |
| |
| EGL 1.0 or later. |
| |
| Overview |
| |
| EGL 1.1 supports three types of drawing surfaces: |
| * Window surfaces |
| * Pixmap surfaces |
| * Pbuffer surfaces |
| This extension defines a fourth type of drawing surface: |
| * Screen surface |
| |
| A screen surface is a surface for which the (front) color buffer can |
| be directly displayed (i.e. scanned out) on a monitor (such as a flat |
| panel or CRT). In particular the color buffer memory will be allocated |
| at a location in VRAM (and in a suitable format) which can be displayed |
| by the graphics hardware. |
| |
| Note that the width and height of the screen surface need not exactly |
| match the monitor's current resolution. For example, while the monitor |
| may be configured to to show 1024x768 pixels, the associated screen |
| surface may be larger, such as 1200x1000. The "screen origin" attribute |
| will specify which region of the screen surface which is visible on the |
| monitor. The screen surface can be scrolled by changing this origin. |
| |
| This extension also defines functions for controlling the monitor's |
| display mode (width, height, refresh rate, etc), and specifing which |
| screen surface is to be displayed on a monitor. |
| |
| The new EGLModeMESA type and related functions are very similar to the |
| EGLConfig type and related functions. The user may get a list of |
| supported modes for a screen and specify the mode to be used when |
| displaying a screen surface. |
| |
| |
| Issues |
| |
| 1. Should EGL_INTERLACE be a supported mode attribute? |
| |
| Arguments against: |
| |
| No, this should be provided by another extension which would |
| also provide the mechanisms needed to play back interlaced video |
| material correctly on hardware that supports it. |
| This extension should prefer non-interlaced modes. [M. Danzer] |
| |
| Arguments for: |
| |
| An interlaced display can be of use without considering video |
| material. Being able to query whether a screen is operating in |
| interlaced mode can be used by applications to control their |
| drawing. For example: avoid drawing 1-pixel-wide horizontal lines |
| if screen is interlaced. [B. Paul] |
| |
| Resolution: Defer for future extension? |
| |
| |
| 2. Should EGL_REFRESH_RATE be a supported mode attribute? |
| |
| Arguments for: |
| |
| Yes, it's been shown that applications and/or users need to select |
| modes by this. [M. Danzer] |
| |
| Many examples have been given in which it's desirable to let the |
| user choose from a variety of refresh rates without having to |
| restart/reconfigure. [B. Paul] |
| |
| Arguments against: |
| |
| TBD. |
| |
| Resolution: Yes. |
| |
| |
| 3. Exactly how should the list of modes returned by eglChooseConfigMESA |
| be sorted? |
| |
| Current method is described in the text below. Subject to change. |
| |
| Alternately, leave the sorting order undefined so that each |
| implementation can return the modes in order of "most desirable" |
| to "least desirable" which may depend on the display technology |
| (CRT vs LCD, etc) or other factors. |
| |
| |
| 4. How should screen blanking be supported? Note that a screen can be |
| disabled or turned off by calling eglShowSurface(dpy, scrn, |
| EGL_NO_SURFACE, EGL_NO_MODE_MESA). But what about power-save mode? |
| |
| I would defer this to other extensions that depend on this one. |
| I can imagine people wanting different semantics not just in |
| relation to the power management API being exposed (DPMS or whatever) |
| but also relating to what events can trigger EGL_CONTEXT_LOST. Also |
| I'm not sure whether power management commands are properly operations |
| on the Display or on a screen surface. [A. Jackson] |
| |
| |
| 5. Should the EGL_PHYSICAL_SIZE_EGL query be kept? The size information |
| isn't always reliable (consider video projectors) but can still be |
| used to determine the pixel aspect ratio. |
| |
| Resolution: Omit. The EGL 1.2 specification includes queries for |
| the display resolution and pixel aspect ratio. |
| |
| |
| 6. Should detailed mode timing information be exposed by this API? |
| |
| Probably not. Instead, offer that information in a layered extension. |
| |
| |
| 7. How should the notion of a screen's "native" mode be expressed? |
| For example, LCD panels have a native resolution and refresh rate |
| that looks best but other sub-optimal resolutions may be supported. |
| |
| The mode attribute EGL_OPTIMAL_MESA will be set for modes which |
| best match the screen. [M. Danzer] |
| |
| |
| 8. Should eglQueryModeStringMESA() be included? This function returns |
| a human-readable string which corresponds to an EGLMode. |
| |
| Arguments for: |
| |
| A mode name such as "HDTV-720P" might mean more to users than |
| "1280x720@60Hz" if the later were generated via code. |
| |
| Arguments against: |
| |
| There's no standard syntax for the strings. May cause more |
| trouble than it's worth. |
| |
| Postpone for future extension. [A. Jackson] |
| |
| Latest discussion leaning toward omitting this function. |
| |
| |
| 9. Should we use "Get" or "Query" for functions which return state? |
| The EGL 1.x specification doesn't seem to be totally consistent |
| in this regard, but "Query" is used more often. |
| |
| Use "Get" for mode-related queries (as for EGLConfigs) but "Query" |
| for everything else. |
| |
| |
| 10. What should be the default size for screen surfaces? |
| |
| For Pbuffer surfaces the default width and height are zero. |
| We'll do the same for screen surfaces. Since there's no function |
| to resize surfaces it's useless to have a 0x0 screen, but this isn't |
| a situation that'll normally be encountered. |
| |
| |
| 11. Should there be a function for resizing a screen surface? |
| |
| Suppose one wants to change the screen's size in the EGL application. |
| Also suppose there's a hardware restriction such that only one screen |
| surface can exist at a time (either for lack of memory or because of |
| memory layout restrictions). |
| |
| The basic idea is that the currently displayed screen surface must |
| be deallocated before a new one can be created. Perhaps a resize |
| function would work better? |
| |
| |
| 12. How should sub-pixel LCD color information be made available? |
| What about the display's gamma value? |
| |
| Perhaps expose as additional read-only mode attributes. |
| |
| Perhaps postpone for a layered extension. |
| |
| |
| 13. What happens if the user attempts to delete a screen surface that |
| is currently being shown? |
| |
| Spec currently says that's illegal and that an error (TBD) will be |
| generated. |
| |
| |
| 14. What if the physical screen size can't be determined? Should |
| a query of EGL_PHYSICAL_SIZE_MESA return [0,0]? |
| |
| Obsolete: EGL_PHYSICAL_SIZE_MESA not used. |
| |
| |
| 15. Suppose the device's number of RAMDACs is different from the |
| number of output ports. For example, a graphics card with |
| two RAMDACs but three ports (VGA, DVI, TV). |
| |
| Address this in a follow-on extension. [Matthias Hopf] |
| |
| |
| 16. How should we deal with on-the-fly device changes? For example, |
| the monitor being unplugged and replaced by another with different |
| characteristics? |
| |
| A HAL event could be received via DBUS in the application [J. Smirl, |
| A. Jackson]. |
| |
| Should there be an EGL mechanism for detecting this? Maybe an |
| EGL_SCREEN_LOST error (similar to EGL_CONTEXT_LOST) can be recorded |
| when there's a screen change. At least then the application can |
| poll to detect this situation. |
| |
| Maybe leave that to a future extension. |
| |
| See also the EGL_SCREEN_COUNT_MESA query. |
| |
| |
| 17. What if pixel-accurate panning is not supported (see |
| eglScreenPositionMESA)? [M. Danzer] |
| |
| Is this a common problem? Can we ignore it for now? |
| |
| |
| 18. Should eglShowSurfaceMESA be renamed to eglShowScreenSurfaceMESA? |
| |
| Probably. |
| |
| |
| |
| New Procedures and Functions |
| |
| EGLBoolean eglChooseModeMESA(EGLDisplay dpy, EGLScreenMESA screen, |
| const EGLint *attrib_list, |
| EGLModeMESA *modes, EGLint modes_size, |
| EGLint *num_modes) |
| |
| EGLBoolean eglGetModesMESA(EGLDisplay dpy, EGLScreenMESA screen, |
| EGLModeMESA *modes, EGLint modes_size, |
| EGLint *num_modes) |
| |
| EGLBoolean eglGetModeAttribMESA(EGLDisplay dpy, EGLModeMESA mode, |
| EGLint attrib, EGLint *value) |
| |
| |
| EGLBoolean eglGetScreensMESA(EGLDisplay dpy, EGLScreenMESA *screens, |
| EGLint screens_size, EGLint *num_screens) |
| |
| EGLSurface eglCreateScreenSurfaceMESA(EGLDisplay dpy, EGLConfig config, |
| const EGLint *attrib_list) |
| |
| EGLBoolean eglShowSurfaceMESA(EGLDisplay dpy, EGLScreenMESA screen, |
| EGLSurface surface, EGLModeMESA mode) |
| |
| EGLBoolean eglScreenPositionMESA(EGLDisplay dpy, EGLScreenMESA screen, |
| EGLint x, EGLint y) |
| |
| |
| EGLBoolean eglQueryScreenMESA(EGLDisplay dpy, EGLScreenMESA screen, |
| EGLint attrib, EGLint *value); |
| |
| EGLBoolean eglQueryScreenSurfaceMESA(EGLDisplay dpy, EGLScreenMESA screen, |
| EGLSurface *surface) |
| |
| EGLBoolean eglQueryScreenModeMESA(EGLDisplay dpy, EGLScreenMESA screen, |
| EGLModeMESA *mode) |
| |
| const char *eglQueryModeStringMESA(EGLDisplay dpy, EGLMode mode); |
| |
| |
| New Types |
| |
| EGLModeMESA |
| EGLScreenMESA |
| |
| New Tokens |
| |
| New error codes: |
| |
| EGL_BAD_SCREEN_MESA |
| EGL_BAD_MODE_MESA |
| |
| Screen-related tokens: |
| |
| EGL_SCREEN_COUNT_MESA |
| EGL_SCREEN_POSITION_MESA |
| EGL_SCREEN_BIT_MESA |
| EGL_SCREEN_POSITION_GRANULARITY_MESA |
| |
| Mode-related tokens: |
| |
| EGL_MODE_ID_MESA |
| EGL_REFRESH_RATE_MESA |
| EGL_INTERLACED_MESA |
| EGL_OPTIMAL_MESA |
| EGL_NO_MODE_MESA |
| |
| |
| Additions to Chapter X of the EGL 1.1 Specification |
| |
| [XXX this all has to be rewritten to fit into the EGL specification |
| and match the conventions of an EGL extension. For now, just list |
| all the functions with brief descriptions.] |
| |
| |
| EGLBoolean eglChooseModeMESA(EGLDisplay dpy, const EGLScreenMESA screen, |
| EGLint *attrib_list, EGLModeMESA *modes, |
| EGLint modes_size, EGLint *num_modes) |
| |
| Like eglChooseConfig, returns a list of EGLModes which match the given |
| attribute list. This does not set the screen's current display mode. |
| The attribute list is a list of token/value pairs terminated with |
| EGL_NONE. Supported attributes include: |
| |
| Name Description |
| --------------------- --------------------------------------------- |
| EGL_WIDTH Mode width (resolution) |
| EGL_HEIGHT Mode height (resolution) |
| EGL_REFRESH_RATE_MESA The mode's refresh rate, multiplied by 1000 |
| EGL_INTERLACED_MESA 1 indicates an interlaced mode, 0 otherwise |
| EGL_OPTIMAL_MESA Set if the most is especially optimal for the |
| screen (ex. for particular LCD resolutions) |
| |
| Any other token will generate the error EGL_BAD_ATTRIBUTE. |
| |
| The list of modes returned by eglChooseModeMESA will be sorted |
| according to the following criteria. See the discussion of table 3.3 |
| in the EGL specification for more information. |
| |
| Selection Sort Sort |
| Attribute Default Criteria Order Priority |
| -------------------- -------------- ----------- ------ -------- |
| EGL_OPTIMAL_MESA EGL_DONT_CARE Exact 1,0 1 |
| EGL_INTERLACED_MESA EGL_DONT_CARE Exact 0,1 2 |
| EGL_REFRESH_RATE EGL_DONT_CARE AtLeast Larger 3 |
| EGL_WIDTH EGL_DONT_CARE AtLeast Larger 4 |
| EGL_HEIGHT EGL_DONT_CARE AtLeast Larger 5 |
| EGL_MODE_ID_MESA EGL_DONT_CARE Exact Smaller 6 |
| |
| |
| EGLBoolean eglGetModesMESA(EGLDisplay dpy, EGLScreenMESA screen, |
| EGLModeMESA *modes, EGLint modes_size, |
| EGLint *num_modes) |
| |
| Like eglGetConfigs, returns a list of all modes supported by the |
| given screen. The returned modes will be sorted in the same manner |
| as for eglChooseModeMESA(). |
| |
| |
| |
| EGLBoolean eglGetModeAttribMESA(EGLDisplay dpy, EGLModeMESA mode, |
| EGLint attrib, EGLint *value) |
| |
| Used to query mode attributes. The following attributes are supported: |
| |
| Name Return value description |
| --------------------- ---------------------------------------------- |
| EGL_OPTIMAL_MESA 1 indicates an optimal mode, 0 otherwise |
| EGL_INTERLACED_MESA 1 indicates an interlaced mode, 0 otherwise |
| EGL_REFRESH_RATE_MESA The mode's refresh rate, multiplied by 1000 |
| EGL_WIDTH Mode width (resolution) |
| EGL_HEIGHT Mode height (resolution) |
| EGL_MODE_ID_MESA A unique small integer identifier for the mode |
| |
| Any other token will generate the error EGL_BAD_ATTRIBUTE. |
| |
| |
| |
| EGLBoolean eglGetScreensMESA(EGLDisplay dpy, EGLScreenMESA *screens, |
| EGLint screens_size, EGLint *num_screens) |
| |
| This function returns an array of all available screen handles. |
| <screens_size> is the maximum number of screens to return in the |
| <screens> array. <num_screens> will return the number of screen handles |
| placed in the array, even if <screens> is NULL. |
| |
| The number of screens and the availability of each may change over |
| time (hot-plugging). Screen handles will not be reused. When a |
| screen handle becomes invalid, function calls which reference an |
| invalid handle will generate EGL_BAD_SCREEN_MESA. |
| |
| The first screen handle returned will be considered to be the primary |
| one. |
| |
| |
| |
| EGLSurface eglCreateScreenSurfaceMESA(EGLDisplay dpy, EGLConfig config, |
| const EGLint *attrib_list) |
| |
| Create a surface that can be displayed on a screen. <attrib_list> is |
| an array of token/value pairs terminated with EGL_NONE. Valid tokens |
| include: |
| |
| Name Description |
| ---------------- -------------------------------- |
| EGL_WIDTH desired surface width in pixels |
| EGL_HEIGHT desired surface height in pixels |
| |
| Any other token will generate the error EGL_BAD_ATTRIBUTE. |
| The default width and height are zero. |
| |
| |
| |
| EGLBoolean eglShowSurfaceMESA(EGLDisplay dpy, EGLScreenMESA screen, |
| EGLSurface surface, EGLModeMESA mode) |
| |
| This function causes a screen to show the given surface (or more |
| precisely, the surface's front color buffer) with the given mode. |
| |
| If the surface is in any way incompatible with the mode, the error |
| EGL_BAD_MATCH will be generated, EGL_FALSE will be returned, and the |
| previous screen state will remain in effect. This might occur when |
| the bandwidth of the video-out subsystem is exceeded, or if the mode |
| specifies a width or height that's greater than the width or height |
| of the surface. |
| |
| To disable a screen, the values EGL_NO_SURFACE and EGL_NO_MODE_MESA |
| be passed as the <surface> and <mode> parameters. |
| |
| The values of EGL_SCREEN_POSITION_MESA are clamped to the new valid |
| range computed from the screen size and surface size. If the new |
| surface is EGL_NO_SURFACE, EGL_SCREEN_POSITION_MESA is set to [0, 0]. |
| |
| |
| Attempting to delete a screen surface which is currently being |
| displayed will result in the error EGL_BAD_ACCESS being generated. |
| |
| |
| |
| EGLBoolean eglScreenPositionMESA(EGLDisplay dpy, EGLScreenMESA screen, |
| EGLint x, EGLint y) |
| |
| Specifies the origin of the screen's view into the surface, if the |
| surface is larger than the screen. Valid values for x and y are |
| [0, surfaceWidth - screenWidth] and [0, surfaceHeight - screenHeight], |
| respectively. |
| |
| The x and y values are also constrained to be integer multiples of the |
| EGL_SCREEN_POSITION_GRANULARITY_MESA values. |
| |
| |
| |
| |
| EGLBoolean eglQueryScreenMESA(EGLDisplay dpy, EGLScreenMESA screen, |
| EGLint attrib, EGLint *value); |
| |
| Used to query screen attributes. <attrib> may be one of the following: |
| |
| Name Return value description |
| ------------------------ --------------------------------------------- |
| EGL_SCREEN_POSITION_MESA x, y position of the screen's origin with |
| respect to the surface. If no surface is |
| attached to the screen, [0, 0] is returned. |
| EGL_SCREEN_POSITION_GRANULARITY_MESA |
| Returns the granularity, in pixels, for |
| which the screen position is constrained. |
| |
| Any other token will generate the error EGL_BAD_ATTRIBUTE. |
| |
| |
| |
| |
| EGLBoolean eglQueryScreenSurfaceMESA(EGLDisplay dpy, EGLScreenMESA screen, |
| EGLSurface *surface) |
| |
| Returns the surface currently displayed on the given screen. <surface> |
| may be EGL_NO_SURFACE if the screen isn't currently showing any surface. |
| |
| |
| |
| |
| EGLBoolean eglQueryScreenModeMESA(EGLDisplay dpy, EGLScreenMESA screen, |
| EGLModeMESA *mode) |
| |
| Returns the given screen's current display mode. The mode may be |
| EGL_NO_MODE_MESA if the screen is currently disabled. |
| |
| |
| |
| const char *eglQueryModeStringMESA(EGLDisplay dpy, EGLModeMESA mode); |
| |
| Returns a human-readable string for the given mode. The string is a |
| zero-terminated C string which the user should not attempt to free. |
| There is no standard syntax for mode strings. Applications should |
| not directly rely on mode strings. |
| |
| |
| |
| Version History |
| |
| 1. 15 March 2005 - BrianP |
| Initial version |
| |
| 2. 16 March 2005 - BrianP |
| Removed EGL_DEPTH_MESA |
| Added EGL_PHYSICAL_WIDTH_MESA, EGL_PHYSICAL_HEIGHT_MESA queries |
| Added EGL_OPTIMAL_MESA for width/height/refresh rate selection |
| Added possible eglQueryModeStringMESA() function |
| More details of the new functions explained. |
| |
| 3. 18 March 2005 - BrianP |
| Added screen_number to eglChooseModeMESA(). |
| Fix off by one mistake in value range for ORIGIN attributes |
| Added Issues section |
| |
| 4. 21 March 2005 - BrianP |
| Removed eglScreenAttribsMESA(). |
| Added eglScreenPositionMESA() to set screen origin. |
| Replaced EGL_SCREEN_X/Y_OFFSET_MESA with EGL_SCREEN_POSITION_MESA. |
| Replaced EGL_PHYSICAL_WIDTH/HEIGHT_MESA with EGL_PHYSICAL_SIZE_MESA. |
| Use EGL_OPTIMAL_MESA as a new mode attribute. (Michel Danzer) |
| Added a few more issues. |
| |
| 5. 6 April 2005 - BrianP |
| More language for eglGetModeStringMESA(). |
| Added issues 10, 11, 12, 13, 14. |
| Updated issue 3 discussion about mode sorting. |
| |
| 6. 22 April 2005 - BrianP |
| Fixed "LDC" typo. |
| Added issues 15, 16. |
| Changed dependency on EGL 1.1 to EGL 1.0 |
| s/EGL_NUM_SCREENS_MESA/EGL_SCREEN_COUNT_MESA/ |
| Added eglQueryDisplayMESA() to New Functions section. |
| Clarified language for the EGL_SCREEN_COUNT_MESA query. |
| |
| 7. 29 April 2005 - BrianP |
| Added EGLScreenMESA type and eglGetScreensMESA() function. [J. Smirl]. |
| Replaced EGLint screen_number parameters with EGLScreenMESA screen. |
| Added issue 17 (pixel-accurate panning) |
| |
| 8. 2 May 2005 - BrianP |
| Removed eglQueryDisplayMESA. |
| Fixed a few more EGLint -> EGLScreenMESA changes. |
| |
| 9. 20 May 2005 - BrianP |
| Fixed a few typos. |
| Updated some open issues text. |
| |
| 10. 10 August 2005 - BrianP |
| Added EGL_SCREEN_POSITION_GRANULARITY_MESA. |
| |
| 11. 27 January 2006 - BrianP |
| EGL_PHYSICAL_SIZE_MESA removed since EGL 1.2 has a similar feature. |
| |