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