| 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 |