| Name |
| |
| OES_EGL_image |
| |
| Name Strings |
| |
| GL_OES_EGL_image |
| |
| Contributors |
| |
| Gary King |
| Acorn Pooley |
| Jon Leech |
| |
| Contacts |
| |
| Gary King, NVIDIA Corporation (gking 'at' nvidia.com) |
| |
| Notice |
| |
| Copyright (c) 2006-2014 The Khronos Group Inc. Copyright terms at |
| http://www.khronos.org/registry/speccopyright.html |
| |
| Specification Update Policy |
| |
| Khronos-approved extension specifications are updated in response to |
| issues and bugs prioritized by the Khronos OpenGL ES Working Group. For |
| extensions which have been promoted to a core Specification, fixes will |
| first appear in the latest version of that core Specification, and will |
| eventually be backported to the extension document. This policy is |
| described in more detail at |
| https://www.khronos.org/registry/OpenGL/docs/update_policy.php |
| |
| Status |
| |
| Approved by the Khronos OpenKODE Working Group in January, 2007 |
| as part of OpenKODE 1.0 Provisional. |
| |
| Version |
| |
| April 23, 2015 (version 8) |
| |
| Number |
| |
| OpenGL ES Extension #23 |
| |
| Dependencies |
| |
| Requires OpenGL-ES 1.1 or OpenGL-ES 2.0. |
| |
| Requires EGL 1.2 and either the EGL_OES_image or EGL_OES_image_base |
| extensions. |
| |
| The EGL_KHR_gl_texture_2D_image, EGL_KHR_gl_texture_cubemap_image, |
| EGL_KHR_gl_texture_3D_image, EGL_KHR_gl_renderbuffer_image, and |
| EGL_KHR_vg_parent_image extensions provide additional functionality |
| layered on EGL_OES_image_base and related to this extension |
| |
| OES_framebuffer_object affects the wording of this specification |
| |
| This extension is written based on the wording of the OpenGL 2.0 |
| Specification and the EXT_framebuffer_object extension. |
| |
| Overview |
| |
| This extension provides a mechanism for creating texture and |
| renderbuffer objects sharing storage with specified EGLImage objects |
| (such objects are referred to as "EGLImage targets"). |
| |
| The companion EGL_KHR_image_base and EGL_KHR_image extensions |
| provide the definition and rationale for EGLImage objects. |
| |
| Other EGL extensions, such as EGL_KHR_gl_texture_2D_image, |
| EGL_KHR_gl_texture_cubemap_image, EGL_KHR_gl_texture_3D_image, |
| EGL_KHR_gl_renderbuffer_image, and EGL_KHR_vg_parent_image, define |
| the related functionality of creating EGLImage objects from |
| "EGLImage sources" such as OpenGL ES texture or renderbuffers or |
| OpenVG VGImage objects. |
| |
| EGL extension specifications are located in the EGL Registry at |
| |
| http://www.khronos.org/registry/egl/ |
| |
| Glossary |
| |
| Please see the EGL_KHR_image specification for a list of terms |
| used by this specification. |
| |
| New Types |
| |
| /* |
| * GLeglImageOES is an opaque handle to an EGLImage |
| */ |
| typedef void* GLeglImageOES; |
| |
| |
| New Procedures and Functions |
| |
| void EGLImageTargetTexture2DOES(enum target, eglImageOES image) |
| |
| void EGLImageTargetRenderbufferStorageOES(enum target, |
| eglImageOES image) |
| |
| New Tokens |
| |
| None. |
| |
| Additions to Chapter 3 of the OpenGL 2.0 Specification (Rasterization) |
| |
| - (3.8.2, p. 160) Insert the following text after the end of the |
| first paragraph (before the discussion of {Copy}TexSubImage): |
| |
| "Another way of specifying two-dimensional texture images is to |
| reference them from existing EGLImage objects. Images specified |
| this way will be EGLImage siblings with the original EGLImage |
| source and any other EGLImage targets. |
| |
| The command |
| |
| void EGLImageTargetTexture2DOES(enum target, eglImageOES image); |
| |
| defines an entire two-dimensional texture array. All properties |
| of the texture images (including width, height, format, border, mipmap |
| levels of detail, and image data) are taken from the specified |
| eglImageOES <image>, rather than from the client or the framebuffer. |
| Any existing image arrays associated with any mipmap levels in the texture |
| object are freed (as if TexImage was called for each, with an image of |
| zero size). As a result of this referencing operation, all of the pixel |
| data in the <buffer> used as the EGLImage source resource (i.e., the |
| <buffer> parameter passed to the CreateImageOES command that returned |
| <image>) will become undefined. |
| |
| Currently, <target> must be TEXTURE_2D. <image> must be the |
| handle of a valid EGLImage resource, cast into the type eglImageOES. |
| Assuming no errors are generated in EGLImageTargetTexture2DOES, the |
| newly specified texture object will be an EGLImage target of the |
| specified eglImageOES. If an application later respecifies any image |
| array in the texture object (through mechanisms such as calls to |
| TexImage2D and/or GenerateMipmapOES, or setting the |
| SGIS_GENERATE_MIPMAP parameter to TRUE), implementations should allocate |
| additional space for all specified (and respecified) image arrays, |
| and copy any existing image data to the newly (re)specified texture |
| object (as if TexImage was called for every level-of-detail in the |
| texture object). The respecified texture object will not be an |
| EGLImage target. |
| |
| If the GL is unable to specify a texture object using the supplied |
| eglImageOES <image> (if, for example, <image> refers to a multisampled |
| eglImageOES), the error INVALID_OPERATION is generated. |
| |
| If <image> does not refer to a valid eglImageOES object, the error |
| INVALID_VALUE is generated. |
| |
| If <target> is not TEXTURE_2D, the error INVALID_ENUM is generated. |
| |
| Additions to the EXT_framebuffer_object extension |
| |
| - (4.4.2.1) Add the following text at the end of section 4.4.2.1 |
| (Renderbuffer Objects) |
| |
| The command |
| |
| void EGLImageTargetRenderbufferStorageOES(enum target, |
| eglImageOES image) |
| |
| establishes the data storage, format, and dimensions of a |
| renderbuffer object's image, using the parameters and storage |
| associated with the eglImageOES <image>. Assuming no errors |
| are generated in this process, the resulting renderbuffer |
| will be an EGLImage target of the specifed eglImageOES <image>. |
| The renderbuffer will remain an EGLImage target until it is |
| deleted or respecified by a call to |
| {Reference}RenderbufferStorageOES. As a result of this referencing |
| operation, all of the pixel data in the <buffer> used as the |
| EGLImage source resource (i.e., the <buffer> parameter passed to |
| the CreateImageOES command that returned <image>) will become |
| undefined. |
| |
| <target> must be RENDERBUFFER_OES, and <image> must be the |
| handle of a valid EGLImage resource, cast into the type |
| eglImageOES. |
| |
| If the GL is unable to create a renderbuffer using the specified |
| eglImageOES, the error INVALID_OPERATION is generated. If <image> |
| does not refer to a valid eglImageOES object, the error |
| INVALID_VALUE is generated. |
| |
| Issues |
| |
| 1. What happens if an application tries to specify a new mipmap |
| level (or respecify an existing mipmap level) for a texture |
| object that was originally specified using |
| EGLImageTargetTexture2D (e.g., by subsequent calls to |
| {Copy}TexImage, GenerateMipmapOES, and/or setting the |
| texture's GENERATE_MIPMAP_SGIS parameter to TRUE) ? |
| |
| RESOLVED: If the application respecifies any properties of |
| an EGLImage target texture, the GL should allocate additional |
| memory for the respecified object, copying any data from |
| previously-specified levels (including those in the EGLImage |
| source). The respecified texture object will not be an |
| EGLImage target, potentially orphaning the EGLImage. |
| |
| 2. What happens if multiple texture or renderbuffer objects, which |
| are each EGLImage siblings, are attached to multiple attachment |
| points of a framebuffer object? |
| |
| RESOLVED: There are several possibilities for handling this |
| situation, listed below. The primary goal for any solution |
| should be minimizing the required run-time error checking & |
| validation, since determining that two objects refer to the same |
| parent resource is a complex operation. |
| |
| i. Generate an error if a context share group attempts to create |
| two EGLImage siblings (either source or target) . |
| |
| This limits error checking to just EGLImageTargetTexture / |
| EGLImageTargetRenderbufferStorage, which should be infrequent |
| calls, particularly during run-time. However, some potentially |
| valuable use cases are restricted with this approach, such |
| as referencing 2D texture objects from cube map EGLImage sources |
| in the same context share group. |
| |
| ii. Add a new clause to the framebuffer completeness test that |
| disallows multiple EGLImage siblings being attached to the |
| same framebuffer object. |
| |
| This would be in the spirit of the OES_framebuffer_object |
| extension and does not limit any valuable use cases; however, |
| it has the potential to significantly increase runtime |
| overhead, given the complexity of this completeness check |
| and the potential frequency that framebuffer completeness |
| may need to be checked. |
| |
| iii. Leave the rendering results undefined, but require that |
| behavior be limited to undefined rendering results (i.e., |
| the application and/or system may not crash as a result |
| of this operation). |
| |
| This solution allows implementations the opportunity to have |
| virtually no additional run-time validation overhead, nor |
| are any valuable use cases restricted. Implementations |
| may consider framebuffer objects which contain multiple |
| EGLImage siblings as incomplete framebuffers if necessary to |
| ensure application & system stability. |
| |
| SUGGESTION: Solution (iii). The only reasonable well-defined |
| behavior for this type of API usage is an error; however, given |
| the potential for the error check to noticeably increase validation |
| overhead, leaving this behavior undefined seems like the best |
| choice. |
| |
| 3. What about portability problems introduced by allowing implementation- |
| dependent failures? |
| |
| UNRESOLVED: This is the same issue described in Issue 14 of the |
| EGL_KHR_image_base specification. Like the resolution for that |
| issue, this specification should include some minimum |
| requirements, but leave the larger portability problem |
| unresolved at the moment. |
| |
| 4. Should EGLImageTargetTexture2DOES and |
| EGLImageTargetRenderBufferStorageOES result in undefined pixel data, |
| as with calls to eglCreateImageOES? |
| |
| UNRESOLVED: One of the problems with allowing the referencing |
| functions to result in undefined pixel data is that the EGLImage |
| source object may be part of a larger image structure (such as |
| an array of mipmap levels-of-detail, or cube map faces). While we |
| can specify that the pixel data in the EGLImage become undefined |
| quite easily, specifying that the pixel data in other images become |
| undefined is more difficult. So, with that discussion, the following |
| options were considered: |
| |
| i. Specify that the pixel data in the EGLImage, and other image |
| arrays associated with the EGLImage source, become undefined |
| as a result of referencing. |
| |
| ii. Specify that only the pixel data in the EGLImage becomes |
| undefined; any data in other image arrays associated with the |
| EGLImage source must not be affected by the referencing |
| operation. |
| |
| iii. Specify that the pixel data in the EGLImage is unaffected as |
| a result of the referencing operation. |
| |
| Option (i) gives the greatest flexibility (and potentially ease- |
| of implementation) to implementers, which should may result in |
| implementations exporting a larger number of compatible configurations |
| than the other, stricter options. Additionally, for well-behaved |
| applications (i.e., applications which perform all resource creation |
| and referencing prior to use), making the image data undefined will |
| not have any adverse side effects. |
| |
| Option (ii) provides option (i)'s benefits if the EGLImage source |
| is a trivial image (i.e., no additional mipmap levels-of-detail, |
| 3D texture slices, etc.); however, some implementations may be |
| required to implement potentially-expensive copy operations to support |
| complex EGLImage source images. |
| |
| Option (iii) is the strictest, and may significantly impede |
| implementers' ability to expose compatible configurations. |
| |
| Weighing the benefits (increased configuration compatibility and ease- |
| / performance- of implementation) versus the costs (specification |
| ugliness), the specification has currently selected option (i), |
| favoring compatibility and performance. |
| |
| |
| 5. What should the entry point for referencing 2D textures be named? |
| |
| UNRESOLVED: Unfortunately, OpenGL is not particularly consistent |
| with texture naming conventions. However, most texture function |
| names have followed the convention of using a verb- or adjective- |
| specifier followed by the object type, e.g. : CopyTexImage, |
| CompressedTexImage, DrawPixels, etc. |
| |
| Therefore, this issue can be broken into two sub-issues: naming |
| the verb or adjective and naming the object type. |
| |
| The following options were considered for the verb or adjective: |
| a1) Reference / Referenced |
| a2) EGLImageTarget |
| |
| Reference (a1) is the verb for creating EGLImage targets from |
| EGLImages (defined in the EGL_OES_image specification), but |
| "Reference<blah>" might confuse some developers, since the |
| direction of the verb sounds backwards. |
| |
| Therefore, option (a2) has been selected, since the newly- |
| specified texture object will be an EGLImage target. |
| |
| And the following options were considered for the object type: |
| b1) TexImage |
| b2) Texture |
| b3) TextureObject |
| |
| (b1) follows the convention used by other texture specification |
| functions; however, unlike {Copy,Compressed}TexImage, which |
| specify only a single mipmap level-of-detail, the referencing |
| entry point respecifies all image arrays in the texture object. |
| |
| (b2) and (b3) address the issues with (b1). The OpenGL |
| specification interchangeably uses "texture" and "texture object" |
| to refer to the entire collection of image arrays, so either |
| choice seems reasonable. For brevity, (b2) has been used |
| in this specification. |
| |
| Note, though, that eglBindTexImage also respecifies all image |
| arrays in the texture object, but it does not change the |
| TexImage suffix. |
| |
| Another option would be to treat the referencing function as an |
| attachment, rather than a specification, in which case a more |
| appropriate name would follow the convention used in the |
| OES_framebuffer_object extension, such as Texture2DeglImageOES. |
| |
| 6. What should the entry point for referencing renderbuffers be named? |
| |
| UNRESOLVED: There are far fewer conventions for renderbuffer |
| function names than there are for textures, so the naming for |
| this function should use whichever convention is selected |
| to resolve Issue 5. Given the current selections in that issue, |
| EGLImageTargetRenderbufferStorage is being used. |
| |
| Dependencies on EGL_KHR_image, EGL_KHR_image_base, and EGL 1.2 |
| |
| If EGL 1.2 is not supported, or if neither the EGL_OES_image nor |
| EGL_OES_image_base extensions is supported, all discussion of |
| EGLImages should be ignored, and any calls to either |
| EGLImageTargetTexture2DOES or EGLImageTargetRenderbufferStorageOES |
| should generate the error INVALID_OPERATION. |
| |
| Dependencies on OES_framebuffer_object |
| |
| If the OES_framebuffer_object extension is not supported, all |
| discussion of renderbuffers should be ignored, and all calls to |
| EGLImageTargetRenderbufferStorageOES should generate the error |
| INVALID_OPERATION. |
| |
| Revision History |
| |
| #8 (April 23, 2015, Jon Leech) |
| - Fix typo EGLImageTargetTexImage2DOES -> EGLImageTargetTexture2DOES |
| (Bug 8114). |
| |
| #7 (April 17, 2014, Jon Leech) |
| - Add missing error for invalid <image> parameter to |
| EGLImageTargetTexture2DOES (Bug 5164). |
| |
| #6 (April 1, 2009, Acorn Pooley, Jon Leech) |
| - Fix dependancy typo. Mention EGL_KHR_image_base. Correct |
| spelling of EGL_KHR_image and refer to alternate |
| EGL_KHR_image_base. Correct dependency on EGL from 1.1 to 1.2. |
| Change filename in the registry to correspond to capitalization |
| of the extension string. Don't update the version number |
| further until all internal edits are completed. |
| |
| #5 (April 1, 2009, Jon Leech) |
| - Added more overview pointing to companion EGL extensions. |
| |
| #4 (April 22, 2007, Jon Leech) |
| - Added updated 'Status' to reflect OpenKODE 1.0 Provisional. |
| |
| #3 (December 14, 2006) |
| - Changed requirement to egl 1.2 to include EGLClientBuffer type. |
| |
| #2 (October 20, 2006) |
| - Reworded phrasing describing undefined pixel data as a |
| result of EGLImageTarget* commands |
| |
| #1 - Original Release |