X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=wrappers%2Fgltrace_state.cpp;h=a8476b04c1bb247b9fb1131eb2c81852f7723896;hb=8cf630712592eea93b1a1988a0875fe293e6aea8;hp=796d61f37399a3060651493d79f6c48fb7b9ef99;hpb=df347e7f014639233bd1494a7cac87c1adb6bd2c;p=apitrace diff --git a/wrappers/gltrace_state.cpp b/wrappers/gltrace_state.cpp index 796d61f..a8476b0 100644 --- a/wrappers/gltrace_state.cpp +++ b/wrappers/gltrace_state.cpp @@ -28,10 +28,15 @@ #include #include +#if defined(_MSC_VER) +#include +#else #include +#endif -#include #include +#include +#include namespace gltrace { @@ -53,15 +58,13 @@ public: } }; -static os::thread_specific_ptr thread_state; +static OS_THREAD_SPECIFIC_PTR(ThreadState) thread_state; static ThreadState *get_ts(void) { - ThreadState *ts = thread_state.get(); - + ThreadState *ts = thread_state; if (!ts) { - ts = new ThreadState; - thread_state.reset(ts); + thread_state = ts = new ThreadState; } return ts; @@ -92,7 +95,7 @@ static bool _releaseContext(context_ptr_t ctx) */ bool releaseContext(uintptr_t context_id) { - bool res; + bool res = false; context_map_mutex.lock(); /* @@ -111,26 +114,22 @@ bool releaseContext(uintptr_t context_id) void createContext(uintptr_t context_id) { + // wglCreateContextAttribsARB causes internal calls to wglCreateContext to be + // traced, causing context to be defined twice. + if (context_map.find(context_id) != context_map.end()) { + return; + } + context_ptr_t ctx(new Context); context_map_mutex.lock(); _retainContext(ctx); - assert(context_map.find(context_id) == context_map.end()); context_map[context_id] = ctx; context_map_mutex.unlock(); } -/* - * return true if the context has been destroyed, false otherwise. See - * the note at releaseContext about the actual ccontext lifetime. - */ -bool destroyContext(uintptr_t context_id) -{ - return releaseContext(context_id); -} - void setContext(uintptr_t context_id) { ThreadState *ts = get_ts(); @@ -144,6 +143,29 @@ void setContext(uintptr_t context_id) context_map_mutex.unlock(); ts->current_context = ctx; + + if (!ctx->bound) { + ctx->bound = true; + + /* + * The default viewport and scissor state is set when a context is + * first made current, with values matching the bound drawable. Many + * applications never thouch the default state ever again. + * + * Since we currently don't trace window sizes, and rely on viewport + * calls to deduct, emit fake calls here so that viewport/scissor state + * can be deducated. + * + * FIXME: don't call the real functions here -- just emit the fake + * calls. + */ + GLint viewport[4] = {0, 0, 0, 0}; + GLint scissor_box[4] = {0, 0, 0, 0}; + _glGetIntegerv(GL_VIEWPORT, viewport); + _glGetIntegerv(GL_SCISSOR_BOX, scissor_box); + glViewport(viewport[0], viewport[1], viewport[2], viewport[3]); + glScissor(scissor_box[0], scissor_box[1], scissor_box[2], scissor_box[3]); + } } void clearContext(void)