OSDN Git Service

docs: document how to apply a candidate to a stable branch
[android-x86/external-mesa.git] / docs / OLD / MESA_program_debug.spec
1 Name
2
3     MESA_program_debug
4
5 Name Strings
6
7     GL_MESA_program_debug
8
9 Contact
10
11     Brian Paul (brian.paul 'at' tungstengraphics.com)
12
13 Status
14
15     XXX - Not complete yet!!!
16
17 Version
18
19     Last Modified Date: July 20, 2003
20     Author Revision: 1.0
21
22 Number
23
24     TBD
25
26 Dependencies
27
28     OpenGL 1.4 is required
29     The extension is written against the OpenGL 1.4 specification.
30     ARB_vertex_program or ARB_fragment_program or NV_vertex_program
31     or NV_fragment_program is required.
32
33 Overview
34
35     The extension provides facilities for implementing debuggers for
36     vertex and fragment programs.
37
38     The concept is that vertex and fragment program debuggers will be
39     implemented outside of the GL as a utility package.  This extension
40     only provides the minimal hooks required to implement a debugger.
41
42     There are facilities to do the following:
43     1. Have the GL call a user-specified function prior to executing
44        each vertex or fragment instruction.
45     2. Query the current program string's execution position.
46     3. Query the current values of intermediate program values.
47
48     The main feature is the ProgramCallbackMESA function.  It allows the
49     user to register a callback function with the GL.  The callback will
50     be called prior to executing each vertex or fragment program instruction.
51
52     From within the callback, the user may issue Get* commands to
53     query current GL state.  The GetProgramRegisterfvMESA function allows
54     current program values to be queried (such as temporaries, input
55     attributes, and result registers).
56
57     There are flags for enabling/disabling the program callbacks.
58
59     The current execution position (as an offset from the start of the
60     program string) can be queried with
61     GetIntegerv(GL_FRAGMENT_PROGRAM_POSITION_MESA, &pos) or
62     GetIntegerv(GL_VERTEX_PROGRAM_POSITION_MESA, &pos).
63
64
65 IP Status
66
67     None
68
69 Issues
70
71     1. Is this the right model for a debugger?
72
73        It seems prudent to minimize the scope of this extension and leave
74        it up to the developer (or developer community) to write debuggers
75        that layer on top of this extension.
76
77        If the debugger were fully implemented within the GL it's not
78        clear how terminal and GUI-based interfaces would work, for
79        example.
80
81     2. There aren't any other extensions that register callbacks with
82        the GL.  Isn't there another solution?
83
84        If we want to be able to single-step through vertex/fragment
85        programs I don't see another way to do it.
86
87     3. How do we prevent the user from doing something crazy in the
88        callback function, like trying to call glBegin (leading to
89        recursion)?
90
91        The rule is that the callback function can only issue glGet*()
92        functions and no other GL commands.  It could be difficult to
93        enforce this, however.  Therefore, calling any non-get GL
94        command from within the callback will result in undefined
95        results.    
96
97     4. Is this extension amenable to hardware implementation?
98
99        Hopefully, but if not, the GL implementation will have to fall
100        back to a software path when debugging.  This may be acceptable
101        for debugging.
102
103     5. What's the <data> parameter to ProgramCallbackMESA for?
104
105        It's a common programming practice to associate a user-supplied
106        value with callback functions.
107
108     6. Debuggers often allow one to modify intermediate program values,
109        then continue.  Does this extension support that?
110
111        No.
112
113
114 New Procedures and Functions (and datatypes)
115
116     typedef void (*programcallbackMESA)(enum target, void *data)
117
118     void ProgramCallbackMESA(enum target, programcallbackMESA callback,
119                              void *data)
120
121     void GetProgramRegisterfvMESA(enum target, sizei len,
122                                   const ubyte *registerName, float *v)
123
124 New Tokens
125
126     Accepted by the <cap> parameter of Enable, Disable, IsEnabled,
127     GetBooleanv, GetDoublev, GetFloatv and GetIntegerv:
128
129         FRAGMENT_PROGRAM_CALLBACK_MESA      0x8bb1
130         VERTEX_PROGRAM_CALLBACK_MESA        0x8bb4
131
132     Accepted by the <pname> parameter GetBooleanv, GetDoublev,
133     GetFloatv and GetIntegerv:
134
135         FRAGMENT_PROGRAM_POSITION_MESA      0x8bb0
136         VERTEX_PROGRAM_POSITION_MESA        0x8bb4
137
138     Accepted by the <pname> parameter of GetPointerv:
139
140         FRAGMENT_PROGRAM_CALLBACK_FUNC_MESA 0x8bb2
141         FRAGMENT_PROGRAM_CALLBACK_DATA_MESA 0x8bb3
142         VERTEX_PROGRAM_CALLBACK_FUNC_MESA   0x8bb6
143         VERTEX_PROGRAM_CALLBACK_DATA_MESA   0x8bb7
144
145 Additions to Chapter 2 of the OpenGL 1.4 Specification (OpenGL Operation)
146
147     None.
148
149 Additions to Chapter 3 of the OpenGL 1.4 Specification (Rasterization)
150
151     None.
152
153 Additions to Chapter 4 of the OpenGL 1.4 Specification (Per-Fragment
154 Operations and the Frame Buffer)
155
156     None.
157
158 Additions to Chapter 5 of the OpenGL 1.4 Specification (Special Functions)
159
160     In section 5.4 "Display Lists", page 202, add the following command
161     to the list of those that are not compiled into display lists:
162
163         ProgramCallbackMESA.
164
165
166     Add a new section 5.7 "Callback Functions"
167
168     The function
169
170         void ProgramCallbackMESA(enum target, programcallbackMESA callback,
171                                  void *data)
172
173     registers a user-defined callback function with the GL.  <target>
174     may be FRAGMENT_PROGRAM_ARB or VERTEX_PROGRAM_ARB.  The enabled
175     callback functions registered with these targets will be called
176     prior to executing each instruction in the current fragment or
177     vertex program, respectively.  The callbacks are enabled and
178     disabled by calling Enable or Disable with <cap>
179     FRAGMENT_PROGRAM_ARB or VERTEX_PROGRAM_ARB.
180
181     The callback function's signature must match the typedef
182
183         typedef void (*programcallbackMESA)(enum target, void *data)
184
185     When the callback function is called, <target> will either be
186     FRAGMENT_PROGRAM_ARB or VERTEX_PROGRAM_ARB to indicate which
187     program is currently executing and <data> will be the value
188     specified when ProgramCallbackMESA was called.
189
190     From within the callback function, only the following GL commands
191     may be called:
192
193         GetBooleanv
194         GetDoublev
195         GetFloatv
196         GetIntegerv
197         GetProgramLocalParameter
198         GetProgramEnvParameter
199         GetProgramRegisterfvMESA
200         GetProgramivARB
201         GetProgramStringARB
202         GetError
203
204     Calling any other command from within the callback results in
205     undefined behaviour.
206
207
208 Additions to Chapter 6 of the OpenGL 1.4 Specification (State and
209 State Requests)
210
211     Add a new section 6.1.3 "Program Value Queries":
212
213     The command
214
215         void GetProgramRegisterfvMESA(enum target, sizei len,
216                                       const ubyte *registerName,
217                                       float *v)
218         
219     Is used to query the value of program variables and registers
220     during program execution.  GetProgramRegisterfvMESA may only be
221     called from within a callback function registered with
222     ProgramCallbackMESA.
223
224     <registerName> and <len> specify the name a variable, input
225     attribute, temporary, or result register in the program string.
226     The current value of the named variable is returned as four
227     values in <v>.  If <name> doesn't exist in the program string,
228     the error INVALID_OPERATION is generated.
229
230 Additions to Appendix A of the OpenGL 1.4 Specification (Invariance)
231
232     None.
233
234 Additions to the AGL/GLX/WGL Specifications
235
236     None.
237
238 GLX Protocol
239
240     XXX TBD
241
242 Dependencies on NV_vertex_program and NV_fragment_program
243
244     If NV_vertex_program and/or NV_fragment_program are supported,
245     vertex and/or fragment programs defined by those extensions may
246     be debugged as well.  Register queries will use the syntax used
247     by those extensions (i.e. "v[X]" to query vertex attributes,
248     "o[X]" for vertex outputs, etc.)
249
250 Errors
251
252     INVALID_OPERATION is generated if ProgramCallbackMESA is called
253     between Begin and End.
254
255     INVALID_ENUM is generated by ProgramCallbackMESA if <target> is not
256     a supported vertex or fragment program type.
257
258     Note: INVALID_OPERAION IS NOT generated by GetProgramRegisterfvMESA,
259     GetBooleanv, GetDoublev, GetFloatv, or GetIntegerv if called between
260     Begin and End when a vertex or fragment program is currently executing.
261
262     INVALID_ENUM is generated by ProgramCallbackMESA,
263     GetProgramRegisterfvMESA if <target> is not a program target supported
264     by ARB_vertex_program, ARB_fragment_program (or NV_vertex_program or
265     NV_fragment_program).
266
267     INVALID_VALUE is generated by GetProgramRegisterfvMESA if <registerName>
268     does not name a known program register or variable.
269
270     INVALID_OPERATION is generated by GetProgramRegisterfvMESA when a
271     register query is attempted for a program target that's not currently
272     being executed.
273
274
275 New State
276
277     XXX finish
278
279 (table 6.N, p. ###)
280                                                             Initial
281     Get Value                            Type Get Command   Value    Description  Sec.  Attribute
282     ---------                            ---- -----------   -----    -----------  ----  ---------
283     FRAGMENT_PROGRAM_CALLBACK_MESA        B   IsEnabled     FALSE    XXX          XXX   enable
284     VERTEX_PROGRAM_CALLBACK_MESA          B   IsEnabled     FALSE    XXX          XXX   enable
285     FRAGMENT_PROGRAM_POSITION_MESA        Z+  GetIntegerv   -1       XXX          XXX   -
286     VERTEX_PROGRAM_POSITION_MESA          Z+  GetIntegerv   -1       XXX          XXX   -
287     FRAGMENT_PROGRAM_CALLBACK_FUNC_MESA   P   GetPointerv   NULL     XXX          XXX   -
288     VERTEX_PROGRAM_CALLBACK_FUNC_MESA     P   GetPointerv   NULL     XXX          XXX   -
289     FRAGMENT_PROGRAM_CALLBACK_DATA_MESA   P   GetPointerv   NULL     XXX          XXX   -
290     VERTEX_PROGRAM_CALLBACK_DATA_MESA     P   GetPointerv   NULL     XXX          XXX   -
291
292     XXX more?
293
294 New Implementation Dependent State
295
296     None.
297
298 Revision History
299
300     8 July 2003
301         Initial draft. (Brian Paul)
302     11 July 2003
303         Second draft. (Brian Paul)
304     20 July 2003
305         Third draft.  Lots of fundamental changes. (Brian Paul)
306     23 July 2003
307         Added chapter 5 and 6 spec language. (Brian Paul)
308
309 Example Usage
310
311    The following is a very simple example of how this extension may
312    be used to print the values of R0, R1, R2 and R3 while executing
313    vertex programs.
314
315
316     /* This is called by the GL when the vertex program is executing.
317      * We can only make glGet* calls from within this function!
318      */
319     void DebugCallback(GLenum target, GLvoid *data)
320     {
321        GLint pos;
322        GLuint i;
323
324        /* Get PC and current instruction string */
325        glGetIntegerv(GL_VERTEX_PROGRAM_POSITION_ARB, &pos);
326
327        printf("Current position: %d\n", pos);
328
329        printf("Current temporary registers:\n");
330        for (i = 0; i < 4; i++) {
331           GLfloat v[4];
332           char s[10];
333           sprintf(s, "R%d", i);
334           glGetProgramRegisterfvMESA(GL_VERTEX_PROGRAM_ARB, strlen(s), s, v);
335           printf("R%d = %g, %g, %g, %g\n", i, v[0], v[1], v[2], v[3]);
336        }
337     }
338
339
340     /*
341      * elsewhere...
342      */
343
344     /* Register our debugger callback function */
345     glProgramCallbackMESA(GL_VERTEX_PROGRAM_ARB, DebugCallback, NULL);
346     glEnable(GL_VERTEX_PROGRAM_CALLBACK_MESA);
347
348     /* define/bind a vertex program */
349
350     glEnable(GL_VERTEX_PROGRAM);
351
352     /* render something */
353     glBegin(GL_POINTS);
354     glVertex2f(0, 0);
355     glEnd();
356