1 Name 2 3 MESA_trace 4 5 Name Strings 6 7 GL_MESA_trace 8 9 Contact 10 11 Bernd Kreimeier, Loki Entertainment, bk 'at' lokigames.com 12 Brian Paul, VA Linux Systems, Inc., brianp 'at' valinux.com 13 14 Status 15 16 Obsolete. 17 18 Version 19 20 21 Number 22 23 none yet 24 25 Dependencies 26 27 OpenGL 1.2 is required. 28 The extension is written against the OpenGL 1.2 Specification 29 30 Overview 31 32 Provides the application with means to enable and disable logging 33 of GL calls including parameters as readable text. The verbosity 34 of the generated log can be controlled. The resulting logs are 35 valid (but possibly incomplete) C code and can be compiled and 36 linked for standalone test programs. The set of calls and the 37 amount of static data that is logged can be controlled at runtime. 38 The application can add comments and enable or disable tracing of GL 39 operations at any time. The data flow from the application to GL 40 and back is unaffected except for timing. 41 42 Application-side implementation of these features raises namespace 43 and linkage issues. In the driver dispatch table a simple 44 "chain of responsibility" pattern (aka "composable piepline") 45 can be added. 46 47 IP Status 48 49 The extension spec is in the public domain. The current implementation 50 in Mesa is covered by Mesa's XFree86-style copyright by the authors above. 51 This extension is partially inspired by the Quake2 QGL wrapper. 52 53 Issues 54 55 56 (1) Is this Extension obsolete because it can 57 be implemented as a wrapper DLL? 58 59 RESOLVED: No. While certain operating systems (Win32) provide linkers 60 that facilitate this kind of solution, other operating systems 61 (Linux) do not support hierarchical linking, so a wrapper solution 62 would result in symbol collisions. 63 Further, IHV's might have builtin support for tracing GL execution 64 that enjoys privileged access, or that they do not wish to separate 65 the tracing code from their driver code base. 66 67 (2) Should the Trace API explicitely support the notion of "frames? 68 This would require hooking into glXSwapBuffers calls as well. 69 70 RESOLVED: No. The application can use NewTraceMESA/EndTraceMESA 71 and TraceComment along with external parsing tools to split the 72 trace into frames, in whatever way considered adequate. 73 74 (2a) Should GLX calls be traced? 75 76 PBuffers and other render-to-texture solutions demonstrate that 77 context level commands beyond SwapBuffers might have to be 78 traced. The GL DLL exports the entry points, so this would not 79 be out of the question. 80 81 (3) Should the specification mandate the actual output format? 82 83 RESOLVED: No. It is sufficient to guarantee that all data and commands 84 will be traced as requested by Enable/DisableTraceMESA, in the order 85 encountered. Whether the resulting trace is available as a readable 86 text file, binary metafile, compilable source code, much less which 87 indentation and formatting has been used, is up to the implementation. 88 For the same reason this specification does not enforce or prohibit 89 additional information added to the trace (statistics, profiling/timing, 90 warnings on possible error conditions). 91 92 (4) Should the comment strings associated with names and pointer (ranges) 93 be considered persistent state? 94 95 RESOLVED: No. The implementation is not forced to use this information 96 on subsequent occurences of name/pointer, and is free to consider it 97 transient state. 98 99 (5) Should comment commands be prohibited between Begin/End? 100 101 RESOLVED: Yes, with the exception of TraceCommentMESA. TraceCommentMESA 102 is transient, the other commands might cause storage of persistent 103 data in the context. There is no need to have the ability mark names 104 or pointers between Begin and End. 105 106 107 New Procedures and Functions 108 109 void NewTraceMESA( bitfield mask, const ubyte * traceName ) 110 111 void EndTraceMESA( void ) 112 113 void EnableTraceMESA( bitfield mask ) 114 115 void DisableTraceMESA( bitfield mask ) 116 117 void TraceAssertAttribMESA( bitfield attribMask ) 118 119 void TraceCommentMESA( const ubyte* comment ) 120 121 void TraceTextureMESA( uint name, const ubyte* comment ) 122 123 void TraceListMESA( uint name, const ubyte* comment ) 124 125 void TracePointerMESA( void* pointer, const ubyte* comment ) 126 127 void TracePointerRangeMESA( const void* first, 128 const void* last, 129 const ubyte* comment ) 130 131 New Tokens 132 133 Accepted by the <mask> parameter of EnableTrace and DisableTrace: 134 135 TRACE_ALL_BITS_MESA 0xFFFF 136 TRACE_OPERATIONS_BIT_MESA 0x0001 137 TRACE_PRIMITIVES_BIT_MESA 0x0002 138 TRACE_ARRAYS_BIT_MESA 0x0004 139 TRACE_TEXTURES_BIT_MESA 0x0008 140 TRACE_PIXELS_BIT_MESA 0x0010 141 TRACE_ERRORS_BIT_MESA 0x0020 142 143 Accepted by the <pname> parameter of GetIntegerv, GetBooleanv, 144 GetFloatv, and GetDoublev: 145 146 TRACE_MASK_MESA 0x8755 147 148 Accepted by the <pname> parameter to GetString: 149 150 TRACE_NAME_MESA 0x8756 151 152 153 Additions to Chapter 2 of the OpenGL 1.2.1 Specification (OpenGL Operation) 154 155 None. 156 157 Additions to Chapter 3 of the OpenGL 1.2.1 Specification (OpenGL Operation) 158 159 None. 160 161 Additions to Chapter 4 of the OpenGL 1.2.1 Specification (OpenGL Operation) 162 163 None. 164 165 Additions to Chapter 5 of the OpenGL 1.2.1 Specification (Special Functions) 166 167 Add a new section: 168 169 5.7 Tracing 170 171 The tracing facility is used to record the execution of a GL program 172 to a human-readable log. The log appears as a sequence of GL commands 173 using C syntax. The primary intention of tracing is to aid in program 174 debugging. 175 176 A trace is started with the command 177 178 void NewTraceMESA( bitfield mask, const GLubyte * traceName ) 179 180 <mask> may be any value accepted by PushAttrib and specifies a set of 181 attribute groups. The state values included in those attribute groups 182 is written to the trace as a sequence of GL commands. 183 184 <traceName> specifies a name or label for the trace. It is expected 185 that <traceName> will be interpreted as a filename in most implementations. 186 187 A trace is ended by calling the command 188 189 void EndTraceMESA( void ) 190 191 It is illegal to call NewTraceMESA or EndTraceMESA between Begin and End. 192 193 The commands 194 195 void EnableTraceMESA( bitfield mask ) 196 void DisableTraceMESA( bitfield mask ) 197 198 enable or disable tracing of different classes of GL commands. 199 <mask> may be the union of any of TRACE_OPERATIONS_BIT_MESA, 200 TRACE_PRIMITIVES_BIT_MESA, TRACE_ARRAYS_BIT_MESA, TRACE_TEXTURES_BIT_MESA, 201 and TRACE_PIXELS_BIT_MESA. The special token TRACE_ALL_BITS_MESA 202 indicates all classes of commands are to be logged. 203 204 TRACE_OPERATIONS_BIT_MESA controls logging of all commands outside of 205 Begin/End, including Begin/End. 206 207 TRACE_PRIMITIVES_BIT_MESA controls logging of all commands inside of 208 Begin/End, including Begin/End. 209 210 TRACE_ARRAYS_BIT_MESA controls logging of VertexPointer, NormalPointer, 211 ColorPointer, IndexPointer, TexCoordPointer and EdgeFlagPointer commands. 212 213 TRACE_TEXTURES_BIT_MESA controls logging of texture data dereferenced by 214 TexImage1D, TexImage2D, TexImage3D, TexSubImage1D, TexSubImage2D, and 215 TexSubImage3D commands. 216 217 TRACE_PIXELS_BIT_MESA controls logging of image data dereferenced by 218 Bitmap and DrawPixels commands. 219 220 TRACE_ERRORS_BIT_MESA controls logging of all errors. If this bit is 221 set, GetError will be executed whereever applicable, and the result will 222 be added to the trace as a comment. The error returns are cached and 223 returned to the application on its GetError calls. If the user does not 224 wish the additional GetError calls to be performed, this bit should not 225 be set. 226 227 The command 228 229 void TraceCommentMESA( const ubyte* comment ) 230 231 immediately adds the <comment> string to the trace output, surrounded 232 by C-style comment delimiters. 233 234 The commands 235 236 void TraceTextureMESA( uint name, const ubyte* comment ) 237 void TraceListMESA( uint name, const ubyte* comment ) 238 239 associates <comment> with the texture object or display list specified 240 by <name>. Logged commands which reference the named texture object or 241 display list will be annotated with <comment>. If IsTexture(name) or 242 IsList(name) fail (respectively) the command is quietly ignored. 243 244 The commands 245 246 void TracePointerMESA( void* pointer, const ubyte* comment ) 247 248 void TracePointerRangeMESA( const void* first, 249 const void* last, 250 const ubyte* comment ) 251 252 associate <comment> with the address specified by <pointer> or with 253 a range of addresses specified by <first> through <last>. 254 Any logged commands which reference <pointer> or an address between 255 <first> and <last> will be annotated with <comment>. 256 257 The command 258 259 void TraceAssertAttribMESA( bitfield attribMask ) 260 261 will add GL state queries and assertion statements to the log to 262 confirm that the current state at the time TraceAssertAttrib is 263 executed matches the current state when the trace log is executed 264 in the future. 265 266 <attribMask> is any value accepted by PushAttrib and specifies 267 the groups of state variables which are to be asserted. 268 269 The commands NewTraceMESA, EndTraceMESA, EnableTraceMESA, DisableTraceMESA, 270 TraceAssertAttribMESA, TraceCommentMESA, TraceTextureMESA, TraceListMESA, 271 TracePointerMESA and TracePointerRangeMESA are not compiled into display lists. 272 273 274 Examples: 275 276 The command NewTraceMESA(DEPTH_BUFFER_BIT, "log") will query the state 277 variables DEPTH_TEST, DEPTH_FUNC, DEPTH_WRITEMASK, and DEPTH_CLEAR_VALUE 278 to get the values <test>, <func>, <mask>, and <clear> respectively. 279 Statements equivalent to the following will then be logged: 280 281 glEnable(GL_DEPTH_TEST); (if <test> is true) 282 glDisable(GL_DEPTH_TEST); (if <test> is false) 283 glDepthFunc(<func>); 284 glDepthMask(<mask>); 285 glClearDepth(<clear>); 286 287 288 The command TraceAssertAttribMESA(DEPTH_BUFFER_BIT) will query the state 289 variables DEPTH_TEST, DEPTH_FUNC, DEPTH_WRITEMASK, and DEPTH_CLEAR_VALUE 290 to get the values <test>, <func>, <mask>, and <clear> respectively. 291 The resulting trace might then look will like this: 292 293 { 294 GLboolean b; 295 GLint i; 296 GLfloat f; 297 b = glIsEnabled(GL_DEPTH_TEST); 298 assert(b == <test>); 299 glGetIntegerv(GL_DEPTH_FUNC, &i); 300 assert(i == <func>); 301 glGetIntegerv(GL_DEPTH_MASK, &i); 302 assert(i == <mask>); 303 glGetFloatv(GL_DEPTH_CLEAR_VALUE, &f); 304 assert(f == <clear>); 305 } 306 307 308 Additions to Chapter 6 of the OpenGL 1.2.1 Specification 309 (State and State Requests) 310 311 Querying TRACE_MASK_MESA with GetIntegerv, GetFloatv, GetBooleanv or 312 GetDoublev returns the current command class trace mask. 313 314 Querying TRACE_NAME_MESA with GetString returns the current trace name. 315 316 317 Additions to Appendix A of the OpenGL 1.2.1 Specification (Invariance) 318 319 The MESA_trace extension can be used in a way that does not affect data 320 flow from application to OpenGL, as well as data flow from OpenGL to 321 application, except for timing, possible print I/O. TRACE_ERRORS_BIT_MESA 322 will add additional GetError queries. Setting a trace mask with NewTraceMESA 323 as well as use of TraceAssertAttribMESA might cause additional state queries. 324 With the possible exception of performance, OpenGL rendering should not be 325 affected at all by a properly chosen logging operation. 326 327 Additions to the AGL/GLX/WGL Specifications 328 329 None. 330 331 GLX Protocol 332 333 None. The logging operation is carried out client-side, by exporting 334 entry points to the wrapper functions that execute the logging operation. 335 336 Errors 337 338 INVALID_OPERATION is generated if any trace command except TraceCommentMESA 339 is called between Begin and End. 340 341 New State 342 343 The current trace name and current command class mask are stored 344 per-context. 345 346 New Implementation Dependent State 347 348 None. 349 350 Revision History 351 352 * Revision 0.1 - Initial draft from template (bk000415) 353 * Revision 0.2 - Draft (bk000906) 354 * Revision 0.3 - Draft (bk000913) 355 * Revision 0.4 - Reworked text, fixed typos (bp000914) 356 * Revision 0.5 - Assigned final GLenum values (bp001103) 357 * Revision 0.6 - TRACE_ERRORS_BIT_MESA (bk000916) 358 * Revision 0.7 - Added MESA postfix (bk010126) 359 360