| Name |
| |
| QCOM_texture_foveated_subsampled_layout |
| |
| Name Strings |
| |
| GL_QCOM_texture_foveated_subsampled_layout |
| |
| Contributors |
| |
| Tate Hornbeck |
| Jonathan Wicks |
| Robert VanReenen |
| Jeff Leger |
| |
| Contact |
| |
| Jeff Leger - jleger 'at' qti.qualcomm.com |
| |
| Status |
| |
| Complete |
| |
| Version |
| |
| Last Modified Date: |
| Revision: #3 |
| |
| Number |
| |
| OpenGL ES Extension #306 |
| |
| Dependencies |
| |
| OpenGL ES 2.0 is required. This extension is written against OpenGL ES 3.2. |
| |
| QCOM_texture_foveated is required. |
| |
| This extension interacts with OES_EGL_image_external and |
| OES_EGL_image_external_essl3. |
| |
| Overview |
| |
| This extension builds on QCOM_texture_foveated by introducing a new foveation |
| method bit that aims to reduce memory bandwidth by avoiding the upscaling that |
| occurred as part of the original extension. |
| |
| With the original FOVEATION_SCALED_BIN_METHOD_BIT_QCOM foveation method, |
| the render target in system memory is entirely populated. The lower |
| resolution framebuffer data is upscaled to fill the entire render target. |
| The subsampled layout method introduced in this extension leaves the |
| framebuffer data at the calculated lower density and instead samples |
| directly from the the lower resolution texels. |
| |
| The primary usecase this is targeting is traditional VR pipeline. The |
| application eye buffers would be rendered as textures with a subsampled layout |
| and then sampled by the warp process. Sampling from a texture with a |
| subsampled layout requires a new sampler layout qualifier. |
| |
| New Tokens |
| |
| Accepted as a value to <param> for the TexParameter{if} and |
| to <params> for the TexParameter{if}v commands with a <pname> of |
| TEXTURE_FOVEATED_FEATURE_BITS_QCOM returned as possible values for |
| <params> when GetTexParameter{if}v is queried with a <pname> of |
| TEXTURE_FOVEATED_FEATURE_BITS_QCOM: |
| |
| FOVEATION_SUBSAMPLED_LAYOUT_METHOD_BIT_QCOM 0x4 |
| |
| Accepted by the <value> parameter of GetBooleanv, GetIntegerv, |
| GetInteger64v, and GetFloatv: |
| |
| MAX_SHADER_SUBSAMPLED_IMAGE_UNITS_QCOM 0x8FA1 |
| |
| Additions to the OpenGL ES 3.2 Specification |
| |
| Modify section 8.1 "Texture Objects" |
| |
| Modify rows in Table 8.19 "Texture parameters and their values" |
| |
| Name | Type | Legal Values |
| ------------------------------------------------------------ |
| TEXTURE_FOVEATED_FEATURE_BITS_QCOM | uint | 0, |
| FOVEATION_ENABLE_BIT_QCOM, |
| (FOVEATION_ENABLE_BIT_QCOM | |
| FOVEATION_SCALED_BIN_METHOD_BIT_QCOM), |
| (FOVEATION_ENABLE_BIT_QCOM | |
| FOVEATION_SUBSAMPLED_LAYOUT_METHOD_BIT_QCOM) |
| |
| TEXTURE_FOVEATED_FEATURE_QUERY_QCOM | uint | 0, |
| FOVEATION_ENABLE_BIT_QCOM, |
| (FOVEATION_ENABLE_BIT_QCOM | |
| FOVEATION_SCALED_BIN_METHOD_BIT_QCOM), |
| (FOVEATION_ENABLE_BIT_QCOM | |
| FOVEATION_SUBSAMPLED_LAYOUT_METHOD_BIT_QCOM) |
| |
| |
| Additions to the end of section 8.19 of the OpenGL ES 3.2 Specification |
| after the description of FOVEATION_SCALED_BIN_METHOD_QCOM: |
| |
| FOVEATION_SUBSAMPLED_LAYOUT_METHOD_BIT_QCOM: Requests that the |
| implementation perform foveated rendering by dividing the texture render target |
| into a grid of subregions. Each subregions will be greater than or equal to one |
| pixel and less than or equal to the full size of the texture. Then rendering |
| the geometry to each of these regions with a different projection or scale. |
| No upscale is done when writing out to system memory, instead, to sample |
| from a texture with a subsampled layout, the application must declare the sampler |
| with a "subsampled" layout qualifier. Any attempt to read/write |
| this subsampled memory with the CPU will result in a reconstruction pass. |
| |
| glGetTexParameteriv(GL_TEXTURE_2D, |
| GL_TEXTURE_FOVEATED_FEATURE_QUERY_QCOM, |
| &query); |
| |
| if ((query & GL_FOVEATION_ENABLE_BIT_QCOM == GL_FOVEATION_ENABLE_BIT_QCOM) && |
| (query & GL_FOVEATION_SUBSAMPLED_LAYOUT_METHOD_BIT_QCOM == |
| GL_FOVEATION_SUBSAMPLED_LAYOUT_METHOD_BIT_QCOM)) |
| { |
| // Implementation supports subsampled layout scaled bin method of foveation |
| } |
| |
| glTexParameteri(GL_TEXTURE_2D, |
| GL_TEXTURE_FOVEATED_FEATURE_BITS_QCOM, |
| GL_FOVEATION_ENABLE_BIT_QCOM | |
| GL_FOVEATION_SUBSAMPLED_LAYOUT_METHOD_BIT_QCOM); |
| |
| This will set a texture as having a subsampled layout once it has been rendered to. |
| |
| If any shader attempts to use more than MAX_SHADER_SUBSAMPLED_IMAGE_UNITS_QCOM a compile time |
| error will occur. |
| |
| Add a new row in Table 21.52 "Implementation Dependent Aggregate Shader Limits" |
| |
| Get Value Type Get Command Minimum Value Description Sec |
| --------- ---- ----------- ------------- ----------- ------ |
| MAX_SHADER_SUBSAMPLED_IMAGE_UNITS_QCOM Z+ GetIntegerv 1 No. of subsampled texture 8.19 |
| images allowed in any |
| shader stage. |
| |
| Errors |
| |
| INVALID_ENUM is generated by TexParameter{if} or TexParameter{if}v |
| if <pname> is TEXTURE_FOVEATED_FEATURE_BITS_QCOM and <param> has |
| both FOVEATION_SCALED_BIN_METHOD_BIT_QCOM and |
| FOVEATION_SUBSAMPLED_LAYOUT_METHOD_BIT_QCOM set. |
| |
| INVALID_VALUE is generated by TexParameter{if} or TexParameter{if}v |
| if <pname> is TEXTURE_MAX_ANISOTROPY_EXT and <param> is a value |
| > 1.0f and the texture at <target> target has a subsampled layout. |
| |
| INVALID_OPERATION is generated by TexParameter{if} or TexParameter{if}v |
| if <pname> is TEXTURE_WRAP_S, TEXTURE_WRAP_T, or TEXTURE_WRAP_R and |
| <param> is not CLAMP_TO_EDGE or CLAMP_TO_BORDER and the texture at |
| <target> target has a subsampled layout. |
| |
| INVALID_OPERATION is generated by GenerateMipmap if the texture at |
| <target> target has a subsampled layout. |
| |
| Modifications to the OpenGL ES Shading Language Specification, Version 1.0.17 |
| |
| #extension GL_QCOM_texture_foveated_subsampled_layout: <behavior> |
| |
| The above line is needed to control the GLSL features described in |
| this section. |
| |
| A new preprocessor #define is added to the OpenGL ES Shading Language: |
| |
| #define GL_QCOM_texture_foveated_subsampled_layout 1 |
| |
| [[ The following applies if GL_QCOM_texture_foveated_subsampled_layout is supported. ]] |
| |
| Add a new Section 4.x (Layout Qualifiers) as follows: |
| |
| 4.x Layout Qualifiers |
| |
| Layout qualifiers can appear with an individual variable declaration: |
| |
| <layout-qualifier> <declaration>; |
| |
| <layout-qualifier>: |
| layout( <layout-qualifier-id-list> ) |
| |
| <layout-qualifier-id-list>: |
| comma separated list of <layout-qualifier-id> |
| |
| Declarations of layouts can only be made at global scope, and only where |
| indicated in the following subsection; their details are specific to what |
| the declaration interface is, and are discussed individually. |
| |
| The tokens in any <layout-qualifier-id-list> are identifiers, not |
| keywords. Generally they can be listed in any order. Order-dependent |
| meanings exist only if explicitly called out below. Similarly, these |
| identifiers are not case-sensitive, unless explicitly noted otherwise. |
| |
| 4.x.1 Sampler Layout Qualifiers |
| |
| Shaders may specify the following layout qualifier only for samplers of type: |
| |
| sampler2D |
| |
| if OES_EGL_image_external is supported: |
| |
| samplerExternalOES |
| |
| The allowed layout qualifier identifiers for these samplers are: |
| |
| <layout-qualifier-id>: |
| subsampled |
| |
| Specifying subsampled layout qualifier for any other sampler types will result |
| in a compile time error. Additionally, dynamically indexing an array of subsampled |
| samplers will result in a compile time error. |
| |
| For samplers specified with subsampled layout qualifier only texture2D() |
| lookup function may be used. Any other texel lookup function will produce |
| a compile time error. |
| |
| This identifier specifies that the sampler is reading from a texture with a |
| subsampled layout. Attempting to sample a texture previously rendered with |
| FOVEATION_SUBSAMPLED_LAYOUT_METHOD_BIT_QCOM without this layout |
| qualifier will result in undefined behaviour. Declarations are done as follows: |
| |
| layout(subsampled) mediump uniform sampler2D u_sampler2D; |
| |
| Modifications to the OpenGL ES Shading Language Specification, Version 3.10 |
| |
| #extension GL_QCOM_texture_foveated_subsampled_layout: <behavior> |
| |
| The above line is needed to control the GLSL features described in |
| this section. |
| |
| A new preprocessor #define is added to the OpenGL ES Shading Language: |
| |
| #define GL_QCOM_texture_foveated_subsampled_layout 1 |
| |
| Modify section 8.9 "Texture Functions" |
| |
| Add paragraph at end: |
| |
| For samplers specified with subsampled layout qualifier only texture() |
| lookup function may be used. Any other texel lookup function will produce |
| a compile time error. |
| |
| Add a new section 4.4.8 "Sampler Layout Qualifiers" |
| |
| Shaders may specify the following layout qualifier only for samplers of type: |
| |
| sampler2D |
| sampler2DArray |
| isampler2D |
| isampler2DArray |
| usampler2D |
| usampler2DArray |
| |
| if OES_EGL_image_external_essl3 is supported: |
| |
| samplerExternalOES |
| |
| The allowed layout qualifier identifiers for these samplers are: |
| |
| <layout-qualifier-id>: |
| subsampled |
| |
| Specifying subsampled layout qualifier for any other sampler types will result |
| in a compile time error. Additionally, dynamically indexing an array of subsampled |
| samplers will result in a compile time error. |
| |
| This identifier specifies that the sampler is reading from a texture with a |
| subsampled layout. Attempting to sample a texture previously rendered with |
| FOVEATION_SUBSAMPLED_LAYOUT_METHOD_BIT_QCOM without this layout |
| qualifier will result in undefined behaviour. Declarations are done as follows: |
| |
| layout(subsampled) mediump uniform sampler2D u_sampler2D; |
| |
| Issues |
| |
| 1. Mipmap support |
| |
| RESOLVED: Mipmaps are not supported for textures that have a subsampled layout. |
| |
| 2. How does ReadPixels / CPU access work? |
| |
| RESOLVED: A reconstruction pass will occur to fill in the subsampled texture before |
| attempting to access. |
| |
| For the sake of completeness, CPU access is supported for textures with a subsampled |
| layout. The implementation guarantees that no uninitialized data in the texture |
| will be returned to the CPU. Accessing a texture with a subsampled layout in this |
| manner removes any bandwidth benefits from this method of foveated rendering and |
| should be avoided when possible. |
| |
| 3. How does this extension interact with BlitFramebuffer? |
| |
| RESOLVED: Similar to ReadPixels, BlitFramebuffer will trigger a reconstruction |
| pass that will be followed by the normal BlitFramebuffer. |
| |
| 4. TexImage2D/TexSubImage2D/CopyTexImage2D |
| |
| RESOLVED: Similar to ReadPixels, TexImage2D type calls will trigger a reconstruction |
| pass and then the data will be uploaded to texture memory. |
| |
| 5. Wrap Modes |
| |
| Resolved: Only CLAMP_TO_EDGE and CLAMP_TO_BORDER are allowed for textures that have |
| a subsampled layout |
| |
| 6. Aniso |
| |
| Resolved: Aniso > 1.0f is not supported for textures that have a subsampled layout. |
| |
| 7. Dynamically indexing subsampled sampler arrays |
| |
| Resolved: Do not allow dynamically indexed subsampled sampler arrays. This is to |
| ease the GLSL->SPIRV translation that glslang will perform. |
| |
| Revision History |
| |
| Rev. Date Author Changes |
| ---- -------- -------- ---------------------------------------------- |
| 1 08/22/17 tateh Initial spec |
| 2 07/27/18 tateh Update to layout qualifiers and update |
| wrap mode limitations |
| 3 08/24/18 tateh Added MAX_SHADER_SUBSAMPLED_IMAGE_UNITS_QCOM query |
| and dynamically indexed issue |