Home | History | Annotate | Download | only in OLD
      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