| Name | |
| EXT_external_buffer | |
| Name Strings | |
| GL_EXT_external_buffer | |
| Contact | |
| Jeff Leger (jleger 'at' qti.qualcomm.com) | |
| Contributors | |
| Sam Holmes | |
| Maurice Ribble | |
| Matt Netsch | |
| Jeremy Gebben | |
| John Bates | |
| Craig Donner | |
| Jeff Leger | |
| Rob VanReenen | |
| Tom Kneeland | |
| Jesse Hall | |
| Jan-Harald Fredriksen | |
| Daniel Koch | |
| Mathias Heyer | |
| Status | |
| Complete | |
| Version | |
| Last Modified Date: May 29, 2017 | |
| Revision: 1.0 | |
| Number | |
| OpenGL ES Extension #284 | |
| OpenGL Extension #508 | |
| Dependencies | |
| OpenGL ES 3.1 and EXT_buffer_storage are required for OpenGL ES | |
| implementations. | |
| OpenGL 4.4 is required for OpenGL implementations. | |
| This extension is written against the OpenGL ES 3.1 (June 4, 2014) | |
| Specification. | |
| This extension is written against version 3 of EXT_buffer_storage. | |
| The definition of this extension is affected by the presence of | |
| GL_EXT_direct_state_access, GL_ARB_direct_state_access, or OpenGL 4.5. | |
| Overview | |
| Extension EXT_buffer_storage introduced immutable storage buffers to | |
| OpenGL ES. This extension allows the data store for an immutable buffer to | |
| be sourced from an external EGLClientBuffer, allowing sharing of EGL client | |
| buffers across APIs, across processes, and across different processing | |
| cores such as the GPU, CPU, and DSP. | |
| Operations can then be performed on the external buffer using standard | |
| GL buffer object procedures. The data in the allocation is not copied to | |
| the buffer object's data store; the external allocation represents a single | |
| memory allocation that can be shared across multiple GL objects -- this | |
| aspect is similar to EGL external images. On the other hand, the external | |
| buffer does not provide lifetime guarantees including orphaning and sibling | |
| behavior as provided by EGL external images. | |
| The EGLClientBuffer must be allocated in a way which permits this shared | |
| access. For example, on Android via a shareable Android hardware buffer. | |
| This extension does not enable support for arbitrary EGLClientBuffers to be | |
| used as an external buffer. | |
| It is the application's responsibility to ensure synchronization between | |
| operations performed by separate components (DSP / CPU / GPU) and processes | |
| on the external buffer. Additionally the application is responsible for | |
| avoiding violating existing GL spec requirements. For example, mapping a | |
| single shared allocation to two GL buffer objects and then performing | |
| CopyBufferSubData such that the read and write regions overlap would | |
| violate the existing CopyBufferSubData spec regarding copies performed | |
| with the same buffer set for source and destination. | |
| The application must take any steps necessary to ensure memory access to | |
| the external buffer behaves as required by the application. For example, | |
| preventing compilation differences in data padding from causing data to be | |
| inadvertently corrupted by using defined structure alignment methods such | |
| as the std140 layout qualifier. The application is responsible for | |
| managing the lifetime of the external buffer, ensuring that the external | |
| buffer is not deleted as long as there are any GL buffer objects referring | |
| to it. | |
| New Types | |
| /* | |
| * GLeglClientBufferEXT is an opaque handle to an EGLClientBuffer | |
| */ | |
| typedef void* GLeglClientBufferEXT; | |
| New Procedures and Functions | |
| void BufferStorageExternalEXT(enum target, | |
| intptr offset, | |
| sizeiptr size, | |
| eglClientBufferEXT clientBuffer, | |
| bitfield flags); | |
| [[ The following is only added if GL_EXT_direct_state_access, | |
| GL_ARB_direct_state_access, or OpenGL 4.5 is supported. ]] | |
| void NamedBufferStorageExternalEXT(uint buffer, | |
| intptr offset, | |
| sizeiptr size, | |
| eglClientBufferEXT clientBuffer, | |
| bitfield flags); | |
| New Tokens | |
| None | |
| Additions to Chapter 6 of the OpenGL ES 3.1 Specification (Buffer Objects) | |
| Modify Section 6.2, (Creating and Modifying Buffer Object Data Stores). After | |
| the section describing BufferStorageEXT, insert the following: | |
| The command | |
| void BufferStorageExternalEXT(enum target, intptr offset, | |
| sizeiptr size, eglClientBufferEXT clientBuffer, | |
| bitfield flags); | |
| behaves similar to BufferStorageEXT, but rather than allocate an immutable | |
| data store, the specified client buffer is referenced as the immutable | |
| data store. Such a store may not be modified through further calls to | |
| BufferStorageExternalEXT, BufferStorageEXT, or BufferData. | |
| <target> Specifies the target buffer object. The symbolic constant must be | |
| one of the targets listed in table 6.1. <offset> and <size> specify, in | |
| basic machine units, the range of the client buffer to be bound to the data | |
| store. <offset> must be zero. | |
| <clientBuffer> Is the handle of a valid EGLClientBuffer resource (cast | |
| into type eglClientBufferEXT). The EGLClientBuffer must be allocated in a | |
| platform-specific way which permits shared access. For example, on Android | |
| via a sharable Android hardware buffer (struct AHardwareBuffer), converted | |
| into EGLClientBuffer via extension EGL_ANDROID_get_native_client_buffer. | |
| Other platforms would require a similar mechanism. This extension does not | |
| enable support for arbitrary EGLClientBuffers to be used as a shared buffer. | |
| <flags> is the bitwise OR of flags describing the intended usage of the buffer | |
| object's external data store by the application. Valid flags and their | |
| meanings are as described for BufferStorageEXT. | |
| The values of the buffer object's state variables will match those for other | |
| *BufferStorageEXT calls, as specified in table 6.3. | |
| The behavior follows other immutable buffers; BufferStorageExternalEXT sets the | |
| created buffer's BUFFER_IMMUTABLE_STORAGE_EXT to TRUE. | |
| [[ The following is only added if GL_EXT_direct_state_access, | |
| GL_ARB_direct_state_access, or OpenGL 4.5 is supported. ]] | |
| The command | |
| void NamedBufferStorageExternalEXT(uint buffer, intptr offset, | |
| sizeiptr size, eglClientBufferEXT clientBuffer, | |
| bitfield flags); | |
| behaves similarly to BufferStorageExternalEXT, except that the buffer whose | |
| storage is to be defined is specified by <buffer> rather than by the current | |
| binding to <target>. | |
| Errors | |
| INVALID_OPERATION is generated by BufferStorageExternalEXT if zero is bound to | |
| <target>. | |
| INVALID_OPERATION is generated by BufferStorageExternalEXT, if the | |
| BUFFER_IMMUTABLE_STORAGE flag of the buffer bound to <target> is TRUE. | |
| INVALID_VALUE is generated by BufferStorageExternalEXT if <offset> is not 0. | |
| INVALID_VALUE is generated by BufferStorageExternalEXT if <size> is 0 | |
| or negative. | |
| INVALID_VALUE is generated by BufferStorageExternalEXT if <offset> + <size> | |
| exceeds the size of the EGLClientBuffer. | |
| INVALID_VALUE is generated by BufferStorageExternalEXT if <flags> has any | |
| bits set other than those defined above. | |
| INVALID_VALUE is generated by BufferStorageExternalEXT if <flags> contains | |
| MAP_PERSISTENT_BIT_EXT but does not contain at least one of MAP_READ_BIT or | |
| MAP_WRITE_BIT. | |
| INVALID_VALUE is generated by BufferStorageExternalEXT if <flags> contains | |
| MAP_COHERENT_BIT_EXT, but does not also contain MAP_PERSISTENT_BIT_EXT. | |
| INVALID_ENUM is generated by BufferStorageExternalEXT if <target> is not one | |
| of the accepted buffer targets. | |
| INVALID_OPERATION is generated by BufferStorageExternalEXT if the shared | |
| buffer is not allocated in a way which permits shared access by the GPU. | |
| [[ The following is only added if GL_EXT_direct_state_access or | |
| GL_ARB_direct_state_access is supported. ]] | |
| An INVALID_OPERATION error is generated by NamedBufferStorageExternalEXT if | |
| the BUFFER_IMMUTABLE_STORAGE_EXT flag of <buffer> is set to TRUE. | |
| Interactions with GL_EXT_direct_state_access, GL_ARB_direct_state_access and | |
| OpenGL 4.5 | |
| If none of GL_EXT_direct_state_access, GL_ARB_direct_state_access, or | |
| OpenGL 4.5, the NamedBufferStorageExternalEXT entry-point is not | |
| added and all references to it should be ignored. | |
| Issues | |
| 1. How are possible GPU cache interactions handled? | |
| The application is responsible for synchronizing writes to the shared buffer | |
| by other processing cores (e.g. DSP), and making those available to CPU | |
| reads for the processing of client-side GL commands (e.g., BufferSubData). | |
| The GL implementation should guarantee that available writes by other cores | |
| (e.g., DSP) are visible to the GPU when server-side commands read from the | |
| shared buffer. | |
| PROPOSED: The exact granularity with which available writes from other cores | |
| e.g., DSP) become visible to the CPU and GPU is implementation dependent. | |
| 2. Should EGLClientBuffers, be directly referenced by the GL API? | |
| For images, a set of EGL and client API extensions provide import/export | |
| of EGLImages from client APIs and native buffers. The EGLImage also provides | |
| lifetime guarantees including orphaning and sibling behavior. This extension | |
| is more narrowly focused, specifically targeted to the import of EGLClientBuffers | |
| as GL buffers, and requiring the application to manage the resource lifetime. | |
| As such, it may not warrant a new EGL object or EGL extension. | |
| RESOLVED: A corresponding EGL object and extension is not required. When | |
| using this extension, applications are expected to cast EGLClientBuffer as | |
| GLeglClientBufferEXT. | |
| Revision History | |
| Rev. Date Author Changes | |
| ---- ---------- -------- ----------------------------------------- | |
| 0.1 04/18/2017 sholmes Initial version. Based on QCOM_shared_buffer. | |
| 0.2 05/16/2017 jleger Renamed the extension and reworked it to to | |
| be an extension to EXT_buffer_storage. | |
| 0.3 05/24/2017 jleger Add offset parameter and other cleanup. | |
| 0.4 05/25/2017 jleger Add DSA entrypoint and minor cleanup. | |
| 1.0 05/29/2017 dgkoch Add interactions with GL, minor cleanup. |