1 Name 2 3 EXT_robustness 4 5 Name Strings 6 7 GL_EXT_robustness 8 9 Contributors 10 11 Daniel Koch, TransGaming 12 Nicolas Capens, TransGaming 13 Contributors to ARB_robustness 14 15 Contact 16 17 Greg Roth, NVIDIA (groth 'at' nvidia.com) 18 19 Status 20 21 Complete. 22 23 Version 24 25 Version 3, 2011/10/31 26 27 Number 28 29 OpenGL ES Extension #107 30 31 Dependencies 32 33 This extension is written against the OpenGL ES 2.0 Specification 34 but can apply to OpenGL ES 1.1 and up. 35 36 EGL_EXT_create_context_robustness is used to determine if a context 37 implementing this extension supports robust buffer access, and if it 38 supports reset notification. 39 40 Overview 41 42 Several recent trends in how OpenGL integrates into modern computer 43 systems have created new requirements for robustness and security 44 for OpenGL rendering contexts. 45 46 Additionally GPU architectures now support hardware fault detection; 47 for example, video memory supporting ECC (error correcting codes) 48 and error detection. OpenGL contexts should be capable of recovering 49 from hardware faults such as uncorrectable memory errors. Along with 50 recovery from such hardware faults, the recovery mechanism can 51 also allow recovery from video memory access exceptions and system 52 software failures. System software failures can be due to device 53 changes or driver failures. 54 55 OpenGL queries that that return (write) some number of bytes to a 56 buffer indicated by a pointer parameter introduce risk of buffer 57 overflows that might be exploitable by malware. To address this, 58 queries with return value sizes that are not expressed directly by 59 the parameters to the query itself are given additional API 60 functions with an additional parameter that specifies the number of 61 bytes in the buffer and never writing bytes beyond that limit. This 62 is particularly useful for multi-threaded usage of OpenGL contexts 63 in a "share group" where one context can change objects in ways that 64 can cause buffer overflows for another context's OpenGL queries. 65 66 The original ARB_vertex_buffer_object extension includes an issue 67 that explicitly states program termination is allowed when 68 out-of-bounds vertex buffer object fetches occur. Modern graphics 69 hardware is capable well-defined behavior in the case of out-of- 70 bounds vertex buffer object fetches. Older hardware may require 71 extra checks to enforce well-defined (and termination free) 72 behavior, but this expense is warranted when processing potentially 73 untrusted content. 74 75 The intent of this extension is to address some specific robustness 76 goals: 77 78 * For all existing OpenGL queries, provide additional "safe" APIs 79 that limit data written to user pointers to a buffer size in 80 bytes that is an explicit additional parameter of the query. 81 82 * Provide a mechanism for an OpenGL application to learn about 83 graphics resets that affect the context. When a graphics reset 84 occurs, the OpenGL context becomes unusable and the application 85 must create a new context to continue operation. Detecting a 86 graphics reset happens through an inexpensive query. 87 88 * Provide an enable to guarantee that out-of-bounds buffer object 89 accesses by the GPU will have deterministic behavior and preclude 90 application instability or termination due to an incorrect buffer 91 access. Such accesses include vertex buffer fetches of 92 attributes and indices, and indexed reads of uniforms or 93 parameters from buffers. 94 95 New Procedures and Functions 96 97 enum GetGraphicsResetStatusEXT(); 98 99 void ReadnPixelsEXT(int x, int y, sizei width, sizei height, 100 enum format, enum type, sizei bufSize, 101 void *data); 102 103 void GetnUniformfvEXT(uint program, int location, sizei bufSize, 104 float *params); 105 void GetnUniformivEXT(uint program, int location, sizei bufSize, 106 int *params); 107 108 New Tokens 109 110 Returned by GetGraphicsResetStatusEXT: 111 112 NO_ERROR 0x0000 113 GUILTY_CONTEXT_RESET_EXT 0x8253 114 INNOCENT_CONTEXT_RESET_EXT 0x8254 115 UNKNOWN_CONTEXT_RESET_EXT 0x8255 116 117 Accepted by the <value> parameter of GetBooleanv, GetIntegerv, 118 and GetFloatv: 119 120 CONTEXT_ROBUST_ACCESS_EXT 0x90F3 121 RESET_NOTIFICATION_STRATEGY_EXT 0x8256 122 123 Returned by GetIntegerv and related simple queries when <value> is 124 RESET_NOTIFICATION_STRATEGY_EXT : 125 126 LOSE_CONTEXT_ON_RESET_EXT 0x8252 127 NO_RESET_NOTIFICATION_EXT 0x8261 128 129 Additions to Chapter 2 of the OpenGL ES 2.0 Specification (OpenGL ES Operation) 130 131 Add a new subsection after 2.5 "GL Errors" and renumber subsequent 132 sections accordingly. 133 134 2.6 "Graphics Reset Recovery" 135 136 Certain events can result in a reset of the GL context. Such a reset 137 causes all context state to be lost. Recovery from such events 138 requires recreation of all objects in the affected context. The 139 current status of the graphics reset state is returned by 140 141 enum GetGraphicsResetStatusEXT(); 142 143 The symbolic constant returned indicates if the GL context has been 144 in a reset state at any point since the last call to 145 GetGraphicsResetStatusEXT. NO_ERROR indicates that the GL context 146 has not been in a reset state since the last call. 147 GUILTY_CONTEXT_RESET_EXT indicates that a reset has been detected 148 that is attributable to the current GL context. 149 INNOCENT_CONTEXT_RESET_EXT indicates a reset has been detected that 150 is not attributable to the current GL context. 151 UNKNOWN_CONTEXT_RESET_EXT indicates a detected graphics reset whose 152 cause is unknown. 153 154 If a reset status other than NO_ERROR is returned and subsequent 155 calls return NO_ERROR, the context reset was encountered and 156 completed. If a reset status is repeatedly returned, the context may 157 be in the process of resetting. 158 159 Reset notification behavior is determined at context creation time, 160 and may be queried by calling GetIntegerv with the symbolic constant 161 RESET_NOTIFICATION_STRATEGY_EXT. 162 163 If the reset notification behavior is NO_RESET_NOTIFICATION_EXT, 164 then the implementation will never deliver notification of reset 165 events, and GetGraphicsResetStatusEXT will always return 166 NO_ERROR[fn1]. 167 [fn1: In this case it is recommended that implementations should 168 not allow loss of context state no matter what events occur. 169 However, this is only a recommendation, and cannot be relied 170 upon by applications.] 171 172 If the behavior is LOSE_CONTEXT_ON_RESET_EXT, a graphics reset will 173 result in the loss of all context state, requiring the recreation of 174 all associated objects. In this case GetGraphicsResetStatusEXT may 175 return any of the values described above. 176 177 If a graphics reset notification occurs in a context, a notification 178 must also occur in all other contexts which share objects with that 179 context[fn2]. 180 [fn2: The values returned by GetGraphicsResetStatusEXT in the 181 different contexts may differ.] 182 183 Add to Section 2.8 "Vertex Arrays" before subsection "Transferring 184 Array Elements" 185 186 Robust buffer access is enabled by creating a context with robust 187 access enabled through the window system binding APIs. When enabled, 188 indices within the vertex array that lie outside the arrays defined 189 for enabled attributes result in undefined values for the 190 corresponding attributes, but cannot result in application failure. 191 Robust buffer access behavior may be queried by calling GetIntegerv 192 with the symbolic constant CONTEXT_ROBUST_ACCESS_EXT. 193 194 Additions to Chapter 4 of the OpenGL ES 2.0 Specification (Per-Fragment 195 Operations and the Frame Buffer) 196 197 Modify section 4.3.1 "Reading Pixels" 198 199 Pixels are read using 200 201 void ReadPixels(int x, int y, sizei width, sizei height, 202 enum format, enum type, void *data); 203 void ReadnPixelsEXT(int x, int y, sizei width, sizei height, 204 enum format, enum type, sizei bufSize, 205 void *data); 206 207 Add to the description of ReadPixels: 208 209 ReadnPixelsEXT behaves identically to ReadPixels except that it does 210 not write more than <bufSize> bytes into <data>. If the buffer size 211 required to fill all the requested data is greater than <bufSize> an 212 INVALID_OPERATION error is generated and <data> is not altered. 213 214 Additions to Chapter 5 of the OpenGL ES 2.0 Specification (Special 215 Functions): 216 217 None 218 219 Additions to Chapter 6 of the OpenGL ES 2.0 Specification (State and 220 State Requests) 221 222 Modify Section 6.1.8 "Shader and Program Queries" 223 224 The commands 225 226 void GetUniformfv(uint program, int location, float *params); 227 void GetnUniformfvEXT(uint program, int location, sizei bufSize, 228 float *params); 229 void GetUniformiv(uint program, int location, int *params); 230 void GetnUniformivEXT(uint program, int location, sizei bufSize, 231 int *params); 232 233 return the value or values of the uniform at location <location> 234 for program object <program> in the array <params>. Calling 235 GetnUniformfvEXT or GetnUniformivEXT ensures that no more than 236 <bufSize> bytes are written into <params>. If the buffer size 237 required to fill all the requested data is greater than <bufSize> an 238 INVALID_OPERATION error is generated and <params> is not altered. 239 ... 240 241 Additions to The OpenGL ES Shading Language Specification, Version 1. 242 243 Append to the third paragraph of section 4.1.9 "Arrays" 244 245 If robust buffer access is enabled via the OpenGL ES API, such 246 indexing must not result in abnormal program termination. The 247 results are still undefined, but implementations are encouraged to 248 produce zero values for such accesses. 249 250 Interactions with EGL_EXT_create_context_robustness 251 252 If the EGL window-system binding API is used to create a context, 253 the EGL_EXT_create_context_robustness extension is supported, and 254 the attribute EGL_CONTEXT_OPENGL_ROBUST_ACCESS_EXT is set to 255 EGL_TRUE when eglCreateContext is called, the resulting context will 256 perform robust buffer access as described above in section 2.8, and 257 the CONTEXT_ROBUST_ACCESS_EXT query will return GL_TRUE as described 258 above in section 6.1.5. 259 260 If the EGL window-system binding API is used to create a context and 261 the EGL_EXT_create_context_robustness extension is supported, then 262 the value of attribute EGL_CONTEXT_RESET_NOTIFICATION_STRATEGY_EXT 263 determines the reset notification behavior and the value of 264 RESET_NOTIFICATION_STRATEGY_EXT, as described in section 2.6. 265 266 Errors 267 268 ReadnPixelsEXT, GetnUniformfvEXT, and GetnUniformivEXT share all the 269 errors of their unsized buffer query counterparts with the addition 270 that INVALID_OPERATION is generated if the buffer size required to 271 fill all the requested data is greater than <bufSize>. 272 273 New Implementation Dependent State 274 275 Get Value Type Get Command Minimum Value Description Sec. Attribute 276 --------- ---- ----------- ------------- --------------------------- ----- --------- 277 CONTEXT_ROBUST_ACCESS_EXT B GetIntegerv - Robust access enabled 6.1.5 - 278 RESET_NOTIFICATION_STRATEGY_EXT Z_2 GetIntegerv See sec. 2.6 Reset notification behavior 2.6 - 279 280 Issues 281 282 283 1. What should this extension be called? 284 285 RESOLVED: EXT_robustness 286 287 Since this is intended to be a version of ARB_robustness for 288 OpenGL ES, it should be named accordingly. 289 290 2. How does this extension differ from Desktop GL's ARB_robustness? 291 292 RESOLVED: Because EGL_EXT_create_context_robustness uses a 293 separate attribute to enable robust buffer access, a 294 corresponding query is added here. 295 296 3. Should we provide a context creation mechanism to enable this extension? 297 298 RESOLVED. Yes. 299 300 Currently, EGL_EXT_create_context_robustness provides this 301 mechanism via two unique attributes. These attributes differ 302 from those specified by KHR_create_context to allow for 303 differences in what functionality those attributes define. 304 305 4. What can cause a graphics reset? 306 307 Either user or implementor errors may result in a graphics reset. 308 If the application attempts to perform a rendering that takes too long 309 whether due to an infinite loop in a shader or even just a rendering 310 operation that takes too long on the given hardware. Implementation 311 errors may produce badly formed hardware commands. Memory access errors 312 may result from user or implementor mistakes. On some systems, power 313 management events such as system sleep, screen saver activation, or 314 pre-emption may also context resets to occur. Any of these events may 315 result in a graphics reset event that will be detectable by the 316 mechanism described in this extension. 317 318 5. How should the application react to a reset context event? 319 320 RESOLVED: For this extension, the application is expected to query 321 the reset status until NO_ERROR is returned. If a reset is encountered, 322 at least one *RESET* status will be returned. Once NO_ERROR is again 323 encountered, the application can safely destroy the old context and 324 create a new one. 325 326 After a reset event, apps should not use a context for any purpose 327 other than determining its reset status, and then destroying it. If a 328 context receives a reset event, all other contexts in its share group 329 will also receive reset events, and should be destroyed and 330 recreated. 331 332 Apps should be cautious in interpreting the GUILTY and INNOCENT reset 333 statuses. These are guidelines to the immediate cause of a reset, but 334 not guarantees of the ultimate cause. 335 336 6. If a graphics reset occurs in a shared context, what happens in 337 shared contexts? 338 339 RESOLVED: A reset in one context will result in a reset in all other 340 contexts in its share group. 341 342 7. How can an application query for robust buffer access support, 343 since this is now determined at context creation time? 344 345 RESOLVED. The application can query the value of ROBUST_ACCESS_EXT 346 using GetIntegerv. If true, this functionality is enabled. 347 348 8. How is the reset notification behavior controlled? 349 350 RESOLVED: Reset notification behavior is determined at context 351 creation time using EGL/GLX/WGL/etc. mechanisms. In order that shared 352 objects be handled predictably, a context cannot share with 353 another context unless both have the same reset notification 354 behavior. 355 356 357 Revision History 358 359 Rev. Date Author Changes 360 ---- ------------ --------- ---------------------------------------- 361 3 31 Oct 2011 groth Reverted to attribute for robust access. Now it's a 362 companion to rather than subset of KHR_create_context 363 2 11 Oct 2011 groth Merged ANGLE and NV extensions. 364 Convert to using flag to indicate robust access. 365 1 15 July 2011 groth Initial version 366