XXX - Not complete yet!!! Name MESA_trace Name Strings GL_MESA_TRACE Contact Bernd Kreimeier, Loki Entertainment, bk 'at' lokigames.com Brian Paul, VA Linux Systems, Inc., brianp 'at' valinux.com Status XXX - Not complete yet!!! Version $Id: MESA_trace.spec,v 1.1 2000/11/03 15:10:04 brianp Exp $ Number ??? Dependencies OpenGL 1.2 is required. The extension is written against the OpenGL 1.2 Specification Overview Provides the application with means to enable and disable logging of GL calls including parameters as readable text. The verbosity of the generated log can be controlled. The resulting logs are valid (but possibly incomplete) C code and can be compiled and linked for standalone test programs. The set of calls and the amount of static data that is logged can be controlled at runtime. The application can add comments and enable or disable tracing of GL operations at any time. The data flow from the application to GL and back is unaffected except for timing. Application-side implementation of these features raises namespace and linkage issues. In the driver dispatch table a simple "chain of responsibility" pattern (aka "composable piepline") can be added. IP Status The extension spec is in the public domain. The current implementation in Mesa is covered by Mesa's XFree86-style copyright by the authors above. This extension is partially inspired by the Quake2 QGL wrapper. Issues none yet New Procedures and Functions void NewTraceMESA( bitfield mask, const ubyte *traceName ) void EndTraceMESA( void ) void EnableTraceMESA( bitfield mask ) void DisableTraceMESA( bitfield mask ) void TraceAssertAttribMESA( bitfield attribMask ) void TraceCommentMESA( const ubyte *comment ) void TraceTextureMESA( uint name, const ubyte *comment ) void TraceListMESA( uint name, const ubyte *comment ) void TracePointerMESA( void *pointer, const ubyte *comment ) void TracePointerRangeMESA( const void *first, const void *last, const ubyte *comment ) New Tokens Accepted by the parameter of EnableTrace and DisableTrace: TRACE_ALL_BITS_MESA 0x0001 TRACE_OPERATIONS_BIT_MESA 0x0002 TRACE_PRIMITIVES_BIT_MESA 0x0004 TRACE_ARRAYS_BIT_MESA 0x0008 TRACE_TEXTURES_BIT_MESA 0x0010 TRACE_PIXELS_BIT_MESA 0x0020 Accepted by the parameter of GetIntegerv, GetBooleanv, GetFloatv, and GetDoublev: TRACE_MASK_MESA 0x8755 Accepted by the parameter to GetString: TRACE_NAME_MESA 0x8756 Additions to Chapter 2 of the OpenGL 1.2.1 Specification (OpenGL Operation) None. Additions to Chapter 3 of the OpenGL 1.2.1 Specification (OpenGL Operation) None. Additions to Chapter 4 of the OpenGL 1.2.1 Specification (OpenGL Operation) None. Additions to Chapter 5 of the OpenGL 1.2.1 Specification (Special Functions) Add a new section: 5.7 Tracing The tracing facility is used to record the execution of a GL program to a human-readable log. The log appears as a sequence of GL commands using C syntax. The primary intention of tracing is to aid in program debugging. A trace is started with the command void NewTraceMESA( bitfield mask, const GLubyte * traceName ) may be any value accepted by PushAttrib and specifies a set of attribute groups. The state values included in those attribute groups is written to the trace as a sequence of GL commands. specifies a name or label for the trace. It is expected that will be interpreted as a filename in most implementations. A trace is ended by calling the command void EndTraceMESA( void ) It is illegal to call NewTrace or EndTrace between Begin and End. The commands void EnableTraceMESA( bitfield mask ) void DisableTraceMESA( bitfield mask ) enable or disable tracing of different classes of GL commands. may be the union of any of TRACE_OPERATIONS_BIT_MESA, TRACE_PRIMITIVES_BIT_MESA, TRACE_ARRAYS_BIT_MESA, TRACE_TEXTURES_BIT_MESA, and TRACE_PIXELS_BIT_MESA. The special token TRACE_ALL_BITS_MESA indicates all classes of commands are to be logged. TRACE_OPERATIONS_BIT_MESA controls logging of all commands outside of Begin/End, including Begin/End. TRACE_PRIMITIVES_BIT_MESA controls logging of all commands inside of Begin/End, including Begin/End. TRACE_ARRAYS_BIT_MESA controls logging of VertexPointer, NormalPointer, ColorPointer, IndexPointer, TexCoordPointer and EdgeFlagPointer commands. TRACE_TEXTURES_BIT_MESA controls logging of texture data dereferenced by TexImage1D, TexImage2D, TexImage3D, TexSubImage1D, TexSubImage2D, and TexSubImage3D commands. TRACE_PIXELS_BIT_MESA controls logging of image data dereferenced by Bitmap and DrawPixels commands. The command void TraceCommentMESA( const ubyte* comment ) immediately adds the string to the trace output, surrounded by C-style comment delimiters. The commands void TraceTextureMESA( uint name, const ubyte* comment ) void TraceListMESA( uint name, const ubyte* comment ) associates with the texture object or display list specified by . Logged commands which reference the named texture object or display list will be annotated with . If IsTexture(name) or IsList(name) fail (respectively) the command is quietly ignored. The commands void TracePointerMESA( void* pointer, const ubyte* comment ) void TracePointerRangeMESA( const void* first, const void* last, const ubyte* comment ) associate with the address specified by or with a range of addresses specified by through . Any logged commands which reference or an address between and will be annotated with . The command void TraceAssertAttribMESA( bitfield attribMask ) will add GL state queries and assertion statements to the log to confirm that the current state at the time TraceAssertAttrib is executed matches the current state when the trace log is executed in the future. is any value accepted by PushAttrib and specifies the groups of state variables which are to be asserted. The commands NewTrace, EndTrace, EnableTrace, DisableTrace, TraceAssertAttrib, TraceComment, TraceTexture, TraceList, TracePointer, TracePointerRange, GetTraceName and GetTraceMask are not compiled into display lists. Examples: The command NewTrace(DEPTH_BUFFER_BIT, "log") will query the state variables DEPTH_TEST, DEPTH_FUNC, DEPTH_WRITEMASK, and DEPTH_CLEAR_VALUE to get the values , , , and respectively. Statements equivalent to the following will then be logged: glEnable(GL_DEPTH_TEST); (if is true) glDisable(GL_DEPTH_TEST); (if is false) glDepthFunc(); glDepthMask(); glClearDepth(); The command TraceAssertAttrib(DEPTH_BUFFER_BIT) will query the state variables DEPTH_TEST, DEPTH_FUNC, DEPTH_WRITEMASK, and DEPTH_CLEAR_VALUE to get the values , , , and respectively. Statements equivalent to the following will then be logged: { GLboolean b; GLint i; GLfloat f; b = glIsEnabled(GL_DEPTH_TEST); assert(b == ); glGetIntegerv(GL_DEPTH_FUNC, &i); assert(i == ); glGetIntegerv(GL_DEPTH_MASK, &i); assert(i == ); glGetFloatv(GL_DEPTH_CLEAR_VALUE, &f); assert(f == ); } Additions to Chapter 6 of the OpenGL 1.2.1 Specification (State and State Requests) Querying TRACE_MASK_MESA with GetIntegerv, GetFloatv, GetBooleanv or GetDoublev returns the current command class trace mask. Querying TRACE_NAME_MESA with GetString returns the current trace name. Additions to Appendix A of the OpenGL 1.2.1 Specification (Invariance) The MESA_tracelog extension does not affect data flow from application to OpenGL, as well as data flow from OpenGL to application, except for timing, possible print I/O, and sequence of GetError queries. With the possible exception of performance, OpenGL rendering should not be affect by the logging operation. Additions to the AGL/GLX/WGL Specifications None. ? Hooking into glXSwapBuffers() ? GLX Protocol None. The logging operation is carried out client-side, by exporting entry points to the wrapper functions that execute the logging operation. Errors INVALID_OPERATION is generated if any trace command except TraceComment is called between Begin and End. New State The current trace name and current command class mask are stored per-context. New Implementation Dependent State None. Revision History * Revision 0.1 - Initial draft from template (bk000415) * Revision 0.2 - Draft (bk000906) * Revision 0.3 - Draft (bk000913) * Revision 0.4 - Added GetTraceName/Mask, fixed typos (bp000914) * Revision 0.5 - Assigned final GLenum values