X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=retrace%2Fglretrace_ws.cpp;h=ac03fcc97de6d56390f807a3b1661e6571d489c1;hb=7a9fb5103e052150232b64cb5d99374cda3f1234;hp=47fe0d697f342125e447250cdf6e8dda3cf225ce;hpb=4a3ccab160b3197933b9fdf02d924370b7e48a79;p=apitrace diff --git a/retrace/glretrace_ws.cpp b/retrace/glretrace_ws.cpp index 47fe0d6..ac03fcc 100644 --- a/retrace/glretrace_ws.cpp +++ b/retrace/glretrace_ws.cpp @@ -50,6 +50,10 @@ getVisual(glws::Profile profile) { glws::Visual * & visual = visuals[profile]; if (!visual) { visual = glws::createVisual(retrace::doubleBuffer, profile); + if (!visual) { + std::cerr << "error: failed to create OpenGL visual\n"; + exit(1); + } } return visual; } @@ -68,11 +72,11 @@ getDefaultProfile(void) static glws::Drawable * createDrawableHelper(glws::Profile profile, int width = 32, int height = 32, bool pbuffer = false) { - glws::Drawable *draw = glws::createDrawable(getVisual(profile), width, height, pbuffer); + glws::Visual *visual = getVisual(profile); + glws::Drawable *draw = glws::createDrawable(visual, width, height, pbuffer); if (!draw) { std::cerr << "error: failed to create OpenGL drawable\n"; exit(1); - return NULL; } return draw; @@ -99,8 +103,9 @@ createPbuffer(int width, int height) { Context * createContext(Context *shareContext, glws::Profile profile) { + glws::Visual *visual = getVisual(profile); glws::Context *shareWsContext = shareContext ? shareContext->wsContext : NULL; - glws::Context *ctx = glws::createContext(getVisual(profile), shareWsContext, profile, retrace::debug); + glws::Context *ctx = glws::createContext(visual, shareWsContext, profile, retrace::debug); if (!ctx) { std::cerr << "error: failed to create OpenGL context\n"; exit(1); @@ -117,14 +122,23 @@ createContext(Context *shareContext) { } -static os::thread_specific_ptr +Context::~Context() +{ + //assert(this != getCurrentContext()); + if (this != getCurrentContext()) { + delete wsContext; + } +} + + +static thread_specific Context * currentContextPtr; bool makeCurrent(trace::Call &call, glws::Drawable *drawable, Context *context) { - Context *currentContext = currentContextPtr.release(); + Context *currentContext = currentContextPtr; glws::Drawable *currentDrawable = currentContext ? currentContext->drawable : NULL; if (drawable == currentDrawable && context == currentContext) { @@ -148,13 +162,10 @@ makeCurrent(trace::Call &call, glws::Drawable *drawable, Context *context) return false; } - if (currentContext) { - currentContext->drawable = NULL; - } + currentContextPtr = context; if (drawable && context) { context->drawable = drawable; - currentContextPtr.reset(context); if (!context->used) { initContext(); @@ -168,7 +179,7 @@ makeCurrent(trace::Call &call, glws::Drawable *drawable, Context *context) Context * getCurrentContext(void) { - return currentContextPtr.get(); + return currentContextPtr; }