| Name |
| |
| EGL_ANGLE_program_cache_control |
| |
| Name Strings |
| |
| EGL_ANGLE_program_cache_control |
| |
| Contributors |
| |
| Jamie Madill, Google |
| |
| Contacts |
| |
| Jamie Madill (jmadill 'at' google.com) |
| |
| Status |
| |
| Draft |
| |
| Version |
| |
| Version 1, June 29, 2017 |
| |
| Number |
| |
| EGL Extension #?? |
| |
| Dependencies |
| |
| Requires EGL 1.5. |
| |
| Written against the EGL 1.5 specification. |
| |
| Overview |
| |
| This extension allows the for creation of an OpenGL or OpenGL ES contexts |
| that have access to an internal binary program cache. It also allows for |
| querying and populating the contents of the binary cache. |
| |
| An OpenGL ES implementation supporting GL_ANGLE_program_cache_control or |
| equivalent functionality is required. |
| |
| New Types |
| |
| None |
| |
| New Procedures and Functions |
| |
| EGLint eglProgramCacheGetAttribANGLE( |
| EGLDisplay dpy, |
| EGLenum attrib); |
| |
| void eglProgramCacheQueryANGLE( |
| EGLDisplay dpy, |
| EGLint index, |
| void *key, |
| EGLint *keysize, |
| void *binary, |
| EGLint *binarysize); |
| |
| void eglProgramCachePopulateANGLE( |
| EGLDisplay dpy, |
| const void *key, |
| EGLint keysize, |
| const void *binary, |
| EGLint binarysize); |
| |
| EGLint eglProgramCacheResizeANGLE( |
| EGLDisplay dpy, |
| EGLint limit, |
| EGLenum mode); |
| |
| New Tokens |
| |
| Accepted as a value for 'attrib' in eglProgramCacheGetAttribANGLE: |
| |
| EGL_PROGRAM_CACHE_SIZE_ANGLE 0x3455 |
| EGL_PROGRAM_CACHE_KEY_LENGTH_ANGLE 0x3456 |
| |
| Accepted as a value for 'mode' in eglProgramCacheResizeANGLE: |
| |
| EGL_PROGRAM_CACHE_RESIZE_ANGLE 0x3457 |
| EGL_PROGRAM_CACHE_TRIM_ANGLE 0x3458 |
| |
| Accepted as an attribute name in the <*attrib_list> argument to |
| eglCreateContext: |
| |
| EGL_CONTEXT_PROGRAM_BINARY_CACHE_ENABLED_ANGLE 0x3459 |
| |
| Additions to the EGL 1.5 Specification |
| |
| Add the following to section 3.7.1 "Creating Rendering Contexts": |
| |
| EGL_CONTEXT_PROGRAM_BINARY_CACHE_ENABLED_ANGLE indicates whether the context |
| should be created with the GL_PROGRAM_BINARY_CACHE_ENABLE_ANGLE state |
| initialized to GL_TRUE or GL_FALSE. The default value of |
| EGL_CONTEXT_PROGRAM_BINARY_CACHE_ENABLED_ANGLE is EGL_TRUE. See section 3.13 |
| for details on the program binary cache. |
| |
| Add a section 3.13 to the end of section 3 "EGL Program Binary Cache": |
| |
| Each display has an associated program binary cache. This cache stores |
| compiled programs for re-use on subsequent calls to glLinkProgram. The |
| application can control the behaviour of the cache by enabling or disabling |
| its use per-context (see section 3.7.1) and specifying a cache size. It |
| can also query the current cache values and populate the cache during start- |
| up. |
| |
| Program binary cache properties may be queried using |
| |
| EGLint eglProgramCacheGetAttribANGLE(EGLDisplay dpy, EGLenum attrib); |
| |
| The only accepted values for 'attrib' are EGL_PROGRAM_CACHE_SIZE_ANGLE and |
| EGL_PROGRAM_CACHE_KEY_LENGTH_ANGLE. A query for EGL_PROGRAM_CACHE_SIZE_ANGLE |
| will return the number of cache entries in the program cache. A |
| query of EGL_PROGRAM_CACHE_KEY_LENGTH_ANGLE will return the required length |
| (in bytes) of the 'key' parameter to eglProgramCacheQueryANGLE and |
| eglPopulateProgramCacheANGLE. Any other value for 'attrib' will produce an |
| error of EGL_BAD_ATTRIBUTE, and an invalid display for 'dpy' will produce an |
| error of EGL_BAD_DISPLAY. All error cases will return zero. |
| |
| Cache contents may be queried by using |
| |
| void eglProgramCacheQueryANGLE(EGLDisplay dpy, EGLint index, |
| void *key, EGLint *keysize, void *binary, EGLint *binarysize); |
| |
| If 'dpy' is not a valid display an EGL_BAD_DISPLAY error is generated. If |
| 'index' is not equal to or greater than zero and less than |
| EGL_PROGRAM_CACHE_SIZE_ANGLE, an EGL_BAD_PARAMETER error is generated. If |
| 'dpy' is not a valid display EGL_BAD_DISPLAY is generated. If 'binarysize' |
| and 'keysize' are non-null, and 'binary' and 'key' are null, the size of the |
| binary at 'index' is written to 'binarysize', and the key size to 'keysize'. |
| If 'binary' is not null, 'binarysize' specifies the maximum size of the |
| 'binary' out parameter, and if 'keysize' is not null, the size of the 'key' |
| out parameter. Any attempt to write more than 'binarysize' or 'keysize' |
| bytes will produce an EGL_BAD_ACCESS error in this case. If 'keysize' or |
| 'binarysize' is null, an EGL_BAD_PARAMETER error is generated. If 'key' is |
| not null, 'binary' must also be non-null, and vice versa, or an |
| EGL_BAD_PARAMETER error is generated. If the cache contents change such that |
| a cache entry at 'index' is not retrievable, either EGL_BAD_ACCESS is |
| generated or a null key and binary are returned. Valid entries returned are |
| not guaranteed to be in the cache. Otherwise, the binary is written to |
| 'binary' and the program key is written to 'key'. |
| |
| The cache may be warmed up on startup with |
| |
| void eglProgramCachePopulateANGLE(EGLDisplay dpy, const void *key, |
| EGLint keysize, const void *binary, EGLint binarysize); |
| |
| If 'dpy' is not a valid display an EGL_BAD_DISPLAY error is generated. If |
| 'binarysize' is not positive or is greater than an internally defined |
| maximum size, EGL_BAD_PARAMETER is generated. If 'keysize' does not equal |
| EGL_PROGRAM_CACHE_KEY_LENGTH_ANGLE, EGL_BAD_PARAMETER is generated. If the |
| program binary is invalid for any reason, behaviour is undefined. Otherwise |
| the program will be loaded into the internal binary cache with the key |
| 'key'. If 'binary' or 'key' are null, an EGL_BAD_PARAMETER error is |
| generated. |
| |
| The cache contents size may be changed using |
| |
| EGLint eglProgramCacheResizeANGLE(EGLDisplay dpy, EGLint limit, |
| EGLenum mode); |
| |
| If 'dpy' is not a valid display an EGL_BAD_DISPLAY error is generated. If |
| limit is negative then EGL_BAD_PARAMETER is generated. If 'mode' is |
| EGL_PROGRAM_CACHE_RESIZE, cache contents are discarded and a new maximum |
| cache size is set to 'limit'. If 'limit' is larget than an implementation- |
| defined internal constant, EGL_BAD_PARAMETER is generated. Otherwise the |
| initial cache size is returned. If 'mode' is EGL_PROGRAM_CACHE_TRIM, cache |
| resources are released until the total cache size, in bytes, is less than or |
| equal to 'limit', and the number of bytes of memory released is returned. |
| In any error case, zero is returned. |
| |
| Errors |
| |
| None |
| |
| New State |
| |
| None |
| |
| Conformance Tests |
| |
| TBD |
| |
| Issues |
| |
| 1. Should the cache control be a property of the display or the contexts? |
| |
| The cache itself will internally be a property of the display, since we |
| want to share caches between contexts. It is possible to design an |
| implementation with other kinds of cache sharing, such as between share |
| groups. |
| |
| We can choose to prefer simplicity of design in this case. |
| |
| RESOLVED: the cache should be a property of the display. |
| |
| 2. What should happen if the cache is modified as the user is querying its |
| contents? |
| |
| It is more difficult to design a query API such that it can be returned |
| atomically. Hence the cache can change in some cases while it is being |
| queried. This can be controlled in the application layer. It can also be |
| locked using OS-level synchronization. |
| |
| Introducing undefined behaviour can be very problematic. |
| |
| RESOLVED: we should use a mutex or similar lock to allow for multithreaded |
| access, and not expose undefined behaviour. |
| |
| 3. Should we expose the key/value semantics or just have a binary value? |
| |
| Having just the binary would eliminate one query enum, and make the APIs |
| simpler. Having both key and value represents the implementation exactly. |
| |
| RESOLVED: we should expose the key to mirror the implementation. |
| |
| 4. Should the extension allow for setting cache size limits? |
| |
| If caches are a property of the display, they could be set in |
| eglGetPlatformDisplay as an attribute. |
| |
| Cache controls can be a necessary feature for memory management. |
| |
| RESOLVED: yes, we should expose cache size controls. |
| |
| Revision History |
| |
| Rev. Date Author Changes |
| ---- ------------- --------- ---------------------------------------- |
| 1 June 29, 2017 jmadill Initial version |