1 /**************************************************************************
3 * Copyright 2011 Jose Fonseca
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:
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
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
24 **************************************************************************/
28 #include "retrace.hpp"
29 #include "glretrace.hpp"
32 using namespace glretrace;
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;
41 static glws::Drawable *
42 getDrawable(unsigned long drawable_id) {
43 if (drawable_id == 0) {
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));
56 static void retrace_glXChooseVisual(Trace::Call &call) {
59 static void retrace_glXCreateContext(Trace::Call &call) {
60 void * orig_context = call.ret->toPointer();
61 glws::Context *share_context = NULL;
63 if (call.arg(2).toPointer()) {
64 share_context = context_map[call.arg(2).toPointer()];
67 glws::Context *context = ws->createContext(glretrace::visual, share_context);
68 context_map[orig_context] = context;
71 static void retrace_glXDestroyContext(Trace::Call &call) {
74 static void retrace_glXMakeCurrent(Trace::Call &call) {
75 if (drawable && context) {
78 frame_complete(call.no);
82 glws::Drawable *new_drawable = getDrawable(call.arg(1).toUInt());
83 glws::Context *new_context = context_map[call.arg(2).toPointer()];
85 bool result = ws->makeCurrent(new_drawable, new_context);
87 if (new_drawable && new_context && result) {
88 drawable = new_drawable;
89 context = new_context;
96 static void retrace_glXCopyContext(Trace::Call &call) {
99 static void retrace_glXSwapBuffers(Trace::Call &call) {
100 frame_complete(call.no);
102 drawable->swapBuffers();
108 static void retrace_glXCreateGLXPixmap(Trace::Call &call) {
111 static void retrace_glXDestroyGLXPixmap(Trace::Call &call) {
114 static void retrace_glXQueryExtension(Trace::Call &call) {
117 static void retrace_glXQueryVersion(Trace::Call &call) {
120 static void retrace_glXIsDirect(Trace::Call &call) {
123 static void retrace_glXGetConfig(Trace::Call &call) {
126 static void retrace_glXWaitGL(Trace::Call &call) {
129 static void retrace_glXWaitX(Trace::Call &call) {
132 static void retrace_glXUseXFont(Trace::Call &call) {
135 static void retrace_glXQueryExtensionsString(Trace::Call &call) {
138 static void retrace_glXQueryServerString(Trace::Call &call) {
141 static void retrace_glXGetClientString(Trace::Call &call) {
144 static void retrace_glXChooseFBConfig(Trace::Call &call) {
147 static void retrace_glXGetFBConfigAttrib(Trace::Call &call) {
150 static void retrace_glXGetFBConfigs(Trace::Call &call) {
153 static void retrace_glXGetVisualFromFBConfig(Trace::Call &call) {
156 static void retrace_glXCreateWindow(Trace::Call &call) {
159 static void retrace_glXDestroyWindow(Trace::Call &call) {
162 static void retrace_glXCreatePixmap(Trace::Call &call) {
165 static void retrace_glXDestroyPixmap(Trace::Call &call) {
168 static void retrace_glXCreatePbuffer(Trace::Call &call) {
171 static void retrace_glXDestroyPbuffer(Trace::Call &call) {
174 static void retrace_glXQueryDrawable(Trace::Call &call) {
177 static void retrace_glXCreateNewContext(Trace::Call &call) {
178 void * orig_context = call.ret->toPointer();
179 glws::Context *share_context = NULL;
181 if (call.arg(3).toPointer()) {
182 share_context = context_map[call.arg(3).toPointer()];
185 glws::Context *context = ws->createContext(glretrace::visual, share_context);
186 context_map[orig_context] = context;
189 static void retrace_glXMakeContextCurrent(Trace::Call &call) {
190 if (drawable && context) {
192 if (!double_buffer) {
193 frame_complete(call.no);
197 glws::Drawable *new_drawable = getDrawable(call.arg(1).toUInt());
198 glws::Context *new_context = context_map[call.arg(3).toPointer()];
200 bool result = ws->makeCurrent(new_drawable, new_context);
202 if (new_drawable && new_context && result) {
203 drawable = new_drawable;
204 context = new_context;
211 static void retrace_glXGetCurrentReadDrawable(Trace::Call &call) {
214 static void retrace_glXQueryContext(Trace::Call &call) {
217 static void retrace_glXSelectEvent(Trace::Call &call) {
220 static void retrace_glXGetSelectedEvent(Trace::Call &call) {
223 static void retrace_glXGetProcAddressARB(Trace::Call &call) {
226 static void retrace_glXGetProcAddress(Trace::Call &call) {
229 void glretrace::retrace_call_glx(Trace::Call &call) {
230 const char *name = call.name().c_str();
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') {
248 retrace_glXChooseFBConfig(call);
253 if (name[10] == 'i' && name[11] == 's' && name[12] == 'u' && name[13] == 'a' && name[14] == 'l' && name[15] == '\0') {
255 retrace_glXChooseVisual(call);
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') {
272 retrace_glXCopyContext(call);
287 if (name[10] == 'o' && name[11] == 'n' && name[12] == 't' && name[13] == 'e' && name[14] == 'x' && name[15] == 't' && name[16] == '\0') {
289 retrace_glXCreateContext(call);
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);
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);
310 if (name[11] == 'u' && name[12] == 'f' && name[13] == 'f' && name[14] == 'e' && name[15] == 'r' && name[16] == '\0') {
312 retrace_glXCreatePbuffer(call);
317 if (name[11] == 'x' && name[12] == 'm' && name[13] == 'a' && name[14] == 'p' && name[15] == '\0') {
319 retrace_glXCreatePixmap(call);
326 if (name[10] == 'i' && name[11] == 'n' && name[12] == 'd' && name[13] == 'o' && name[14] == 'w' && name[15] == '\0') {
328 retrace_glXCreateWindow(call);
359 if (name[11] == 'o' && name[12] == 'n' && name[13] == 't' && name[14] == 'e' && name[15] == 'x' && name[16] == 't' && name[17] == '\0') {
361 retrace_glXDestroyContext(call);
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);
375 if (name[12] == 'u' && name[13] == 'f' && name[14] == 'f' && name[15] == 'e' && name[16] == 'r' && name[17] == '\0') {
377 retrace_glXDestroyPbuffer(call);
382 if (name[12] == 'x' && name[13] == 'm' && name[14] == 'a' && name[15] == 'p' && name[16] == '\0') {
384 retrace_glXDestroyPixmap(call);
391 if (name[11] == 'i' && name[12] == 'n' && name[13] == 'd' && name[14] == 'o' && name[15] == 'w' && name[16] == '\0') {
393 retrace_glXDestroyWindow(call);
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);
427 if (name[8] == 'n' && name[9] == 'f' && name[10] == 'i' && name[11] == 'g' && name[12] == '\0') {
429 retrace_glXGetConfig(call);
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
454 if (name[15] == 's' && name[16] == 'p' && name[17] == 'l' && name[18] == 'a' && name[19] == 'y' && name[20] == '\0') {
455 // glXGetCurrentDisplay
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
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);
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);
512 if (name[15] == '\0') {
514 retrace_glXGetFBConfigs(call);
558 retrace_glXGetProcAddress(call);
562 if (name[18] == 'R' && name[19] == 'B' && name[20] == '\0') {
563 // glXGetProcAddressARB
564 retrace_glXGetProcAddressARB(call);
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);
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);
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') {
613 retrace_glXIsDirect(call);
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);
635 if (name[9] == 'r' && name[10] == 'r' && name[11] == 'e' && name[12] == 'n' && name[13] == 't' && name[14] == '\0') {
637 retrace_glXMakeCurrent(call);
662 if (name[9] == 'o' && name[10] == 'n' && name[11] == 't' && name[12] == 'e' && name[13] == 'x' && name[14] == 't' && name[15] == '\0') {
664 retrace_glXQueryContext(call);
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') {
671 retrace_glXQueryDrawable(call);
695 retrace_glXQueryExtension(call);
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);
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);
731 if (name[9] == 'e' && name[10] == 'r' && name[11] == 's' && name[12] == 'i' && name[13] == 'o' && name[14] == 'n' && name[15] == '\0') {
733 retrace_glXQueryVersion(call);
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') {
752 retrace_glXSelectEvent(call);
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') {
759 retrace_glXSwapBuffers(call);
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') {
768 retrace_glXUseXFont(call);
781 if (name[8] == 'L' && name[9] == '\0') {
783 retrace_glXWaitGL(call);
788 if (name[8] == '\0') {
790 retrace_glXWaitX(call);
803 retrace::retrace_unknown(call);