From 4bcaa103b8cc893055c50e46685e49b384f5e326 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jos=C3=A9=20Fonseca?= Date: Thu, 5 May 2011 08:33:42 +0100 Subject: [PATCH] Basic multi GLX context support. --- glretrace_glx.cpp | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/glretrace_glx.cpp b/glretrace_glx.cpp index 11465ea..540d7cb 100644 --- a/glretrace_glx.cpp +++ b/glretrace_glx.cpp @@ -32,10 +32,34 @@ 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 void retrace_glXChooseVisual(Trace::Call &call) { } static void retrace_glXCreateContext(Trace::Call &call) { + void * orig_context = call.ret->blob(); + glws::Context *context = ws->createContext(glretrace::visual); + context_map[orig_context] = context; } static void retrace_glXDestroyContext(Trace::Call &call) { @@ -46,6 +70,19 @@ static void retrace_glXMakeCurrent(Trace::Call &call) { if (!double_buffer) { frame_complete(call.no); } + + glws::Drawable *new_drawable = getDrawable(static_cast(call.arg(1))); + glws::Context *new_context = context_map[call.arg(2).blob()]; + + 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; + } } static void retrace_glXCopyContext(Trace::Call &call) { -- 2.7.4