X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=glretrace_cgl.cpp;h=63b94b466d6f2804a8663f3effb67f405eeabeb4;hb=cbabe34c0bc4c5190f53c2b4e6991ad10ad36e44;hp=892dc0d1c67e0ffd2d3fb96bfc048a55834195d5;hpb=31c9f62616e2c59973ca00fd074e8c288f6488b3;p=apitrace diff --git a/glretrace_cgl.cpp b/glretrace_cgl.cpp index 892dc0d..63b94b4 100644 --- a/glretrace_cgl.cpp +++ b/glretrace_cgl.cpp @@ -38,6 +38,7 @@ typedef std::map DrawableMap; typedef std::map ContextMap; static DrawableMap drawable_map; static ContextMap context_map; +static glws::Context *sharedContext = NULL; static glws::Drawable * @@ -46,10 +47,13 @@ getDrawable(unsigned long drawable_id) { return NULL; } + /* XXX: Support multiple drawables. */ + drawable_id = 1; + DrawableMap::const_iterator it; it = drawable_map.find(drawable_id); if (it == drawable_map.end()) { - return (drawable_map[drawable_id] = ws->createDrawable(visual)); + return (drawable_map[drawable_id] = glws::createDrawable(visual[glretrace::defaultProfile])); } return it->second; @@ -65,33 +69,25 @@ getContext(unsigned long long ctx) { ContextMap::const_iterator it; it = context_map.find(ctx); if (it == context_map.end()) { - return (context_map[ctx] = ws->createContext(visual)); + glws::Context *context; + context_map[ctx] = context = glws::createContext(visual[glretrace::defaultProfile], sharedContext, glretrace::defaultProfile); + if (!sharedContext) { + sharedContext = context; + } + return context; } 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); - } +static void retrace_CGLSetCurrentContext(trace::Call &call) { + unsigned long long ctx = call.arg(0).toUIntPtr(); glws::Drawable *new_drawable = getDrawable(ctx); glws::Context *new_context = getContext(ctx); - bool result = ws->makeCurrent(new_drawable, new_context); + bool result = glws::makeCurrent(new_drawable, new_context); if (new_drawable && new_context && result) { drawable = new_drawable; @@ -103,18 +99,27 @@ static void retrace_CGLSetCurrentContext(Trace::Call &call) { } -void glretrace::retrace_call_cgl(Trace::Call &call) { - const char *name = call.name().c_str(); +static void retrace_CGLFlushDrawable(trace::Call &call) { + if (drawable && context) { + if (double_buffer) { + drawable->swapBuffers(); + } else { + glFlush(); + } - if (strcmp(name, "CGLSetCurrentContext") == 0) { - retrace_CGLSetCurrentContext(call); - return; + frame_complete(call); } +} - if (strcmp(name, "CGLGetCurrentContext") == 0) { - return; - } - retrace::retrace_unknown(call); -} +const retrace::Entry glretrace::cgl_callbacks[] = { + {"CGLSetCurrentContext", &retrace_CGLSetCurrentContext}, + {"CGLGetCurrentContext", &retrace::ignore}, + {"CGLEnable", &retrace::ignore}, + {"CGLDisable", &retrace::ignore}, + {"CGLSetParameter", &retrace::ignore}, + {"CGLGetParameter", &retrace::ignore}, + {"CGLFlushDrawable", &retrace_CGLFlushDrawable}, + {NULL, NULL}, +};