| Name |
| |
| EXT_output_base |
| |
| Name Strings |
| |
| EGL_EXT_output_base |
| |
| Contributors |
| |
| Daniel Kartch |
| James Jones |
| Christopher James Halse Rogers |
| |
| Contacts |
| |
| Daniel Kartch, NVIDIA (dkartch 'at' nvidia.com) |
| |
| Status |
| |
| Complete |
| |
| Version |
| |
| Version 9 - August 22, 2014 |
| |
| Number |
| |
| EGL Extension #78 |
| |
| Extension Type |
| |
| EGL display extension |
| |
| Dependencies |
| |
| Written against the wording of EGL 1.5, plus the EGL_EXT_device_base |
| specification. |
| |
| Requires EGL_EXT_device_base |
| |
| Overview |
| |
| Increasingly, EGL and its client APIs are being used in place of |
| "native" rendering APIs to implement the basic graphics |
| functionality of native windowing systems. This creates demand |
| for a method to initialize EGL displays and surfaces directly on |
| top of native GPU or device objects rather than native window |
| system objects. The mechanics of enumerating the underlying |
| native devices and constructing EGL displays and surfaces from |
| them have been solved in various platform and implementation- |
| specific ways. The EGL device family of extensions offers a |
| standardized framework for bootstrapping EGL without the use of |
| any underlying "native" APIs or functionality. |
| |
| This extension defines new EGL resource types for referencing |
| display control hardware associated with an EGL device. Its purpose |
| is to allow rendering to be directed to a screen in the absence of |
| (or bypassing) a window system. Because the use models for these |
| resources are potentially diverse, only the objects themselves and |
| basic functions to acquire and query them are defined here. More |
| detailed functions and enumerants required to operate on outputs |
| are provided by separate extensions. |
| |
| New Types |
| |
| A handle representing a portion of display control hardware which |
| accepts a single image as input and processes it for output on a |
| display device: |
| |
| typedef void* EGLOutputLayerEXT; |
| |
| A handle representing a portion of display control hardware which |
| transmits a signal to a display device: |
| |
| typedef void* EGLOutputPortEXT; |
| |
| New Functions |
| |
| EGLBoolean eglGetOutputLayersEXT( |
| EGLDisplay dpy, |
| const EGLAttrib *attrib_list, |
| EGLOutputLayerEXT *layers, |
| EGLint max_layers, |
| EGLint *num_layers); |
| |
| EGLBoolean eglGetOutputPortsEXT( |
| EGLDisplay dpy, |
| const EGLAttrib *attrib_list, |
| EGLOutputPortEXT *ports, |
| EGLint max_ports, |
| EGLint *num_ports); |
| |
| EGLBoolean eglOutputLayerAttribEXT( |
| EGLDisplay dpy, |
| EGLOutputLayerEXT layer, |
| EGLint attribute, |
| EGLAttrib value); |
| |
| EGLBoolean eglQueryOutputLayerAttribEXT( |
| EGLDisplay dpy, |
| EGLOutputLayerEXT layer, |
| EGLint attribute, |
| EGLAttrib *value); |
| |
| const char* eglQueryOutputLayerStringEXT( |
| EGLDisplay dpy, |
| EGLOutputLayerEXT layer, |
| EGLint name); |
| |
| EGLBoolean eglOutputPortAttribEXT( |
| EGLDisplay dpy, |
| EGLOutputPortEXT port, |
| EGLint attribute, |
| EGLAttrib value); |
| |
| EGLBoolean eglQueryOutputPortAttribEXT( |
| EGLDisplay dpy, |
| EGLOutputPortEXT port, |
| EGLint attribute, |
| EGLAttrib *value); |
| |
| const char* eglQueryOutputPortStringEXT( |
| EGLDisplay dpy, |
| EGLOutputPortEXT port, |
| EGLint name); |
| |
| New Tokens |
| |
| Functions with a return type of EGLOutputLayerEXT will return this |
| value on failure: |
| |
| EGL_NO_OUTPUT_LAYER_EXT ((EGLOutputLayerEXT)0) |
| |
| Functions with a return type of EGLOutputPortEXT will return this |
| value on failure: |
| |
| EGL_NO_OUTPUT_PORT_EXT ((EGLOutputPortEXT)0) |
| |
| Functions which fail due to a bad EGLOutputLayerEXT handle will set |
| this error code: |
| |
| EGL_BAD_OUTPUT_LAYER_EXT 0x322D |
| |
| Functions which fail due to a bad EGLOutputPortEXT handle will set |
| this error code: |
| |
| EGL_BAD_OUTPUT_PORT_EXT 0x322E |
| |
| Functions which set or query the swap interval use this attribute |
| name: |
| |
| EGL_SWAP_INTERVAL_EXT 0x322F |
| |
| Add a new section "2.1.4 Outputs" after "2.1.3 Displays": |
| |
| An EGLDisplay may have zero or more associated EGLOutputLayerEXT |
| and EGLOutputPortEXT objects. These represent, respectively, the |
| inputs and outputs of display control hardware. |
| |
| An EGLOutputLayerEXT is an abstract handle representing an element |
| of display control hardware which receives image data and processes |
| it for display. This processing is hardware-dependent, and may |
| include, but is not limited to, color space transformation, scaling |
| and rotation, and composition/blending with images from other |
| EGLOutputLayerEXTs. |
| |
| An EGLOutputPortEXT is an abstract handle representing an element of |
| display control hardware which sends a signal to drive a display |
| screen. In general, this signal is the result of the processing of |
| one or more EGLOutputLayerEXTs. |
| |
| Add new entries to section "3.1 Errors": |
| |
| EGL_BAD_OUTPUT_LAYER_EXT |
| An EGLOutputLayerEXT argument does not name a valid |
| EGLOutputLayerEXT. Any command taking an EGLOutputLayerEXT |
| parameter may generate this error. |
| |
| EGL_BAD_OUTPUT_PORT_EXT |
| An EGLOutputPortEXT argument does not name a valid |
| EGLOutputPortEXT. Any command taking an EGLOutputPortEXT |
| parameter may generate this error. |
| |
| Add a new section "3.10 Device Outputs" after "3.9 Posting the Color Buffer": |
| |
| 3.10 Device Outputs |
| |
| A simple platform running a custom software suite may not require a |
| formal window system. Instead, individual applications or a |
| compositor may send rendering results directly to display control |
| hardware, represented by EGLOutputLayerEXT and EGLOutputPortEXT |
| handles. |
| |
| As with other EGL resources, EGLOutputLayerEXT and EGLOutputPortEXT |
| handles are owned by an EGLDisplay, but not all EGLDisplays are |
| required to support these objects. In general, they will only be |
| available for EGLDisplays obtained from platforms which allow direct |
| manipulation of display devices. |
| |
| 3.10.1 Acquiring Outputs |
| |
| To obtain EGLOutputLayerEXT handles associated with a display which |
| match a list of attributes, use |
| |
| EGLBoolean eglGetOutputLayersEXT( |
| EGLDisplay dpy, |
| const EGLAttrib *attrib_list, |
| EGLOutputLayerEXT *layers, |
| EGLint max_layers, |
| EGLint *num_layers) |
| |
| On success, EGL_TRUE is returned. If <layers> is NULL, <max_layers> |
| is ignored and the number of output layers which match <attrib_list> |
| is returned in <num_layers>. Otherwise, up to <max_layers> matching |
| layers will be returned in <layers> and <num_layers> will be set to |
| the number of layer handles returned. The states of the output |
| layers are not altered by this query, and output layer handles can |
| be retrieved by multiple calls to this function. |
| |
| <attrib_list> may be NULL or a list of name/value pairs terminated |
| by EGL_NONE. If no attributes are provided, all output layers |
| associated with <dpy> will match. Otherwise, only those layers |
| matching all attributes provided in the list will be returned, |
| unless the value specified is EGL_DONT_CARE. If there are no |
| matching layers but all parameters are otherwise valid, success is |
| returned but num_layers is set to 0. |
| |
| On failure, EGL_FALSE will be returned and the memory referenced by |
| <layers> and <num_layers> will be unaffected. If <dpy> is not a |
| valid, initialized EGLDisplay, an EGL_BAD_DISPLAY error is |
| generated. If any name in <attrib_list> is not a valid layer |
| attribute name defined in Table 3.10.3.1, an EGL_BAD_ATTRIBUTE error |
| is generated. If any name in <attrib_list> does not allow search |
| access, an EGL_BAD_ACCESS error is generated. |
| |
| To obtain EGLOutputPortEXT handles associated with a display which |
| match a list of attributes, use |
| |
| EGLBoolean eglGetOutputPortsEXT( |
| EGLDisplay dpy, |
| const EGLAttrib *attrib_list, |
| EGLOutputPortEXT *ports, |
| EGLint max_ports, |
| EGLint *num_ports) |
| |
| On success, EGL_TRUE is returned. If <ports> is NULL, <max_ports> is |
| ignored and the number of output ports which match <attrib_list> is |
| returned in <num_ports>. Otherwise, up to <max_ports> matching |
| layers will be returned in <ports> and <num_ports> will be set to |
| the number of port handles returned. The states of the output ports |
| are not altered by this query, and output port handles can be |
| retrieved by multiple calls to this function. |
| |
| <attrib_list> may be NULL or a list of name/value pairs terminated |
| by EGL_NONE. If no attributes are provided, all output ports |
| associated with <dpy> will match. Otherwise, only those ports |
| matching all attributes provided in the list will be returned, |
| unless the value specified is EGL_DONT_CARE. If there are no |
| matching ports but all parameters are otherwise valid, success is |
| returned but num_ports is set to 0. |
| |
| On failure, EGL_FALSE will be returned and the memory referenced by |
| <ports> and <num_ports> will be unaffected. If <dpy> is not a valid, |
| initialized EGLDisplay, an EGL_BAD_DISPLAY error is generated. If |
| any name in <attrib_list> is not a valid port attribute name defined |
| in Table 3.10.3.2, an EGL_BAD_ATTRIBUTE error is generated. If any |
| name in <attrib_list> does not allow search access, an |
| EGL_BAD_ACCESS error is generated. |
| |
| 3.10.2 Lifetime of Output Handles |
| |
| An initialized EGLDisplay has a fixed set of output layer and port |
| resources available. Implementations may defer creation of handles |
| and allocation of data structions for these objects until they are |
| first requested. However, once acquired, they remain valid as long |
| as the EGLDisplay is not terminated. |
| |
| 3.10.3 Output Attributes |
| |
| Valid attributes associated with output layers and ports are listed |
| in Tables 3.10.3.1 and 3.10.3.2, respectively. Additional attributes |
| may be defined by other extensions. The Access columns contain one |
| or more of the letters "S", "R", and W". A value of "S" indicates |
| the attribute may be used to restrict the search when obtaining a |
| list of output handles. A value of "R" indicates the value may be |
| queried from an output handle. A value of "W" indicates the value |
| may be modified using an output handle. |
| |
| Attribute Type Access |
| --------------------- ------- ------ |
| EGL_SWAP_INTERVAL_EXT integer R|W |
| EGL_MIN_SWAP_INTERVAL integer R |
| EGL_MAX_SWAP_INTERVAL integer R |
| |
| Table 3.10.3.1 Output layer attributes |
| |
| Attribute Type Access |
| --------------------- ------- ------ |
| [no attributes supported] |
| |
| Table 3.10.3.2 Output port attributes |
| |
| 3.10.3.1 Querying Output Attributes |
| |
| To query attributes of an EGLOutputLayerEXT, use |
| |
| EGLBoolean eglQueryOutputLayerAttribEXT( |
| EGLDisplay dpy, |
| EGLOutputLayerEXT layer, |
| EGLint attribute, |
| EGLAttrib *value) |
| |
| On success, this function returns EGL_TRUE and stores the value of |
| <attribute> in <value>. |
| |
| On failure, EGL_FALSE is returned. If <dpy> is not a valid, |
| initialized EGLDisplay, an EGL_BAD_DISPLAY error is generated. If |
| <layer> is not a valid EGLOutputLayerEXT associated with <dpy>, an |
| EGL_BAD_OUTPUT_LAYER_EXT error is generated. If <attribute> is not a |
| valid layer attribute name defined in Table 3.10.3.1, an |
| EGL_BAD_ATTRIBUTE error is generated. If <attribute> has string |
| type or does not allow read access, an EGL_BAD_ACCESS error is |
| generated. |
| |
| To query string properties of an EGLOutputLayerEXT, use |
| |
| const char* eglQueryOutputLayerStringEXT( |
| EGLDisplay dpy, |
| EGLOutputLayerEXT layer, |
| EGLint attribute) |
| |
| On success, this function returns a zero-terminated string |
| containing the value associated with <name>. |
| |
| On failure, NULL is returned. If <dpy> is not a valid, initialized |
| EGLDisplay, an EGL_BAD_DISPLAY error is generated. If <layer> is not |
| a valid EGLOutputLayerEXT associated with <dpy>, an |
| EGL_BAD_OUTPUT_LAYER_EXT error is generated. If <name> is not a |
| valid layer attribute name defined in Table 3.10.3.1, an |
| EGL_BAD_ATTRIBUTE error is generated. If <attribute> has non-string |
| type or does not allow read access, an EGL_BAD_ACCESS error is |
| generated. |
| |
| To query attributes of an EGLOutputPortEXT, use |
| |
| EGLBoolean eglQueryOutputPortAttribEXT( |
| EGLDisplay dpy, |
| EGLOutputPortEXT port, |
| EGLint attribute, |
| EGLAttrib *value) |
| |
| On success, this function returns EGL_TRUE and stores the value of |
| <attribute> in <value>. |
| |
| On failure, EGL_FALSE is returned. If <dpy> is not a valid, |
| initialized EGLDisplay, an EGL_BAD_DISPLAY error is generated. If |
| <port> is not a valid EGLOutputPortEXT associated with <dpy>, an |
| EGL_BAD_OUTPUT_PORT_EXT error is generated. If <attribute> is not a |
| valid port attribute name defined in Table 3.10.3.2, an |
| EGL_BAD_ATTRIBUTE error is generated. If <attribute> has string |
| type or does not allow read access, an EGL_BAD_ACCESS error is |
| generated. |
| |
| To query string properties of an EGLOutputPortEXT, use |
| |
| const char* eglQueryOutputPortStringEXT( |
| EGLDisplay dpy, |
| EGLOutputPortEXT port, |
| EGLint attribute) |
| |
| On success, this function returns a zero-terminated string |
| containing the value associated with <name>. |
| |
| On failure, NULL is returned. If <dpy> is not a valid, initialized |
| EGLDisplay, an EGL_BAD_DISPLAY error is generated. If <port> is not |
| a valid EGLOutputPortEXT associated with <dpy>, an |
| EGL_BAD_OUTPUT_PORT_EXT error is generated. If <name> is not a |
| valid port attribute name defined in Table 3.10.3.2, an |
| EGL_BAD_ATTRIBUTE error is generated. If <attribute> has non-string |
| type or does not allow read access, an EGL_BAD_ACCESS error is |
| generated. |
| |
| 3.10.3.2 Setting Output Attributes |
| |
| To set attributes of an EGLOutputLayerEXT, use |
| |
| EGLBoolean eglOutputLayerAttribEXT( |
| EGLDisplay dpy, |
| EGLOutputLayerEXT layer, |
| EGLint attribute, |
| EGLAttrib value) |
| |
| On success, this function returns EGL_TRUE and sets the value of |
| <attribute> to <value>. |
| |
| If <attribute> is EGL_SWAP_INTERVAL_EXT, the value provided will be |
| silently clamped to the range specified by the layer's |
| EGL_MIN_SWAP_INTERVAL and EGL_MAX_SWAP_INTERVAL values. |
| |
| On failure, EGL_FALSE is returned. If <dpy> is not a valid, |
| initialized EGLDisplay, an EGL_BAD_DISPLAY error is generated. If |
| <layer> is not a valid EGLOutputLayerEXT associated with <dpy>, an |
| EGL_BAD_OUTPUT_LAYER_EXT error is generated. If <attribute> is not a |
| valid layer attribute name defined in Table 3.10.3.1, an |
| EGL_BAD_ATTRIBUTE error is generated. If <attribute> does not |
| allow write access, an EGL_BAD_ACCESS error is generated. |
| |
| To set attributes of an EGLOutputPortEXT, use |
| |
| EGLBoolean eglOutputPortAttribEXT( |
| EGLDisplay dpy, |
| EGLOutputPortEXT port, |
| EGLint attribute, |
| EGLAttrib value) |
| |
| On success, this function returns EGL_TRUE and sets the value of |
| <attribute> to <value>. |
| |
| On failure, EGL_FALSE is returned. If <dpy> is not a valid, |
| initialized EGLDisplay, an EGL_BAD_DISPLAY error is generated. If |
| <port> is not a valid EGLOutputPortEXT associated with <dpy>, an |
| EGL_BAD_OUTPUT_PORT_EXT error is generated. If <attribute> is not a |
| valid port attribute name defined in Table 3.10.3.2, an |
| EGL_BAD_ATTRIBUTE error is generated. If <attribute> does not |
| allow write access, an EGL_BAD_ACCESS error is generated. |
| |
| 3.10.4 Setting Output Modes |
| |
| EGL does not currently define any mechanims to adjust display |
| modes through EGLOutputPortEXTs. These may be added via additional |
| extensions. |
| |
| 3.10.5 Posting to Outputs |
| |
| EGL does not currently define any mechanisms to post rendering |
| results to EGLOutputsLayerEXTs. These may be added via additional |
| extensions. However, unless otherwise specified, such mechanims |
| will respect the layer's EGL_SWAP_INTERVAL_EXT value, which |
| specifies the minimum number of video frame periods for which the |
| frames should be displayed, in a manner analogous to using |
| eglSwapInterval for the current draw surface. The default value of |
| EGL_SWAP_INTERVAL_EXT is 1, clamped to the layer's |
| EGL_MIN_SWAP_INTERVAL and EGL_MAX_SWAP_INTERVAL values. |
| |
| (Example: See extension specification |
| EGL_EXT_stream_consumer_egloutput) |
| |
| Issues |
| |
| 1. Should this extension provide a mechanism to enumerate outputs |
| associated with an EGLDevice and set their modes? |
| |
| RESOLVED: No. On many operating systems there already exist |
| standardized and/or widely accepted low level mechanisms for |
| performing these tasks. Duplicating this support in EGL would |
| impose an undesirable implementation burden where output handles |
| are only required as a means to direct rendering to a display |
| screen. Functions for enumerating screens or obtaining them from |
| platform-dependent representations will be provided by other |
| extensions. |
| |
| 2. Should output layer and port handles be associated with an |
| EGLDisplay, or vice versa? |
| |
| RESOLVED: Yes. Furthermore, it may only be possible to obtain |
| output handles from some EGLDisplays. The primary intended use |
| case is the EGLDisplay associated with an EGLDevice, through the |
| platform defined by EGL_EXT_platform_device. This represents raw |
| device access available in the absence of a window system. |
| EGLDisplays associated with other platforms typically represent |
| handles provided by window systems, which may not allow direct |
| access to the display control hardware. |
| |
| 3. Can the EGLDeviceEXT handle be returned by a query function |
| which returns integer attributes? |
| |
| RESOLVED: Yes. Function definition has been updated to use |
| EGLAttribEXT, which is compatible with EGL handles. |
| |
| 4. What display mode properties should be queriable by the base |
| extension? Does the application require width/height/refresh or |
| should those be left to other mechanisms or additional |
| extensions? If hardware supports selecting a portion of the |
| image for display, or restricting an image to a portion of the |
| screen, or scaling an image to a different resolution for |
| display, should all these settings be queriable? |
| |
| RESOLVED: The base extension will not define any display |
| properties. These will be left to future extensions if required. |
| |
| 5. How should stereo/multiview displays be handled? Should all |
| views share a single output or does each one have its own? |
| |
| UNRESOLVED. Left for a future extension to define. |
| |
| 6. This extension is currently focused on individual display layers |
| for the purpose of directing rendering output. An API covering |
| all hardware would associate one or more of those layers with a |
| display port. Do we need to abstract both? |
| |
| RESOLVED: Yes. Extension has been modified to abstract both |
| inputs (layers) and outputs (ports) of display control hardware. |
| An implementation is not required to return any ports in the |
| query function if it provides no means to operate on them. |
| |
| Revision History: |
| |
| #9 (August 22nd, 2014) James Jones |
| - Marked complete. |
| - Added minor coments to issue 5. |
| - Listed Daniel as the contact. |
| |
| #8 (June 10th, 2014) Daniel Kartch |
| - Fixed prototypes for layer/port attribute setting functions. |
| |
| #7 (June 5th, 2014) Daniel Kartch |
| - Assigned enumerated values for constants. |
| - Indicated default swap interval value. |
| |
| #6 (May 28th, 2014) Daniel Kartch |
| - Updated wording based on EGL 1.5 specification, using |
| EGLAttrib instead of EGLAttribEXT. |
| - Added functions to set layer and port attributes. |
| - Added table of valid attributes, with min/max/current swap |
| interval values, and adjusted function descriptions |
| accordingly. |
| - Refined description for output enumeration functions to better |
| indicate the effect of attribute list. |
| - Added effect of swap interval in posting section. |
| |
| #5 (January 31st, 2014) Daniel Kartch |
| - Added eglGetOutput* functions, folding in and generalizing |
| functionality previously provided by EXT_native_output |
| extension. |
| - Separated descriptions for layer and port query functions for |
| clarity. |
| |
| #4 (January 22nd, 2014) Daniel Kartch |
| - Added section clarifying that this extension provides no means |
| to use output ports to set display modes, but future |
| extensions may. |
| |
| #3 (January 17th, 2014) Daniel Kartch |
| - Updated names of example extension for obtaining and using |
| output handles. |
| - Fixed typos. |
| |
| #2 (November 12th, 2013) Daniel Kartch |
| - Replaced EGLOutput with EGLOutputLayer and added |
| EGLOutputPort (and modified/added corresponding functions), to |
| allow both inputs and outputs of display control hardware to |
| be abstracted. |
| - Modified attribute query functions to use EGLAttribEXT and |
| added string query functions. |
| - Removed display mode attributes. These can be defined by a |
| separate extension if desired. |
| - Removed destructor function for outputs and added section on |
| lifetime, as well as language describing their relationship to |
| EGLDisplays. |
| |
| #1 (October 25nd, 2013) Daniel Kartch |
| - Initial draft |
| |