| Name | 
 |  | 
 |     EXT_robustness | 
 |  | 
 | Name Strings | 
 |  | 
 |     GL_EXT_robustness | 
 |  | 
 | Contributors | 
 |  | 
 |     Daniel Koch, TransGaming | 
 |     Nicolas Capens, TransGaming | 
 |     Contributors to ARB_robustness | 
 |  | 
 | Contact | 
 |  | 
 |     Greg Roth, NVIDIA (groth 'at' nvidia.com) | 
 |  | 
 | Status | 
 |  | 
 |     Complete. | 
 |  | 
 | Version | 
 |  | 
 |     Version 3, 2011/10/31 | 
 |  | 
 | Number | 
 |  | 
 |     OpenGL ES Extension #107 | 
 |  | 
 | Dependencies | 
 |  | 
 |     This extension is written against the OpenGL ES 2.0 Specification | 
 |     but can apply to OpenGL ES 1.1 and up. | 
 |  | 
 |     EGL_EXT_create_context_robustness is used to determine if a context | 
 |     implementing this extension supports robust buffer access, and if it | 
 |     supports reset notification.  | 
 |  | 
 | Overview | 
 |  | 
 |     Several recent trends in how OpenGL integrates into modern computer | 
 |     systems have created new requirements for robustness and security | 
 |     for OpenGL rendering contexts. | 
 |      | 
 |     Additionally GPU architectures now support hardware fault detection; | 
 |     for example, video memory supporting ECC (error correcting codes) | 
 |     and error detection.  OpenGL contexts should be capable of recovering | 
 |     from hardware faults such as uncorrectable memory errors.  Along with | 
 |     recovery from such hardware faults, the recovery mechanism can | 
 |     also allow recovery from video memory access exceptions and system | 
 |     software failures.  System software failures can be due to device | 
 |     changes or driver failures. | 
 |  | 
 |     OpenGL queries that that return (write) some number of bytes to a | 
 |     buffer indicated by a pointer parameter introduce risk of buffer | 
 |     overflows that might be exploitable by malware. To address this, | 
 |     queries with return value sizes that are not expressed directly by | 
 |     the parameters to the query itself are given additional API | 
 |     functions with an additional parameter that specifies the number of | 
 |     bytes in the buffer and never writing bytes beyond that limit. This | 
 |     is particularly useful for multi-threaded usage of OpenGL contexts | 
 |     in a "share group" where one context can change objects in ways that | 
 |     can cause buffer overflows for another context's OpenGL queries. | 
 |  | 
 |     The original ARB_vertex_buffer_object extension includes an issue | 
 |     that explicitly states program termination is allowed when | 
 |     out-of-bounds vertex buffer object fetches occur. Modern graphics | 
 |     hardware is capable well-defined behavior in the case of out-of- | 
 |     bounds vertex buffer object fetches. Older hardware may require | 
 |     extra checks to enforce well-defined (and termination free) | 
 |     behavior, but this expense is warranted when processing potentially | 
 |     untrusted content. | 
 |  | 
 |     The intent of this extension is to address some specific robustness | 
 |     goals: | 
 |  | 
 |     *   For all existing OpenGL queries, provide additional "safe" APIs  | 
 |         that limit data written to user pointers to a buffer size in  | 
 |         bytes that is an explicit additional parameter of the query. | 
 |  | 
 |     *   Provide a mechanism for an OpenGL application to learn about | 
 |         graphics resets that affect the context.  When a graphics reset | 
 |         occurs, the OpenGL context becomes unusable and the application | 
 |         must create a new context to continue operation. Detecting a | 
 |         graphics reset happens through an inexpensive query. | 
 |  | 
 |     *   Provide an enable to guarantee that out-of-bounds buffer object | 
 |         accesses by the GPU will have deterministic behavior and preclude | 
 |         application instability or termination due to an incorrect buffer | 
 |         access.  Such accesses include vertex buffer fetches of | 
 |         attributes and indices, and indexed reads of uniforms or | 
 |         parameters from buffers. | 
 |  | 
 | New Procedures and Functions | 
 |  | 
 |         enum GetGraphicsResetStatusEXT(); | 
 |  | 
 |         void ReadnPixelsEXT(int x, int y, sizei width, sizei height, | 
 |                             enum format, enum type, sizei bufSize, | 
 |                             void *data); | 
 |  | 
 |         void GetnUniformfvEXT(uint program, int location, sizei bufSize, | 
 |                               float *params); | 
 |         void GetnUniformivEXT(uint program, int location, sizei bufSize, | 
 |                               int *params); | 
 |  | 
 | New Tokens | 
 |  | 
 |     Returned by GetGraphicsResetStatusEXT: | 
 |  | 
 |         NO_ERROR                                        0x0000 | 
 |         GUILTY_CONTEXT_RESET_EXT                        0x8253 | 
 |         INNOCENT_CONTEXT_RESET_EXT                      0x8254 | 
 |         UNKNOWN_CONTEXT_RESET_EXT                       0x8255 | 
 |  | 
 |     Accepted by the <value> parameter of GetBooleanv, GetIntegerv, | 
 |     and GetFloatv: | 
 |  | 
 |         CONTEXT_ROBUST_ACCESS_EXT                       0x90F3 | 
 |         RESET_NOTIFICATION_STRATEGY_EXT                 0x8256 | 
 |  | 
 |     Returned by GetIntegerv and related simple queries when <value> is | 
 |     RESET_NOTIFICATION_STRATEGY_EXT : | 
 |  | 
 |         LOSE_CONTEXT_ON_RESET_EXT                       0x8252 | 
 |         NO_RESET_NOTIFICATION_EXT                       0x8261 | 
 |  | 
 | Additions to Chapter 2 of the OpenGL ES 2.0 Specification (OpenGL ES Operation) | 
 |  | 
 | Add a new subsection after 2.5 "GL Errors" and renumber subsequent | 
 | sections accordingly. | 
 |  | 
 |     2.6 "Graphics Reset Recovery" | 
 |  | 
 |     Certain events can result in a reset of the GL context. Such a reset | 
 |     causes all context state to be lost. Recovery from such events | 
 |     requires recreation of all objects in the affected context. The | 
 |     current status of the graphics reset state is returned by | 
 |  | 
 |         enum GetGraphicsResetStatusEXT(); | 
 |  | 
 |     The symbolic constant returned indicates if the GL context has been | 
 |     in a reset state at any point since the last call to | 
 |     GetGraphicsResetStatusEXT. NO_ERROR indicates that the GL context | 
 |     has not been in a reset state since the last call. | 
 |     GUILTY_CONTEXT_RESET_EXT indicates that a reset has been detected | 
 |     that is attributable to the current GL context. | 
 |     INNOCENT_CONTEXT_RESET_EXT indicates a reset has been detected that | 
 |     is not attributable to the current GL context. | 
 |     UNKNOWN_CONTEXT_RESET_EXT indicates a detected graphics reset whose | 
 |     cause is unknown. | 
 |  | 
 |     If a reset status other than NO_ERROR is returned and subsequent | 
 |     calls return NO_ERROR, the context reset was encountered and | 
 |     completed. If a reset status is repeatedly returned, the context may | 
 |     be in the process of resetting. | 
 |  | 
 |     Reset notification behavior is determined at context creation time, | 
 |     and may be queried by calling GetIntegerv with the symbolic constant | 
 |     RESET_NOTIFICATION_STRATEGY_EXT. | 
 |  | 
 |     If the reset notification behavior is NO_RESET_NOTIFICATION_EXT, | 
 |     then the implementation will never deliver notification of reset | 
 |     events, and GetGraphicsResetStatusEXT will always return | 
 |     NO_ERROR[fn1]. | 
 |        [fn1: In this case it is recommended that implementations should | 
 |         not allow loss of context state no matter what events occur. | 
 |         However, this is only a recommendation, and cannot be relied | 
 |         upon by applications.] | 
 |  | 
 |     If the behavior is LOSE_CONTEXT_ON_RESET_EXT, a graphics reset will | 
 |     result in the loss of all context state, requiring the recreation of | 
 |     all associated objects. In this case GetGraphicsResetStatusEXT may | 
 |     return any of the values described above. | 
 |  | 
 |     If a graphics reset notification occurs in a context, a notification | 
 |     must also occur in all other contexts which share objects with that | 
 |     context[fn2]. | 
 |        [fn2: The values returned by GetGraphicsResetStatusEXT in the | 
 |         different contexts may differ.] | 
 |  | 
 |     Add to Section 2.8 "Vertex Arrays" before subsection "Transferring | 
 |     Array Elements" | 
 |  | 
 |     Robust buffer access is enabled by creating a context with robust | 
 |     access enabled through the window system binding APIs. When enabled, | 
 |     indices within the vertex array that lie outside the arrays defined | 
 |     for enabled attributes result in undefined values for the | 
 |     corresponding attributes, but cannot result in application failure. | 
 |     Robust buffer access behavior may be queried by calling GetIntegerv | 
 |     with the symbolic constant CONTEXT_ROBUST_ACCESS_EXT. | 
 |  | 
 | Additions to Chapter 4 of the OpenGL ES 2.0 Specification (Per-Fragment | 
 | Operations and the Frame Buffer) | 
 |  | 
 |     Modify section 4.3.1 "Reading Pixels" | 
 |  | 
 |     Pixels are read using | 
 |  | 
 |         void ReadPixels(int x, int y, sizei width, sizei height, | 
 |                         enum format, enum type, void *data); | 
 |         void ReadnPixelsEXT(int x, int y, sizei width, sizei height, | 
 |                            enum format, enum type, sizei bufSize, | 
 |                            void *data); | 
 |  | 
 |     Add to the description of ReadPixels: | 
 |  | 
 |     ReadnPixelsEXT behaves identically to ReadPixels except that it does | 
 |     not write more than <bufSize> bytes into <data>. If the buffer size | 
 |     required to fill all the requested data is greater than <bufSize> an | 
 |     INVALID_OPERATION error is generated and <data> is not altered. | 
 |  | 
 | Additions to Chapter 5 of the OpenGL ES 2.0 Specification (Special | 
 | Functions): | 
 |  | 
 |     None | 
 |  | 
 | Additions to Chapter 6 of the OpenGL ES 2.0 Specification (State and | 
 | State Requests) | 
 |  | 
 |     Modify Section 6.1.8 "Shader and Program Queries" | 
 |  | 
 |     The commands | 
 |  | 
 |         void GetUniformfv(uint program, int location, float *params); | 
 |         void GetnUniformfvEXT(uint program, int location, sizei bufSize, | 
 |                               float *params); | 
 |         void GetUniformiv(uint program, int location, int *params); | 
 |         void GetnUniformivEXT(uint program, int location, sizei bufSize, | 
 |                               int *params); | 
 |  | 
 |     return the value or values of the uniform at location <location> | 
 |     for program object <program> in the array <params>. Calling | 
 |     GetnUniformfvEXT or GetnUniformivEXT ensures that no more than | 
 |     <bufSize> bytes are written into <params>. If the buffer size | 
 |     required to fill all the requested data is greater than <bufSize> an | 
 |     INVALID_OPERATION error is generated and <params> is not altered. | 
 |     ... | 
 |  | 
 | Additions to The OpenGL ES Shading Language Specification, Version 1. | 
 |  | 
 |     Append to the third paragraph of section 4.1.9 "Arrays" | 
 |  | 
 |     If robust buffer access is enabled via the OpenGL ES API, such | 
 |     indexing must not result in abnormal program termination. The | 
 |     results are still undefined, but implementations are encouraged to | 
 |     produce zero values for such accesses. | 
 |  | 
 | Interactions with EGL_EXT_create_context_robustness | 
 |  | 
 |     If the EGL window-system binding API is used to create a context, | 
 |     the EGL_EXT_create_context_robustness extension is supported, and | 
 |     the attribute EGL_CONTEXT_OPENGL_ROBUST_ACCESS_EXT is set to | 
 |     EGL_TRUE when eglCreateContext is called, the resulting context will | 
 |     perform robust buffer access as described above in section 2.8, and | 
 |     the CONTEXT_ROBUST_ACCESS_EXT query will return GL_TRUE as described | 
 |     above in section 6.1.5. | 
 |  | 
 |     If the EGL window-system binding API is used to create a context and | 
 |     the EGL_EXT_create_context_robustness extension is supported, then | 
 |     the value of attribute EGL_CONTEXT_RESET_NOTIFICATION_STRATEGY_EXT | 
 |     determines the reset notification behavior and the value of | 
 |     RESET_NOTIFICATION_STRATEGY_EXT, as described in section 2.6. | 
 |  | 
 | Errors | 
 |  | 
 |     ReadnPixelsEXT, GetnUniformfvEXT, and GetnUniformivEXT share all the | 
 |     errors of their unsized buffer query counterparts with the addition | 
 |     that INVALID_OPERATION is generated if the buffer size required to | 
 |     fill all the requested data is greater than <bufSize>. | 
 |  | 
 | New Implementation Dependent State | 
 |  | 
 |     Get Value                       Type  Get Command     Minimum Value    Description                  Sec.  Attribute | 
 |     ---------                       ----  -----------     -------------    ---------------------------  ----- --------- | 
 |     CONTEXT_ROBUST_ACCESS_EXT       B     GetIntegerv     -                Robust access enabled        6.1.5 - | 
 |     RESET_NOTIFICATION_STRATEGY_EXT Z_2   GetIntegerv     See sec. 2.6     Reset notification behavior  2.6   - | 
 |  | 
 | Issues | 
 |  | 
 |  | 
 |     1.  What should this extension be called? | 
 |  | 
 |         RESOLVED: EXT_robustness | 
 |  | 
 |         Since this is intended to be a version of ARB_robustness for | 
 |         OpenGL ES, it should be named accordingly. | 
 |  | 
 |     2.  How does this extension differ from Desktop GL's ARB_robustness? | 
 |  | 
 |         RESOLVED: Because EGL_EXT_create_context_robustness uses a | 
 | 	separate attribute to enable robust buffer access, a | 
 | 	corresponding query is added here. | 
 |  | 
 |     3.  Should we provide a context creation mechanism to enable this extension? | 
 |  | 
 |         RESOLVED. Yes. | 
 |  | 
 |         Currently, EGL_EXT_create_context_robustness provides this | 
 |         mechanism via two unique attributes. These attributes differ | 
 | 	from those specified by KHR_create_context to allow for | 
 | 	differences in what functionality those attributes define. | 
 |          | 
 |     4. What can cause a graphics reset? | 
 |  | 
 |        Either user or implementor errors may result in a graphics reset. | 
 |        If the application attempts to perform a rendering that takes too long | 
 |        whether due to an infinite loop in a shader or even just a rendering | 
 |        operation that takes too long on the given hardware. Implementation | 
 |        errors may produce badly formed hardware commands. Memory access errors | 
 |        may result from user or implementor mistakes. On some systems, power | 
 |        management events such as system sleep, screen saver activation, or | 
 |        pre-emption may also context resets to occur. Any of these events may | 
 |        result in a graphics reset event that will be detectable by the | 
 |        mechanism described in this extension. | 
 |  | 
 |     5. How should the application react to a reset context event? | 
 |  | 
 |        RESOLVED: For this extension, the application is expected to query | 
 |        the reset status until NO_ERROR is returned. If a reset is encountered, | 
 |        at least one *RESET* status will be returned. Once NO_ERROR is again | 
 |        encountered, the application can safely destroy the old context and | 
 |        create a new one. | 
 |  | 
 |        After a reset event, apps should not use a context for any purpose | 
 |        other than determining its reset status, and then destroying it. If a | 
 |        context receives a reset event, all other contexts in its share group | 
 |        will also receive reset events, and should be destroyed and | 
 |        recreated. | 
 |  | 
 |        Apps should be cautious in interpreting the GUILTY and INNOCENT reset | 
 |        statuses. These are guidelines to the immediate cause of a reset, but | 
 |        not guarantees of the ultimate cause. | 
 |  | 
 |     6. If a graphics reset occurs in a shared context, what happens in | 
 |        shared contexts? | 
 |  | 
 |        RESOLVED: A reset in one context will result in a reset in all other | 
 |        contexts in its share group.  | 
 |  | 
 |     7. How can an application query for robust buffer access support, | 
 |        since this is now determined at context creation time? | 
 |  | 
 |        RESOLVED. The application can query the value of ROBUST_ACCESS_EXT | 
 |        using GetIntegerv. If true, this functionality is enabled. | 
 |  | 
 |     8. How is the reset notification behavior controlled? | 
 |  | 
 |        RESOLVED: Reset notification behavior is determined at context | 
 |        creation time using EGL/GLX/WGL/etc. mechanisms. In order that shared | 
 |        objects be handled predictably, a context cannot share with | 
 |        another context unless both have the same reset notification | 
 |        behavior. | 
 |  | 
 |  | 
 | Revision History | 
 |  | 
 |     Rev.    Date       Author     Changes | 
 |     ----  ------------ ---------  ---------------------------------------- | 
 |       3   31 Oct  2011 groth      Reverted to attribute for robust access. Now it's a | 
 |                                   companion to rather than subset of KHR_create_context | 
 |       2   11 Oct  2011 groth      Merged ANGLE and NV extensions. | 
 |                                   Convert to using flag to indicate robust access. | 
 |       1   15 July 2011 groth      Initial version |