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