From: José Fonseca Date: Sun, 15 May 2011 12:52:28 +0000 (+0100) Subject: Rudimentary CGL retracing. X-Git-Url: https://git.cworth.org/git?a=commitdiff_plain;h=31c9f62616e2c59973ca00fd074e8c288f6488b3;p=apitrace Rudimentary CGL retracing. --- diff --git a/CMakeLists.txt b/CMakeLists.txt index 5cd5781..d41e89d 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -318,6 +318,7 @@ include_directories ( add_executable (glretrace glretrace_gl.cpp + glretrace_cgl.cpp glretrace_glx.cpp glretrace_wgl.cpp glretrace_main.cpp diff --git a/glretrace.hpp b/glretrace.hpp index 2593040..dcac8f0 100644 --- a/glretrace.hpp +++ b/glretrace.hpp @@ -56,6 +56,7 @@ extern unsigned dump_state; void checkGlError(Trace::Call &call); +void retrace_call_cgl(Trace::Call &call); void retrace_call_glx(Trace::Call &call); void retrace_call_wgl(Trace::Call &call); diff --git a/glretrace_cgl.cpp b/glretrace_cgl.cpp new file mode 100644 index 0000000..892dc0d --- /dev/null +++ b/glretrace_cgl.cpp @@ -0,0 +1,120 @@ +/************************************************************************** + * + * Copyright 2011 Jose Fonseca + * All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + **************************************************************************/ + + +#include + +#include "glproc.hpp" +#include "retrace.hpp" +#include "glretrace.hpp" + + +using namespace glretrace; + + +typedef std::map DrawableMap; +typedef std::map ContextMap; +static DrawableMap drawable_map; +static ContextMap context_map; + + +static glws::Drawable * +getDrawable(unsigned long drawable_id) { + if (drawable_id == 0) { + return NULL; + } + + DrawableMap::const_iterator it; + it = drawable_map.find(drawable_id); + if (it == drawable_map.end()) { + return (drawable_map[drawable_id] = ws->createDrawable(visual)); + } + + return it->second; +} + + +static glws::Context * +getContext(unsigned long long ctx) { + if (ctx == 0) { + return NULL; + } + + ContextMap::const_iterator it; + it = context_map.find(ctx); + if (it == context_map.end()) { + return (context_map[ctx] = ws->createContext(visual)); + } + + return it->second; +} + +static void retrace_CGLSetCurrentContext(Trace::Call &call) { + unsigned long long ctx = call.arg(0).toUIntPtr(); + + /* + * XXX: Frame termination is mostly a guess, because we don't trace enough + * of the CGL API to know that. + */ + if (drawable && context) { + if (double_buffer) { + drawable->swapBuffers(); + } else { + glFlush(); + } + + frame_complete(call.no); + } + + glws::Drawable *new_drawable = getDrawable(ctx); + glws::Context *new_context = getContext(ctx); + + bool result = ws->makeCurrent(new_drawable, new_context); + + if (new_drawable && new_context && result) { + drawable = new_drawable; + context = new_context; + } else { + drawable = NULL; + context = NULL; + } +} + + +void glretrace::retrace_call_cgl(Trace::Call &call) { + const char *name = call.name().c_str(); + + if (strcmp(name, "CGLSetCurrentContext") == 0) { + retrace_CGLSetCurrentContext(call); + return; + } + + if (strcmp(name, "CGLGetCurrentContext") == 0) { + return; + } + + retrace::retrace_unknown(call); +} + diff --git a/glretrace_main.cpp b/glretrace_main.cpp index a9ef157..b9a11b1 100644 --- a/glretrace_main.cpp +++ b/glretrace_main.cpp @@ -187,7 +187,10 @@ static void display(void) { std::cout.flush(); } - if (name[0] == 'w' && name[1] == 'g' && name[2] == 'l') { + if (name[0] == 'C' && name[1] == 'G' && name[2] == 'L') { + glretrace::retrace_call_cgl(*call); + } + else if (name[0] == 'w' && name[1] == 'g' && name[2] == 'l') { glretrace::retrace_call_wgl(*call); } else if (name[0] == 'g' && name[1] == 'l' && name[2] == 'X') { diff --git a/trace_model.hpp b/trace_model.hpp index 5e0a09d..e7a2249 100644 --- a/trace_model.hpp +++ b/trace_model.hpp @@ -31,7 +31,7 @@ #define _TRACE_MODEL_HPP_ -#include +#include #include #include @@ -316,6 +316,7 @@ public: } inline Value & arg(unsigned index) { + assert(index < args.size()); return *(args[index]); } };