]> git.cworth.org Git - apitrace/blob - glretrace_glx.cpp
Use regular C strings everywhere.
[apitrace] / glretrace_glx.cpp
1 /**************************************************************************
2  *
3  * Copyright 2011 Jose Fonseca
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 #include "glproc.hpp"
28 #include "retrace.hpp"
29 #include "glretrace.hpp"
30
31
32 using namespace glretrace;
33
34
35 typedef std::map<unsigned long, glws::Drawable *> DrawableMap;
36 typedef std::map<void *, glws::Context *> ContextMap;
37 static DrawableMap drawable_map;
38 static ContextMap context_map;
39
40
41 static glws::Drawable *
42 getDrawable(unsigned long drawable_id) {
43     if (drawable_id == 0) {
44         return NULL;
45     }
46
47     DrawableMap::const_iterator it;
48     it = drawable_map.find(drawable_id);
49     if (it == drawable_map.end()) {
50         return (drawable_map[drawable_id] = ws->createDrawable(visual));
51     }
52
53     return it->second;
54 }
55
56 static void retrace_glXChooseVisual(Trace::Call &call) {
57 }
58
59 static void retrace_glXCreateContext(Trace::Call &call) {
60     void * orig_context = call.ret->toPointer();
61     glws::Context *share_context = NULL;
62
63     if (call.arg(2).toPointer()) {
64         share_context = context_map[call.arg(2).toPointer()];
65     }
66
67     glws::Context *context = ws->createContext(glretrace::visual, share_context);
68     context_map[orig_context] = context;
69 }
70
71 static void retrace_glXDestroyContext(Trace::Call &call) {
72 }
73
74 static void retrace_glXMakeCurrent(Trace::Call &call) {
75     glws::Drawable *new_drawable = getDrawable(call.arg(1).toUInt());
76     glws::Context *new_context = context_map[call.arg(2).toPointer()];
77
78     if (new_drawable == drawable && new_context == context) {
79         return;
80     }
81
82     if (drawable && context) {
83         glFlush();
84         if (!double_buffer) {
85             frame_complete(call.no);
86         }
87     }
88
89     bool result = ws->makeCurrent(new_drawable, new_context);
90
91     if (new_drawable && new_context && result) {
92         drawable = new_drawable;
93         context = new_context;
94     } else {
95         drawable = NULL;
96         context = NULL;
97     }
98 }
99
100 static void retrace_glXCopyContext(Trace::Call &call) {
101 }
102
103 static void retrace_glXSwapBuffers(Trace::Call &call) {
104     frame_complete(call.no);
105     if (double_buffer) {
106         drawable->swapBuffers();
107     } else {
108         glFlush();
109     }
110 }
111
112 static void retrace_glXCreateGLXPixmap(Trace::Call &call) {
113 }
114
115 static void retrace_glXDestroyGLXPixmap(Trace::Call &call) {
116 }
117
118 static void retrace_glXQueryExtension(Trace::Call &call) {
119 }
120
121 static void retrace_glXQueryVersion(Trace::Call &call) {
122 }
123
124 static void retrace_glXIsDirect(Trace::Call &call) {
125 }
126
127 static void retrace_glXGetConfig(Trace::Call &call) {
128 }
129
130 static void retrace_glXWaitGL(Trace::Call &call) {
131 }
132
133 static void retrace_glXWaitX(Trace::Call &call) {
134 }
135
136 static void retrace_glXUseXFont(Trace::Call &call) {
137 }
138
139 static void retrace_glXQueryExtensionsString(Trace::Call &call) {
140 }
141
142 static void retrace_glXQueryServerString(Trace::Call &call) {
143 }
144
145 static void retrace_glXGetClientString(Trace::Call &call) {
146 }
147
148 static void retrace_glXChooseFBConfig(Trace::Call &call) {
149 }
150
151 static void retrace_glXGetFBConfigAttrib(Trace::Call &call) {
152 }
153
154 static void retrace_glXGetFBConfigs(Trace::Call &call) {
155 }
156
157 static void retrace_glXGetVisualFromFBConfig(Trace::Call &call) {
158 }
159
160 static void retrace_glXCreateWindow(Trace::Call &call) {
161 }
162
163 static void retrace_glXDestroyWindow(Trace::Call &call) {
164 }
165
166 static void retrace_glXCreatePixmap(Trace::Call &call) {
167 }
168
169 static void retrace_glXDestroyPixmap(Trace::Call &call) {
170 }
171
172 static void retrace_glXCreatePbuffer(Trace::Call &call) {
173 }
174
175 static void retrace_glXDestroyPbuffer(Trace::Call &call) {
176 }
177
178 static void retrace_glXQueryDrawable(Trace::Call &call) {
179 }
180
181 static void retrace_glXCreateNewContext(Trace::Call &call) {
182     void * orig_context = call.ret->toPointer();
183     glws::Context *share_context = NULL;
184
185     if (call.arg(3).toPointer()) {
186         share_context = context_map[call.arg(3).toPointer()];
187     }
188
189     glws::Context *context = ws->createContext(glretrace::visual, share_context);
190     context_map[orig_context] = context;
191 }
192
193 static void retrace_glXMakeContextCurrent(Trace::Call &call) {
194     glws::Drawable *new_drawable = getDrawable(call.arg(1).toUInt());
195     glws::Context *new_context = context_map[call.arg(3).toPointer()];
196
197     if (new_drawable == drawable && new_context == context) {
198         return;
199     }
200
201     if (drawable && context) {
202         glFlush();
203         if (!double_buffer) {
204             frame_complete(call.no);
205         }
206     }
207
208     bool result = ws->makeCurrent(new_drawable, new_context);
209
210     if (new_drawable && new_context && result) {
211         drawable = new_drawable;
212         context = new_context;
213     } else {
214         drawable = NULL;
215         context = NULL;
216     }
217 }
218
219 static void retrace_glXGetCurrentReadDrawable(Trace::Call &call) {
220 }
221
222 static void retrace_glXQueryContext(Trace::Call &call) {
223 }
224
225 static void retrace_glXSelectEvent(Trace::Call &call) {
226 }
227
228 static void retrace_glXGetSelectedEvent(Trace::Call &call) {
229 }
230
231 static void retrace_glXGetProcAddressARB(Trace::Call &call) {
232 }
233
234 static void retrace_glXGetProcAddress(Trace::Call &call) {
235 }
236
237 void glretrace::retrace_call_glx(Trace::Call &call) {
238     const char *name = call.name();
239
240     switch (name[3]) {
241     case 'C':
242         switch (name[4]) {
243         case 'h':
244             switch (name[5]) {
245             case 'o':
246                 switch (name[6]) {
247                 case 'o':
248                     switch (name[7]) {
249                     case 's':
250                         switch (name[8]) {
251                         case 'e':
252                             switch (name[9]) {
253                             case 'F':
254                                 if (name[10] == 'B' && name[11] == 'C' && name[12] == 'o' && name[13] == 'n' && name[14] == 'f' && name[15] == 'i' && name[16] == 'g' && name[17] == '\0') {
255                                     // glXChooseFBConfig
256                                     retrace_glXChooseFBConfig(call);
257                                     return;
258                                 }
259                                 break;
260                             case 'V':
261                                 if (name[10] == 'i' && name[11] == 's' && name[12] == 'u' && name[13] == 'a' && name[14] == 'l' && name[15] == '\0') {
262                                     // glXChooseVisual
263                                     retrace_glXChooseVisual(call);
264                                     return;
265                                 }
266                                 break;
267                             }
268                             break;
269                         }
270                         break;
271                     }
272                     break;
273                 }
274                 break;
275             }
276             break;
277         case 'o':
278             if (name[5] == 'p' && name[6] == 'y' && name[7] == 'C' && name[8] == 'o' && name[9] == 'n' && name[10] == 't' && name[11] == 'e' && name[12] == 'x' && name[13] == 't' && name[14] == '\0') {
279                 // glXCopyContext
280                 retrace_glXCopyContext(call);
281                 return;
282             }
283             break;
284         case 'r':
285             switch (name[5]) {
286             case 'e':
287                 switch (name[6]) {
288                 case 'a':
289                     switch (name[7]) {
290                     case 't':
291                         switch (name[8]) {
292                         case 'e':
293                             switch (name[9]) {
294                             case 'C':
295                                 if (name[10] == 'o' && name[11] == 'n' && name[12] == 't' && name[13] == 'e' && name[14] == 'x' && name[15] == 't' && name[16] == '\0') {
296                                     // glXCreateContext
297                                     retrace_glXCreateContext(call);
298                                     return;
299                                 }
300                                 break;
301                             case 'G':
302                                 if (name[10] == 'L' && name[11] == 'X' && name[12] == 'P' && name[13] == 'i' && name[14] == 'x' && name[15] == 'm' && name[16] == 'a' && name[17] == 'p' && name[18] == '\0') {
303                                     // glXCreateGLXPixmap
304                                     retrace_glXCreateGLXPixmap(call);
305                                     return;
306                                 }
307                                 break;
308                             case 'N':
309                                 if (name[10] == 'e' && name[11] == 'w' && name[12] == 'C' && name[13] == 'o' && name[14] == 'n' && name[15] == 't' && name[16] == 'e' && name[17] == 'x' && name[18] == 't' && name[19] == '\0') {
310                                     // glXCreateNewContext
311                                     retrace_glXCreateNewContext(call);
312                                     return;
313                                 }
314                                 break;
315                             case 'P':
316                                 switch (name[10]) {
317                                 case 'b':
318                                     if (name[11] == 'u' && name[12] == 'f' && name[13] == 'f' && name[14] == 'e' && name[15] == 'r' && name[16] == '\0') {
319                                         // glXCreatePbuffer
320                                         retrace_glXCreatePbuffer(call);
321                                         return;
322                                     }
323                                     break;
324                                 case 'i':
325                                     if (name[11] == 'x' && name[12] == 'm' && name[13] == 'a' && name[14] == 'p' && name[15] == '\0') {
326                                         // glXCreatePixmap
327                                         retrace_glXCreatePixmap(call);
328                                         return;
329                                     }
330                                     break;
331                                 }
332                                 break;
333                             case 'W':
334                                 if (name[10] == 'i' && name[11] == 'n' && name[12] == 'd' && name[13] == 'o' && name[14] == 'w' && name[15] == '\0') {
335                                     // glXCreateWindow
336                                     retrace_glXCreateWindow(call);
337                                     return;
338                                 }
339                                 break;
340                             }
341                             break;
342                         }
343                         break;
344                     }
345                     break;
346                 }
347                 break;
348             }
349             break;
350         }
351         break;
352     case 'D':
353         switch (name[4]) {
354         case 'e':
355             switch (name[5]) {
356             case 's':
357                 switch (name[6]) {
358                 case 't':
359                     switch (name[7]) {
360                     case 'r':
361                         switch (name[8]) {
362                         case 'o':
363                             switch (name[9]) {
364                             case 'y':
365                                 switch (name[10]) {
366                                 case 'C':
367                                     if (name[11] == 'o' && name[12] == 'n' && name[13] == 't' && name[14] == 'e' && name[15] == 'x' && name[16] == 't' && name[17] == '\0') {
368                                         // glXDestroyContext
369                                         retrace_glXDestroyContext(call);
370                                         return;
371                                     }
372                                     break;
373                                 case 'G':
374                                     if (name[11] == 'L' && name[12] == 'X' && name[13] == 'P' && name[14] == 'i' && name[15] == 'x' && name[16] == 'm' && name[17] == 'a' && name[18] == 'p' && name[19] == '\0') {
375                                         // glXDestroyGLXPixmap
376                                         retrace_glXDestroyGLXPixmap(call);
377                                         return;
378                                     }
379                                     break;
380                                 case 'P':
381                                     switch (name[11]) {
382                                     case 'b':
383                                         if (name[12] == 'u' && name[13] == 'f' && name[14] == 'f' && name[15] == 'e' && name[16] == 'r' && name[17] == '\0') {
384                                             // glXDestroyPbuffer
385                                             retrace_glXDestroyPbuffer(call);
386                                             return;
387                                         }
388                                         break;
389                                     case 'i':
390                                         if (name[12] == 'x' && name[13] == 'm' && name[14] == 'a' && name[15] == 'p' && name[16] == '\0') {
391                                             // glXDestroyPixmap
392                                             retrace_glXDestroyPixmap(call);
393                                             return;
394                                         }
395                                         break;
396                                     }
397                                     break;
398                                 case 'W':
399                                     if (name[11] == 'i' && name[12] == 'n' && name[13] == 'd' && name[14] == 'o' && name[15] == 'w' && name[16] == '\0') {
400                                         // glXDestroyWindow
401                                         retrace_glXDestroyWindow(call);
402                                         return;
403                                     }
404                                     break;
405                                 }
406                                 break;
407                             }
408                             break;
409                         }
410                         break;
411                     }
412                     break;
413                 }
414                 break;
415             }
416             break;
417         }
418         break;
419     case 'G':
420         switch (name[4]) {
421         case 'e':
422             switch (name[5]) {
423             case 't':
424                 switch (name[6]) {
425                 case 'C':
426                     switch (name[7]) {
427                     case 'l':
428                         if (name[8] == 'i' && name[9] == 'e' && name[10] == 'n' && name[11] == 't' && name[12] == 'S' && name[13] == 't' && name[14] == 'r' && name[15] == 'i' && name[16] == 'n' && name[17] == 'g' && name[18] == '\0') {
429                             // glXGetClientString
430                             retrace_glXGetClientString(call);
431                             return;
432                         }
433                         break;
434                     case 'o':
435                         if (name[8] == 'n' && name[9] == 'f' && name[10] == 'i' && name[11] == 'g' && name[12] == '\0') {
436                             // glXGetConfig
437                             retrace_glXGetConfig(call);
438                             return;
439                         }
440                         break;
441                     case 'u':
442                         switch (name[8]) {
443                         case 'r':
444                             switch (name[9]) {
445                             case 'r':
446                                 switch (name[10]) {
447                                 case 'e':
448                                     switch (name[11]) {
449                                     case 'n':
450                                         switch (name[12]) {
451                                         case 't':
452                                             switch (name[13]) {
453                                             case 'C':
454                                                 if (name[14] == 'o' && name[15] == 'n' && name[16] == 't' && name[17] == 'e' && name[18] == 'x' && name[19] == 't' && name[20] == '\0') {
455                                                     // glXGetCurrentContext
456                                                     return;
457                                                 }
458                                                 break;
459                                             case 'D':
460                                                 switch (name[14]) {
461                                                 case 'i':
462                                                     if (name[15] == 's' && name[16] == 'p' && name[17] == 'l' && name[18] == 'a' && name[19] == 'y' && name[20] == '\0') {
463                                                         // glXGetCurrentDisplay
464                                                         return;
465                                                     }
466                                                     break;
467                                                 case 'r':
468                                                     if (name[15] == 'a' && name[16] == 'w' && name[17] == 'a' && name[18] == 'b' && name[19] == 'l' && name[20] == 'e' && name[21] == '\0') {
469                                                         // glXGetCurrentDrawable
470                                                         return;
471                                                     }
472                                                     break;
473                                                 }
474                                                 break;
475                                             case 'R':
476                                                 if (name[14] == 'e' && name[15] == 'a' && name[16] == 'd' && name[17] == 'D' && name[18] == 'r' && name[19] == 'a' && name[20] == 'w' && name[21] == 'a' && name[22] == 'b' && name[23] == 'l' && name[24] == 'e' && name[25] == '\0') {
477                                                     // glXGetCurrentReadDrawable
478                                                     retrace_glXGetCurrentReadDrawable(call);
479                                                     return;
480                                                 }
481                                                 break;
482                                             }
483                                             break;
484                                         }
485                                         break;
486                                     }
487                                     break;
488                                 }
489                                 break;
490                             }
491                             break;
492                         }
493                         break;
494                     }
495                     break;
496                 case 'F':
497                     switch (name[7]) {
498                     case 'B':
499                         switch (name[8]) {
500                         case 'C':
501                             switch (name[9]) {
502                             case 'o':
503                                 switch (name[10]) {
504                                 case 'n':
505                                     switch (name[11]) {
506                                     case 'f':
507                                         switch (name[12]) {
508                                         case 'i':
509                                             switch (name[13]) {
510                                             case 'g':
511                                                 switch (name[14]) {
512                                                 case 'A':
513                                                     if (name[15] == 't' && name[16] == 't' && name[17] == 'r' && name[18] == 'i' && name[19] == 'b' && name[20] == '\0') {
514                                                         // glXGetFBConfigAttrib
515                                                         retrace_glXGetFBConfigAttrib(call);
516                                                         return;
517                                                     }
518                                                     break;
519                                                 case 's':
520                                                     if (name[15] == '\0') {
521                                                         // glXGetFBConfigs
522                                                         retrace_glXGetFBConfigs(call);
523                                                         return;
524                                                     }
525                                                     break;
526                                                 }
527                                                 break;
528                                             }
529                                             break;
530                                         }
531                                         break;
532                                     }
533                                     break;
534                                 }
535                                 break;
536                             }
537                             break;
538                         }
539                         break;
540                     }
541                     break;
542                 case 'P':
543                     switch (name[7]) {
544                     case 'r':
545                         switch (name[8]) {
546                         case 'o':
547                             switch (name[9]) {
548                             case 'c':
549                                 switch (name[10]) {
550                                 case 'A':
551                                     switch (name[11]) {
552                                     case 'd':
553                                         switch (name[12]) {
554                                         case 'd':
555                                             switch (name[13]) {
556                                             case 'r':
557                                                 switch (name[14]) {
558                                                 case 'e':
559                                                     switch (name[15]) {
560                                                     case 's':
561                                                         switch (name[16]) {
562                                                         case 's':
563                                                             switch (name[17]) {
564                                                             case '\0':
565                                                                 // glXGetProcAddress
566                                                                 retrace_glXGetProcAddress(call);
567                                                                 return;
568                                                                 break;
569                                                             case 'A':
570                                                                 if (name[18] == 'R' && name[19] == 'B' && name[20] == '\0') {
571                                                                     // glXGetProcAddressARB
572                                                                     retrace_glXGetProcAddressARB(call);
573                                                                     return;
574                                                                 }
575                                                                 break;
576                                                             }
577                                                             break;
578                                                         }
579                                                         break;
580                                                     }
581                                                     break;
582                                                 }
583                                                 break;
584                                             }
585                                             break;
586                                         }
587                                         break;
588                                     }
589                                     break;
590                                 }
591                                 break;
592                             }
593                             break;
594                         }
595                         break;
596                     }
597                     break;
598                 case 'S':
599                     if (name[7] == 'e' && name[8] == 'l' && name[9] == 'e' && name[10] == 'c' && name[11] == 't' && name[12] == 'e' && name[13] == 'd' && name[14] == 'E' && name[15] == 'v' && name[16] == 'e' && name[17] == 'n' && name[18] == 't' && name[19] == '\0') {
600                         // glXGetSelectedEvent
601                         retrace_glXGetSelectedEvent(call);
602                         return;
603                     }
604                     break;
605                 case 'V':
606                     if (name[7] == 'i' && name[8] == 's' && name[9] == 'u' && name[10] == 'a' && name[11] == 'l' && name[12] == 'F' && name[13] == 'r' && name[14] == 'o' && name[15] == 'm' && name[16] == 'F' && name[17] == 'B' && name[18] == 'C' && name[19] == 'o' && name[20] == 'n' && name[21] == 'f' && name[22] == 'i' && name[23] == 'g' && name[24] == '\0') {
607                         // glXGetVisualFromFBConfig
608                         retrace_glXGetVisualFromFBConfig(call);
609                         return;
610                     }
611                     break;
612                 }
613                 break;
614             }
615             break;
616         }
617         break;
618     case 'I':
619         if (name[4] == 's' && name[5] == 'D' && name[6] == 'i' && name[7] == 'r' && name[8] == 'e' && name[9] == 'c' && name[10] == 't' && name[11] == '\0') {
620             // glXIsDirect
621             retrace_glXIsDirect(call);
622             return;
623         }
624         break;
625     case 'M':
626         switch (name[4]) {
627         case 'a':
628             switch (name[5]) {
629             case 'k':
630                 switch (name[6]) {
631                 case 'e':
632                     switch (name[7]) {
633                     case 'C':
634                         switch (name[8]) {
635                         case 'o':
636                             if (name[9] == 'n' && name[10] == 't' && name[11] == 'e' && name[12] == 'x' && name[13] == 't' && name[14] == 'C' && name[15] == 'u' && name[16] == 'r' && name[17] == 'r' && name[18] == 'e' && name[19] == 'n' && name[20] == 't' && name[21] == '\0') {
637                                 // glXMakeContextCurrent
638                                 retrace_glXMakeContextCurrent(call);
639                                 return;
640                             }
641                             break;
642                         case 'u':
643                             if (name[9] == 'r' && name[10] == 'r' && name[11] == 'e' && name[12] == 'n' && name[13] == 't' && name[14] == '\0') {
644                                 // glXMakeCurrent
645                                 retrace_glXMakeCurrent(call);
646                                 return;
647                             }
648                             break;
649                         }
650                         break;
651                     }
652                     break;
653                 }
654                 break;
655             }
656             break;
657         }
658         break;
659     case 'Q':
660         switch (name[4]) {
661         case 'u':
662             switch (name[5]) {
663             case 'e':
664                 switch (name[6]) {
665                 case 'r':
666                     switch (name[7]) {
667                     case 'y':
668                         switch (name[8]) {
669                         case 'C':
670                             if (name[9] == 'o' && name[10] == 'n' && name[11] == 't' && name[12] == 'e' && name[13] == 'x' && name[14] == 't' && name[15] == '\0') {
671                                 // glXQueryContext
672                                 retrace_glXQueryContext(call);
673                                 return;
674                             }
675                             break;
676                         case 'D':
677                             if (name[9] == 'r' && name[10] == 'a' && name[11] == 'w' && name[12] == 'a' && name[13] == 'b' && name[14] == 'l' && name[15] == 'e' && name[16] == '\0') {
678                                 // glXQueryDrawable
679                                 retrace_glXQueryDrawable(call);
680                                 return;
681                             }
682                             break;
683                         case 'E':
684                             switch (name[9]) {
685                             case 'x':
686                                 switch (name[10]) {
687                                 case 't':
688                                     switch (name[11]) {
689                                     case 'e':
690                                         switch (name[12]) {
691                                         case 'n':
692                                             switch (name[13]) {
693                                             case 's':
694                                                 switch (name[14]) {
695                                                 case 'i':
696                                                     switch (name[15]) {
697                                                     case 'o':
698                                                         switch (name[16]) {
699                                                         case 'n':
700                                                             switch (name[17]) {
701                                                             case '\0':
702                                                                 // glXQueryExtension
703                                                                 retrace_glXQueryExtension(call);
704                                                                 return;
705                                                                 break;
706                                                             case 's':
707                                                                 if (name[18] == 'S' && name[19] == 't' && name[20] == 'r' && name[21] == 'i' && name[22] == 'n' && name[23] == 'g' && name[24] == '\0') {
708                                                                     // glXQueryExtensionsString
709                                                                     retrace_glXQueryExtensionsString(call);
710                                                                     return;
711                                                                 }
712                                                                 break;
713                                                             }
714                                                             break;
715                                                         }
716                                                         break;
717                                                     }
718                                                     break;
719                                                 }
720                                                 break;
721                                             }
722                                             break;
723                                         }
724                                         break;
725                                     }
726                                     break;
727                                 }
728                                 break;
729                             }
730                             break;
731                         case 'S':
732                             if (name[9] == 'e' && name[10] == 'r' && name[11] == 'v' && name[12] == 'e' && name[13] == 'r' && name[14] == 'S' && name[15] == 't' && name[16] == 'r' && name[17] == 'i' && name[18] == 'n' && name[19] == 'g' && name[20] == '\0') {
733                                 // glXQueryServerString
734                                 retrace_glXQueryServerString(call);
735                                 return;
736                             }
737                             break;
738                         case 'V':
739                             if (name[9] == 'e' && name[10] == 'r' && name[11] == 's' && name[12] == 'i' && name[13] == 'o' && name[14] == 'n' && name[15] == '\0') {
740                                 // glXQueryVersion
741                                 retrace_glXQueryVersion(call);
742                                 return;
743                             }
744                             break;
745                         }
746                         break;
747                     }
748                     break;
749                 }
750                 break;
751             }
752             break;
753         }
754         break;
755     case 'S':
756         switch (name[4]) {
757         case 'e':
758             if (name[5] == 'l' && name[6] == 'e' && name[7] == 'c' && name[8] == 't' && name[9] == 'E' && name[10] == 'v' && name[11] == 'e' && name[12] == 'n' && name[13] == 't' && name[14] == '\0') {
759                 // glXSelectEvent
760                 retrace_glXSelectEvent(call);
761                 return;
762             }
763             break;
764         case 'w':
765             if (name[5] == 'a' && name[6] == 'p' && name[7] == 'B' && name[8] == 'u' && name[9] == 'f' && name[10] == 'f' && name[11] == 'e' && name[12] == 'r' && name[13] == 's' && name[14] == '\0') {
766                 // glXSwapBuffers
767                 retrace_glXSwapBuffers(call);
768                 return;
769             }
770             break;
771         }
772         break;
773     case 'U':
774         if (name[4] == 's' && name[5] == 'e' && name[6] == 'X' && name[7] == 'F' && name[8] == 'o' && name[9] == 'n' && name[10] == 't' && name[11] == '\0') {
775             // glXUseXFont
776             retrace_glXUseXFont(call);
777             return;
778         }
779         break;
780     case 'W':
781         switch (name[4]) {
782         case 'a':
783             switch (name[5]) {
784             case 'i':
785                 switch (name[6]) {
786                 case 't':
787                     switch (name[7]) {
788                     case 'G':
789                         if (name[8] == 'L' && name[9] == '\0') {
790                             // glXWaitGL
791                             retrace_glXWaitGL(call);
792                             return;
793                         }
794                         break;
795                     case 'X':
796                         if (name[8] == '\0') {
797                             // glXWaitX
798                             retrace_glXWaitX(call);
799                             return;
800                         }
801                         break;
802                     }
803                     break;
804                 }
805                 break;
806             }
807             break;
808         }
809         break;
810     }
811     retrace::retrace_unknown(call);
812 }
813