| Name |
| |
| NV_stream_consumer_gltexture_yuv |
| |
| Name Strings |
| |
| EGL_NV_stream_consumer_gltexture_yuv |
| |
| Contributors |
| |
| James Jones |
| Daniel Kartch |
| Nikhil Mahale |
| Daniel Koch |
| Jeff Gilbert |
| |
| Contacts |
| |
| James Jones, NVIDIA (jajones 'at' nvidia 'dot' com) |
| |
| Status |
| |
| Complete |
| |
| Version |
| |
| Version 4 - November 14, 2017 |
| |
| Number |
| |
| EGL Extension #94 |
| |
| Extension Type |
| |
| EGL display extension |
| |
| Dependencies |
| |
| Requires EGL_KHR_stream_consumer_gltexture |
| References EGL_EXT_yuv_surface |
| |
| Interactions with EGL_EXT_yuv_surface |
| |
| This extension makes use of several tokens defined in the |
| EGL_EXT_yuv_surface extension spec. However support for this |
| EGLStream extension does not require the EGLSurface extension, or |
| vice versa. Only the tokens are shared. |
| |
| Overview |
| |
| The EGL_KHR_stream_consumer_gltexture extension allows EGLStream |
| frames to be latched to a GL texture for use in rendering. These |
| frames are assumed to be stored in RGB format and accessed as such |
| by shader programs. If the producer uses a different color space, |
| the stream implementation must perform an implicit conversion. |
| |
| In cases where the producer operates in a native YUV color space, it |
| may be desirable for shaders to directly access the YUV components, |
| without conversion. This extension adds a new variant of the |
| function to bind GL textures as stream consumers which allows |
| attributes to specify the color space. |
| |
| New Types |
| |
| None |
| |
| New Functions |
| |
| EGLBoolean eglStreamConsumerGLTextureExternalAttribsNV( |
| EGLDisplay dpy, |
| EGLStreamKHR stream, |
| const EGLAttrib *attrib_list) |
| |
| New Tokens |
| |
| Accepted as attribute name in <attrib_list> by |
| eglStreamConsumerGLTextureExternalAttribsNV: |
| |
| EGL_YUV_PLANE0_TEXTURE_UNIT_NV 0x332C |
| EGL_YUV_PLANE1_TEXTURE_UNIT_NV 0x332D |
| EGL_YUV_PLANE2_TEXTURE_UNIT_NV 0x332E |
| |
| Reused Tokens From EGL_EXT_yuv_surface |
| |
| Accepted as attribute name in <attrib_list> by |
| eglStreamConsumerGLTextureExternalAttribsNV: |
| |
| EGL_YUV_NUMBER_OF_PLANES_EXT 0x3311 |
| |
| Accepted as value for EGL_COLOR_BUFFER_TYPE attribute in |
| <attrib_list> by eglStreamConsumerGLTextureExternalAttribsNV: |
| |
| EGL_YUV_BUFFER_EXT 0x3300 |
| |
| Replace entire description of eglStreamConsumerGLTextureExternalKHR in |
| section "3.10.2.1 GL Texture External consumer" of |
| EGL_KHR_stream_consumer_gltexture extension. |
| |
| Call |
| |
| EGLBoolean eglStreamConsumerGLTextureExternalAttribsNV( |
| EGLDisplay dpy, |
| EGLStreamKHR stream, |
| const EGLAttrib *attrib_list) |
| |
| to connect one or more texture objects in the OpenGL or OpenGL ES |
| context current to the calling thread as the consumer(s) of |
| <stream>. The identity and format of the texture objects used are |
| determined by <attrib_list> and the current context state. |
| |
| <attrib_list> must either be NULL or point to an array of name/value |
| pairs terminated by EGL_NONE. Valid attribute names are |
| EGL_COLOR_BUFFER_TYPE, EGL_YUV_NUMBER_OF_PLANES_EXT, and |
| EGL_YUV_PLANE<n>_TEXTURE_UNIT_NV. |
| |
| If the value of EGL_COLOR_BUFFER_TYPE is EGL_RGB_BUFFER (the |
| default), then the stream will be connected to a single texture |
| whose contents are available to shaders as RGB values. If the value |
| of EGL_COLOR_BUFFER_TYPE is EGL_YUV_BUFFER_EXT the stream will be |
| connected to some number of planar textures, determined by the value |
| of EGL_YUV_NUMBER_OF_PLANES_EXT, whose contents are available to |
| shaders as YUV values. The mapping between YUV values and texture |
| contents is described in table 3.10.2.1. |
| |
| If EGL_COLOR_BUFFER_TYPE is EGL_YUV_BUFFER_EXT, the default value of |
| EGL_YUV_NUMBER_OF_PLANES_EXT is 2. Otherwise it is 0. |
| |
| PLANE0 PLANE1 PLANE2 |
| # Planes Values Fields Values Fields Values Fields |
| -------------------------------------------------------------- |
| 1 YUV XYZ unused unused |
| 2 Y X UV XY unused |
| 3 Y X U X V X |
| |
| Table 3.10.2.1 YUV Planar Texture Mappings |
| |
| If EGL_COLOR_BUFFER_TYPE is EGL_RGB_BUFFER, the stream is connected |
| to the texture object currently bound to the active texture unit's |
| GL_TEXTURE_EXTERNAL_OES texture target in the current context. |
| |
| If EGL_COLOR_BUFFER_TYPE is EGL_YUV_BUFFER_EXT, attribute values |
| must be specified for EGL_YUV_PLANE<n>_TEXTURE_UNIT_NV for all <n> |
| less than the number of planes. The value of each attribute must |
| either be a valid texture unit index or EGL_NONE. No two of these |
| attributes may specify the same valid texture unit index or |
| reference separate texture units bound to the same texture object. |
| Plane <n> of the stream contents will be connected to the texture |
| object currently bound to the indexed texture unit's |
| GL_TEXTURE_EXTERNAL_OES texture target in the current context, or |
| will be left unused if the index is EGL_NONE. |
| |
| Once connected, the stream will remain associated with the initial |
| texture object(s) even if the texture units are bound to new |
| textures. |
| |
| (Note: Before this can succeed a GL_TEXTURE_EXTERNAL_OES texture |
| must be bound to the appropriate texture units of the GL context |
| current to the calling thread. To create a GL_TEXTURE_EXTERNAL_OES |
| texture and bind it to the current context, call glBindTexture() |
| with <target> set to GL_TEXTURE_EXTERNAL_OES and <texture> set to |
| the name of the GL_TEXTURE_EXTERNAL_OES (which may or may not have |
| previously been created). This is described in the |
| GL_NV_EGL_stream_consumer_external extension.) |
| |
| On failure EGL_FALSE is returned and an error is generated. |
| |
| - EGL_BAD_DISPLAY is generated if <dpy> is not a valid, |
| EGLDisplay. |
| |
| - EGL_BAD_STREAM_KHR is generated if <stream> is not a valid |
| EGLStreamKHR created for <dpy>. |
| |
| - EGL_BAD_STATE_KHR is generated if <stream> is not in state |
| EGL_STREAM_STATE_CREATED_KHR. |
| |
| - EGL_BAD_ATTRIBUTE is generated if any attribute name in |
| <attrib_list> is not a valid attribute. |
| |
| - EGL_BAD_PARAMETER is generated if the value of |
| EGL_COLOR_BUFFER_TYPE is not EGL_RGB_BUFFER or |
| EGL_YUV_BUFFER_EXT. |
| |
| - EGL_BAD_MATCH is generated if EGL_COLOR_BUFFER_TYPE is |
| EGL_RGB_BUFFER and EGL_YUV_NUMBER_OF_PLANES_EXT is not 0, or |
| if EGL_COLOR_BUFFER_TYPE is EGL_YUV_BUFFER_EXT and |
| EGL_YUV_NUMBER_OF_PLANES_EXT is not 1, 2, or 3. |
| |
| - EGL_BAD_MATCH is generated if any |
| EGL_YUV_PLANE<n>_TEXTURE_UNIT_NV is not specified for any <n> |
| less than EGL_YUV_NUMBER_OF_PLANES_EXT, or if it is specified |
| for any <n> greater than or equal to |
| EGL_YUV_NUMBER_OF_PLANES_EXT. |
| |
| - EGL_BAD_ACCESS is generated if any |
| EGL_YUV_PLANE<n>_TEXTURE_UNIT_NV is set to anything other than |
| a valid texture unit index or EGL_NONE. |
| |
| - EGL_BAD_ACCESS is generated if there is no GL context |
| current to the calling thread. |
| |
| - EGL_BAD_ACCESS is generated unless nonzero texture object |
| names are bound the GL_TEXTURE_EXTERNAL_OES texture target |
| of each of the appropriate texture units of the GL context |
| current to the calling thread. |
| |
| - EGL_BAD_ACCESS is generated if more than one planar surface |
| would be bound to the same texture object. |
| |
| - EGL_BAD_ACCESS is generated if the implementation cannot |
| support the requested planar arrangement. |
| |
| On success the texture(s) are connected to the <stream>, <stream> |
| is placed in the EGL_STREAM_STATE_CONNECTING_KHR state, and EGL_TRUE |
| is returned. |
| |
| When a producer is later connected, if it cannot support the planar |
| arrangement of the GL texture connection, it will fail with an |
| EGL_BAD_ACCESS error. |
| |
| If any texture is later deleted, connected to a different |
| EGLStream, or connected to an EGLImage, then <stream> will be |
| placed into the EGL_STREAM_STATE_DISCONNECTED_KHR state. |
| |
| If the <stream> is later destroyed then the textures will be |
| "incomplete" until they are connected to a new EGLStream, connected |
| to a new EGLImage, or deleted. |
| |
| The function |
| |
| EGLBoolean eglStreamConsumerGLTextureExternalKHR( |
| EGLDisplay dpy, |
| EGLStreamKHR stream) |
| |
| is equivalent to eglStreamConsumerGLTextureExternalAttribsNV with |
| <attrib_list> list set to NULL. |
| |
| In the remainder of section "3.10.2.1 GL Texture External consumer", |
| replace all singular references to "texture" with "textures" and make |
| appropriate grammatical modifications. |
| |
| Issues |
| |
| 1. This competes with GL_EXT_yuv_target as a means for specifying |
| how YUV values can be directly accessed by a texture shader |
| without conversion to RGB. However, that extension also requires |
| a means to render to YUV surfaces in addition to using them as |
| textures. Should we go with the approach used here or create a |
| GL extension which defines a subset GL_EXT_yuv_target? |
| |
| RESOLVED: The extension as is serves immediate needs. Conflicts |
| and overlap with other extensions will be addressed if and when |
| there is a need to promote to EXT. |
| |
| 2. This also contradicts how previous extensions for EXTERNAL GL |
| textures bind multiplanar surfaces, using separate texture |
| objects rather than a single virtual texture object which |
| requires multiple texture units. This allows the application |
| greater control of the planar arrangement, and the ability to |
| leave planes unbound, which may reduce overhead for the |
| producer. But it makes applications less portabile if the |
| desired arrangement isn't supported. |
| |
| RESOLVED: The extension as is serves immediate needs. Conflicts |
| and overlap with other extensions will be addressed if and when |
| there is a need to promote to EXT. |
| |
| Revision History |
| |
| #4 (November 14, 2017) Mozilla Corporation |
| - Const-qualify attrib_list. |
| |
| #3 (August 19, 2015) NVIDIA Corporation |
| - Added enum values. |
| - Cleaned up and added contact info for publication. |
| |
| #2 (May 6, 2015) NVIDIA Corporation |
| - Consolidated error codes to make GL interaction simpler. |
| |
| #1 (April 15, 2015) NVIDIA Corporation |
| - Initial draft |