OSDN Git Service

docs: document how to apply a candidate to a stable branch
[android-x86/external-mesa.git] / docs / OLD / MESA_trace.spec
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