Name | |
EXT_surface_compression | |
Name Strings | |
EGL_EXT_surface_compression | |
Contributors | |
Jan-Harald Fredriksen, Arm | |
Lisa Wu, Arm | |
George Liu, Arm | |
Laurie Hedge, Imagination Technologies | |
Contact | |
Jan-Harald Fredriksen (jan-harald.fredriksen 'at' arm.com) | |
IP Status | |
No known IP claims. | |
Status | |
Complete | |
Version | |
Version 1 - November 15, 2021 | |
Number | |
EGL Extension #147 | |
Dependencies | |
These extensions are written against the wording of the EGL 1.5 | |
specification (August 27, 2014). | |
This extension interacts with EGL_EXT_yuv_surface. | |
Overview | |
Applications may wish to take advantage of framebuffer compression. Some | |
platforms may support framebuffer compression at fixed bitrates. Such | |
compression algorithms generally produce results that are visually lossless, | |
but the results are typically not bit exact when compared to a non-compressed | |
result. | |
This extension enables applications to opt-in to fixed-rate compression | |
for EGL window surfaces. | |
Compression may not be supported for all framebuffer formats. It can still | |
be requested for all formats and applications can query what level of compression | |
was actually enabled. | |
New Procedures and Functions | |
EGLBoolean eglQuerySupportedCompressionRatesEXT( | |
EGLDisplay dpy, EGLConfig config, const EGLAttrib *attrib_list, | |
EGLint *rates, EGLint rate_size, EGLint *num_rates); | |
New Tokens | |
New attributes accepted by the <attrib_list> argument of | |
eglCreatePlatformWindowSurface and eglCreateWindowSurface: | |
EGL_SURFACE_COMPRESSION_EXT 0x34B0 | |
[Only if EGL_EXT_yuv_surface is supported] | |
EGL_SURFACE_COMPRESSION_PLANE1_EXT 0x328E | |
EGL_SURFACE_COMPRESSION_PLANE2_EXT 0x328F | |
Accepted as attribute values for EGL_SURFACE_COMPRESSION_EXT by | |
eglCreatePlatformWindowSurface and eglCreateWindowSurface: | |
EGL_SURFACE_COMPRESSION_FIXED_RATE_NONE_EXT 0x34B1 | |
EGL_SURFACE_COMPRESSION_FIXED_RATE_DEFAULT_EXT 0x34B2 | |
EGL_SURFACE_COMPRESSION_FIXED_RATE_1BPC_EXT 0x34B4 | |
EGL_SURFACE_COMPRESSION_FIXED_RATE_2BPC_EXT 0x34B5 | |
EGL_SURFACE_COMPRESSION_FIXED_RATE_3BPC_EXT 0x34B6 | |
EGL_SURFACE_COMPRESSION_FIXED_RATE_4BPC_EXT 0x34B7 | |
EGL_SURFACE_COMPRESSION_FIXED_RATE_5BPC_EXT 0x34B8 | |
EGL_SURFACE_COMPRESSION_FIXED_RATE_6BPC_EXT 0x34B9 | |
EGL_SURFACE_COMPRESSION_FIXED_RATE_7BPC_EXT 0x34BA | |
EGL_SURFACE_COMPRESSION_FIXED_RATE_8BPC_EXT 0x34BB | |
EGL_SURFACE_COMPRESSION_FIXED_RATE_9BPC_EXT 0x34BC | |
EGL_SURFACE_COMPRESSION_FIXED_RATE_10BPC_EXT 0x34BD | |
EGL_SURFACE_COMPRESSION_FIXED_RATE_11BPC_EXT 0x34BE | |
EGL_SURFACE_COMPRESSION_FIXED_RATE_12BPC_EXT 0x34BF | |
Modifications to the EGL 1.5 Specification | |
Modify section 3.5.1 "Creating On-Screen Rendering Surfaces: | |
Add EGL_SURFACE_COMPRESSION_EXT to the list of attributes that can | |
be specified in <attrib_list> for eglCreatePlatformWindowSurface. | |
Add the following paragraph: | |
EGL_SURFACE_COMPRESSION_EXT specifies the fixed-rate compression that may | |
be enabled for rendering to the window. | |
If its value is EGL_SURFACE_COMPRESSION_FIXED_RATE_NONE_EXT, then fixed-rate | |
compression is disabled. | |
If its value is EGL_SURFACE_COMPRESSION_FIXED_RATE_DEFAULT_EXT, | |
then the implementation may enable compression at a default, | |
implementation-defined, rate. | |
If its value is EGL_SURFACE_COMPRESSION_FIXED_RATE_1BPC_EXT, then the | |
implementation may enable fixed-rate compression with a bitrate of at | |
least 1 bit and less than 2 bits per component. | |
If its value is EGL_SURFACE_COMPRESSION_FIXED_RATE_2BPC_EXT, then the | |
implementation may enable fixed-rate compression with a bitrate of at | |
least 2 bits and less than 3 bits per component. | |
If its value is EGL_SURFACE_COMPRESSION_FIXED_RATE_3BPC_EXT, then the | |
implementation may enable fixed-rate compression with a bitrate of at | |
least 3 bits and less than 4 bits per component. | |
If its value is EGL_SURFACE_COMPRESSION_FIXED_RATE_4BPC_EXT, then the | |
implementation may enable fixed-rate compression with a bitrate of at | |
least 4 bits and less than 5 bits per component. | |
If its value is EGL_SURFACE_COMPRESSION_FIXED_RATE_5BPC_EXT, then the | |
implementation may enable fixed-rate compression with a bitrate of at | |
least 5 bits and less than 6 bits per component. | |
If its value is EGL_SURFACE_COMPRESSION_FIXED_RATE_6BPC_EXT, then the | |
implementation may enable fixed-rate compression with a bitrate of at | |
least 6 bits and less than 7 bits per component. | |
If its value is EGL_SURFACE_COMPRESSION_FIXED_RATE_7BPC_EXT, then the | |
implementation may enable fixed-rate compression with a bitrate of at | |
least 7 bits and less than 8 bits per component. | |
If its value is EGL_SURFACE_COMPRESSION_FIXED_RATE_8BPC_EXT, then the | |
implementation may enable fixed-rate compression with a bitrate of at | |
least 8 bits and less than 9 bits per component. | |
If its value is EGL_SURFACE_COMPRESSION_FIXED_RATE_9BPC_EXT, then the | |
implementation may enable fixed-rate compression with a bitrate of at | |
least 9 bits and less than 10 bits per component. | |
If its value is EGL_SURFACE_COMPRESSION_FIXED_RATE_10BPC_EXT, then the | |
implementation may enable fixed-rate compression with a bitrate of at | |
least 10 bits and less than 11 bits per component. | |
If its value is EGL_SURFACE_COMPRESSION_FIXED_RATE_11BPC_EXT, then the | |
implementation may enable fixed-rate compression with a bitrate of at | |
least 11 bits and less than 12 bits per component. | |
If its value is EGL_SURFACE_COMPRESSION_FIXED_RATE_12BPC_EXT, then the | |
implementation may enable fixed-rate compression with a bitrate of at | |
least 12 bits per component. | |
For pixel formats with different number of bits per component, the | |
specified fixed-rate compression rate applies to the component with | |
the highest number of bits. | |
The default value of EGL_SURFACE_COMPRESSION_EXT is | |
EGL_SURFACE_COMPRESSION_FIXED_RATE_NONE_EXT. | |
[Only if EGL_EXT_yuv_surface is supported] | |
If _config_ describes a surface with multiple planes (the | |
value of the EGL_YUV_NUMBER_OF_PLANES_EXT attribute is larger than one), | |
then the fixed-rate compression rate can be specified independently for | |
the each plane. | |
In this case, EGL_SURFACE_COMPRESSION_EXT specifies the fixed-rate | |
compression that may be enabled for rendering to plane 0, | |
EGL_SURFACE_COMPRESSION_PLANE1_EXT specifies the fixed-rate | |
compression that may be enabled for rendering to plane 1, and | |
EGL_SURFACE_COMPRESSION_PLANE2_EXT specifies the fixed-rate compression | |
that may be enabled for rendering to plane 2. | |
The supported values of EGL_SURFACE_COMPRESSION_PLANE1_EXT and | |
EGL_SURFACE_COMPRESSION_PLANE2_EXT are the same as for | |
EGL_SURFACE_COMPRESSION_EXT. | |
If _config_ has more than one plane and the | |
EGL_SURFACE_COMPRESSION_PLANE1_EXT attribute is not specified, | |
then the value of EGL_SURFACE_COMPRESSION_EXT is used for all planes. | |
If _config_ has more than two planes and the | |
EGL_SURFACE_COMPRESSION_PLANE2_EXT attribute is not specified, | |
then the value of EGL_SURFACE_COMPRESSION_PLANE1_EXT is also used | |
for plane 2. | |
The default value of EGL_SURFACE_COMPRESSION_PLANE1_EXT and | |
EGL_SURFACE_COMPRESSION_PLANE2_EXT is EGL_SURFACE_COMPRESSION_FIXED_RATE_NONE_EXT. | |
Modify section 3.5.6 "Surface Attributes" | |
Add entries to Table 3.5 "Queryable surface attributes and types": | |
EGL_SURFACE_COMPRESSION_EXT enum Fixed-rate compression | |
[Only if EGL_EXT_yuv_surface is supported] | |
EGL_SURFACE_COMPRESSION_PLANE1_EXT enum Fixed-rate compression for plane 1 | |
EGL_SURFACE_COMPRESSION_PLANE2_EXT enum Fixed-rate compression for plane 2 | |
Add the following paragraph: | |
Querying EGL_SURFACE_COMPRESSION_EXT returns the actual fixed-rate | |
compression applied to a surface. For YUV surfaces, the value applied to | |
the luma plane is returned. This value may be different to the one | |
requested when the surface was created. | |
For pbuffer and pixmap surfaces, the contents of <value> are not modified." | |
[Only if EGL_EXT_yuv_surface is supported] | |
Querying EGL_SURFACE_COMPRESSION_PLANE1_EXT returns the actual | |
fixed-rate compression applied to plane 1 of a YUV surface. | |
Querying EGL_SURFACE_COMPRESSION_PLANE2_EXT returns the actual | |
fixed-rate compression applied to plane 2 of a YUV surface. | |
These values may be different to the one requested when the surface was created. | |
For pbuffer and pixmap surfaces, the contents of <value> are not modified." | |
To get the list of all fixed-rate compression rates that are available on | |
a specified display and EGLConfig, call | |
EGLBoolean eglQuerySupportedCompressionRatesEXT( | |
EGLDisplay dpy, EGLConfig config, const EGLAttrib *attrib_list, | |
EGLint *rates, EGLint rate_size, EGLint *num_rates); | |
<attrib_list> specifies a list of attributes that will be provided when a surface is created with | |
this combination of display and EGLConfig. The accepted attributes are the same as for | |
eglCreatePlatformWindowSurface. | |
<rates> is a pointer to a buffer containing <rate_size> elements. On success, EGL_TRUE is | |
returned. The number of rates is returned in <num_rates>, and elements 0 through <num_rates>-1 of | |
<rates> are filled in with the available compression rates. | |
No more than <rate_size> compression rates will be returned even if more are available | |
on the specified display and config. However, if eglQuerySupportedCompressionRatesEXT is called with | |
<rates> = NULL, then no rates are returned, but the total number of rates available will be returned | |
in <num_rates>. | |
The possible values returned in <rates> are the attribute values accepted for | |
EGL_SURFACE_COMPRESSION_EXT by eglCreatePlatformWindowSurface and eglCreateWindowSurface, except | |
EGL_SURFACE_COMPRESSION_FIXED_RATE_NONE_EXT and EGL_SURFACE_COMPRESSION_FIXED_RATE_DEFAULT_EXT. | |
Errors | |
[Only if EGL_EXT_yuv_surface is supported] | |
Add to the error section of eglCreatePlatformWindowSurface: | |
If the EGL_SURFACE_COMPRESSION_PLANE1_EXT attribute is specified and | |
_config_ does not describe a surface with at least 2 planes (the | |
EGL_YUV_NUMBER_OF_PLANES_EXT attribute is not greater than or | |
equal to 2), an EGL_BAD_MATCH error is generated. | |
If the EGL_SURFACE_COMPRESSION_PLANE2_EXT attribute is specified and | |
_config_ does not describe a surface with at least 3 planes (the | |
EGL_YUV_NUMBER_OF_PLANES_EXT attribute is not greater than or | |
equal to 3), an EGL_BAD_MATCH error is generated. | |
Add to the section describing eglQuerySupportedCompressionRatesEXT: | |
* On failure, EGL_FALSE is returned. | |
* An EGL_NOT_INITIALIZED error is generated if EGL is not initialized on <dpy>. | |
* An EGL_BAD_PARAMETER error is generated if <num_rates> is NULL. | |
Issues | |
1. Should fixed-rate compression be supported for pixmap or pbuffer | |
surfaces? | |
No, no use-cases have been identified for this. | |
2. What is the result of querying EGL_SURFACE_COMPRESSION_EXT if | |
EGL_SURFACE_COMPRESSION_FIXED_RATE_DEFAULT_EXT was requested? | |
Resolved. | |
The result will be the specific compression ratio chosen by the | |
implementation, or EGL_SURFACE_COMPRESSION_FIXED_RATE_NONE_EXT if | |
no fixed-rate compression was applied. | |
3. Should we expose different compressions rates per plane in this extension? | |
Yes. | |
4. How can an application query the set of supported compression rates? | |
Resolved. Option B. | |
Two options were considered. | |
Option A: | |
Reuse eglGetConfigAttrib(EGLDisplay dpy, EGLConfig config, EGLint attribute, EGLint *value); | |
This is not ideal because: | |
- the compression modes are currently tied to the surface, not the EGLConfig | |
- we don't want this to affect EGLConfig selection etc. | |
- this query can only return a single value, so you'd need to query each of the | |
12 bit rates separately. | |
Option B: | |
Add a new query, specifically for the compression rates. This addresses the concerns | |
with Option A, and is very similar to the mechanism used for the OpenGL ES API. Main | |
downside is that it adds additional functions to the API. | |
Revision History | |
Version 1, 2021/11/15 | |
- Internal revisions |