298 lines
9.3 KiB
Python
298 lines
9.3 KiB
Python
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 <mask> 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 <pname> parameter of GetIntegerv, GetBooleanv,
|
|
GetFloatv, and GetDoublev:
|
|
|
|
TRACE_MASK_MESA 0x8755
|
|
|
|
Accepted by the <pname> 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 )
|
|
|
|
<mask> 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.
|
|
|
|
<traceName> specifies a name or label for the trace. It is expected
|
|
that <traceName> 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.
|
|
<mask> 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 <comment> 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 <comment> with the texture object or display list specified
|
|
by <name>. Logged commands which reference the named texture object or
|
|
display list will be annotated with <comment>. 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 <comment> with the address specified by <pointer> or with
|
|
a range of addresses specified by <first> through <last>.
|
|
Any logged commands which reference <pointer> or an address between
|
|
<first> and <last> will be annotated with <comment>.
|
|
|
|
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.
|
|
|
|
<attribMask> 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 <test>, <func>, <mask>, and <clear> respectively.
|
|
Statements equivalent to the following will then be logged:
|
|
|
|
glEnable(GL_DEPTH_TEST); (if <test> is true)
|
|
glDisable(GL_DEPTH_TEST); (if <test> is false)
|
|
glDepthFunc(<func>);
|
|
glDepthMask(<mask>);
|
|
glClearDepth(<clear>);
|
|
|
|
|
|
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 <test>, <func>, <mask>, and <clear> respectively.
|
|
Statements equivalent to the following will then be logged:
|
|
|
|
{
|
|
GLboolean b;
|
|
GLint i;
|
|
GLfloat f;
|
|
b = glIsEnabled(GL_DEPTH_TEST);
|
|
assert(b == <test>);
|
|
glGetIntegerv(GL_DEPTH_FUNC, &i);
|
|
assert(i == <func>);
|
|
glGetIntegerv(GL_DEPTH_MASK, &i);
|
|
assert(i == <mask>);
|
|
glGetFloatv(GL_DEPTH_CLEAR_VALUE, &f);
|
|
assert(f == <clear>);
|
|
}
|
|
|
|
|
|
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
|