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