]> git.cworth.org Git - apitrace/blob - glretrace.py
Eliminate more string comparisons.
[apitrace] / glretrace.py
1 ##########################################################################
2 #
3 # Copyright 2010 VMware, Inc.
4 # All Rights Reserved.
5 #
6 # Permission is hereby granted, free of charge, to any person obtaining a copy
7 # of this software and associated documentation files (the "Software"), to deal
8 # in the Software without restriction, including without limitation the rights
9 # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 # copies of the Software, and to permit persons to whom the Software is
11 # furnished to do so, subject to the following conditions:
12 #
13 # The above copyright notice and this permission notice shall be included in
14 # all copies or substantial portions of the Software.
15 #
16 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 # THE SOFTWARE.
23 #
24 ##########################################################################/
25
26
27 import stdapi
28 import glapi
29 from retrace import Retracer
30
31
32 class GlRetracer(Retracer):
33
34     def filter_function(self, function):
35         return function.name not in [
36             "glNewBufferRegion",
37             "glDeleteBufferRegion",
38             "glReadBufferRegion",
39             "glDrawBufferRegion",
40             "glBufferRegionEnabled",
41         ]
42
43     def retrace_function(self, function):
44         Retracer.retrace_function(self, function)
45
46     def call_function(self, function):
47         if function.name in ("glDrawArrays", "glDrawElements", "glDrawRangeElements", "glMultiDrawElements"):
48             print '    GLint __array_buffer = 0;'
49             print '    glGetIntegerv(GL_ARRAY_BUFFER_BINDING, &__array_buffer);'
50             print '    if (!__array_buffer) {'
51             self.fail_function(function)
52             print '    }'
53
54         if function.name == "glEnd":
55             print '    insideGlBeginEnd = false;'
56         Retracer.call_function(self, function)
57         if function.name == "glBegin":
58             print '    insideGlBeginEnd = true;'
59         else:
60             # glGetError is not allowed inside glBegin/glEnd
61             print '    checkGlError();'
62
63
64     def extract_arg(self, function, arg, arg_type, lvalue, rvalue):
65         if function.name in [
66             "glColorPointer",
67             "glEdgeFlagPointer",
68             "glIndexPointer",
69             "glNormalPointer",
70             "glTexCoordPointer",
71             "glVertexPointer",
72             "glFogCoordPointer",
73             "glSecondaryColorPointer",
74             "glVertexAttribPointer",
75         ] and arg.name == 'pointer':
76             self.extract_pointer(function, arg, arg_type, lvalue, rvalue)
77         else:
78             Retracer.extract_arg(self, function, arg, arg_type, lvalue, rvalue)
79
80     def extract_pointer(self, function, arg, arg_type, lvalue, rvalue):
81         print '    if (dynamic_cast<Trace::Null *>(&%s)) {' % rvalue
82         print '        %s = 0;' % (lvalue)
83         print '    } else {'
84         print '        %s = (%s)(uintptr_t)(%s);' % (lvalue, arg_type, rvalue)
85         print '    }'
86
87
88 if __name__ == '__main__':
89     print
90     print '#include <string.h>'
91     print '#include <iostream>'
92     print
93     print '#ifdef WIN32'
94     print '#include <windows.h>'
95     print '#endif'
96     print
97     print '#include <GL/glew.h>'
98     print '#include <GL/glut.h>'
99     print
100     print 'static bool double_buffer = false;'
101     print 'static bool insideGlBeginEnd = false;'
102     print
103     print '''
104 static void
105 checkGlError(void) {
106     if (insideGlBeginEnd) {
107         return;
108     }
109
110     GLenum error = glGetError();
111     if (error == GL_NO_ERROR) {
112         return;
113     }
114
115     std::cerr << "warning: glGetError() = ";
116     switch (error) {
117     case GL_INVALID_ENUM:
118         std::cerr << "GL_INVALID_ENUM";
119         break;
120     case GL_INVALID_VALUE:
121         std::cerr << "GL_INVALID_VALUE";
122         break;
123     case GL_INVALID_OPERATION:
124         std::cerr << "GL_INVALID_OPERATION";
125         break;
126     case GL_STACK_OVERFLOW:
127         std::cerr << "GL_STACK_OVERFLOW";
128         break;
129     case GL_STACK_UNDERFLOW:
130         std::cerr << "GL_STACK_UNDERFLOW";
131         break;
132     case GL_OUT_OF_MEMORY:
133         std::cerr << "GL_OUT_OF_MEMORY";
134         break;
135     case GL_INVALID_FRAMEBUFFER_OPERATION:
136         std::cerr << "GL_INVALID_FRAMEBUFFER_OPERATION";
137         break;
138     case GL_TABLE_TOO_LARGE:
139         std::cerr << "GL_TABLE_TOO_LARGE";
140         break;
141     default:
142         std::cerr << error;
143         break;
144     }
145     std::cerr << "\\n";
146 }
147 '''
148     api = glapi.glapi
149     retracer = GlRetracer()
150     retracer.retrace_api(glapi.glapi)
151     print '''
152
153 static Trace::Parser parser;
154
155 static void display(void) {
156     Trace::Call *call;
157
158     while ((call = parser.parse_call())) {
159         if (call->name() == "glFlush") {
160             glFlush();
161             return;
162         }
163         
164         if (!retrace_call(*call)) {
165             if (call->name() == "glXSwapBuffers" ||
166                 call->name() == "wglSwapBuffers") {
167                 if (double_buffer)
168                     glutSwapBuffers();
169                 else
170                     glFlush();
171                 return;
172             }
173         }
174     }
175
176     glFlush();
177     glutIdleFunc(NULL);
178 }
179
180 static void idle(void) {
181     glutPostRedisplay();
182 }
183
184 int main(int argc, char **argv)
185 {
186
187     int i;
188     for (i = 1; i < argc; ++i) {
189         const char *arg = argv[i];
190
191         if (arg[0] != '-') {
192             break;
193         }
194
195         if (!strcmp(arg, "--")) {
196             break;
197         }
198         else if (!strcmp(arg, "-db")) {
199             double_buffer = true;
200         } else if (!strcmp(arg, "-v")) {
201             ++verbosity;
202         } else {
203             std::cerr << "error: unknown option " << arg << "\\n";
204             return 1;
205         }
206     }
207
208     glutInit(&argc, argv);
209     glutInitWindowPosition(0, 0);
210     glutInitWindowSize(800, 600);
211     glutInitDisplayMode(GLUT_DEPTH | GLUT_RGB | (double_buffer ? GLUT_DOUBLE : GLUT_SINGLE));
212     glutCreateWindow(argv[0]);
213     glewInit();
214
215     glutDisplayFunc(&display);
216     glutIdleFunc(&idle);
217
218     for (GLuint h = 0; h < 1024; ++h) {
219         __list_map[h] = h;
220     }
221
222     for ( ; i < argc; ++i) {
223         if (parser.open(argv[i])) {
224             glutMainLoop();
225             parser.close();
226         }
227     }
228
229     return 0;
230 }
231
232 '''