early support for sharing contexts.
static void retrace_glXCreateContext(Trace::Call &call) {
void * orig_context = call.ret->toPointer();
- glws::Context *context = ws->createContext(glretrace::visual);
+ glws::Context *share_context = NULL;
+
+ if (call.arg(2).toPointer()) {
+ share_context = context_map[call.arg(2).toPointer()];
+ }
+
+ glws::Context *context = ws->createContext(glretrace::visual, share_context);
context_map[orig_context] = context;
}
}
static void retrace_glXCreateNewContext(Trace::Call &call) {
- retrace_glXCreateContext(call);
+ void * orig_context = call.ret->toPointer();
+ glws::Context *share_context = NULL;
+
+ if (call.arg(3).toPointer()) {
+ share_context = context_map[call.arg(3).toPointer()];
+ }
+
+ glws::Context *context = ws->createContext(glretrace::visual, share_context);
+ context_map[orig_context] = context;
}
static void retrace_glXMakeContextCurrent(Trace::Call &call) {
}
static void retrace_wglShareLists(Trace::Call &call) {
+ unsigned long long hglrc1 = call.arg(0).toUIntPtr();
+ unsigned long long hglrc2 = call.arg(1).toUIntPtr();
+
+ glws::Context *share_context = context_map[hglrc1];
+ glws::Context *old_context = context_map[hglrc2];
+
+ glws::Context *new_context =
+ ws->createContext(old_context->visual, share_context);
+ if (new_context) {
+ delete old_context;
+ context_map[hglrc2] = new_context;
+ }
}
static void retrace_wglCreateLayerContext(Trace::Call &call) {
}
static void retrace_wglCreateContextAttribsARB(Trace::Call &call) {
- retrace_wglCreateContext(call);
- /* TODO: handle context sharing */
+ unsigned long long orig_context = call.ret->toUIntPtr();
+ glws::Context *share_context = NULL;
+
+ if (call.arg(1).toPointer()) {
+ share_context = context_map[call.arg(1).toUIntPtr()];
+ }
+
+ glws::Context *context = ws->createContext(glretrace::visual, share_context);
+ context_map[orig_context] = context;
}
static void retrace_wglMakeContextCurrentEXT(Trace::Call &call) {
createDrawable(const Visual *visual, int width = 256, int height = 256) = 0;
virtual Context *
- createContext(const Visual *visual) = 0;
+ createContext(const Visual *visual, Context *shareContext = NULL) = 0;
virtual bool
makeCurrent(Drawable *drawable, Context *context) = 0;
}
Context *
- createContext(const Visual *visual)
+ createContext(const Visual *visual, Context *shareContext)
{
XVisualInfo *visinfo = dynamic_cast<const GlxVisual *>(visual)->visinfo;
- GLXContext context = glXCreateContext(display, visinfo, NULL, True);
+ GLXContext share_context = NULL;
+ GLXContext context;
+
+ if (shareContext) {
+ share_context = dynamic_cast<GlxContext*>(shareContext)->context;
+ }
+
+ context = glXCreateContext(display, visinfo,
+ share_context, True);
return new GlxContext(visual, context);
}
{
public:
HGLRC hglrc;
-
- WglContext(const Visual *vis) :
+ WglContext *shareContext;
+
+ WglContext(const Visual *vis, WglContext *share) :
Context(vis),
- hglrc(0)
+ hglrc(0),
+ shareContext(share)
{}
~WglContext() {
}
Context *
- createContext(const Visual *visual)
+ createContext(const Visual *visual, Context *shareContext)
{
- return new WglContext(visual);
+ return new WglContext(visual, dynamic_cast<WglContext *>(shareContext));
}
bool
if (!wglContext->hglrc) {
return false;
}
+ if (wglContext->shareContext) {
+ wglShareLists(wglContext->shareContext->hglrc,
+ wglContext->hglrc);
+ }
}
return wglMakeCurrent(wglDrawable->hDC, wglContext->hglrc);