0,0 → 1,359 |
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 |
|
Obsolete. |
|
Version |
|
|
Number |
|
none yet |
|
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 |
|
|
(1) Is this Extension obsolete because it can |
be implemented as a wrapper DLL? |
|
RESOLVED: No. While certain operating systems (Win32) provide linkers |
that facilitate this kind of solution, other operating systems |
(Linux) do not support hierarchical linking, so a wrapper solution |
would result in symbol collisions. |
Further, IHV's might have builtin support for tracing GL execution |
that enjoys privileged access, or that they do not wish to separate |
the tracing code from their driver code base. |
|
(2) Should the Trace API explicitely support the notion of "frames? |
This would require hooking into glXSwapBuffers calls as well. |
|
RESOLVED: No. The application can use NewTraceMESA/EndTraceMESA |
and TraceComment along with external parsing tools to split the |
trace into frames, in whatever way considered adequate. |
|
(2a) Should GLX calls be traced? |
|
PBuffers and other render-to-texture solutions demonstrate that |
context level commands beyond SwapBuffers might have to be |
traced. The GL DLL exports the entry points, so this would not |
be out of the question. |
|
(3) Should the specification mandate the actual output format? |
|
RESOLVED: No. It is sufficient to guarantee that all data and commands |
will be traced as requested by Enable/DisableTraceMESA, in the order |
encountered. Whether the resulting trace is available as a readable |
text file, binary metafile, compilable source code, much less which |
indentation and formatting has been used, is up to the implementation. |
For the same reason this specification does not enforce or prohibit |
additional information added to the trace (statistics, profiling/timing, |
warnings on possible error conditions). |
|
(4) Should the comment strings associated with names and pointer (ranges) |
be considered persistent state? |
|
RESOLVED: No. The implementation is not forced to use this information |
on subsequent occurences of name/pointer, and is free to consider it |
transient state. |
|
(5) Should comment commands be prohibited between Begin/End? |
|
RESOLVED: Yes, with the exception of TraceCommentMESA. TraceCommentMESA |
is transient, the other commands might cause storage of persistent |
data in the context. There is no need to have the ability mark names |
or pointers between Begin and End. |
|
|
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 0xFFFF |
TRACE_OPERATIONS_BIT_MESA 0x0001 |
TRACE_PRIMITIVES_BIT_MESA 0x0002 |
TRACE_ARRAYS_BIT_MESA 0x0004 |
TRACE_TEXTURES_BIT_MESA 0x0008 |
TRACE_PIXELS_BIT_MESA 0x0010 |
TRACE_ERRORS_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 NewTraceMESA or EndTraceMESA 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. |
|
TRACE_ERRORS_BIT_MESA controls logging of all errors. If this bit is |
set, GetError will be executed whereever applicable, and the result will |
be added to the trace as a comment. The error returns are cached and |
returned to the application on its GetError calls. If the user does not |
wish the additional GetError calls to be performed, this bit should not |
be set. |
|
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 NewTraceMESA, EndTraceMESA, EnableTraceMESA, DisableTraceMESA, |
TraceAssertAttribMESA, TraceCommentMESA, TraceTextureMESA, TraceListMESA, |
TracePointerMESA and TracePointerRangeMESA are not compiled into display lists. |
|
|
Examples: |
|
The command NewTraceMESA(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 TraceAssertAttribMESA(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. |
The resulting trace might then look will like this: |
|
{ |
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_trace extension can be used in a way that 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. TRACE_ERRORS_BIT_MESA |
will add additional GetError queries. Setting a trace mask with NewTraceMESA |
as well as use of TraceAssertAttribMESA might cause additional state queries. |
With the possible exception of performance, OpenGL rendering should not be |
affected at all by a properly chosen logging operation. |
|
Additions to the AGL/GLX/WGL Specifications |
|
None. |
|
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 TraceCommentMESA |
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 - Reworked text, fixed typos (bp000914) |
* Revision 0.5 - Assigned final GLenum values (bp001103) |
* Revision 0.6 - TRACE_ERRORS_BIT_MESA (bk000916) |
* Revision 0.7 - Added MESA postfix (bk010126) |
|