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 *context = ws->createContext(glretrace::visual);
62 context_map[orig_context] = context;
65 static void retrace_glXDestroyContext(Trace::Call &call) {
68 static void retrace_glXMakeCurrent(Trace::Call &call) {
69 if (drawable && context) {
72 frame_complete(call.no);
76 glws::Drawable *new_drawable = getDrawable(static_cast<unsigned long>(call.arg(1)));
77 glws::Context *new_context = context_map[call.arg(2).toPointer()];
79 bool result = ws->makeCurrent(new_drawable, new_context);
81 if (new_drawable && new_context && result) {
82 drawable = new_drawable;
83 context = new_context;
90 static void retrace_glXCopyContext(Trace::Call &call) {
93 static void retrace_glXSwapBuffers(Trace::Call &call) {
94 frame_complete(call.no);
96 drawable->swapBuffers();
102 static void retrace_glXCreateGLXPixmap(Trace::Call &call) {
105 static void retrace_glXDestroyGLXPixmap(Trace::Call &call) {
108 static void retrace_glXQueryExtension(Trace::Call &call) {
111 static void retrace_glXQueryVersion(Trace::Call &call) {
114 static void retrace_glXIsDirect(Trace::Call &call) {
117 static void retrace_glXGetConfig(Trace::Call &call) {
120 static void retrace_glXWaitGL(Trace::Call &call) {
123 static void retrace_glXWaitX(Trace::Call &call) {
126 static void retrace_glXUseXFont(Trace::Call &call) {
129 static void retrace_glXQueryExtensionsString(Trace::Call &call) {
132 static void retrace_glXQueryServerString(Trace::Call &call) {
135 static void retrace_glXGetClientString(Trace::Call &call) {
138 static void retrace_glXChooseFBConfig(Trace::Call &call) {
141 static void retrace_glXGetFBConfigAttrib(Trace::Call &call) {
144 static void retrace_glXGetFBConfigs(Trace::Call &call) {
147 static void retrace_glXGetVisualFromFBConfig(Trace::Call &call) {
150 static void retrace_glXCreateWindow(Trace::Call &call) {
153 static void retrace_glXDestroyWindow(Trace::Call &call) {
156 static void retrace_glXCreatePixmap(Trace::Call &call) {
159 static void retrace_glXDestroyPixmap(Trace::Call &call) {
162 static void retrace_glXCreatePbuffer(Trace::Call &call) {
165 static void retrace_glXDestroyPbuffer(Trace::Call &call) {
168 static void retrace_glXQueryDrawable(Trace::Call &call) {
171 static void retrace_glXCreateNewContext(Trace::Call &call) {
172 retrace_glXCreateContext(call);
175 static void retrace_glXMakeContextCurrent(Trace::Call &call) {
176 if (drawable && context) {
178 if (!double_buffer) {
179 frame_complete(call.no);
183 glws::Drawable *new_drawable = getDrawable(static_cast<unsigned long>(call.arg(1)));
184 glws::Context *new_context = context_map[call.arg(3).toPointer()];
186 bool result = ws->makeCurrent(new_drawable, new_context);
188 if (new_drawable && new_context && result) {
189 drawable = new_drawable;
190 context = new_context;
197 static void retrace_glXGetCurrentReadDrawable(Trace::Call &call) {
200 static void retrace_glXQueryContext(Trace::Call &call) {
203 static void retrace_glXSelectEvent(Trace::Call &call) {
206 static void retrace_glXGetSelectedEvent(Trace::Call &call) {
209 static void retrace_glXGetProcAddressARB(Trace::Call &call) {
212 static void retrace_glXGetProcAddress(Trace::Call &call) {
215 void glretrace::retrace_call_glx(Trace::Call &call) {
216 const char *name = call.name().c_str();
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') {
234 retrace_glXChooseFBConfig(call);
239 if (name[10] == 'i' && name[11] == 's' && name[12] == 'u' && name[13] == 'a' && name[14] == 'l' && name[15] == '\0') {
241 retrace_glXChooseVisual(call);
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') {
258 retrace_glXCopyContext(call);
273 if (name[10] == 'o' && name[11] == 'n' && name[12] == 't' && name[13] == 'e' && name[14] == 'x' && name[15] == 't' && name[16] == '\0') {
275 retrace_glXCreateContext(call);
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);
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);
296 if (name[11] == 'u' && name[12] == 'f' && name[13] == 'f' && name[14] == 'e' && name[15] == 'r' && name[16] == '\0') {
298 retrace_glXCreatePbuffer(call);
303 if (name[11] == 'x' && name[12] == 'm' && name[13] == 'a' && name[14] == 'p' && name[15] == '\0') {
305 retrace_glXCreatePixmap(call);
312 if (name[10] == 'i' && name[11] == 'n' && name[12] == 'd' && name[13] == 'o' && name[14] == 'w' && name[15] == '\0') {
314 retrace_glXCreateWindow(call);
345 if (name[11] == 'o' && name[12] == 'n' && name[13] == 't' && name[14] == 'e' && name[15] == 'x' && name[16] == 't' && name[17] == '\0') {
347 retrace_glXDestroyContext(call);
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);
361 if (name[12] == 'u' && name[13] == 'f' && name[14] == 'f' && name[15] == 'e' && name[16] == 'r' && name[17] == '\0') {
363 retrace_glXDestroyPbuffer(call);
368 if (name[12] == 'x' && name[13] == 'm' && name[14] == 'a' && name[15] == 'p' && name[16] == '\0') {
370 retrace_glXDestroyPixmap(call);
377 if (name[11] == 'i' && name[12] == 'n' && name[13] == 'd' && name[14] == 'o' && name[15] == 'w' && name[16] == '\0') {
379 retrace_glXDestroyWindow(call);
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);
413 if (name[8] == 'n' && name[9] == 'f' && name[10] == 'i' && name[11] == 'g' && name[12] == '\0') {
415 retrace_glXGetConfig(call);
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
440 if (name[15] == 's' && name[16] == 'p' && name[17] == 'l' && name[18] == 'a' && name[19] == 'y' && name[20] == '\0') {
441 // glXGetCurrentDisplay
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
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);
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);
498 if (name[15] == '\0') {
500 retrace_glXGetFBConfigs(call);
544 retrace_glXGetProcAddress(call);
548 if (name[18] == 'R' && name[19] == 'B' && name[20] == '\0') {
549 // glXGetProcAddressARB
550 retrace_glXGetProcAddressARB(call);
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);
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);
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') {
599 retrace_glXIsDirect(call);
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);
621 if (name[9] == 'r' && name[10] == 'r' && name[11] == 'e' && name[12] == 'n' && name[13] == 't' && name[14] == '\0') {
623 retrace_glXMakeCurrent(call);
648 if (name[9] == 'o' && name[10] == 'n' && name[11] == 't' && name[12] == 'e' && name[13] == 'x' && name[14] == 't' && name[15] == '\0') {
650 retrace_glXQueryContext(call);
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') {
657 retrace_glXQueryDrawable(call);
681 retrace_glXQueryExtension(call);
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);
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);
717 if (name[9] == 'e' && name[10] == 'r' && name[11] == 's' && name[12] == 'i' && name[13] == 'o' && name[14] == 'n' && name[15] == '\0') {
719 retrace_glXQueryVersion(call);
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') {
738 retrace_glXSelectEvent(call);
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') {
745 retrace_glXSwapBuffers(call);
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') {
754 retrace_glXUseXFont(call);
767 if (name[8] == 'L' && name[9] == '\0') {
769 retrace_glXWaitGL(call);
774 if (name[8] == '\0') {
776 retrace_glXWaitX(call);
789 retrace::retrace_unknown(call);