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 long, glws::Drawable *> DrawableMap;
36 typedef std::map<unsigned long long, glws::Context *> ContextMap;
37 static DrawableMap drawable_map;
38 static DrawableMap pbuffer_map;
39 static ContextMap context_map;
42 static glws::Drawable *
43 getDrawable(unsigned long long hdc) {
48 DrawableMap::const_iterator it;
49 it = drawable_map.find(hdc);
50 if (it == drawable_map.end()) {
51 return (drawable_map[hdc] = glws::createDrawable(visual));
57 static void retrace_wglCreateContext(Trace::Call &call) {
58 unsigned long long orig_context = call.ret->toUIntPtr();
59 glws::Context *context = glws::createContext(glretrace::visual);
60 context_map[orig_context] = context;
63 static void retrace_wglDeleteContext(Trace::Call &call) {
66 static void retrace_wglMakeCurrent(Trace::Call &call) {
67 if (drawable && context) {
70 frame_complete(call.no);
74 glws::Drawable *new_drawable = getDrawable(call.arg(0).toUIntPtr());
75 glws::Context *new_context = context_map[call.arg(1).toUIntPtr()];
77 bool result = glws::makeCurrent(new_drawable, new_context);
79 if (new_drawable && new_context && result) {
80 drawable = new_drawable;
81 context = new_context;
88 static void retrace_wglCopyContext(Trace::Call &call) {
91 static void retrace_wglChoosePixelFormat(Trace::Call &call) {
94 static void retrace_wglDescribePixelFormat(Trace::Call &call) {
97 static void retrace_wglSetPixelFormat(Trace::Call &call) {
100 static void retrace_wglSwapBuffers(Trace::Call &call) {
101 frame_complete(call.no);
103 drawable->swapBuffers();
109 static void retrace_wglShareLists(Trace::Call &call) {
110 unsigned long long hglrc1 = call.arg(0).toUIntPtr();
111 unsigned long long hglrc2 = call.arg(1).toUIntPtr();
113 glws::Context *share_context = context_map[hglrc1];
114 glws::Context *old_context = context_map[hglrc2];
116 glws::Context *new_context =
117 glws::createContext(old_context->visual, share_context);
119 if (context == old_context) {
120 glws::makeCurrent(drawable, new_context);
123 context_map[hglrc2] = new_context;
129 static void retrace_wglCreateLayerContext(Trace::Call &call) {
130 retrace_wglCreateContext(call);
133 static void retrace_wglDescribeLayerPlane(Trace::Call &call) {
136 static void retrace_wglSetLayerPaletteEntries(Trace::Call &call) {
139 static void retrace_wglRealizeLayerPalette(Trace::Call &call) {
142 static void retrace_wglSwapLayerBuffers(Trace::Call &call) {
143 retrace_wglSwapBuffers(call);
146 static void retrace_wglUseFontBitmapsA(Trace::Call &call) {
149 static void retrace_wglUseFontBitmapsW(Trace::Call &call) {
152 static void retrace_wglSwapMultipleBuffers(Trace::Call &call) {
155 static void retrace_wglUseFontOutlinesA(Trace::Call &call) {
158 static void retrace_wglUseFontOutlinesW(Trace::Call &call) {
161 static void retrace_wglCreateBufferRegionARB(Trace::Call &call) {
164 static void retrace_wglDeleteBufferRegionARB(Trace::Call &call) {
167 static void retrace_wglSaveBufferRegionARB(Trace::Call &call) {
170 static void retrace_wglRestoreBufferRegionARB(Trace::Call &call) {
173 static void retrace_wglChoosePixelFormatARB(Trace::Call &call) {
176 static void retrace_wglMakeContextCurrentARB(Trace::Call &call) {
179 static void retrace_wglCreatePbufferARB(Trace::Call &call) {
180 int iWidth = call.arg(2).toUInt();
181 int iHeight = call.arg(3).toUInt();
183 unsigned long long orig_pbuffer = call.ret->toUIntPtr();
184 glws::Drawable *drawable = glws::createDrawable(glretrace::visual);
186 drawable->resize(iWidth, iHeight);
188 pbuffer_map[orig_pbuffer] = drawable;
191 static void retrace_wglGetPbufferDCARB(Trace::Call &call) {
192 glws::Drawable *pbuffer = pbuffer_map[call.arg(0).toUIntPtr()];
194 unsigned long long orig_hdc = call.ret->toUIntPtr();
196 drawable_map[orig_hdc] = pbuffer;
199 static void retrace_wglReleasePbufferDCARB(Trace::Call &call) {
202 static void retrace_wglDestroyPbufferARB(Trace::Call &call) {
205 static void retrace_wglQueryPbufferARB(Trace::Call &call) {
208 static void retrace_wglBindTexImageARB(Trace::Call &call) {
211 static void retrace_wglReleaseTexImageARB(Trace::Call &call) {
214 static void retrace_wglSetPbufferAttribARB(Trace::Call &call) {
217 static void retrace_wglCreateContextAttribsARB(Trace::Call &call) {
218 unsigned long long orig_context = call.ret->toUIntPtr();
219 glws::Context *share_context = NULL;
221 if (call.arg(1).toPointer()) {
222 share_context = context_map[call.arg(1).toUIntPtr()];
225 glws::Context *context = glws::createContext(glretrace::visual, share_context);
226 context_map[orig_context] = context;
229 static void retrace_wglMakeContextCurrentEXT(Trace::Call &call) {
232 static void retrace_wglChoosePixelFormatEXT(Trace::Call &call) {
235 static void retrace_wglSwapIntervalEXT(Trace::Call &call) {
238 static void retrace_wglAllocateMemoryNV(Trace::Call &call) {
241 static void retrace_wglFreeMemoryNV(Trace::Call &call) {
244 static void retrace_glAddSwapHintRectWIN(Trace::Call &call) {
247 static void retrace_wglGetProcAddress(Trace::Call &call) {
250 const retrace::Entry glretrace::wgl_callbacks[] = {
251 {"glAddSwapHintRectWIN", &retrace_glAddSwapHintRectWIN},
252 {"wglAllocateMemoryNV", &retrace_wglAllocateMemoryNV},
253 {"wglBindTexImageARB", &retrace_wglBindTexImageARB},
254 {"wglChoosePixelFormat", &retrace_wglChoosePixelFormat},
255 {"wglChoosePixelFormatARB", &retrace_wglChoosePixelFormatARB},
256 {"wglChoosePixelFormatEXT", &retrace_wglChoosePixelFormatEXT},
257 {"wglCopyContext", &retrace_wglCopyContext},
258 {"wglCreateBufferRegionARB", &retrace_wglCreateBufferRegionARB},
259 {"wglCreateContext", &retrace_wglCreateContext},
260 {"wglCreateContextAttribsARB", &retrace_wglCreateContextAttribsARB},
261 {"wglCreateLayerContext", &retrace_wglCreateLayerContext},
262 {"wglCreatePbufferARB", &retrace_wglCreatePbufferARB},
263 {"wglDeleteBufferRegionARB", &retrace_wglDeleteBufferRegionARB},
264 {"wglDeleteContext", &retrace_wglDeleteContext},
265 {"wglDescribeLayerPlane", &retrace_wglDescribeLayerPlane},
266 {"wglDescribePixelFormat", &retrace_wglDescribePixelFormat},
267 {"wglDestroyPbufferARB", &retrace_wglDestroyPbufferARB},
268 {"wglFreeMemoryNV", &retrace_wglFreeMemoryNV},
269 {"wglGetCurrentContext", &retrace::ignore},
270 {"wglGetCurrentDC", &retrace::ignore},
271 {"wglGetCurrentReadDCARB", &retrace::ignore},
272 {"wglGetCurrentReadDCEXT", &retrace::ignore},
273 {"wglGetDefaultProcAddress", &retrace::ignore},
274 {"wglGetExtensionsStringARB", &retrace::ignore},
275 {"wglGetExtensionsStringEXT", &retrace::ignore},
276 {"wglGetLayerPaletteEntries", &retrace::ignore},
277 {"wglGetPbufferDCARB", &retrace_wglGetPbufferDCARB},
278 {"wglGetPixelFormat", &retrace::ignore},
279 {"wglGetPixelFormatAttribfvARB", &retrace::ignore},
280 {"wglGetPixelFormatAttribfvEXT", &retrace::ignore},
281 {"wglGetPixelFormatAttribivARB", &retrace::ignore},
282 {"wglGetPixelFormatAttribivEXT", &retrace::ignore},
283 {"wglGetProcAddress", &retrace_wglGetProcAddress},
284 {"wglGetSwapIntervalEXT", &retrace::ignore},
285 {"wglMakeContextCurrentARB", &retrace_wglMakeContextCurrentARB},
286 {"wglMakeContextCurrentEXT", &retrace_wglMakeContextCurrentEXT},
287 {"wglMakeCurrent", &retrace_wglMakeCurrent},
288 {"wglQueryPbufferARB", &retrace_wglQueryPbufferARB},
289 {"wglRealizeLayerPalette", &retrace_wglRealizeLayerPalette},
290 {"wglReleasePbufferDCARB", &retrace_wglReleasePbufferDCARB},
291 {"wglReleaseTexImageARB", &retrace_wglReleaseTexImageARB},
292 {"wglRestoreBufferRegionARB", &retrace_wglRestoreBufferRegionARB},
293 {"wglSaveBufferRegionARB", &retrace_wglSaveBufferRegionARB},
294 {"wglSetLayerPaletteEntries", &retrace_wglSetLayerPaletteEntries},
295 {"wglSetPbufferAttribARB", &retrace_wglSetPbufferAttribARB},
296 {"wglSetPixelFormat", &retrace_wglSetPixelFormat},
297 {"wglShareLists", &retrace_wglShareLists},
298 {"wglSwapBuffers", &retrace_wglSwapBuffers},
299 {"wglSwapIntervalEXT", &retrace_wglSwapIntervalEXT},
300 {"wglSwapLayerBuffers", &retrace_wglSwapLayerBuffers},
301 {"wglSwapMultipleBuffers", &retrace_wglSwapMultipleBuffers},
302 {"wglUseFontBitmapsA", &retrace_wglUseFontBitmapsA},
303 {"wglUseFontBitmapsW", &retrace_wglUseFontBitmapsW},
304 {"wglUseFontOutlinesA", &retrace_wglUseFontOutlinesA},
305 {"wglUseFontOutlinesW", &retrace_wglUseFontOutlinesW},