blob: 1cbd112694ac8913541508a20f383616c532612d [file] [log] [blame]
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